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.6  2007/04/10 05:08:46  rjongbloed
00028  * Fixed issue with use of static C string variables in DLL environment,
00029  *   must use functional interface for correct initialisation.
00030  *
00031  * Revision 1.5  2005/11/30 12:47:37  csoutheren
00032  * Removed tabs, reformatted some code, and changed tags for Doxygen
00033  *
00034  * Revision 1.4  2004/11/11 07:34:50  csoutheren
00035  * Added #include <ptlib.h>
00036  *
00037  * Revision 1.3  2004/05/09 07:23:46  rjongbloed
00038  * More work on XMPP, thanks Federico Pinna and Reitek S.p.A.
00039  *
00040  * Revision 1.2  2004/04/26 01:51:57  rjongbloed
00041  * More implementation of XMPP, thanks a lot to Federico Pinna & Reitek S.p.A.
00042  *
00043  * Revision 1.1  2004/04/22 12:31:00  rjongbloed
00044  * Added PNotifier extensions and XMPP (Jabber) support,
00045  *   thanks to Federico Pinna and Reitek S.p.A.
00046  *
00047  *
00048  */
00049 
00050 #ifndef _XMPP
00051 #define _XMPP
00052 
00053 #ifdef P_USE_PRAGMA
00054 #pragma interface
00055 #endif
00056 
00057 #include <ptlib.h>
00058 
00059 #if P_EXPAT
00060 
00061 #include <ptclib/pxml.h>
00062 #include <ptlib/notifier_ext.h>
00063 
00064 
00066 
00067 namespace XMPP
00068 {
00071   extern const PString & LanguageTag();
00072   extern const PString & NamespaceTag();
00073   extern const PString & MessageStanzaTag();
00074   extern const PString & PresenceStanzaTag();
00075   extern const PString & IQStanzaTag();
00076   extern const PString & IQQueryTag();
00077 
00078   class JID : public PObject
00079   {
00080     PCLASSINFO(JID, PObject);
00081 
00082   public:
00083     JID(const char * jid = 0);
00084     JID(const PString& jid);
00085     JID(const PString& user, const PString& server, const PString& resource = PString::Empty());
00086 
00087     virtual Comparison Compare(
00088       const PObject & obj   
00089       ) const;
00090 
00091     JID& operator=(
00092       const PString & jid  
00093       );
00094 
00095     operator const PString&() const;
00096 
00097     virtual PObject * Clone() const { return new JID(m_JID); }
00098 
00099     PString   GetUser() const         { return m_User; }
00100     PString   GetServer() const       { return m_Server; }
00101 
00102     virtual PString GetResource() const { return m_Resource; }
00103 
00104     virtual void SetUser(const PString& user);
00105     virtual void SetServer(const PString& server);
00106     virtual void SetResource(const PString& resource);
00107 
00108     virtual BOOL IsBare() const       { return m_Resource.IsEmpty(); }
00109     virtual void PrintOn(ostream & strm) const;
00110 
00111   protected:
00112     virtual void ParseJID(const PString& jid);
00113     virtual void BuildJID() const;
00114 
00115     PString   m_User;
00116     PString   m_Server;
00117     PString   m_Resource;
00118 
00119     mutable PString m_JID;
00120     mutable BOOL    m_IsDirty;
00121   };
00122 
00123   // A bare jid is a jid with no resource
00124   class BareJID : public JID
00125   {
00126     PCLASSINFO(BareJID, JID);
00127 
00128   public:
00129     BareJID(const char * jid = 0) : JID(jid) { }
00130     BareJID(const PString& jid) : JID(jid) { }
00131     BareJID(const PString& user, const PString& server, const PString& resource = PString::Empty())
00132       : JID(user, server, resource) { }
00133 
00134     virtual Comparison Compare(
00135       const PObject & obj   
00136       ) const;
00137 
00138     BareJID& operator=(
00139       const PString & jid  
00140       );
00141 
00142     virtual PObject * Clone() const { return new BareJID(m_JID); }
00143     virtual PString GetResource() const { return PString::Empty(); }
00144     virtual void SetResource(const PString&) { }
00145     virtual BOOL IsBare() const { return TRUE; }
00146   };
00147 
00153   class Transport : public PIndirectChannel
00154   {
00155     PCLASSINFO(Transport, PIndirectChannel);
00156 
00157   public:
00158     virtual BOOL Open() = 0;
00159     virtual BOOL Close() = 0;
00160   };
00161 
00162 
00166   class Stream : public PIndirectChannel
00167   {
00168     PCLASSINFO(Stream, PIndirectChannel);
00169 
00170   public:
00171     Stream(Transport * transport = 0);
00172     ~Stream();
00173 
00174     virtual BOOL        OnOpen()            { return m_OpenHandlers.Fire(*this); }
00175     PNotifierList&      OpenHandlers()      { return m_OpenHandlers; }
00176 
00177     virtual BOOL        Close();
00178     virtual void        OnClose()           { m_CloseHandlers.Fire(*this); }
00179     PNotifierList&      CloseHandlers()     { return m_CloseHandlers; }
00180 
00181     virtual BOOL        Write(const void * buf, PINDEX len);
00182     virtual BOOL        Write(const PString& data);
00183     virtual BOOL        Write(const PXML& pdu);
00184 
00187     virtual PXML *      Read();
00188 
00192     virtual void        Reset();
00193     PXMLStreamParser *  GetParser()     { return m_Parser; }
00194 
00195   protected:
00196     PXMLStreamParser *  m_Parser;
00197     PNotifierList       m_OpenHandlers;
00198     PNotifierList       m_CloseHandlers;
00199   };
00200 
00201 
00202   class BaseStreamHandler : public PThread
00203   {
00204     PCLASSINFO(BaseStreamHandler, PThread);
00205 
00206   public:
00207     BaseStreamHandler();
00208     ~BaseStreamHandler();
00209 
00210     virtual BOOL        Start(Transport * transport = 0);
00211     virtual BOOL        Stop(const PString& error = PString::Empty());
00212 
00213     void                SetAutoReconnect(BOOL b = TRUE, long timeout = 1000);
00214 
00215     PNotifierList&      ElementHandlers()   { return m_ElementHandlers; }
00216     Stream *            GetStream()         { return m_Stream; }
00217 
00218     virtual BOOL        Write(const void * buf, PINDEX len);
00219     virtual BOOL        Write(const PString& data);
00220     virtual BOOL        Write(const PXML& pdu);
00221     virtual void        OnElement(PXML& pdu);
00222 
00223     virtual void        Main();
00224 
00225   protected:
00226     PDECLARE_NOTIFIER(Stream, BaseStreamHandler, OnOpen);
00227     PDECLARE_NOTIFIER(Stream, BaseStreamHandler, OnClose);
00228 
00229     Stream *        m_Stream;
00230     BOOL            m_AutoReconnect;
00231     PTimeInterval   m_ReconnectTimeout;
00232 
00233     PNotifierList   m_ElementHandlers;
00234   };
00235 
00236 
00241   class Stanza : public PXML
00242   {
00243     PCLASSINFO(Stanza, PXML)
00244 
00245   public:
00248     static const PString & IDTag();
00249     static const PString & FromTag();
00250     static const PString & ToTag();
00251 
00252     virtual BOOL IsValid() const = 0;
00253 
00254     virtual PString GetID() const;
00255     virtual PString GetFrom() const;
00256     virtual PString GetTo() const;
00257 
00258     virtual void SetID(const PString& id);
00259     virtual void SetFrom(const PString& from);
00260     virtual void SetTo(const PString& to);
00261 
00262     virtual PXMLElement * GetElement(const PString& name, PINDEX i = 0);
00263     virtual void AddElement(PXMLElement * elem);
00264 
00265     static PString GenerateID();
00266   };
00267 
00268   PLIST(StanzaList, Stanza);
00269 
00270 
00271   class Message : public Stanza
00272   {
00273     PCLASSINFO(Message, Stanza)
00274 
00275   public:
00276     enum MessageType {
00277       Normal,
00278       Chat,
00279       Error,
00280       GroupChat,
00281       HeadLine,
00282       Unknown = 999
00283     };
00284 
00287     static const PString & TypeTag();
00288     static const PString & SubjectTag();
00289     static const PString & BodyTag();
00290     static const PString & ThreadTag();
00291 
00294     Message();
00295 
00300     Message(PXML& pdu);
00301     Message(PXML * pdu);
00302 
00303     virtual BOOL IsValid() const;
00304     static BOOL IsValid(const PXML * pdu);
00305 
00306     virtual MessageType GetType(PString * typeName = 0) const;
00307     virtual PString     GetLanguage() const;
00308 
00313     virtual PString GetSubject(const PString& lang = PString::Empty());
00314     virtual PString GetBody(const PString& lang = PString::Empty());
00315     virtual PString GetThread();
00316 
00317     virtual PXMLElement * GetSubjectElement(const PString& lang = PString::Empty());
00318     virtual PXMLElement * GetBodyElement(const PString& lang = PString::Empty());
00319 
00320     virtual void SetType(MessageType type);
00321     virtual void SetType(const PString& type); // custom, possibly non standard, type
00322     virtual void SetLanguage(const PString& lang);
00323 
00324     virtual void SetSubject(const PString& subj, const PString& lang = PString::Empty());
00325     virtual void SetBody(const PString& body, const PString& lang = PString::Empty());
00326     virtual void SetThread(const PString& thrd);
00327   };
00328 
00329 
00330   class Presence : public Stanza
00331   {
00332     PCLASSINFO(Presence, Stanza)
00333 
00334   public:
00335     enum PresenceType {
00336       Available,
00337       Unavailable,
00338       Subscribe,
00339       Subscribed,
00340       Unsubscribe,
00341       Unsubscribed,
00342       Probe,
00343       Error,
00344       Unknown = 999
00345     };
00346 
00347     enum ShowType {
00348       Online,
00349       Away,
00350       Chat,
00351       DND,
00352       XA,
00353       Other = 999
00354     };
00355 
00358     static const PString & TypeTag();
00359     static const PString & ShowTag();
00360     static const PString & StatusTag();
00361     static const PString & PriorityTag();
00362 
00365     Presence();
00366 
00371     Presence(PXML& pdu);
00372     Presence(PXML * pdu);
00373 
00374     virtual BOOL IsValid() const;
00375     static BOOL IsValid(const PXML * pdu);
00376 
00377     virtual PresenceType GetType(PString * typeName = 0) const;
00378     virtual ShowType     GetShow(PString * showName = 0) const;
00379     virtual BYTE         GetPriority() const;
00380 
00385     virtual PString GetStatus(const PString& lang = PString::Empty());
00386     virtual PXMLElement * GetStatusElement(const PString& lang = PString::Empty());
00387 
00388     virtual void SetType(PresenceType type);
00389     virtual void SetType(const PString& type); // custom, possibly non standard, type
00390     virtual void SetShow(ShowType show);
00391     virtual void SetShow(const PString& show); // custom, possibly non standard, type
00392     virtual void SetPriority(BYTE priority);
00393 
00394     virtual void SetStatus(const PString& status, const PString& lang = PString::Empty());
00395   };
00396 
00397 
00398   class IQ : public Stanza
00399   {
00400     PCLASSINFO(IQ, Stanza)
00401 
00402   public:
00403     enum IQType {
00404       Get,
00405       Set,
00406       Result,
00407       Error,
00408       Unknown = 999
00409     };
00410 
00413     static const PString & TypeTag();
00414 
00415     IQ(IQType type, PXMLElement * body = 0);
00416     IQ(PXML& pdu);
00417     IQ(PXML * pdu);
00418     ~IQ();
00419 
00420     virtual BOOL IsValid() const;
00421     static BOOL IsValid(const PXML * pdu);
00422 
00428     void SetProcessed()             { m_Processed = TRUE; }
00429     BOOL HasBeenProcessed() const   { return m_Processed; }
00430 
00431     virtual IQType        GetType(PString * typeName = 0) const;
00432     virtual PXMLElement * GetBody();
00433 
00434     virtual void SetType(IQType type);
00435     virtual void SetType(const PString& type); // custom, possibly non standard, type
00436     virtual void SetBody(PXMLElement * body);
00437 
00438     // If the this message is response, returns a pointer to the
00439     // original set/get message
00440     virtual IQ *  GetOriginalMessage() const      { return m_OriginalIQ; }
00441     virtual void  SetOriginalMessage(IQ * iq);
00442 
00446     virtual IQ *  BuildResult() const;
00447 
00450     virtual IQ *  BuildError(const PString& type, const PString& code) const;
00451 
00452     virtual PNotifierList GetResponseHandlers()   { return m_ResponseHandlers; }
00453 
00454   protected:
00455     BOOL            m_Processed;
00456     IQ *            m_OriginalIQ;
00457     PNotifierList   m_ResponseHandlers;
00458   };
00461   namespace Disco
00462   {
00463     class Item : public PObject
00464     {
00465       PCLASSINFO(Item, PObject);
00466     public:
00467       Item(PXMLElement * item);
00468       Item(const PString& jid, const PString& node = PString::Empty());
00469 
00470       const JID&      GetJID() const    { return m_JID; }
00471       const PString&  GetNode() const   { return m_Node; }
00472 
00473       PXMLElement *   AsXML(PXMLElement * parent) const;
00474 
00475     protected:
00476       const JID     m_JID;
00477       const PString m_Node;
00478     };
00479 
00480     PDECLARE_LIST(ItemList, Item)
00481     public:
00482       ItemList(PXMLElement * list);
00483       PXMLElement * AsXML(PXMLElement * parent) const;
00484     };
00485 
00486     class Identity : public PObject
00487     {
00488       PCLASSINFO(Identity, PObject);
00489     public:
00490       Identity(PXMLElement * identity);
00491       Identity(const PString& category, const PString& type, const PString& name);
00492 
00493       const PString&  GetCategory() const   { return m_Category; }
00494       const PString&  GetType() const       { return m_Type; }
00495       const PString&  GetName() const       { return m_Name; }
00496 
00497       PXMLElement *   AsXML(PXMLElement * parent) const;
00498 
00499     protected:
00500       const PString m_Category;
00501       const PString m_Type;
00502       const PString m_Name;
00503     };
00504 
00505     PDECLARE_LIST(IdentityList, Identity)
00506     public:
00507       IdentityList(PXMLElement * list);
00508       PXMLElement * AsXML(PXMLElement * parent) const;
00509     };
00510 
00511     class Info : public PObject
00512     {
00513       PCLASSINFO(Info, PObject);
00514     public:
00515       Info(PXMLElement * info);
00516       
00517       IdentityList&   GetIdentities() { return m_Identities; }
00518       PStringSet&     GetFeatures()   { return m_Features; }
00519 
00520       PXMLElement *   AsXML(PXMLElement * parent) const;
00521 
00522     protected:
00523       IdentityList  m_Identities;
00524       PStringSet    m_Features;
00525     };
00526   } // namespace Disco
00527 
00528 }; // class XMPP
00529 
00530 
00531 #endif  // P_EXPAT
00532 
00533 #endif  // _XMPP
00534 
00535 // End of File ///////////////////////////////////////////////////////////////
00536 
00537 

Generated on Fri Mar 7 06:25:03 2008 for PTLib by  doxygen 1.5.1