/* rateclass.h - Oscar Rate Limiting Implementation Copyright (c) 2004 by Tom Linsky Copyright (c) 2004 by Matt Rogers ************************************************************************* * * * 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. * * * ************************************************************************* */ #ifndef RATECLASS_H #define RATECLASS_H #include "oscartypes.h" #include #include #include #include const int RATE_SAFETY_TIME = 50; struct SnacPair { int family; int subtype; }; class Transfer; class RateClass : public TQObject { Q_OBJECT public: RateClass( TQObject* parent = 0 ); ~RateClass(); /** Accessor for classid */ Oscar::WORD id() const; /** Sets rate information */ void setRateInfo( Oscar::RateInfo newRateInfo ); /** Add a SNAC to the rate class */ void addMember( const Oscar::SNAC& s ); /** Adds rate class members */ void addMember( Oscar::WORD family, Oscar::WORD subtype ); /** Tells whether the passed snac is a member of this rate class */ bool isMember( const Oscar::SNAC& s ) const; /** * Tells whether the passed family and subtype combo is a member * of this rate class */ bool isMember( Oscar::WORD family, Oscar::WORD subtype ) const; /** Add a packet to the queue */ void enqueue( Transfer* ); /** Takes a packet off the front of the queue */ void dequeue(); /** Check if the queue is empty */ bool queueIsEmpty() const; /** * Calulate the time until we can send again * Uses the first packet on the queue to determine the time since that's * the packet that will get sent. * \return the time in milliseconds that we need to wait */ int timeToNextSend(); /** * Calulate the time until we get to initial level * \return the time in milliseconds that we need to wait */ int timeToInitialLevel(); /** * Calculates a new rate level and updates the rate class' current level * to match */ void updateRateInfo(); /** * Dump the current packet queue. These packets will not be sent. Used * on disconnection */ void dumpQueue(); signals: /** Tell the rate class manager we're ready to send */ void dataReady( Transfer* ); private: /** Calculate our new rate level */ Oscar::DWORD calcNewLevel( int timeDifference ) const; /** sets up the timer for the transfer just added to the queue */ void setupTimer(); private slots: /** * Send the packet. Basically emits dataReady for the first transfer */ void slotSend(); private: Oscar::RateInfo m_rateInfo; TQValueList m_members; TQValueList m_packetQueue; TQTime m_packetTimer; // we are waiting for the TQTimer::singleShot() to send bool m_waitingToSend; }; #endif //kate: tab-width 4; indent-mode csands;