You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
konversation/konversation/src/ircqueue.h

139 lines
4.1 KiB

/*
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) version 2.
*/
/*
Copyright (C) 2008 Eli J. MacKenzie <argonel at gmail.com>
*/
#ifndef IRCQUEUE_H
#define IRCQUEUE_H
class Server;
//channel.cpp, outputfilter.cpp, query.cpp, server.cpp, statuspanel.cpp
/**
* A message from or to an IRC server.
*
* Contains all we know about the message, which currently consists of the text, the time it was created,
* and its original encoding. (Since currently these objects are only used internally, we know the message
* is Unicode.)
*/
struct IRCMessage
{
IRCMessage() : t(TQTime::currentTime()) //, codec(TQTextCodec::codecForName("utf8"))
{} ///< this constructor required for TQValueList, do not use
/**
Make a new IRCMessage with timestamp of TQTime::currentTime().
Note the constructor takes a TQString, not a const TQString& or a TQString *. If you want to modify the
contained text, put it back with setText.
*/
IRCMessage(TQString i) : s(i), t(TQTime::currentTime()) //, codec(TQTextCodec::codecForName("utf8"))
{}
TQString text() { return s; }
int age() { return t.elapsed(); }
TQTime time() { return t; }
void setText(TQString text) { s=text; }
private:
TQString s;
TQTime t;
//FIXME wire this up
//TQTextCodec* codec;
//operator const char * () const { return codec->fromUnicode(text()); }
};
/**
* Provides a self-sending queue of IRCMessages.
*
* Messages enqueued in this server can only be erased via reset() or sent to the attached server.
* The server and the emptying rates cannot be changed, if you want to do that construct a new queue.
*/
class IRCQueue: public TQObject
{
TQ_OBJECT
public:
struct EmptyingRate
{
enum RateType {
Lines, ///< Lines per interval.
Bytes ///< Bytes per interval. Not implemented. FIXME
};
EmptyingRate(int rate=6, int msec_interval=50000, RateType type=Lines):
m_rate(rate), m_interval(msec_interval), m_type(type)
{
}
int nextInterval(int byte_size, int msec_since_last);
int m_rate;
int m_interval;
RateType m_type;
bool isValid() { return m_rate > 0; }
};
IRCQueue(Server *server, EmptyingRate& rate, int myindex=0);
~IRCQueue();
void enqueue(TQString line);
void reset();
EmptyingRate& getRate();// { return &m_rate; }
bool isValid() { return m_rate.isValid(); }
bool isEmpty() { return m_pending.isEmpty(); }
//WTF? why are there two of these.
//These are decoupled for a reason, what is it?
int currentWait(); ///< Time in ms that the front has been waiting
int elapsed(); ///< How long has the queue been running since it was last started?
int nextSize(); ///< Current size of front
int pendingMessages() { return m_pending.count(); }
int linesSent() const; ///< count of lines sent by this queue
int bytesSent() const; ///< count of bytes sent by this queue
///Time in milliseconds that the previous message waited
int lastWait() { return m_lastWait; }
public slots:
void sent(int bytes, int encodedBytes, IRCQueue *); ///< feedback statistics
void sendNow(); ///< dumps a line to the socket
void serverOnline(bool on); ///< server tells us that the socket is ready
protected:
TQString pop(); ///< pops front, sets statistics
void adjustTimer(); ///< sets the next timer interval
bool doSend(); ///< pops front and tells the server to send it. returns true if we sent something
EmptyingRate& m_rate;
private:
TQValueList<IRCMessage> m_pending;
TQTimer *m_timer;
bool m_blocked;
bool m_online;
Server *m_server;
TQTime m_startedAt;
TQTime m_lastSent, m_globalLastSent;
int m_linesSent, m_globalLinesSent;
int m_bytesSent, m_globalBytesSent;
int m_lastWait;
int m_myIndex;
};
extern IRCQueue::EmptyingRate staticrates[];
#endif