index 06a3cd4c50f524f01893d3f8aff1b08044344c71..1ba6266852c99318f7f74d6bc3774f66bdb89e13 100644 (file)
*
* Authors:
* David Yip <yipdw@rose-hulman.edu>
+ * Bob Jamison (Pedro port)
*
* Copyright (c) 2005 Authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#ifndef __SESSION_MANAGER_H__
-#define __SESSION_MANAGER_H__
+#ifndef __INKSCAPE_WHITEBOARD_SESSION_MANAGER_H__
+#define __INKSCAPE_WHITEBOARD_SESSION_MANAGER_H__
#include <glibmm.h>
-#include <set>
-#include <bitset>
-
-#include <libxml/parser.h>
-#include <libxml/tree.h>
-#include <vector>
+#include <list>
+#include <bitset>
-extern "C" {
-#include <loudmouth/loudmouth.h>
-}
+#include "desktop.h"
-#include "jabber_whiteboard/typedefs.h"
+#include "jabber_whiteboard/pedrogui.h"
+#include "jabber_whiteboard/message-queue.h"
#include "jabber_whiteboard/defines.h"
-#include "jabber_whiteboard/buddy-list-manager.h"
+#include "jabber_whiteboard/inkboard-session.h"
#include "gc-alloc.h"
-struct SPDesktop;
-struct SPDocument;
+class SPDocument;
+class SPDesktop;
-namespace Inkscape {
-namespace XML {
-class Node;
-}
-}
namespace Inkscape {
namespace Whiteboard {
-class ReceiveMessageQueue;
-class SendMessageQueue;
-class XMLNodeTracker;
-class SessionManager;
-class MessageHandler;
-class ChatMessageHandler;
-class Callbacks;
-class SessionFile;
-class SessionFilePlayer;
-class UndoStackObserver;
-class Serializer;
-class Deserializer;
-
-/// Jabber resource name
-#define RESOURCE_NAME "Inkboard"
-
-/// connectToServer return values
-#define CONNECT_SUCCESS 0
-#define FAILED_TO_CONNECT 1
-#define INVALID_AUTH 2
-#define SSL_INITIALIZATION_ERROR 3
-
-/// sendMessage return values
-#define SEND_SUCCESS 0
-#define CONNECTION_ERROR 1
-#define UNKNOWN_OUTGOING_TYPE 2
-#define NO_RECIPIENT_JID 3
+class InkboardDocument;
+
+typedef Glib::ustring from,sessionId;
+typedef std::pair< Glib::ustring, InkboardDocument* > WhiteboardRecord;
+typedef std::vector< WhiteboardRecord, GC::Alloc< WhiteboardRecord, GC::MANUAL > > WhiteboardList;
+
+typedef std::pair< from, sessionId > Invitation;
+typedef std::list< Invitation > InvitationList;
+
+class SessionManager : public Pedro::XmppEventListener
+{
-/**
- * Structure grouping data items pertinent to a whiteboard session.
- *
- * SessionData holds all session data for both 1:1 and chatroom conferences.
- * Access to members should be controlled by first querying the status bitset
- * to see if useful data will actually exist in that member -- i.e. checking
- * status[IN_CHATROOM] to see if the chatters set will contain anything.
- * It usually won't hurt to do a straight query -- there are very few members
- * that remain uninitialized for very long -- but it's a good idea to check.
- */
-struct SessionData {
public:
- /**
- * Constructor.
- *
- * \param sm The SessionManager with which a SessionData instance should be
- * associated with.
- */
- SessionData(SessionManager *sm);
-
- ~SessionData();
-
- /**
- * The JID of the recipient: either another user JID or the JID of a chatroom.
- */
- gchar const* recipient;
-
- /**
- * Pointer to Loudmouth connection structure.
- * Used for Loudmouth calls that require it.
- */
- LmConnection* connection;
-
- /**
- * SSL information structure for SSL connections.
- */
- LmSSL* ssl;
-
- /**
- * Flag indicating whether or not we should ignore further SSL errors for a given session.
- */
- bool ignoreFurtherSSLErrors;
-
-
- /**
- * A user's handle in a Jabber chatroom.
- */
- Glib::ustring chat_handle;
-
- /**
- * The Users Jid.
- */
- Glib::ustring jid;
-
- /**
- * Name of the chatroom that a user in a chatroom is connected to.
- */
- Glib::ustring chat_name;
-
- /**
- * Name of the conference server.
- */
- Glib::ustring chat_server;
-
- // Message queues
-
- /**
- * Map associating senders to receive queues.
- */
- RecipientToReceiveQueueMap receive_queues;
-
- /**
- * Map associating senders to commit events sent by those committers.
- */
- CommitsQueue recipients_committed_queue;
-
- /**
- * Pointer to queue for messages to be sent.
- */
- SendMessageQueue* send_queue;
-
- // Message sequence numbers
-
- /**
- * The sequence number of the latest message sent by this client in a given session.
- * Used for determining the sequence number of the next message.
- */
- unsigned int sequence_number;
-
- //unsigned int latest_sent_transaction;
- //RecipientToLatestTransactionMap latest_processed_transactions;
-
-
- // Status tracking
- /**
- * Session state and status flags.
- */
- std::bitset< NUM_FLAGS > status;
-
- /**
- * Jabber buddy list data.
- */
- BuddyListManager buddyList;
-
- /**
- * List of participants in a Jabber chatroom.
- */
- ChatterList chatters;
-
- /**
- * Session file filename; blank if no session file is to be
- * recorded.
- */
- Glib::ustring sessionFile;
-private:
- // access to containing class
- SessionManager *_sm;
+ SessionManager();
- // noncopyable, nonassignable
- SessionData(SessionData const&);
- SessionData& operator=(SessionData const&);
-};
+ virtual ~SessionManager();
-// TODO: This class is huge. It might be best to refactor it into smaller,
-// more coherent chunks.
-//
-// TODO: convert to pass-by-reference where appropriate. In particular, a lot of the
-// string buffers passed to methods in the argument list can be made into references
-// appropriately and easily.
+ static void showClient();
+ static SessionManager& instance();
+
+ virtual Pedro::XmppClient &getClient()
+ { return gui.client; }
+
+ /**
+ * Handles all incoming XMPP events associated with this document
+ * apart from CONNECT_REQUEST, which is handled in SessionManager
+ */
+ virtual void processXmppEvent(const Pedro::XmppEvent &event);
+
+
+ /**
+ * Initiates a shared session with a user or conference room.
+ *
+ * \param to The recipient to which this desktop will be linked, specified as a JID.
+ * \param type Type of the session; i.e. private message or group chat.
+ */
+ virtual void initialiseSession(Glib::ustring const& to, State::SessionType type);
+
+ /**
+ * Terminates an Inkboard session to a given recipient. If the session to be
+ * terminated does not exist, does nothing.
+ *
+ * \param sessionId The session identifier to be terminated.
+ */
+ virtual void terminateSession(Glib::ustring const& sessionId);
+
+ /**
+ * Adds a session to whiteboard
+ *
+ * \param sessionId The session identifier to be terminated.
+ */
+ virtual void addSession(WhiteboardRecord whiteboard);
+
+ /**
+ * Locates an Inkboard session by recipient JID.
+ *
+ * \param to The recipient JID identifying the session to be located.
+ * \return A pointer to the InkboardDocument associated with the Inkboard session,
+ * or NULL if no such session exists.
+ */
+ InkboardDocument* getInkboardSession(Glib::ustring const& to);
-/**
- * Session management class for Inkboard.
- *
- * By "session management", we refer to the management of all events that an Inkboard
- * session may need to handle: negotiating a connection to a Jabber server, negotiating
- * sessions with users and chatrooms, sending, receiving, and parsing messages, and so
- * forth.
- *
- * SessionManager instances are associated with Inkscape desktop objects on a 1:1 basis.
- */
-class SessionManager {
-public:
- /**
- * Constructor.
- *
- * \param desktop The desktop with which this SessionManager is associated. */
- SessionManager(::SPDesktop *desktop);
- ~SessionManager();
-
- // Session tracking data
-
- /**
- * Pointer to SessionData structure.
- */
- struct SessionData *session_data;
-
- // Inkscape interface
-
- /**
- * Set the desktop with which this SessionManager is associated.
- *
- * @param desktop the desktop with which this SessionManager should be associated
- */
- void setDesktop(::SPDesktop* desktop);
-
- // Session management
-
- /**
- * Connect to a Jabber server.
- *
- * @param server Jabber server URL
- * @param username Jabber username
- * @param pw password for Jabber account
- * @param usessl use SSL for connection
- *
- * @return CONNECT_SUCCESS if connection successful; FAILED_TO_CONNECT if connection failed or INVALID_AUTH
- * if authentication invalid
- */
- int connectToServer(Glib::ustring const& server, Glib::ustring const& port, Glib::ustring const& username, Glib::ustring const& pw, bool usessl);
-
- /**
- * Register with a Jabber server.
- *
- * @param username Jabber username
- * @param pw password for Jabber account
- * @param key A list of string elements required for registration
- * @param val The respective list of value of elements required for registration
- * @param usessl use SSL for connection
- *
- * @return CONNECT_SUCCESS if connection successful; FAILED_TO_CONNECT if connection failed or INVALID_AUTH
- * if authentication invalid
- */
- int registerWithServer(Glib::ustring const& username,Glib::ustring const& pw, std::vector<Glib::ustring> key, std::vector<Glib::ustring> val);
-
- /**
- * Query the Registration information required for a jabber server
- *
- * @param server Jabber server URL
- * @param username Jabber username
- * @param pw password for Jabber account
- * @param key A list of string elements required for registration
- * @param val The respective list of value of elements required for registration
- * @param usessl use SSL for connection
- *
- * @return CONNECT_SUCCESS if connection successful; FAILED_TO_CONNECT if connection failed or INVALID_AUTH
- * if authentication invalid
- */
- std::vector<Glib::ustring> getRegistrationInfo();
-
- int finaliseConnection();
- int initializeConnection(Glib::ustring const& server, Glib::ustring const& port, bool usessl);
- /**
- * Handle an SSL error by prompting the user for feedback, and continuing or aborting the connection
- * process based on that feedback.
- *
- * @param ssl pointer to LmSSL structure
- * @param status The error message
- *
- * @return LM_SSL_RESPONSE_CONTINUE if user wishes to continue establishing the connection or LM_SSL_RESPONSE_STOP if user wishes to abort connection
- */
- LmSSLResponse handleSSLError(LmSSL* ssl, LmSSLStatus status);
-
- /**
- * Disconnect from a Jabber server.
- *
- * This invokes disconnectFromDocument().
- *
- * \see Inkscape::Whiteboard::SessionManager::disconnectFromDocument
- */
- void disconnectFromServer();
-
- /**
- * Disconnect from a document session. The connection to the Jabber server is not
- * broken, and may be reused to connect to a new document session.
- *
- */
- void disconnectFromDocument();
-
- /**
- * Perform session teardown. This method by itself does not disconnect from a document or
- * a Jabber server.
- *
- */
- void closeSession();
-
- /**
- * Set the recipient for Inkboard messages.
- *
- * @param recipientJID the recipient's JID
- */
- void setRecipient(char const* recipientJID);
-
- // Message sending utilities
-
- /**
- * Put an Inkboard message into the send queue.
- * This method does not actually send anything to an Inkboard client.
- *
- * \see Inkscape::Whiteboard::SessionManager::sendMessage
- *
- *
- * @param msg the message to send
- * @param type the type of message (only CHANGE_* types permitted)
- * @param chatroom whether or not this message is destined for a chatroom
- */
- void sendChange(Glib::ustring const& msg, MessageType type, std::string const& recipientJID, bool chatroom);
-
- /**
- * Send a message to an Inkboard client.
- *
- *
- * @param msgtype the type of message to send
- * @param sequence message sequence number
- * @param msg the message to send
- * @param recipientJID the JID of the recipient
- * @param chatroom whether or not this message is destined for a chatroom
- *
- * @return SEND_SUCCESS if successful; otherwise: UNKNOWN_OUTGOING_TYPE if msgtype is not recognized, NO_RECIPIENT_JID if recipientJID is NULL or blank, CONNECTION_ERROR if Jabber connection error occurred
- */
- int sendMessage(MessageType msgtype, unsigned int sequence, Glib::ustring const& msg, char const* recipientJID, bool chatroom);
-
- /**
- * Inform the user of a connection error via a Gtk::MessageDialog.
- *
- * @param errmsg message to display
- */
- void connectionError(Glib::ustring const& errmsg);
-
- /**
- * Stream the contents of the document with which this SessionManager is associated with to the given recipient.
- *
- * @param recipientJID the JID of the recipient
- * @param newidsbuf buffer to store IDs of new nodes
- * @param newnodesbuf buffer to store address of new nodes
- */
- void resendDocument(char const* recipientJID, KeyToNodeMap& newidsbuf, NodeToKeyMap& newnodesbuf);
-
-
- /**
- * Send a connection request to another Inkboard client.
- *
- *
- * @param recipientJID the JID to connect to
- * @param document document message to send
- */
- void sendRequestToUser(std::string const& recipientJID);
-
- /**
- * Send a connection request to chatroom.
- *
- * @param server server to connect to
- * @param chatroom name of chatroom
- * @param handle chatroom handle to use
- * @param password chatroom password; leave NULL if no password
- */
- void sendRequestToChatroom(Glib::ustring const& server, Glib::ustring const& chatroom, Glib::ustring const& handle, Glib::ustring const& password);
-
- /**
- * Send a connection request response to a user who requested to connect to us.
- *
- * @param requesterJID the JID of the user whom sent us the request
- * @param accepted_request whether or not we accepted the request
- */
- void sendConnectRequestResponse(char const* requesterJID, gboolean accepted_request);
-
- /**
- * Method called when a connection request is received. This method produces a dialog
- * that asks the user whether or not s/he would like to accept the request.
- *
- *
- * @param requesterJID the JID of the user whom sent us the request
- * @param msg the message associated with this request
- */
- void receiveConnectRequest(gchar const* requesterJID);
-
- /**
- * Method called when a response to a connection request is received.
- * This method performs any necessary session setup/teardown and user notification
- * depending on the response received.
- *
- *
- * @param msg the message associated with this request
- * @param response the response code
- * @param sender the JID of the user whom responded to our request
- */
- void receiveConnectRequestResponse(InvitationResponses response, std::string& sender);
-
- /**
- * Method called when a document synchronization request is received from a new conference
- * member in a chatroom.
- *
- * \param recipient the recipient JID
- */
- void receiveConnectRequestResponseChat(gchar const* recipient);
-
- // Message parsing and passing
-
- /**
- * Processes a group of document change messages.
- *
- * \param changemsg The change message group to process.
- */
- void receiveChange(Glib::ustring const& changemsg);
-
- // Logging and session file handling
- /**
- * Start a session log with the given filename.
- *
- * \param filename Full path to the file that the session log should be written to.
- * \throw Glib::FileError Thrown if an exception is thrown during session file creation.
- */
- void startLog(Glib::ustring filename);
-
- /**
- * Load a session file for playback.
- *
- * \param filename Full path to the session file that is to be loaded.
- */
- void loadSessionFile(Glib::ustring filename);
-
- /**
- * Returns whether or not the session is in session file playback mode.
- *
- * \return Whether or not the session is in session file playback mode.
- */
- bool isPlayingSessionFile();
-
- // User event notification
-
- /**
- * Method to notify the user that a whiteboard session to another user has been successfully
- * established.
- *
- * \param JID The JID with whom the user established a session.
- */
- void userConnectedToWhiteboard(gchar const* JID);
-
- /**
- * Method to notify the user that the other user in a user-to-user whiteboard session
- * has disconnected.
- *
- * \param JID The JID of the user who left the whiteboard session.
- */
- void userDisconnectedFromWhiteboard(std::string const& JID);
-
- // Queue dispatching and UI setup
-
- /**
- * Start the send queue for this session.
- */
- void startSendQueueDispatch();
-
- /**
- * Stop the send queue for this session.
- */
- void stopSendQueueDispatch();
-
- /**
- * Start the receive queue for this session.
- */
- void startReceiveQueueDispatch();
-
- /**
- * Stop the receive queue for this session.
- */
- void stopReceiveQueueDispatch();
-
- /**
- * Clear all layers, definitions, and metadata from the document with which a
- * SessionManager instance is associated.
- *
- * Documents are cleared to assist synchronization between two clients
- * or a client and a chatroom.
- */
- void clearDocument();
-
- /**
- * Set up objects for handling actions generated by the user interacting with
- * Inkscape. This includes marking the active session as being in a whiteboard session,
- * starting send and receive queues, and creating an event serializer and deserializer.
- *
- * \see Inkscape::Whiteboard::SendMessageQueue
- * \see Inkscape::Whiteboard::ReceiveMessageQueue
- * \see Inkscape::Whiteboard::Serializer
- * \see Inkscape::Whiteboard::Deserializer
- */
- void setupInkscapeInterface();
-
- /**
- * Reset whiteboard verbs to INITIAL state.
- */
- void setInitialVerbSensitivity() {
- this->_setVerbSensitivity(INITIAL);
- }
-
- /**
- * Set up the event commit listener.
- *
- * The event commit listener watches for events that are committed to the document's undo log,
- * serializes those events, and then adds them to the message send queue.
- *
- * \see Inkscape::Whiteboard::SendMessageQueue
- * \see Inkscape::Whiteboard::UndoStackObserver
- */
- void setupCommitListener();
-
- // Private object retrieval
- ::SPDesktop* desktop();
- ::SPDocument* document();
- Callbacks* callbacks();
- Whiteboard::UndoStackObserver* undo_stack_observer();
- Serializer* serializer();
- XMLNodeTracker* node_tracker();
- Deserializer* deserializer();
- ChatMessageHandler* chat_handler();
- SessionFilePlayer* session_player();
- SessionFile* session_file();
+
+ void operator=(XmppEventListener const& other) {}
private:
- // Internal logging methods
- void _log(Glib::ustring const& message);
- void _commitLog();
- void _closeLog();
- void _tryToStartLog();
-
- enum SensitivityMode {
- INITIAL,
- ESTABLISHED_CONNECTION,
- ESTABLISHED_SESSION,
- DISCONNECTED_FROM_SESSION
- };
-
- void _setVerbSensitivity(SensitivityMode mode);
-
- bool _pollReceiveConnectRequest(Glib::ustring const recipient);
-
- ::SPDesktop* _myDesktop;
- ::SPDocument* _myDoc;
- Whiteboard::UndoStackObserver* _myUndoObserver;
- XMLNodeTracker* _myTracker;
- ChatMessageHandler* _myChatHandler;
- Callbacks* _myCallbacks;
- SessionFile* _mySessionFile;
- SessionFilePlayer* _mySessionPlayer;
- MessageHandler* _myMessageHandler;
- Serializer* _mySerializer;
- Deserializer* _myDeserializer;
-
- sigc::connection _send_queue_dispatcher;
- sigc::connection _receive_queue_dispatcher;
- sigc::connection _notify_incoming_request;
-
- // noncopyable, nonassignable
- SessionManager(SessionManager const&);
- SessionManager& operator=(SessionManager const&);
+
+ Pedro::PedroGui gui;
+ WhiteboardList whiteboards;
+ InvitationList invitations;
+ sigc::connection CheckPendingInvitations;
+
+ void processWhiteboardEvent(Pedro::XmppEvent const& event);
+
+ void handleIncomingInvitation(Invitation invitation);
+
+ bool checkInvitationQueue();
+
+ char* createSessionId(int size);
+
};
-}
+SPDocument* makeInkboardDocument(int code, gchar const* rootname, State::SessionType type, Glib::ustring const& to);
+SPDesktop* makeInkboardDesktop(SPDocument* doc);
+
+} // namespace Whiteboard
-}
+} // namespace Inkscape
-#endif
+#endif /* __SESSION_MANAGER_H__ */
/*
Local Variables: