summaryrefslogtreecommitdiffstats
path: root/src/jabber_whiteboard/message-queue.h
diff options
context:
space:
mode:
authorMenTaLguY <mental@rydia.net>2006-01-16 02:36:01 +0000
committermental <mental@users.sourceforge.net>2006-01-16 02:36:01 +0000
commit179fa413b047bede6e32109e2ce82437c5fb8d34 (patch)
treea5a6ac2c1708bd02288fbd8edb2ff500ff2e0916 /src/jabber_whiteboard/message-queue.h
downloadinkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.tar.gz
inkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.zip
moving trunk for module inkscape
(bzr r1)
Diffstat (limited to 'src/jabber_whiteboard/message-queue.h')
-rw-r--r--src/jabber_whiteboard/message-queue.h177
1 files changed, 177 insertions, 0 deletions
diff --git a/src/jabber_whiteboard/message-queue.h b/src/jabber_whiteboard/message-queue.h
new file mode 100644
index 000000000..e607ed81b
--- /dev/null
+++ b/src/jabber_whiteboard/message-queue.h
@@ -0,0 +1,177 @@
+/**
+ * Whiteboard message queue
+ *
+ * Authors:
+ * David Yip <yipdw@rose-hulman.edu>
+ *
+ * Copyright (c) 2005 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifndef __WHITEBOARD_MESSAGE_QUEUE_H__
+#define __WHITEBOARD_MESSAGE_QUEUE_H__
+
+#include <list>
+#include <map>
+
+#include "gc-alloc.h"
+
+#include "gc-managed.h"
+
+#include "util/list-container.h"
+
+namespace Inkscape {
+
+namespace Whiteboard {
+
+class SessionManager;
+class MessageNode;
+
+/// Definition of the basic message node queue
+typedef std::list< MessageNode*, GC::Alloc< MessageNode*, GC::MANUAL > > MessageQueueBuffer;
+
+/**
+ * MessageQueue interface.
+ *
+ * A message queue is used to queue up document change messages for sending and receiving.
+ *
+ * Message queues exist to allow us to send/process messages at a given rate rather than
+ * immediately: this allows us to avoid flooding Jabber servers and clients.
+ *
+ * Only one message queue should be created per sender. Message queues store MessageNodes.
+ *
+ * \see Inkscape::Whiteboard::MessageNode
+ */
+class MessageQueue {
+public:
+ /**
+ * Constructor.
+ *
+ * \param sm The SessionManager to associate this MessageQueue with.
+ */
+ MessageQueue(SessionManager *sm);
+ virtual ~MessageQueue();
+
+ /**
+ * Retrieve the MessageNode at the front of the queue.
+ */
+ MessageNode* first();
+
+ /**
+ * Remove the element at the front of the queue.
+ */
+ void popFront();
+
+ /**
+ * Get the size of the queue.
+ *
+ * \return The size of the queue.
+ */
+ unsigned int size();
+
+ /**
+ * Returns whether or not the queue is empty.
+ *
+ * \return Whether or not the queue is empty.
+ */
+ bool empty();
+
+ /**
+ * Clear the queue.
+ */
+ void clear();
+
+ /**
+ * The insertion method. The insertion procedure must be defined
+ * by a subclass.
+ *
+ * \param msg The MessageNode to insert.
+ */
+ virtual void insert(MessageNode* msg) = 0;
+
+protected:
+ /**
+ * Implementation of the queue.
+ */
+ MessageQueueBuffer _queue;
+
+ /**
+ * Pointer to SessionManager.
+ */
+ SessionManager* _sm;
+};
+
+
+/**
+ * MessageQueue subclass designed to queue up received messages.
+ * Received messages are dispatched for processing on a periodic basis by a timeout.
+ *
+ * \see Inkscape::Whiteboard::Callbacks::dispatchReceiveQueue
+ */
+class ReceiveMessageQueue : public MessageQueue, public GC::Managed<> {
+public:
+ ReceiveMessageQueue(SessionManager* sm);
+
+ /**
+ * Insert a message into the queue.
+ * Late messages (out-of-sequence messages) will be discarded.
+ *
+ * \param msg The message node to insert.
+ */
+ void insert(MessageNode* msg);
+
+ /**
+ * Insert a message into the deferred queue.
+ * The deferred message queue is used for messages that are not discarded,
+ * but cannot yet be processed due to missing dependencies.
+ *
+ * \param msg The message node to insert.
+ */
+ void insertDeferred(MessageNode* msg);
+
+ /**
+ * Update the latest processed packet count for this message queue.
+ *
+ * \param seq The sequence number of the latest processed packet.
+ */
+ void setLatestProcessedPacket(unsigned int seq);
+private:
+ MessageQueueBuffer _deferred;
+ unsigned int _latest;
+};
+
+/**
+ * MessageQueue subclass designed to queue up messages for sending.
+ * Messages in this queue are dispatched on a periodic basis by a timeout.
+ *
+ * \see Inkscape::Whiteboard::Callbacks::dispatchSendQueue
+ */
+class SendMessageQueue : public MessageQueue {
+public:
+ SendMessageQueue(SessionManager* sm);
+
+ /**
+ * Insert a message into the queue.
+ *
+ * \param msg The message node to insert.
+ */
+ void insert(MessageNode* msg);
+};
+
+}
+
+}
+
+#endif
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :