diff options
Diffstat (limited to 'protocols/IcqOscarJ/src/icq_rates.h')
-rw-r--r-- | protocols/IcqOscarJ/src/icq_rates.h | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/protocols/IcqOscarJ/src/icq_rates.h b/protocols/IcqOscarJ/src/icq_rates.h new file mode 100644 index 0000000000..ab16e74007 --- /dev/null +++ b/protocols/IcqOscarJ/src/icq_rates.h @@ -0,0 +1,146 @@ +// ---------------------------------------------------------------------------80
+// ICQ plugin for Miranda Instant Messenger
+// ________________________________________
+//
+// Copyright © 2000-2001 Richard Hughes, Roland Rabien, Tristan Van de Vreede
+// Copyright © 2001-2002 Jon Keating, Richard Hughes
+// Copyright © 2002-2004 Martin Öberg, Sam Kothari, Robert Rainwater
+// Copyright © 2004-2010 Joe Kucera
+//
+// 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.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+//
+// -----------------------------------------------------------------------------
+// DESCRIPTION:
+//
+// Rate management
+//
+// -----------------------------------------------------------------------------
+#ifndef __ICQ_RATES_H
+#define __ICQ_RATES_H
+
+#define MAX_RATES_GROUP_COUNT 5
+
+struct rates_group
+{
+ DWORD dwWindowSize;
+ DWORD dwClearLevel;
+ DWORD dwAlertLevel;
+ DWORD dwLimitLevel;
+ DWORD dwMaxLevel;
+ // current level
+ int rCurrentLevel;
+ int tCurrentLevel;
+ // links
+ WORD *pPairs;
+ int nPairs;
+};
+
+struct rates : public MZeroedObject
+{
+private:
+ CIcqProto *ppro;
+ int nGroups;
+ rates_group groups[MAX_RATES_GROUP_COUNT];
+
+ rates_group *getGroup(WORD wGroup);
+public:
+ rates(CIcqProto *ppro, BYTE *pBuffer, WORD wLen);
+ ~rates();
+
+ WORD getGroupFromSNAC(WORD wFamily, WORD wCommand);
+ WORD getGroupFromPacket(icq_packet *pPacket);
+
+ int getLimitLevel(WORD wGroup, int nLevel);
+ int getDelayToLimitLevel(WORD wGroup, int nLevel);
+ int getNextRateLevel(WORD wGroup);
+
+ void packetSent(icq_packet *pPacket);
+ void updateLevel(WORD wGroup, int nLevel);
+
+ void initAckPacket(icq_packet *pPacket);
+};
+
+#define RML_CLEAR 0x01
+#define RML_ALERT 0x02
+#define RML_LIMIT 0x03
+#define RML_IDLE_10 0x10
+#define RML_IDLE_30 0x11
+#define RML_IDLE_50 0x12
+#define RML_IDLE_70 0x13
+
+// Rates - Level 2
+
+// queue types
+#define RQT_DEFAULT 0 // standard - pushes all items without much delay
+#define RQT_REQUEST 1 // request - pushes only first item on duplicity
+#define RQT_RESPONSE 2 // response - pushes only last item on duplicity
+
+//
+// generic queue item
+//
+struct rates_queue_item : public MZeroedObject
+{
+ friend struct rates_queue;
+protected:
+ CIcqProto *ppro;
+ BOOL bCreated;
+ WORD wGroup;
+
+ virtual BOOL isEqual(rates_queue_item *pItem);
+ virtual rates_queue_item* copyItem(rates_queue_item *pDest = NULL);
+public:
+ rates_queue_item(CIcqProto *ppro, WORD wGroup);
+ virtual ~rates_queue_item();
+
+ BOOL isOverRate(int nLevel);
+
+ virtual void execute();
+
+ HANDLE hContact;
+ DWORD dwUin;
+ char *szUid;
+};
+
+struct rates_queue;
+typedef void (rates_queue::*IcqRateFunc)(void);
+
+//
+// generic item queue (FIFO)
+//
+struct rates_queue : public MZeroedObject
+{
+private:
+ CIcqProto *ppro;
+ const char *szDescr;
+ icq_critical_section *listsMutex; // we need to be thread safe
+ int pendingListSize;
+ rates_queue_item **pendingList;
+ int duplicates;
+protected:
+ void cleanup();
+ void processQueue();
+ void initDelay(int nDelay, IcqRateFunc delaycode);
+public:
+ rates_queue(CIcqProto *ppro, const char *szDescr, int nLimitLevel, int nWaitLevel, int nDuplicates = 0);
+ ~rates_queue();
+
+ void putItem(rates_queue_item *pItem, int nMinDelay);
+
+ int limitLevel; // RML_*
+ int waitLevel;
+};
+
+
+#endif /* __ICQ_RATES_H */
|