Code

fix include
[inkscape.git] / src / pedro / pedroxmpp.h
index 447df7868e06c5906ef1aa6d1e97e16d87a7c4a6..ee3234fd4a69e8778c3ab9bd3c6333637102ec74 100644 (file)
@@ -6,7 +6,7 @@
  * Authors:
  *   Bob Jamison
  *
- * Copyright (C) 2005 Bob Jamison
+ * Copyright (C) 2005-2007 Bob Jamison
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,9 @@
  */
 
 #include <stdio.h>
+#include <glib.h>
 #include <vector>
+#include <map>
 
 #include <string>
 
@@ -132,6 +134,13 @@ public:
      */
     static const int EVENT_DISCONNECTED         = 11;
 
+    /**
+     *  Client has begun speaking to the server in SSL.  This is usually
+     *  emitted just before EVENT_CONNECTED,  since authorization has not
+     *  yet taken place.
+     */
+    static const int EVENT_SSL_STARTED          = 12;
+
     /**
      *  Client has successfully registered a new account on a server.
      *  The server is in getFrom(), the user in getTo()
@@ -139,10 +148,10 @@ public:
     static const int EVENT_REGISTRATION_NEW     = 20;
 
     /**
-     *  Client has successfully modified an existing account on a server.
+     *  Client has successfully changed the password of an existing account on a server.
      *  The server is in getFrom(), the user in getTo()
      */
-    static const int EVENT_REGISTRATION_MODIFY  = 21;
+    static const int EVENT_REGISTRATION_CHANGE_PASS  = 21;
 
     /**
      *  Client has successfully cancelled an existing account on a server.
@@ -245,32 +254,32 @@ public:
     static const int EVENT_FILE_RECEIVE         = 61;
 
     /**
-     *
+     *  Constructs an event with one of the types above.
      */
     XmppEvent(int type);
 
     /**
-     *
+     *  Copy constructor
      */
     XmppEvent(const XmppEvent &other);
 
     /**
-     *
+     *  Assignment
      */
     virtual XmppEvent &operator=(const XmppEvent &other);
 
     /**
-     *
+     *  Destructor
      */
     virtual ~XmppEvent();
 
     /**
-     *
+     *  Assignment
      */
     virtual void assign(const XmppEvent &other);
 
     /**
-     *
+     *  Return the event type.
      */
     virtual int getType() const;
 
@@ -470,37 +479,48 @@ private:
 };
 
 
+
+
+
+
 //########################################################################
 //# X M P P    E V E N T    L I S T E N E R
 //########################################################################
 
+/**
+ * Class that receives and processes an XmppEvent.  Users should inherit
+ * from this class, and overload processXmppEvent() to perform their event
+ * handling
+ */
 class XmppEventListener
 {
 public:
 
     /**
-     *
+     *  Constructor  
      */
     XmppEventListener()
         {}
 
     /**
-     *
+     *  Assignment
      */
-    XmppEventListener(const XmppEventListener &other)
+    XmppEventListener(const XmppEventListener &/*other*/)
         {}
 
 
     /**
-     *
+     * Destructor
      */
     virtual ~XmppEventListener()
         {}
 
     /**
-     *
+     *  Overload this method to provide your application-specific
+     *  event handling.  Use event.getType() to decide what to do
+     *  with the event.
      */
-    virtual void processXmppEvent(const XmppEvent &event)
+    virtual void processXmppEvent(const XmppEvent &/*event*/)
         {}
 
 };
@@ -511,22 +531,30 @@ public:
 //# X M P P    E V E N T    T A R G E T
 //########################################################################
 
+/**
+ * A base class for classes that emit XmppEvents.
+ *
+ * Note: terminology: 'target' is the common term for this, although it
+ * seems odd that a 'target' is the source of the events.  It is clearer
+ * if you consider that the greater system targets this class with events,
+ * and this class delegates the handling to its listeners.
+ */
 class XmppEventTarget
 {
 public:
 
     /**
-     *
+     * Constructor
      */
     XmppEventTarget();
 
     /**
-     *
+     *  Copy constructor
      */
     XmppEventTarget(const XmppEventTarget &other);
 
     /**
-     *
+     * Destructor
      */
     virtual ~XmppEventTarget();
 
@@ -539,50 +567,59 @@ public:
     /**
      * Send an error message to all subscribers
      */
-    void error(char *fmt, ...);
+    void error(const char *fmt, ...) G_GNUC_PRINTF(2,3);
 
 
     /**
      * Send a status message to all subscribers
      */
-    void status(char *fmt, ...);
+    void status(const char *fmt, ...) G_GNUC_PRINTF(2,3);
 
     //###########################
     //# LISTENERS
     //###########################
 
     /**
-     *
-     */
-    virtual void dispatchXmppEvent(const XmppEvent &event);
-
-    /**
-     *
+     *  Subscribe a subclass of XmppEventListener to this target's events.
      */
     virtual void addXmppEventListener(const XmppEventListener &listener);
 
     /**
-     *
+     *  Unsubscribe a subclass of XmppEventListener from this target's events.
      */
     virtual void removeXmppEventListener(const XmppEventListener &listener);
 
     /**
-     *
+     *  Remove all event subscribers
      */
     virtual void clearXmppEventListeners();
 
     /**
-     *
+     *  This sends an event to all registered listeners.
+     */
+    virtual void dispatchXmppEvent(const XmppEvent &event);
+
+    /**
+     *  By enabling this, you provide an alternate way to get XmppEvents.
+     *  Any event sent to dispatchXmppEvent() is also sent to this queue,
+     *  so that it can be later be picked up by eventQueuePop();
+     *  This can sometimes be good for GUI's which can't always respond
+     *  repidly or asynchronously.
      */
     void eventQueueEnable(bool val);
 
     /**
-     *
+     *  Return true if there is one or more XmppEvents waiting in the event
+     *  queue.  This is used to avoid calling eventQueuePop() when there is
+     *  nothing in the queue.
      */
     int eventQueueAvailable();
 
     /**
-     *
+     *  Return the next XmppEvent in the queue.  Users should check that
+     *  eventQueueAvailable() is greater than 0 before calling this.  If
+     *  people forget to do this, an event of type XmppEvent::EVENT_NONE
+     *  is generated and returned.
      */
     XmppEvent eventQueuePop();
 
@@ -593,10 +630,6 @@ private:
 
     std::vector<XmppEvent> eventQueue;
     bool eventQueueEnabled;
-
-    static const int targetWriteBufLen = 2048;
-
-    char targetWriteBuf[targetWriteBufLen];
 };
 
 
@@ -607,12 +640,16 @@ private:
 //# X M P P    C L I E N T
 //########################################################################
 
-
+//forward declarations
 class TcpSocket;
 class XmppChat;
 class XmppGroupChat;
 class XmppStream;
 
+
+/**
+ *  This is the actual XMPP (Jabber) client.
+ */
 class XmppClient : public XmppEventTarget
 {
 
@@ -623,22 +660,22 @@ public:
     //###########################
 
     /**
-     *
+     * Constructor
      */
     XmppClient();
 
     /**
-     *
+     *  Copy constructor
      */
     XmppClient(const XmppClient &other);
 
     /**
-     *
+     *  Assignment
      */
     void assign(const XmppClient &other);
 
     /**
-     *
+     * Destructor
      */
     virtual ~XmppClient();
 
@@ -648,12 +685,14 @@ public:
     //###########################
 
     /**
-     *
+     *  Pause execution of the app for a given number of
+     *  milliseconds.  Use this rarely, only when really needed.
      */
     virtual bool pause(unsigned long millis);
 
     /**
-     *
+     *  Process a string so that it can safely be
+     *  placed in XML as PCDATA
      */
     DOMString toXml(const DOMString &str);
 
@@ -683,7 +722,7 @@ public:
     /**
      *
      */
-    virtual bool write(char *fmt, ...);
+    virtual bool write(const char *fmt, ...) G_GNUC_PRINTF(2,3);
 
     //#######################
     //# V A R I A B L E S
@@ -768,27 +807,22 @@ public:
     /**
      *
      */
-    virtual DOMString getJid()
-        { return jid; }
+    virtual void setJid(const DOMString &val)
+        { jid = val; }
 
     /**
      *
      */
-    virtual int getMsgId()
-        { return msgId++; }
+    virtual DOMString getJid()
+        { return jid; }
 
-    /**
-     *
-     */
-    virtual void setDoRegister(bool val)
-        { doRegister = val; }
 
 
     /**
      *
      */
-    virtual bool getDoRegister()
-        { return doRegister; }
+    virtual int getMsgId()
+        { return msgId++; }
 
 
 
@@ -848,6 +882,29 @@ public:
      */
     virtual void rosterShow(const DOMString &jid, const DOMString &show);
 
+    //#######################
+    //# REGISTRATION
+    //#######################
+
+    /**
+     *  Set whether the client should to in-band registration
+     *  before authentication.  Causes inBandRegistrationNew() to be called
+     *  synchronously, before async is started.
+     */
+    virtual void setDoRegister(bool val)
+        { doRegister = val; }
+
+    /**
+     * Change the password of an existing account with a server
+     */
+    bool inBandRegistrationChangePassword(const DOMString &newPassword);
+
+    /**
+     * Cancel an existing account with a server
+     */
+    bool inBandRegistrationCancel();
+
+
     //#######################
     //# CHAT (individual)
     //#######################
@@ -915,7 +972,7 @@ public:
      *
      */
     virtual std::vector<XmppUser>
-          XmppClient::groupChatGetUserList(const DOMString &groupJid);
+             groupChatGetUserList(const DOMString &groupJid);
 
     /**
      *
@@ -968,46 +1025,31 @@ public:
     /**
      *
      */
-    virtual int outputStreamOpen(const DOMString &jid,
+    virtual bool outputStreamOpen(const DOMString &jid,
                                  const DOMString &streamId);
 
     /**
      *
      */
-    virtual int outputStreamWrite(int streamId,
-                          const unsigned char *buf, unsigned long len);
+    virtual bool outputStreamWrite(const DOMString &streamId,
+               const std::vector<unsigned char> &buf);
 
     /**
      *
      */
-    virtual int outputStreamClose(int streamId);
+    virtual bool outputStreamClose(const DOMString &streamId);
 
     /**
      *
      */
-    virtual int inputStreamOpen(const DOMString &jid,
+    virtual bool inputStreamOpen(const DOMString &jid,
                                 const DOMString &streamId,
                                 const DOMString &iqId);
 
     /**
      *
      */
-    virtual int inputStreamAvailable(int streamId);
-
-    /**
-     *
-     */
-    virtual std::vector<unsigned char> inputStreamRead(int streamId);
-
-    /**
-     *
-     */
-    virtual bool inputStreamClosing(int streamId);
-
-    /**
-     *
-     */
-    virtual int inputStreamClose(int streamId);
+    virtual bool inputStreamClose(const DOMString &streamId);
 
 
     //#######################
@@ -1088,35 +1130,42 @@ private:
 
     bool saslPlainAuthenticate();
 
-    bool saslAuthenticate();
+    bool saslAuthenticate(const DOMString &streamId);
 
     bool iqAuthenticate(const DOMString &streamId);
 
-    bool inBandRegistration();
+    /**
+     * Register a new account with a server.  Not done by user
+     */
+    bool inBandRegistrationNew();
 
     bool keepGoing;
 
     bool doRegister;
 
-    static const int writeBufLen = 2048;
+    std::vector<XmppGroupChat *>groupChats;
 
-    unsigned char writeBuf[writeBufLen];
+    //#### Roster
+    std::vector<XmppUser>roster;
 
-    std::vector<XmppGroupChat *>groupChats;
 
-    static const int outputStreamCount = 16;
+    //#### Streams
+    
+    bool processInBandByteStreamMessage(Element *root);
+    
+    DOMString streamPacket;
 
-    XmppStream *outputStreams[outputStreamCount];
+    std::map<DOMString, XmppStream *> outputStreams;
 
-    static const int inputStreamCount = 16;
+    std::map<DOMString, XmppStream *> inputStreams;
 
-    XmppStream *inputStreams[inputStreamCount];
 
-    static const int fileSendCount = 16;
+    //#### File send
+    
+    bool processFileMessage(Element *root);
 
-    XmppStream *fileSends[fileSendCount];
+    std::map<DOMString, XmppStream *> fileSends;
 
-    std::vector<XmppUser>roster;
 };