ports/misc/bidwatcher/files/patch-STABLE_1_3
David E. O'Brien f97f56e86c Pull in large chunks of the unreleased changes on the STABLE_1_3 branch.
This stops the segfaulting on any auction add that started in July.
2004-08-03 17:12:30 +00:00

1767 lines
48 KiB
Text
Raw Blame History

diff -u -ruN -b -B -w /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/bidgroup.cpp anoncvs-STABLE_1_3/bidgroup.cpp
--- /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/bidgroup.cpp Wed Dec 31 16:00:00 1969
+++ bidgroup.cpp Thu Jun 10 02:02:08 2004
@@ -0,0 +1,191 @@
+
+// Copyright (C) 2004 Planet Intelligent Systems GmbH
+// Residence Park 1-7, 19065 Raben Steinfeld, Germany, Europe, Earth
+// All rights reserved
+//
+// Author: Jan Starzynski
+//
+// $Id: bidgroup.cpp,v 1.1.2.1 2004/06/10 09:02:08 sturnus Exp $
+//
+// $Log: bidgroup.cpp,v $
+// Revision 1.1.2.1 2004/06/10 09:02:08 sturnus
+// files for bidgroups and extensions
+//
+// Revision 1.13 2004/05/18 13:29:50 js02
+// integration continued
+//
+// Revision 1.12 2004/05/17 23:33:33 js02
+// bid groups continued
+//
+// Revision 1.10 2004/05/14 16:30:39 js02
+// bidgroup control via middle mouse button implemented
+//
+// Revision 1.9 2004/05/13 21:54:57 js02
+// View and Control for Bidgroups
+//
+// Revision 1.8 2004/05/13 15:38:07 js02
+// new function groupId
+//
+// Revision 1.7 2004/05/13 11:31:39 js02
+// Load/Save of BidGroups
+//
+// Revision 1.6 2004/05/13 09:56:29 js02
+// vereinfachte Version
+//
+
+#include <algorithm>
+#include <functional>
+
+#include "bidgroup.h"
+
+using namespace std;
+
+struct FindItem: public unary_function<BidGroup::ItemList, bool> {
+ BidGroup::IdType id;
+ FindItem(BidGroup::IdType id): id(id) {}
+ bool operator()(const BidGroup::ItemList &list) const { return list.find(id) != list.end(); }
+};
+
+struct UselessList: public unary_function<BidGroup::ItemList, bool> {
+ bool operator()(const BidGroup::ItemList &list) const { return list.size() <= 1; }
+};
+
+void BidGroup::clear()
+{
+ m_list.clear();
+}
+
+int BidGroup::numGroup() const
+{
+ return m_list.size();
+}
+
+BidGroup::ItemList *BidGroup::addItem(const IdType &id1, const IdType &id2)
+{
+ ItemList *item;
+
+ item = findItem(id1);
+ if(item) {
+ item->insert(id2);
+ return item;
+ }
+
+ item = findItem(id2);
+ if(item) {
+ item->insert(id1);
+ return item;
+ }
+
+ if(id1 == id2) return 0;
+
+ ItemList add;
+ add.insert(id1);
+ add.insert(id2);
+ GroupList::iterator insert = find_if(m_list.begin(), m_list.end(), UselessList());
+ if(insert == m_list.end()) {
+ m_list.insert(insert, add);
+ } else {
+ *insert = add;
+ }
+
+ return &m_list.back();
+}
+
+int BidGroup::groupId(const IdType &id) const
+{
+ GroupList::const_iterator it = find_if(m_list.begin(), m_list.end(), FindItem(id));
+ return it == m_list.end() ? -1 : it - m_list.begin();
+}
+
+BidGroup::ItemList *BidGroup::findItemP(const IdType &id) const
+{
+ return getGroupP(groupId(id));
+}
+
+BidGroup::ItemList *BidGroup::getGroupP(int gid) const
+{
+ return const_cast<BidGroup::ItemList*>(gid < 0 || gid >= numGroup() ? 0 : &m_list[gid]);
+}
+
+bool BidGroup::delItem(const IdType &id)
+{
+ bool ok = false;
+ for(GroupList::iterator it = m_list.begin(); it != m_list.end(); ++it) {
+ ok |= it->erase(id);
+ }
+ return ok;
+}
+
+vector<BidGroup::IdType> &BidGroup::findItem(vector<IdType> &vec, const IdType &id)
+{
+ ItemList *item = findItem(id);
+ if(id) vec.insert(vec.end(), item->begin(), item->end());
+ return vec;
+}
+
+bool BidGroup::read(const char *file)
+{
+ FILE *fp = fopen(file, "r");
+ bool ret = read(fp);
+ if(fp) fclose(fp);
+ return ret;
+}
+
+bool BidGroup::write(const char *file) const
+{
+ FILE *fp = fopen(file, "w");
+ bool ret = write(fp);
+ if(fp) fclose(fp);
+ return ret;
+}
+
+bool BidGroup::read(FILE *fp)
+{
+ if(!fp) return false;
+
+ bool ok = true;
+ char buffer[30];
+
+ ItemList group;
+ while(fgets(buffer, sizeof(buffer), fp)) {
+ IdType id;
+ if(sscanf(buffer, "%llu", &id) == 1) {
+ group.insert(id);
+ } else {
+ if(!group.empty()) {
+ m_list.push_back(group);
+ group.clear();
+ }
+ }
+ }
+
+ if(!group.empty()) m_list.push_back(group);
+
+ return ok;
+}
+
+bool BidGroup::write(FILE *fp) const
+{
+ if(!fp) return false;
+
+ bool ok = true;
+ for(GroupList::const_iterator it = m_list.begin(); it != m_list.end(); ++it) {
+ if(!it->empty()) {
+ for(ItemList::const_iterator jt = it->begin(); jt != it->end(); ++jt) {
+ fprintf(fp, "%llu\n", *jt);
+ }
+ fprintf(fp, "\n");
+ }
+ }
+ return ok;
+}
+
+void BidGroup::sweepList(bool at_end_only)
+{
+ if(at_end_only) {
+ m_list.erase(find_if(m_list.rbegin(), m_list.rend(), not1<UselessList>(UselessList())).base(), m_list.end());
+ } else {
+ m_list.erase(remove_if(m_list.begin(), m_list.end(), UselessList()), m_list.end());
+ }
+}
+
diff -u -ruN -b -B -w /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/bidgroup.h anoncvs-STABLE_1_3/bidgroup.h
--- /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/bidgroup.h Wed Dec 31 16:00:00 1969
+++ bidgroup.h Thu Jul 15 07:27:30 2004
@@ -0,0 +1,82 @@
+
+/*
+ * Copyright (C) 2004 Planet Intelligent Systems GmbH
+ * Residence Park 1-7, 19065 Raben Steinfeld, Germany, Europe, Earth
+ * All rights reserved
+ *
+ * Author: Jan Starzynski
+ *
+ * $Id: bidgroup.h,v 1.1.2.2 2004/07/15 14:27:30 sturnus Exp $
+ *
+ * $Log: bidgroup.h,v $
+ * Revision 1.1.2.2 2004/07/15 14:27:30 sturnus
+ * #include <cstdio> + std::FILE added
+ *
+ * Revision 1.1.2.1 2004/06/10 09:02:08 sturnus
+ * files for bidgroups and extensions
+ *
+ * Revision 1.12 2004/05/18 13:29:50 js02
+ * integration continued
+ *
+ * Revision 1.11 2004/05/17 23:33:33 js02
+ * bid groups continued
+ *
+ * Revision 1.9 2004/05/14 16:30:39 js02
+ * bidgroup control via middle mouse button implemented
+ *
+ * Revision 1.8 2004/05/13 21:54:57 js02
+ * View and Control for Bidgroups
+ *
+ * Revision 1.7 2004/05/13 15:38:07 js02
+ * new function groupId
+ *
+ * Revision 1.6 2004/05/13 11:31:39 js02
+ * Load/Save of BidGroups
+ *
+ * Revision 1.5 2004/05/13 09:56:29 js02
+ * vereinfachte Version
+ *
+ */
+
+#ifndef BIDWATCHER_BIDGROUP_H
+#define BIDWATCHER_BIDGROUP_H
+
+#include <vector>
+#include <set>
+#include <cstdio>
+
+class BidGroup {
+public:
+ typedef unsigned long long IdType;
+ typedef std::set<IdType> ItemList;
+ typedef std::vector<ItemList> GroupList;
+
+ void clear();
+ int numGroup() const;
+
+ ItemList *addItem(const IdType &id1, const IdType &id2);
+ bool delItem(const IdType &id);
+
+ int groupId(const IdType &id) const;
+ const ItemList *getGroup(int idx) const { return getGroupP(idx); }
+ ItemList *getGroup(int idx) { return getGroupP(idx); }
+
+ const ItemList *findItem(const IdType &id) const { return findItemP(id); }
+ ItemList *findItem(const IdType &id) { return findItemP(id); }
+ std::vector<IdType> &findItem(std::vector<IdType> &vec, const IdType &id);
+
+ void sweepList(bool at_end_only = true);
+
+ bool read(const char *file);
+ bool read(std::FILE *fp);
+
+ bool write(const char *file) const;
+ bool write(std::FILE *fp) const;
+
+private:
+ GroupList m_list;
+ ItemList *findItemP(const IdType &id) const;
+ ItemList *getGroupP(int idx) const;
+};
+
+#endif
diff -u -ruN -b -B -w /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/bidgui.cpp anoncvs-STABLE_1_3/bidgui.cpp
--- /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/bidgui.cpp Wed Dec 31 16:00:00 1969
+++ bidgui.cpp Mon Jul 12 01:02:55 2004
@@ -0,0 +1,398 @@
+
+// Copyright (C) 2004 Planet Intelligent Systems GmbH
+// Residence Park 1-7, 19065 Raben Steinfeld, Germany, Europe, Earth
+// All rights reserved
+//
+// Author: Jan Starzynski
+//
+// $Id: bidgui.cpp,v 1.1.2.4 2004/07/12 08:02:55 sturnus Exp $
+//
+// $Log: bidgui.cpp,v $
+// Revision 1.1.2.4 2004/07/12 08:02:55 sturnus
+// accelerating snipe setting: don't get snipe key, it's done again later anyway
+//
+// Revision 1.1.2.3 2004/06/25 14:22:02 sturnus
+// finished remote control via ~/.bidwatcher/item.add
+//
+// Revision 1.1.2.2 2004/06/10 16:31:08 sturnus
+// continued work on commando file parser
+//
+// Revision 1.1.2.1 2004/06/10 09:02:08 sturnus
+// files for bidgroups and extensions
+//
+// Revision 1.14 2004/06/03 12:52:03 js02
+// *** empty log message ***
+//
+// Revision 1.13 2004/06/03 12:50:19 js02
+// add items from ~/.bidwatcher/item.add
+//
+// Revision 1.12 2004/05/28 06:50:56 js02
+// failed getkeys are stored
+//
+// Revision 1.11 2004/05/25 15:14:34 js02
+// Bugfix: wrong parameter type for call to delBidGroupItem
+//
+// Revision 1.10 2004/05/19 08:46:52 js02
+// Bugfixes
+//
+// Revision 1.9 2004/05/18 14:45:19 js02
+// *** empty log message ***
+//
+// Revision 1.8 2004/05/18 14:36:20 js02
+// copying of snipe data at creation
+//
+// Revision 1.7 2004/05/18 14:10:33 js02
+// Bidgroups work
+//
+// Revision 1.6 2004/05/18 13:29:50 js02
+// integration continued
+//
+// Revision 1.5 2004/05/17 23:33:33 js02
+// bid groups continued
+//
+// Revision 1.3 2004/05/15 13:12:24 js02
+// rebuild function: do not depend on global variables anymore
+//
+// Revision 1.2 2004/05/14 16:30:39 js02
+// bidgroup control via middle mouse button implemented
+//
+// Revision 1.1 2004/05/13 21:54:57 js02
+// View and Control for Bidgroups
+//
+
+#include <unistd.h>
+#include <sys/file.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <cstdarg>
+#include <map>
+
+#include "bidgui.h"
+
+using namespace std;
+
+// Replaces or removes ascii characters > 127. On some system they are not properly shown.
+void removeAscii127(char *info)
+{
+ unsigned char *p = (unsigned char*)info;
+ while(*p) {
+ switch(*p) {
+ case (unsigned char)'<27>':
+ *p = 'a';
+ break;
+
+ case (unsigned char)'<27>':
+ *p = 'o';
+ break;
+
+ case (unsigned char)'<27>':
+ *p = 'u';
+ break;
+
+ case (unsigned char)'<27>':
+ *p = 'A';
+ break;
+
+ case (unsigned char)'<27>':
+ *p = 'O';
+ break;
+
+ case (unsigned char)'<27>':
+ *p = 'u';
+ break;
+
+ case (unsigned char)'<27>':
+ *p = 's';
+ break;
+ }
+
+ if(*p > 127) *p = ' ';
+
+ p++;
+ }
+}
+
+BidGroup *getBidGroup()
+{
+ static BidGroup bid_group;
+ return &bid_group;
+}
+
+static bool hasBid(struct auctioninfo *auc)
+{
+ if(auc->isSnipe) return true;
+ if(auc->snipeAmount > 0) return true;
+ if(auc->myBidAmount > 0) return true;
+ return false;
+}
+
+static void copySnipe(struct auctioninfo *dst, const struct auctioninfo *src)
+{
+ setBid(dst, src->myBidAmount, src->myBidQuantity, true);
+}
+
+// set/change bidgroup for an item
+void switchBidGroup(struct auctioninfo *auction[], int auc_num, int current_auc, int new_auc,
+ const char *subdir, int time_diff, const char *auth_id)
+{
+ if(current_auc < 0 || current_auc >= auc_num) return;
+ if(new_auc < 0 || new_auc >= auc_num) return;
+ BidGroup *group = getBidGroup();
+ struct auctioninfo *cauc = auction[current_auc];
+ struct auctioninfo *auc = auction[new_auc];
+ BidGroup::IdType cid = cauc->ItemNumber;
+ BidGroup::IdType id = auc->ItemNumber;
+ int cgid = group->groupId(cid);
+// int gid = group->groupId(id);
+
+ if(cgid >= 0) group->delItem(id);
+ group->addItem(cid, id);
+ group->sweepList();
+ if(hasBid(cauc) && !hasBid(auc)) copySnipe(auc, cauc);
+ if(!hasBid(cauc) && hasBid(auc)) copySnipe(cauc, auc);
+
+ setBidGroupAuction(auction, auc_num, auth_id);
+ UpdateList();
+ WriteAucFile();
+}
+
+char *configFileName(char *file, const char *subdir, const char *fname)
+{
+ sprintf(file, "%s/%s/%s", getenv("HOME"), subdir, fname);
+ return file;
+}
+
+char *bidGroupFile(char *file, const char *subdir)
+{
+ return configFileName(file, subdir, "bidgroup.cfg");
+}
+
+void writeBidGroup(const char *subdir)
+{
+ char file[200];
+ BidGroup *group = getBidGroup();
+ group->write(bidGroupFile(file, subdir));
+}
+
+void readBidGroup(const char *subdir)
+{
+ char file[200];
+ BidGroup *group = getBidGroup();
+ group->clear();
+ group->read(bidGroupFile(file, subdir));
+}
+
+void bidGroupComment(char **str, struct auctioninfo *auction[], int auc)
+{
+ BidGroup *group = getBidGroup();
+ const int gid = group->groupId(auction[auc]->ItemNumber);
+ if(group->numGroup() > 0) {
+ if(gid >= 0) *str = g_strdup_printf(" %*s%d%*s: %s", gid, "", gid + 1, group->numGroup() - gid - 1, "", *str);
+ else *str = g_strdup_printf(" %*s : %s", group->numGroup() - 1, "", *str);
+ }
+}
+
+SetBidGroupAuction::~SetBidGroupAuction()
+{
+ setBidGroupAuction(auction, auc_num, auth_id);
+}
+
+// mark all items in a successful bidgroup
+static void findSucceededAuc(map<BidGroup::IdType, bool> &succeeded, const BidGroup::ItemList *list)
+{
+ if(!list) return;
+
+ bool any_succeeded = false;
+ for(BidGroup::ItemList::const_iterator it = list->begin(); it != list->end(); ++it) {
+ if(succeeded[*it]) {
+ any_succeeded = true;
+ break;
+ }
+ }
+
+ if(any_succeeded) {
+ for(BidGroup::ItemList::const_iterator it = list->begin(); it != list->end(); ++it) {
+ succeeded[*it] = any_succeeded;
+ }
+ }
+}
+
+// I won this auction.
+static bool isMine(struct auctioninfo *auction, const char *auth_id)
+{
+ return strcmp(auction->HighBidder, auth_id) == 0 && auction->UpdTime >= auction->EndsValue;
+}
+
+void setBidGroupAuction(struct auctioninfo *auction[], int auc_num, const char *auth_id)
+{
+ BidGroup *group = getBidGroup();
+ map<BidGroup::IdType, bool> succeeded;
+
+ for(int i = 0; i < auc_num; i++) {
+ struct auctioninfo *a = auction[i];
+ succeeded[a->ItemNumber] = isMine(a, auth_id);
+ }
+
+ for(int i = 0; i < group->numGroup(); i++) {
+ findSucceededAuc(succeeded, group->getGroup(i));
+ }
+
+ for(int i = 0; i < auc_num; i++) {
+ struct auctioninfo *a = auction[i];
+ if(a->isSnipe && !isMine(a, auth_id) && succeeded[a->ItemNumber]) {
+ printf("clear snipe %llu\n", a->ItemNumber);
+ ClearSnipe(i);
+ }
+ }
+}
+
+void delBidGroupItem(struct auctioninfo *auction[], int auc)
+{
+ BidGroup *group = getBidGroup();
+ group->delItem(auction[auc]->ItemNumber);
+ group->sweepList();
+}
+
+// save something in a file defined by format
+void savePage(const char *page, const char *format, ...)
+{
+ va_list va;
+ va_start(va, format);
+ char fname[4096];
+ vsprintf(fname, format, va);
+ va_end(va);
+ FILE *fp = fopen(fname, "w");
+ if(fp) {
+ fprintf(fp, "%s", page);
+ fclose(fp);
+ }
+}
+
+// set up a bid or snipe
+void setBid(struct auctioninfo *auction, float bid, int quantity, bool snipe)
+{
+ if(!auction) return;
+
+ auction->isSnipe = snipe;
+ auction->isPreBid = snipe;
+ auction->myBidAmount = bid;
+ auction->myBidQuantity = quantity;
+ memset(auction->snipeKey, 0, sizeof(auction->snipeKey));
+
+ if(snipe) {
+ auction->snipeAmount = bid;
+ auction->snipeQty = quantity;
+ } else {
+ auction->snipeAmount = 0;
+ auction->snipeQty = 0;
+ auction->getkey(bid, quantity);
+ if(auction->snipeKey[0]) auction->bid(FALSE);
+ }
+
+ UpdateList();
+}
+
+// set up a bid or snipe reading amount + quantity from a file
+static struct auctioninfo *setBid(struct auctioninfo *auction, FILE *fp, bool snipe)
+{
+ if(!auction) return auction;
+ float bid;
+ int qty;
+ if(fscanf(fp, "%f%d", &bid, &qty) != 2) return auction;
+ setBid(auction, bid, qty, snipe);
+ fprintf(stderr, "%s %llu bid: %f qty: %d\n", snipe ? "snipeing" : "bidding ", auction->ItemNumber, bid, qty);
+ return auction;
+}
+
+/*
+ * Adds items from the file "~/.bidwatcher/item.add" to bidwatcher.
+ * Places bids/snipes if required.
+ *
+ * Syntax: a continuous stream of the following command
+ * "ebay-id" adds an item
+ * "add ebay-id" adds an item
+ * "bid ebay-id amount quantity" bids for an item
+ * "snipe ebay-id amount quantity" snipes for an item
+ *
+ * Example:
+ * 568880089
+ * add 568880010
+ * bid 568888888 10.51 1
+ * snipe 568888777 12.11 1
+ *
+ * I use this to remotely control my bidwatcher via email-filters.
+ */
+void addItemsFromFile(const char *subdir, volatile bool &up_in_prog)
+{
+ class AutoFp {
+ FILE *fp;
+
+ public:
+ AutoFp(FILE *fp): fp(fp) {
+ if(!fp) return;
+ flock(fileno(fp), LOCK_EX);
+ }
+
+ ~AutoFp() {
+ if(!fp) return;
+ flock(fileno(fp), LOCK_UN);
+ fclose(fp);
+ }
+
+ operator FILE*() const { return fp; }
+ FILE* operator->() const { return fp; }
+ };
+
+ class AutoFlag {
+ volatile bool &up_in_prog;
+
+ public:
+ AutoFlag(volatile bool &up_in_prog): up_in_prog(up_in_prog) { up_in_prog = true; }
+ ~AutoFlag() { up_in_prog = false;}
+ };
+
+ if(up_in_prog) return;
+ AutoFlag a_flag(up_in_prog);
+
+ if(timeToNextEnd() < 5 * 60) return;
+
+ char file[256];
+ configFileName(file, subdir, "item.add");
+ AutoFp fp(fopen(file, "r+"));
+ if(!fp) return;
+ char buffer1[20];
+ char buffer2[20];
+ char *rd = buffer1;
+ char *act = buffer2;
+ const char *def_action = "add";
+ strcpy(act, def_action);
+
+ while(fscanf(fp, "%19s", rd) == 1) {
+ if(timeToNextEnd() < 5 * 60) return;
+ unsigned long long id;
+
+ if(sscanf(rd, "%llu", &id) != 1) {
+ swap(rd, act);
+ continue;
+ }
+
+ up_in_prog = false;
+ if(strcmp(act, "add") == 0) {
+ fprintf(stderr, "adding %llu\n", id);
+ addNewItem(id);
+ } else if(strcmp(act, "bid") == 0) {
+ setBid(addNewItem(id), fp, false);
+ } else if(strcmp(act, "snipe") == 0) {
+ setBid(addNewItem(id), fp, true);
+ } else {
+ fprintf(stderr, "ignoring %s %llu\n", act, id);
+ }
+ up_in_prog = true;
+
+ strcpy(act, def_action);
+ }
+ ftruncate(fileno(fp), 0);
+}
+
diff -u -ruN -b -B -w /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/bidgui.h anoncvs-STABLE_1_3/bidgui.h
--- /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/bidgui.h Wed Dec 31 16:00:00 1969
+++ bidgui.h Fri Jun 25 07:22:02 2004
@@ -0,0 +1,90 @@
+
+/*
+ * Copyright (C) 2004 Planet Intelligent Systems GmbH
+ * Residence Park 1-7, 19065 Raben Steinfeld, Germany, Europe, Earth
+ * All rights reserved
+ *
+ * Author: Jan Starzynski
+ *
+ * $Id: bidgui.h,v 1.1.2.2 2004/06/25 14:22:02 sturnus Exp $
+ *
+ * $Log: bidgui.h,v $
+ * Revision 1.1.2.2 2004/06/25 14:22:02 sturnus
+ * finished remote control via ~/.bidwatcher/item.add
+ *
+ * Revision 1.1.2.1 2004/06/10 09:02:09 sturnus
+ * files for bidgroups and extensions
+ *
+ * Revision 1.9 2004/06/03 12:50:19 js02
+ * add items from ~/.bidwatcher/item.add
+ *
+ * Revision 1.8 2004/05/28 06:50:56 js02
+ * failed getkeys are stored
+ *
+ * Revision 1.7 2004/05/25 15:14:34 js02
+ * Bugfix: wrong parameter type for call to delBidGroupItem
+ *
+ * Revision 1.6 2004/05/18 14:45:19 js02
+ * *** empty log message ***
+ *
+ * Revision 1.5 2004/05/18 13:29:50 js02
+ * integration continued
+ *
+ * Revision 1.4 2004/05/17 23:33:33 js02
+ * bid groups continued
+ *
+ * Revision 1.3 2004/05/15 13:12:24 js02
+ * rebuild function: do not depend on global variables anymore
+ *
+ * Revision 1.2 2004/05/14 16:30:39 js02
+ * bidgroup control via middle mouse button implemented
+ *
+ * Revision 1.1 2004/05/13 21:54:57 js02
+ * View and Control for Bidgroups
+ *
+ */
+
+#ifndef BIDWATCHER_BIDGUI_H
+#define BIDWATCHER_BIDGUI_H
+
+#include <gdk/gdk.h>
+#include <gdk/gdkprivate.h>
+#include <gtk/gtk.h>
+
+#include "bidwatcher.h"
+#include "bidgroup.h"
+
+class SetBidGroupAuction {
+ struct auctioninfo **auction;
+ int auc_num;
+ int ebay_offset;
+ const char *auth_id;
+public:
+ SetBidGroupAuction(struct auctioninfo *auction[], int auc_num, int ebay_offset, const char *auth_id):
+ auction(auction),
+ auc_num(auc_num),
+ ebay_offset(ebay_offset),
+ auth_id(auth_id)
+ {}
+
+ ~SetBidGroupAuction();
+};
+
+void removeAscii127(char *info);
+
+BidGroup *getBidGroup();
+void switchBidGroup(struct auctioninfo *auction[], int auc_num, int current_auc, int new_auc,
+ const char *subdir, int time_diff, const char *auth_id);
+void delBidGroupItem(struct auctioninfo *auction[], int auc);
+char *configFileName(char *file, const char *subdir, const char *fname);
+char *bidGroupFile(char *file, const char *subdir);
+void writeBidGroup(const char *subdir);
+void readBidGroup(const char *subdir);
+void bidGroupComment(char **str, struct auctioninfo *auction[], int auc);
+void setBidGroupAuction(struct auctioninfo *auction[], int auc_num, const char *auth_id);
+void savePage(const char *page, const char *format, ...);
+void addItemsFromFile(const char *subdir, volatile bool &up_in_prog);
+void setBid(struct auctioninfo *auction, float bid, int quantity, bool snipe);
+
+#endif
+
diff -u -ruN -b -B -w /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/bidwatcher.cpp anoncvs-STABLE_1_3/bidwatcher.cpp
--- /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/bidwatcher.cpp Fri Apr 23 13:23:28 2004
+++ bidwatcher.cpp Tue Aug 3 08:34:27 2004
@@ -63,6 +63,8 @@
#include <gtk/gtk.h>
#include "bidwatcher.h"
+#include "bidgroup.h"
+#include "bidgui.h"
#include "pixmaps/user.xpm"
#include "pixmaps/clock.xpm"
@@ -223,19 +225,12 @@
*/
- if (auc->myBidQuantity!=0) {
- if (!strcmp(auc->HighBidder, authID))
- return (i%2)?clist_win2:clist_win1;
-
- else if ((auc->isSnipe && auc->myBidAmount > auc->CurrentBid) ||
- (auc->isSnipe && auc->BidCount == 0 &&
- auc->myBidAmount >= auc->CurrentBid))
- return (i%2)?clist_willwin2:clist_willwin1;
+ if (auc->myBidQuantity > 0) {
+ if (!strcmp(auc->HighBidder, authID)) return (i % 2) ? clist_win2 : clist_win1;
+ if ((auc->isSnipe && auc->myBidAmount > auc->minBid())) return (i % 2) ? clist_willwin2 : clist_willwin1;
+ }
- else
return (i%2)?clist_lose2:clist_lose1;
-
- } else return (i%2)?clist_lose2:clist_lose1;
}
void checkaucs(int line) {
@@ -786,19 +781,16 @@
gtk_widget_set_sensitive(obj->okbutton, FALSE);
gtk_widget_set_sensitive(obj->cancelbutton, FALSE);
gtk_label_set_text(GTK_LABEL(obj->currentbidlabel), "Obtaining key...");
- obj->myauc->getkey(atof(gtk_entry_get_text(GTK_ENTRY(obj->bidtext))),
- atoi(gtk_entry_get_text(GTK_ENTRY(obj->quantitytext))));
+ setBid(obj->myauc,
+ atof(gtk_entry_get_text(GTK_ENTRY(obj->bidtext))),
+ atoi(gtk_entry_get_text(GTK_ENTRY(obj->quantitytext))),
+ doSnipe
+ );
gtk_widget_set_sensitive(obj->okbutton, TRUE);
gtk_widget_set_sensitive(obj->cancelbutton, TRUE);
gtk_label_set_text(GTK_LABEL(obj->currentbidlabel), "");
- // Don't do any bidding if the key setup failed
- if (obj->myauc->snipeKey[0] == '\0') return;
-
if (doSnipe) {
- obj->myauc->snipeAmount=atof(gtk_entry_get_text(GTK_ENTRY(obj->bidtext)));
- obj->myauc->snipeQty=atoi(gtk_entry_get_text(GTK_ENTRY(obj->quantitytext)));
- obj->myauc->isSnipe = TRUE;
gtk_widget_set_sensitive(obj->okbutton, TRUE);
gtk_widget_set_sensitive(obj->cancelbutton, TRUE);
gtk_label_set_text(GTK_LABEL(obj->currentbidlabel), "");
@@ -806,6 +798,8 @@
return;
}
else {
+ // Don't do any bidding if the key setup failed
+ if (obj->myauc->snipeKey[0] == '\0') return;
gtk_label_set_text(GTK_LABEL(obj->currentbidlabel), "Submitting bid...");
// now, finalize bid with the key obtained.
char WebPage[255];
@@ -880,7 +874,7 @@
}
-static int find_auction_index(unsigned long long aucnum)
+int find_auction_index(unsigned long long aucnum)
{
// Locate the auction in the array of auctions
for(int i=0; i<aucIdx; i++) {
@@ -890,11 +884,18 @@
return -1;
}
-static int find_auction_index(struct auctioninfo *auc)
+int find_auction_index(struct auctioninfo *auc)
{
return find_auction_index(auc->ItemNumber);
}
+struct auctioninfo *find_auction(unsigned long long aucnum)
+{
+ int idx = find_auction_index(aucnum);
+ if(idx < 0) return NULL;
+ return auction[idx];
+}
+
void commentok_callback(GtkWidget *widget, gpointer data)
{
// Set the comment text into the auction struct
@@ -1832,12 +1833,7 @@
if (myauc->snipeQty >= 2) // DBS
strcpy(unitstring, " units at "); // DBS
- if (myauc->BidCount == 0 && !TYPE_EBAYMOTORSCAR)
- sprintf(temp, "%.2f", myauc->FirstBid);
- else {
- sprintf(temp,"%.2f",
- calculateBidIncrement(myauc->CurrentBid, myauc->currency));
- }
+ sprintf(temp, "%.2f", myauc->minBid());
char *quant, *bidc;
strcpy(info, " ");
@@ -1924,6 +1920,7 @@
gtk_widget_set_sensitive(bidderbutton, !strcasecmp(authID, myauc->Seller));
*/
+ removeAscii127(info);
gtk_label_set_text(GTK_LABEL(infolabel), info);
/* gtk_widget_set_sensitive(sellerbutton, FALSE);
@@ -2029,15 +2026,7 @@
gtk_widget_show(currentbidlabel);
gtk_widget_show(timeleftlabel);
- chTemp[0]=0;
- // int skipchars=strcspn(myauc->FirstBid, "0123456789");
- if (myauc->BidCount == 0)
- sprintf(chTemp, "%.2f", myauc->FirstBid);
- else {
- sprintf(chTemp, "%.2f",
- calculateBidIncrement(myauc->CurrentBid, myauc->currency));
- }
-
+ sprintf(chTemp, "%.2f", myauc->minBid());
bidlabel = gtk_label_new("Your MAXIMUM bid");
bidtext = gtk_entry_new();
gtk_entry_set_text(GTK_ENTRY(bidtext), chTemp);
@@ -2381,6 +2370,7 @@
gtk_clist_get_selection_info(GTK_CLIST(w), (gint) event->x,
(gint) event->y, &row, &col);
+ if(event->button == 2) switchBidGroup(auction, aucIdx, currentauc, row, bw_subdir, timeDiff, authID); // always call before setting currentauc
currentauc = row;
if (aucIdx != 0) {
@@ -2867,6 +2858,8 @@
fprintf(file, " endauction\n");
}
fclose(file);
+
+ writeBidGroup(bw_subdir);
}
BidWindow::~BidWindow() {
@@ -3002,6 +2995,7 @@
void ClearSnipe(int choice)
{
auction[choice]->isSnipe = FALSE;
+ auction[choice]->isPreBid = FALSE;
strcpy(auction[choice]->snipeKey, "");
auction[choice]->snipeAmount=0;
auction[choice]->snipeQty=0;
@@ -3291,7 +3285,7 @@
// calls:
// UpdateAuction(), DeleteAuction(), UpdateList()
//////////////////////////////////////////////////////////////////////////////
-void addNewItem(unsigned long long newNumber)
+struct auctioninfo *addNewItem(unsigned long long newNumber)
{
updateInProgress = TRUE;
int i;
@@ -3301,7 +3295,7 @@
// over the limit on auctions already
showError("You already have the maximum allowed auctions." );
updateInProgress = FALSE;
- return;
+ return NULL;
}
// scan current list, make sure this isn't a dup
@@ -3318,9 +3312,9 @@
// caller would have to duplicate this loop if he did not want to take
// the chance of the user seeing an "error" message.
DPRINTF(DLOW, ("The auction %llu is already in the list.\n", auction[i]->ItemNumber));
- showStatus(" adding auction...");
+ showStatus("");
updateInProgress = FALSE;
- return;
+ return auction[i];
}
}
@@ -3343,7 +3337,7 @@
updateInProgress = FALSE;
updatelist_callback(NULL);
WriteAucFile();
- return;
+ return NewAuction;
}
else if (returnVal == INFO_BADAUCTION) {
char msg[100];
@@ -3357,6 +3351,7 @@
updateInProgress = FALSE;
showStatus("");
+ return NULL;
}
//////////////////////////////////////////////////////////////////////////////
// timer1Up:
@@ -3383,6 +3378,8 @@
gint secondticker_callback(gpointer data) // second ticker
{
+ addItemsFromFile(bw_subdir, updateInProgress);
+
static volatile int checking_snipes = FALSE;
if (clockIsSet) {
@@ -3422,12 +3419,20 @@
if (auction[i]->isSnipe) {
timeLeft = CalcTimeLeft(auction[i]->EndsValue, timeDiff);
- if (!checking_snipes) {
+ if (!checking_snipes && timeLeft > -30) {
checking_snipes = TRUE;
+ if(timeLeft < cur_snipe_delay + 60) {
+ if(auction[i]->isPreBid) {
+ auction[i]->isPreBid = FALSE;
+ auction[i]->getkey(auction[i]->snipeAmount,
+ auction[i]->snipeQty);
+ }
+ }
+
if (timeLeft < cur_snipe_delay) {
auction[i]->isSnipe = FALSE;
- DoSnipe(i);
+ if(auction[i]->snipeKey[0]) DoSnipe(i);
}
checking_snipes = FALSE;
@@ -3613,6 +3618,23 @@
gtk_timeout_add(time_to_next_update,updatelist_callback,NULL);
return FALSE;
}
+
+static void setProxyURL(char *proxystring, char *proxyuserstring, char *proxypassstring)
+{
+ if (proxyurl != NULL) {
+ delete(proxyurl);
+ proxyurl = NULL;
+ }
+
+ if (strlen(proxystring) > 2) {
+ char *pxy = g_strdup_printf("http://%s/", proxystring);
+ proxyurl = new URL(pxy, NULL, proxyuserstring, proxypassstring);
+ g_free(pxy);
+ } else {
+ proxyurl = NULL;
+ }
+}
+
//////////////////////////////////////////////////////////////////////////////
// ReadAucFile:
// called once at startup, reads the username and stored auctions from
@@ -3829,6 +3851,7 @@
memset(authPASS, 0, sizeof(authPASS));
}
else if (!strcasecmp(keyword, "auction")) {
+ setProxyURL(proxystring, proxyuserstring, proxypassstring);
char which[20];
auction[aucIdx] = new auctioninfo();
fscanf(file, "%llu", &auction[aucIdx]->ItemNumber);
@@ -3866,9 +3889,11 @@
auction[aucIdx]->snipeAmount,
auction[aucIdx]->snipeQty);
#endif
- auction[aucIdx]->isSnipe = 1;
- auction[aucIdx]->getkey(auction[aucIdx]->snipeAmount,
- auction[aucIdx]->snipeQty);
+
+ setBid(auction[aucIdx],
+ auction[aucIdx]->snipeAmount,
+ auction[aucIdx]->snipeQty,
+ true);
}
else if (!strcasecmp(which, "endauction"))
@@ -3879,22 +3904,13 @@
}
fclose(file);
- if (proxyurl != NULL) {
- delete(proxyurl);
- proxyurl = NULL;
- }
- if (strlen(proxystring) > 2) {
- char *pxy = g_strdup_printf("http://%s/", proxystring);
- proxyurl = new URL(pxy, NULL, proxyuserstring,
- proxypassstring);
- g_free(pxy);
- }
- else proxyurl = NULL;
-
+ setProxyURL(proxystring, proxyuserstring, proxypassstring);
resetTimeSyncURL();
makeStyles();
resetStyles();
+
+ readBidGroup(bw_subdir);
}
//////////////////////////////////////////////////////////////////////////////
@@ -3938,6 +3954,8 @@
auction[i]->Comments,
auction[i]->Seller};
+ bidGroupComment(&item[5], auction, i);
+
int j;
for(j=0; j<NUM_COLUMNS; j++)
gtk_clist_set_text(GTK_CLIST(aucList), i, j, item[j]);
@@ -3991,6 +4009,7 @@
CHECK;
int idx;
if (index >= aucIdx) return; // we are out of range
+ delBidGroupItem(auction, index);
// Loop through AucNumList, moving list up to fill the gap
// where choice will be removed, this should be a linked list.
WriteLog(index);
@@ -4172,6 +4191,8 @@
// the item number out of the URL. because it is possible that there are CRLF
// in the URL, strip them out first and call addNewItem() with the auction
// number.
+ strip_crlf(Buff);
+
char *pszendurl;
char *pszonlyurl;
char *pszitemnumber;
@@ -4184,12 +4205,12 @@
memset(pszonlyurl, 0, pszendurl - pszitemurl + 1);
memcpy(pszonlyurl, pszitemurl, pszendurl - pszitemurl);
pszitemnumber = strstr(pszonlyurl, "item=");
- // save some time and only strip crlf from the item number
- strip_crlf(pszitemnumber);
- if(pszitemnumber)
+ if(pszitemnumber) {
// addNewItem() checks for dups and for maximum number of auctions.
// no need to do it twice.
- addNewItem(atoul(pszitemnumber + 5));
+ unsigned long long item;
+ if(sscanf(pszitemnumber + 5, "%llu", &item) == 1) addNewItem(item);
+ }
// delete the new'd memory
delete pszonlyurl;
// get the next url starting from the end of the current url.
@@ -4205,6 +4226,8 @@
///////////////////////////////////////////////////////////////////
void UpdateList()
{
+ if(!aucList) return;
+
CHECK;
char chTemp[20];
ArrangeList();
@@ -4248,6 +4271,8 @@
auction[i]->Comments,
auction[i]->Seller};
+ bidGroupComment(&item[5], auction, i);
+
gtk_clist_insert(GTK_CLIST(aucList), i, item);
if (auction[i]->isSnipe) {
gtk_clist_set_pixtext(GTK_CLIST(aucList), i, 0, item[0], 5,
@@ -4326,6 +4351,8 @@
int auctioninfo::getinfo()
{
CHECK;
+ SetBidGroupAuction set_bid_group(auction, aucIdx, timeDiff, authID);
+
int returnVal;
char *HtmlBuff;
char *urlstring;
@@ -4417,6 +4444,7 @@
}
}
free(Buff);
+ UpdTime = time(NULL) + timeDiff;
return INFO_SUCCESS;
}
free(Buff);
@@ -4983,6 +5011,7 @@
memset(this, 0, sizeof(auctioninfo));
magic = 12345;
isEndless = 0;
+ UpdTime = 0;
}
auctioninfo::~auctioninfo() {
diff -u -ruN -b -B -w /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/bidwatcher.h anoncvs-STABLE_1_3/bidwatcher.h
--- /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/bidwatcher.h Mon Apr 19 20:14:09 2004
+++ bidwatcher.h Tue Aug 3 08:34:27 2004
@@ -94,6 +94,7 @@
gint secondticker_callback(gpointer data);
gint bigdelay_callback(gpointer data);
gint updatelist_callback(gpointer data);
+float calculateBidIncrement(float currentBid, const char *currency);
// other constants
#define HUGEBUFF (256*1024)
@@ -161,15 +162,16 @@
float myBidAmount; /* Our bid */
int myBidQuantity; /* Our bid quantity for dutch */
long int EndsValue; /* time auction ends in seconds */
+ long int UpdTime; /* time of last update */
char stat; /* status of auction for GUI */
char bidstatus; /* final status of bid/snipe */
char reserveMet; /* [y/n/x] = Status of reserve */
bool isSnipe; /* Is this a snipe or not? */
+ bool isPreBid; /* Needs pre-bid for snipe */
int AuctionType; /* Type: ebay/ebaymotors/etc. */
URL *infourl; /* URL for auction info */
URL *bidurl; /* URL for bidding/sniping */
int magic; /* Used to detect corrupt lists */
- int bid(bool);
int isEndless; /* For non-auction auctions */
auctioninfo();
@@ -177,6 +179,10 @@
int getinfo();
bool parseaucinfo(const char *);
void getkey(float bid, int quantity);
+ int bid(bool);
+
+ double currentPrize() const { return BidCount > 0 ? CurrentBid : FirstBid; }
+ double minBid() const { return BidCount > 0 ? calculateBidIncrement(CurrentBid, currency) : FirstBid; }
};
typedef char string30[30];
@@ -196,7 +202,7 @@
void CmExit();
void CmCancelClicked();
void doubleClick(int);
-void addNewItem(unsigned long long);
+struct auctioninfo *addNewItem(unsigned long long);
void timer1Up();
void timer2Up();
void timer3Up();
@@ -360,7 +366,6 @@
~ConfirmWindow();
};
-float calculateBidIncrement(float currentBid, char *currency);
char *StripHtmlTags(const char *stringToStrip);
char *StripAndTab(const char *stringToStrip);
int ProcessBidSubmission(char *Buff, char *lineBuff, int lineBuffLen);
@@ -400,6 +405,10 @@
void basic_authentication_encode (const char *user,
const char *passwd,
char **encstr);
+
+int find_auction_index(unsigned long long aucnum);
+int find_auction_index(struct auctioninfo *auc);
+struct auctioninfo *find_auction(unsigned long long aucnum);
extern bool cancelPressed;
diff -u -ruN -b -B -w /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/daemon.c anoncvs-STABLE_1_3/daemon.c
--- /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/daemon.c Wed Dec 31 16:00:00 1969
+++ daemon.c Tue Apr 2 13:58:06 2002
@@ -0,0 +1,266 @@
+/* daemon.c
+ * Main code for the biddaemon software.
+ * Hey you with your bug report ready, DO NOT EXPECT THIS TO WORK YET.
+ * ;) -kdwyer
+ */
+
+/* bidwatcher
+ copyright (c) 1999, 2000, 2001, 2002
+ Trent McNair (trent@rmci.net)
+ Tom McNair (tmcnair@cyberhighway.net)
+ Wayne Schlitt (wayne@midwestcs.com)
+ Ben Byer (bushing@users.sourceforge.net)
+ Kevin Dwyer (kevin@pheared.net)
+
+ use of this code is restricted to the terms
+ of the GNU GPL, which should have been included in this
+ distribution. If not, see www.gnu.org/copyleft/gpl.html.
+ Here is the short version:
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+*/
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <signal.h>
+#include "daemon.h"
+
+#define MAXMSG sizeof(struct bidmessage)
+#define MAXCLIENTS 100
+
+typedef struct {
+ int sd;
+ char inbuf[MAXMSG];
+ char outbuf[MAXMSG];
+ struct sockaddr_in addr;
+ int closed;
+ int pending;
+ int welcome;
+} users;
+
+/*typedef struct users U;*/
+
+typedef void (*sighandler_t)(int);
+
+int write_pending(users *);
+int read_pending(users *);
+int parse_input(users);
+sighandler_t got_sig(int);
+
+int main (int argc, char *argv[])
+{
+ int sd=0, ret=0, len=0, i=0, stoploop=0;
+ char *port="4221";
+
+ users c[MAXCLIENTS];
+
+ struct sockaddr_in sin;
+ struct sockaddr_in sintmp;
+
+ signal(SIGINT, got_sig(sd));
+
+ memset(&sin,0,sizeof(sin));
+ memset(&sin,0,sizeof(sintmp));
+ memset(&c,0,sizeof(c));
+
+ /* setting up our daemon, sin_port = port to listen on
+ and sin_addr.saddr is source address to listen on.
+ */
+
+ sin.sin_family = AF_INET;
+ sin.sin_port = htons(atoi(port));
+ /* Listen on all addresses */
+ sin.sin_addr.s_addr = inet_addr("0.0.0.0");
+
+ /* procedure is socket, bind, listen, accept in loop. */
+
+ sd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
+
+ ret = bind(sd, (struct sockaddr *)&sin, sizeof(sin));
+
+ if (ret == -1) {
+ perror("bind()");
+ exit(0);
+ }
+
+ ret = listen(sd, 5);
+
+ if (ret == -1) {
+ perror("listen()");
+ exit(0);
+ }
+
+ ret = fcntl(sd, F_SETFL, O_NONBLOCK);
+
+ if (ret == -1) {
+ perror("fcntl()");
+ exit(0);
+ }
+
+ while (!stoploop) {
+ len = sizeof(c[i].addr);
+ ret = accept(sd, (struct sockaddr *)&c[i].addr, &len);
+ if (ret != -1) {
+ c[i].sd = ret;
+ c[i].pending = 1;
+ c[i].closed = 0;
+
+ /* Should make this quieter later. */
+ write(c[i].sd, "biddaemon v1.0\n", 15);
+
+ printf("accept():Got connect from %s source port %i\n",
+ inet_ntoa(c[i].addr.sin_addr),
+ ntohs(c[i].addr.sin_port));
+
+ ret = fcntl(c[i].sd, F_SETFL, O_NONBLOCK);
+
+ if (ret == -1) {
+ perror("fcntl()");
+ exit(0);
+ }
+
+ printf("i=%i/sd=%i/pend=%i/closed=%i\n", i,c[i].sd,c[i].pending,c[i].closed);
+ i++;
+ }
+
+
+ write_pending(c);
+
+ read_pending(c);
+
+ usleep(1);
+
+ }
+
+ return 0;
+}
+
+int write_pending(users c[MAXCLIENTS])
+{
+ int i=0,ret=0;
+
+ while (i < MAXCLIENTS) {
+ if (c[i].pending == 1) {
+ if (ret == -1) {
+ perror("write()");
+ close(c[i].sd);
+ c[i].closed = 1;
+ }
+
+ if (strlen(c[i].outbuf) > 0) {
+ ret = write(c[i].sd, c[i].outbuf, strlen(c[i].outbuf));
+
+ if (ret == -1) {
+ perror("write()");
+ close(c[i].sd);
+ c[i].closed = 1;
+ c[i].sd = -1;
+ }
+
+ memset(&c[i].outbuf, 0, sizeof(c[i].outbuf));
+ }
+
+ c[i].pending = 0;
+
+ }
+
+ i = i + 1;
+
+ }
+ return 0;
+}
+
+int parse_input(users c)
+{
+ struct bidmessage bm;
+
+ printf("DEBUG: Parsing a message\n");
+
+ memset(&bm, 0, sizeof(bm));
+ memcpy(&bm, c.inbuf, sizeof(bm));
+
+ if (bm.type == 0) {
+ printf("Got 0\n");
+ return MSG_PING;
+ }
+ if (bm.type == 1)
+ return MSG_ADD;
+}
+
+int read_pending(users c[MAXCLIENTS])
+{
+ int i=0, ret=0, x=0;
+ /* char inbuf[MAXMSG];*/
+
+ while(i < MAXCLIENTS) {
+ if (c[i].sd > 0) {
+ ret = read(c[i].sd, c[i].inbuf, sizeof(c[i].inbuf));
+
+ if (ret >= 0) {
+ printf("%s --- %i bytes \n", c[i].inbuf, ret);
+
+ switch(parse_input(c[i])) {
+ case MSG_DETACH:
+ printf("Closing sd %i!\n", i);
+ write(c[i].sd,"Closing connection...\n",22);
+ close(c[i].sd);
+ c[i].closed = 1;
+ c[i].sd = -1;
+ break;
+ case MSG_ADD:
+ printf("got add on sd %i\n", i);
+ break;
+ }
+ }
+ else {
+ if (errno != EAGAIN) {
+ perror("write()");
+ close(c[i].sd);
+ c[i].closed = 1;
+ c[i].sd = -1;
+ }
+ }
+ memset(&c[i].inbuf,0,sizeof(c[i].inbuf));
+ }
+ i++;
+ }
+ return 0;
+}
+
+sighandler_t got_sig(int sd)
+{
+ // This is broken right now.
+ // printf("Got Signal !\n");
+
+ // if (i == SIGINT)
+ //{
+ // printf("Shutting down daemon! %i\n", sd);
+ // close(sd);
+ // }
+
+ return 0;
+}
+
+
+
+
+
+
diff -u -ruN -b -B -w /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/daemon.h anoncvs-STABLE_1_3/daemon.h
--- /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/daemon.h Wed Dec 31 16:00:00 1969
+++ daemon.h Sun Feb 3 20:28:38 2002
@@ -0,0 +1,20 @@
+struct bidmessage {
+ /* layout will change a lot */
+ int type;
+
+};
+
+/* Message types */
+#define MSG_PING 0 /* Are you there */
+#define MSG_BID 1 /* Place a bid */
+#define MSG_UPDATE 2 /* Update an auction */
+#define MSG_UPDATE_ALL 3 /* Update all auctions */
+#define MSG_ADD 4 /* Add an auction */
+#define MSG_PREFS 5 /* Update preferences */
+#define MSG_SYNC 6 /* Time Sync */
+#define MSG_SHUTDOWN 7 /* Shut down server */
+#define MSG_ATTACH 8 /* Attach to server */
+#define MSG_DETACH 9 /* Detach from server */
+#define MSG_REMOVE 10 /* Remove an auction */
+#define MSG_SNIPE 11 /* Setup a snipe */
+
diff -u -ruN -b -B -w /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/helpers.cpp anoncvs-STABLE_1_3/helpers.cpp
--- /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/helpers.cpp Fri Apr 23 13:23:28 2004
+++ helpers.cpp Tue Aug 3 08:34:28 2004
@@ -98,7 +98,7 @@
}
};
-float calculateBidIncrement(float currentBid, char *currency)
+float calculateBidIncrement(float currentBid, const char *currency)
{
// step 1 - parse currentBid into useable int's
/*
@@ -162,13 +162,21 @@
if (fcb<=600) inc=30;
if (fcb<=120) inc=5;
break;
- case 'D': // deutsche marks (german)
+ case 'D': // deutsche marks (german, obsolete)
inc=100;
if (fcb<10000) inc=10;
if (fcb<1000) inc=5;
if (fcb<100) inc=1;
break;
+ case 'E': // Euro
+ inc = 50;
+ if(fcb < 5000) inc = 10;
+ if(fcb < 1000) inc = 5;
+ if(fcb < 500) inc = 1;
+ if(fcb < 50) inc = 0.5;
+ break;
default:
+ fprintf(stderr, "unknown currency %s\n", currency);
inc=0;
}
fcb = fcb + inc;
@@ -319,9 +327,24 @@
// strip the html tags
for (u = 0; u < buffLength; u++) {
c = stringToStrip[u];
- if (c == '<') IncludeFlag=5;
- else if (c == '>') IncludeFlag=10;
- else if (IncludeFlag==10) {
+ if (c == '<') {
+ IncludeFlag=5;
+ if(u+3<buffLength) {
+ if (stringToStrip[u+1] == 't' && \
+ stringToStrip[u+2] == 'r' && \
+ stringToStrip[u+3] == '>') {
+ Buff[BuffIdx++] = '\n';
+ u+=2;
+ } else if (stringToStrip[u+1] == 'b' && \
+ stringToStrip[u+2] == 'r' && \
+ stringToStrip[u+3] == '>') {
+ Buff[BuffIdx++] = '\n';
+ u+=2;
+ }
+ }
+ } else if (c == '>') {
+ IncludeFlag=10;
+ } else if (IncludeFlag==10) {
if ((BuffIdx > 0) && (c == ' ') &&
(Buff[BuffIdx-1] != ' ') &&
(Buff[BuffIdx-1] != '\n'))
@@ -711,7 +734,9 @@
NewAuction->stat = '0';
NewAuction->reserveMet = '0';
NewAuction->isSnipe = FALSE;
+ NewAuction->isPreBid = FALSE;
NewAuction->EndsValue = 0;
+ NewAuction->UpdTime = 0;
if (NewAuction->infourl) delete NewAuction->infourl;
if (NewAuction->infourl) delete NewAuction->bidurl;
NewAuction->infourl=NULL;
@@ -866,6 +891,9 @@
// Parse out currency and price
void parseprice(char *buf,struct auctioninfo * auc, bool isfirst) {
+ char *p = strchr(buf, ':');
+ if(p) buf = p + 1;
+
int len;
if ((buf[0]=='$') || (buf[0]=='U' && buf[1]=='S')) strcpy(auc->currency,"$");
else {
@@ -880,10 +908,8 @@
buf[len]='\0';
strip_commas(buf);
- //if (isfirst) auc->FirstBid = atof(buf);
- //else auc->CurrentBid = atof(buf);
-
auc->CurrentBid = atof(buf);
+ if (isfirst) auc->FirstBid = auc->CurrentBid;
DPRINTF(DLOW, ("buf='%s'\n", buf));
DPRINTF(DLOW, ("Price is '%.2f'/'%.2f'\n", auc->CurrentBid, auc->FirstBid));
@@ -1044,7 +1071,6 @@
isBuyItNow = 1;
reserveMet = 'b';
if (!CurrentBid && !FirstBid) {
- streamBuff.getline(LineData, 1024, '\n');
parseprice(LineData, this, TRUE);
}
break;
@@ -1059,8 +1085,6 @@
case 5: // bid count
case 22:
if (!BidCount) {
- char bc[80];
- streamBuff.getline(LineData, 1024, '\n');
DPRINTF(DLOW, ("LDBC: %s\n", LineData));
// if instead of the number of bids an item has "Purchases" and
// there was no time left in the auction the auction is not endless
@@ -1070,11 +1094,18 @@
} else if (strstr(LineData, "Winning bidders list")) {
strcpy(HighBidder, "Dutch Auction");
} else {
- for(cnt=0; (((LineData[cnt]!=' ') &&
- (LineData[cnt]!=0)) && (cnt<14)); ++cnt)
- bc[cnt] = LineData[cnt];
- bc[cnt] = 0;
- BidCount = atoi(bc);
+ scratch = strchr(LineData, ':');
+ if(scratch) {
+ int limit = strlen(scratch);
+ for ( int i=0; i < limit; i++ )
+ {
+ // strip the ':' off the currentBid;
+ scratch[i] = scratch[i + 1];
+ }
+ BidCount = atoi(scratch);
+ } else {
+ fprintf(stderr, "cannot determine BidCount: propably parser broken\n");
+ }
DPRINTF(DLOW, ("BidCount: %i\n", BidCount));
}
}
@@ -1125,6 +1156,7 @@
unsigned int count;
streamBuff.getline(LineData, 1024, '\n');
+ if (*LineData == '\0') streamBuff.getline(LineData, 1024, '\n');
strncpy(Seller, LineData, 75);
for (count=0; count < sizeof(Seller); count++)
@@ -1155,8 +1187,19 @@
case 24:
case 26: // "Buyer:"
if (!HighBidder[0]) {
+ char *p;
+ p = strchr(LineData, ':');
+ if (p) {
+ if (*(p+1) == '\0') {
+ streamBuff.getline(LineData, 1024, '\n');
+ p = LineData;
+ } else
+ p++;
+ } else {
streamBuff.getline(LineData, 1024, '\n');
- strncpy(HighBidder, LineData, 76);
+ p = LineData;
+ }
+ strncpy(HighBidder, p, 76);
for (unsigned int count=0; count < sizeof(HighBidder); count++)
{
if (HighBidder[count] == '(')
@@ -1301,9 +1344,12 @@
// now calculate the ending time in seconds and save it if the auction ended
// early due to cancel or "buy it now"
- if (ended_early == 1)
+ if (ended_early == 1) {
EndsValue = 0;
-
+ } else {
+ EndsValue = CalcEndsValue(Ends);
+ if(EndsValue < 0) EndsValue = 0;
+ }
// now We'll parse the High Bidder and Seller's ratings off their names
// and assign them to .SellerRate and .BidderRate
@@ -1677,8 +1723,21 @@
'w','x','y','z','0','1','2','3',
'4','5','6','7','8','9','+','/'
};
+
int i;
unsigned char *p = (unsigned char *)store;
+ char *src = NULL;
+
+ // s is used in triples: ensure engouh space for this
+ if(length % 3) {
+ int slen = length + 2;
+ src = (char*)malloc(slen);
+ if(src) {
+ memset(src, 0, slen);
+ memcpy(src, s, length);
+ s = src;
+ }
+ }
// Transform the 3x8 bits to 4x6 bits, as required by base64.
for (i = 0; i < length; i += 3)
@@ -1696,6 +1755,8 @@
*(p - 1) = *(p - 2) = '=';
// ...and zero-terminate it.
*p = '\0';
+
+ if(src) free(src);
}
// Create the authentication header contents for the `Basic' scheme.
diff -u -ruN -b -B -w /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/netstuff.cpp anoncvs-STABLE_1_3/netstuff.cpp
--- /usr/ports/misc/bidwatcher/work/bidwatcher-1.3.15/netstuff.cpp Mon Apr 19 20:33:30 2004
+++ netstuff.cpp Tue Aug 3 08:34:28 2004
@@ -156,10 +156,8 @@
free(hostinfo);
}
- if(proxyuser != NULL)
- delete proxyuser;
- if(proxypass != NULL)
- delete proxypass;
+ if(proxyuser != NULL) free(proxyuser);
+ if(proxypass != NULL) free(proxypass);
}
void URL::create(char *newurl,URL *proxy) {