xmpp.h

Go to the documentation of this file.
00001 /*
00002  * xmpp.h
00003  *
00004  * Extensible Messaging and Presence Protocol (XMPP) Core
00005  *
00006  * Portable Windows Library
00007  *
00008  * Copyright (c) 2004 Reitek S.p.A.
00009  *
00010  * The contents of this file are subject to the Mozilla Public License
00011  * Version 1.0 (the "License"); you may not use this file except in
00012  * compliance with the License. You may obtain a copy of the License at
00013  * http://www.mozilla.org/MPL/
00014  *
00015  * Software distributed under the License is distributed on an "AS IS"
00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00017  * the License for the specific language governing rights and limitations
00018  * under the License.
00019  *
00020  * The Original Code is Portable Windows Library.
00021  *
00022  * The Initial Developer of the Original Code is Post Increment
00023  *
00024  * Contributor(s): ______________________________________.
00025  *
00026  * $Log: xmpp.h,v $
00027  * Revision 1.5  2005/11/30 12:47:37  csoutheren
00028  * Removed tabs, reformatted some code, and changed tags for Doxygen
00029  *
00030  * Revision 1.4  2004/11/11 07:34:50  csoutheren
00031  * Added #include <ptlib.h>
00032  *
00033  * Revision 1.3  2004/05/09 07:23:46  rjongbloed
00034  * More work on XMPP, thanks Federico Pinna and Reitek S.p.A.
00035  *
00036  * Revision 1.2  2004/04/26 01:51:57  rjongbloed
00037  * More implementation of XMPP, thanks a lot to Federico Pinna & Reitek S.p.A.
00038  *
00039  * Revision 1.1  2004/04/22 12:31:00  rjongbloed
00040  * Added PNotifier extensions and XMPP (Jabber) support,
00041  *   thanks to Federico Pinna and Reitek S.p.A.
00042  *
00043  *
00044  */
00045 
00046 #ifndef _XMPP
00047 #define _XMPP
00048 
00049 #ifdef P_USE_PRAGMA
00050 #pragma interface
00051 #endif
00052 
00053 #include <ptlib.h>
00054 
00055 #if P_EXPAT
00056 
00057 #include <ptclib/pxml.h>
00058 #include <ptlib/notifier_ext.h>
00059 
00060 
00062 
00063 namespace XMPP
00064 {
00067   extern const PString Language;
00068   extern const PString Namespace;
00069   extern const PString MessageStanza;
00070   extern const PString PresenceStanza;
00071   extern const PString IQStanza;
00072   extern const PString IQQuery;
00073 
00074   class JID : public PObject
00075   {
00076     PCLASSINFO(JID, PObject);
00077 
00078   public:
00079     JID(const char * jid = 0);
00080     JID(const PString& jid);
00081     JID(const PString& user, const PString& server, const PString& resource = PString::Empty());
00082 
00083     virtual Comparison Compare(
00084       const PObject & obj   
00085       ) const;
00086 
00087     JID& operator=(
00088       const PString & jid  
00089       );
00090 
00091     operator const PString&() const;
00092 
00093     virtual PObject * Clone() const { return new JID(m_JID); }
00094 
00095     PString   GetUser() const         { return m_User; }
00096     PString   GetServer() const       { return m_Server; }
00097 
00098     virtual PString GetResource() const { return m_Resource; }
00099 
00100     virtual void SetUser(const PString& user);
00101     virtual void SetServer(const PString& server);
00102     virtual void SetResource(const PString& resource);
00103 
00104     virtual BOOL IsBare() const       { return m_Resource.IsEmpty(); }
00105     virtual void PrintOn(ostream & strm) const;
00106 
00107   protected:
00108     virtual void ParseJID(const PString& jid);
00109     virtual void BuildJID() const;
00110 
00111     PString   m_User;
00112     PString   m_Server;
00113     PString   m_Resource;
00114 
00115     mutable PString m_JID;
00116     mutable BOOL    m_IsDirty;
00117   };
00118 
00119   // A bare jid is a jid with no resource
00120   class BareJID : public JID
00121   {
00122     PCLASSINFO(BareJID, JID);
00123 
00124   public:
00125     BareJID(const char * jid = 0) : JID(jid) { }
00126     BareJID(const PString& jid) : JID(jid) { }
00127     BareJID(const PString& user, const PString& server, const PString& resource = PString::Empty())
00128       : JID(user, server, resource) { }
00129 
00130     virtual Comparison Compare(
00131       const PObject & obj   
00132       ) const;
00133 
00134     BareJID& operator=(
00135       const PString & jid  
00136       );
00137 
00138     virtual PObject * Clone() const { return new BareJID(m_JID); }
00139     virtual PString GetResource() const { return PString::Empty(); }
00140     virtual void SetResource(const PString&) { }
00141     virtual BOOL IsBare() const { return TRUE; }
00142   };
00143 
00149   class Transport : public PIndirectChannel
00150   {
00151     PCLASSINFO(Transport, PIndirectChannel);
00152 
00153   public:
00154     virtual BOOL Open() = 0;
00155     virtual BOOL Close() = 0;
00156   };
00157 
00158 
00162   class Stream : public PIndirectChannel
00163   {
00164     PCLASSINFO(Stream, PIndirectChannel);
00165 
00166   public:
00167     Stream(Transport * transport = 0);
00168     ~Stream();
00169 
00170     virtual BOOL        OnOpen()            { return m_OpenHandlers.Fire(*this); }
00171     PNotifierList&      OpenHandlers()      { return m_OpenHandlers; }
00172 
00173     virtual BOOL        Close();
00174     virtual void        OnClose()           { m_CloseHandlers.Fire(*this); }
00175     PNotifierList&      CloseHandlers()     { return m_CloseHandlers; }
00176 
00177     virtual BOOL        Write(const void * buf, PINDEX len);
00178     virtual BOOL        Write(const PString& data);
00179     virtual BOOL        Write(const PXML& pdu);
00180 
00183     virtual PXML *      Read();
00184 
00188     virtual void        Reset();
00189     PXMLStreamParser *  GetParser()     { return m_Parser; }
00190 
00191   protected:
00192     PXMLStreamParser *  m_Parser;
00193     PNotifierList       m_OpenHandlers;
00194     PNotifierList       m_CloseHandlers;
00195   };
00196 
00197 
00198   class BaseStreamHandler : public PThread
00199   {
00200     PCLASSINFO(BaseStreamHandler, PThread);
00201 
00202   public:
00203     BaseStreamHandler();
00204     ~BaseStreamHandler();
00205 
00206     virtual BOOL        Start(Transport * transport = 0);
00207     virtual BOOL        Stop(const PString& error = PString::Empty());
00208 
00209     void                SetAutoReconnect(BOOL b = TRUE, long timeout = 1000);
00210 
00211     PNotifierList&      ElementHandlers()   { return m_ElementHandlers; }
00212     Stream *            GetStream()         { return m_Stream; }
00213 
00214     virtual BOOL        Write(const void * buf, PINDEX len);
00215     virtual BOOL        Write(const PString& data);
00216     virtual BOOL        Write(const PXML& pdu);
00217     virtual void        OnElement(PXML& pdu);
00218 
00219     virtual void        Main();
00220 
00221   protected:
00222     PDECLARE_NOTIFIER(Stream, BaseStreamHandler, OnOpen);
00223     PDECLARE_NOTIFIER(Stream, BaseStreamHandler, OnClose);
00224 
00225     Stream *        m_Stream;
00226     BOOL            m_AutoReconnect;
00227     PTimeInterval   m_ReconnectTimeout;
00228 
00229     PNotifierList   m_ElementHandlers;
00230   };
00231 
00232 
00237   class Stanza : public PXML
00238   {
00239     PCLASSINFO(Stanza, PXML)
00240 
00241   public:
00244     static const PString ID;
00245     static const PString From;
00246     static const PString To;
00247 
00248     virtual BOOL IsValid() const = 0;
00249 
00250     virtual PString GetID() const;
00251     virtual PString GetFrom() const;
00252     virtual PString GetTo() const;
00253 
00254     virtual void SetID(const PString& id);
00255     virtual void SetFrom(const PString& from);
00256     virtual void SetTo(const PString& to);
00257 
00258     virtual PXMLElement * GetElement(const PString& name, PINDEX i = 0);
00259     virtual void AddElement(PXMLElement * elem);
00260 
00261     static PString GenerateID();
00262   };
00263 
00264   PLIST(StanzaList, Stanza);
00265 
00266 
00267   class Message : public Stanza
00268   {
00269     PCLASSINFO(Message, Stanza)
00270 
00271   public:
00272     enum MessageType {
00273       Normal,
00274       Chat,
00275       Error,
00276       GroupChat,
00277       HeadLine,
00278       Unknown = 999
00279     };
00280 
00283     static const PString Type;
00284     static const PString Subject;
00285     static const PString Body;
00286     static const PString Thread;
00287 
00290     Message();
00291 
00296     Message(PXML& pdu);
00297     Message(PXML * pdu);
00298 
00299     virtual BOOL IsValid() const;
00300     static BOOL IsValid(const PXML * pdu);
00301 
00302     virtual MessageType GetType(PString * typeName = 0) const;
00303     virtual PString     GetLanguage() const;
00304 
00309     virtual PString GetSubject(const PString& lang = PString::Empty());
00310     virtual PString GetBody(const PString& lang = PString::Empty());
00311     virtual PString GetThread();
00312 
00313     virtual PXMLElement * GetSubjectElement(const PString& lang = PString::Empty());
00314     virtual PXMLElement * GetBodyElement(const PString& lang = PString::Empty());
00315 
00316     virtual void SetType(MessageType type);
00317     virtual void SetType(const PString& type); // custom, possibly non standard, type
00318     virtual void SetLanguage(const PString& lang);
00319 
00320     virtual void SetSubject(const PString& subj, const PString& lang = PString::Empty());
00321     virtual void SetBody(const PString& body, const PString& lang = PString::Empty());
00322     virtual void SetThread(const PString& thrd);
00323   };
00324 
00325 
00326   class Presence : public Stanza
00327   {
00328     PCLASSINFO(Presence, Stanza)
00329 
00330   public:
00331     enum PresenceType {
00332       Available,
00333       Unavailable,
00334       Subscribe,
00335       Subscribed,
00336       Unsubscribe,
00337       Unsubscribed,
00338       Probe,
00339       Error,
00340       Unknown = 999
00341     };
00342 
00343     enum ShowType {
00344       Online,
00345       Away,
00346       Chat,
00347       DND,
00348       XA,
00349       Other = 999
00350     };
00351 
00354     static const PString Type;
00355     static const PString Show;
00356     static const PString Status;
00357     static const PString Priority;
00358 
00361     Presence();
00362 
00367     Presence(PXML& pdu);
00368     Presence(PXML * pdu);
00369 
00370     virtual BOOL IsValid() const;
00371     static BOOL IsValid(const PXML * pdu);
00372 
00373     virtual PresenceType GetType(PString * typeName = 0) const;
00374     virtual ShowType     GetShow(PString * showName = 0) const;
00375     virtual BYTE         GetPriority() const;
00376 
00381     virtual PString GetStatus(const PString& lang = PString::Empty());
00382     virtual PXMLElement * GetStatusElement(const PString& lang = PString::Empty());
00383 
00384     virtual void SetType(PresenceType type);
00385     virtual void SetType(const PString& type); // custom, possibly non standard, type
00386     virtual void SetShow(ShowType show);
00387     virtual void SetShow(const PString& show); // custom, possibly non standard, type
00388     virtual void SetPriority(BYTE priority);
00389 
00390     virtual void SetStatus(const PString& status, const PString& lang = PString::Empty());
00391   };
00392 
00393 
00394   class IQ : public Stanza
00395   {
00396     PCLASSINFO(IQ, Stanza)
00397 
00398   public:
00399     enum IQType {
00400       Get,
00401       Set,
00402       Result,
00403       Error,
00404       Unknown = 999
00405     };
00406 
00409     static const PString Type;
00410 
00411     IQ(IQType type, PXMLElement * body = 0);
00412     IQ(PXML& pdu);
00413     IQ(PXML * pdu);
00414     ~IQ();
00415 
00416     virtual BOOL IsValid() const;
00417     static BOOL IsValid(const PXML * pdu);
00418 
00424     void SetProcessed()             { m_Processed = TRUE; }
00425     BOOL HasBeenProcessed() const   { return m_Processed; }
00426 
00427     virtual IQType        GetType(PString * typeName = 0) const;
00428     virtual PXMLElement * GetBody();
00429 
00430     virtual void SetType(IQType type);
00431     virtual void SetType(const PString& type); // custom, possibly non standard, type
00432     virtual void SetBody(PXMLElement * body);
00433 
00434     // If the this message is response, returns a pointer to the
00435     // original set/get message
00436     virtual IQ *  GetOriginalMessage() const      { return m_OriginalIQ; }
00437     virtual void  SetOriginalMessage(IQ * iq);
00438 
00442     virtual IQ *  BuildResult() const;
00443 
00446     virtual IQ *  BuildError(const PString& type, const PString& code) const;
00447 
00448     virtual PNotifierList GetResponseHandlers()   { return m_ResponseHandlers; }
00449 
00450   protected:
00451     BOOL            m_Processed;
00452     IQ *            m_OriginalIQ;
00453     PNotifierList   m_ResponseHandlers;
00454   };
00457   namespace Disco
00458   {
00459     class Item : public PObject
00460     {
00461       PCLASSINFO(Item, PObject);
00462     public:
00463       Item(PXMLElement * item);
00464       Item(const PString& jid, const PString& node = PString::Empty());
00465 
00466       const JID&      GetJID() const    { return m_JID; }
00467       const PString&  GetNode() const   { return m_Node; }
00468 
00469       PXMLElement *   AsXML(PXMLElement * parent) const;
00470 
00471     protected:
00472       const JID     m_JID;
00473       const PString m_Node;
00474     };
00475 
00476     PDECLARE_LIST(ItemList, Item)
00477     public:
00478       ItemList(PXMLElement * list);
00479       PXMLElement * AsXML(PXMLElement * parent) const;
00480     };
00481 
00482     class Identity : public PObject
00483     {
00484       PCLASSINFO(Identity, PObject);
00485     public:
00486       Identity(PXMLElement * identity);
00487       Identity(const PString& category, const PString& type, const PString& name);
00488 
00489       const PString&  GetCategory() const   { return m_Category; }
00490       const PString&  GetType() const       { return m_Type; }
00491       const PString&  GetName() const       { return m_Name; }
00492 
00493       PXMLElement *   AsXML(PXMLElement * parent) const;
00494 
00495     protected:
00496       const PString m_Category;
00497       const PString m_Type;
00498       const PString m_Name;
00499     };
00500 
00501     PDECLARE_LIST(IdentityList, Identity)
00502     public:
00503       IdentityList(PXMLElement * list);
00504       PXMLElement * AsXML(PXMLElement * parent) const;
00505     };
00506 
00507     class Info : public PObject
00508     {
00509       PCLASSINFO(Info, PObject);
00510     public:
00511       Info(PXMLElement * info);
00512       
00513       IdentityList&   GetIdentities() { return m_Identities; }
00514       PStringSet&     GetFeatures()   { return m_Features; }
00515 
00516       PXMLElement *   AsXML(PXMLElement * parent) const;
00517 
00518     protected:
00519       IdentityList  m_Identities;
00520       PStringSet    m_Features;
00521     };
00522   } // namespace Disco
00523 
00524 }; // class XMPP
00525 
00526 
00527 #endif  // P_EXPAT
00528 
00529 #endif  // _XMPP
00530 
00531 // End of File ///////////////////////////////////////////////////////////////
00532 
00533 

Generated on Fri Sep 21 14:40:12 2007 for PWLib by  doxygen 1.5.3