Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Class Members | File Members

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.4  2004/11/11 07:34:50  csoutheren
00028  * Added #include <ptlib.h>
00029  *
00030  * Revision 1.3  2004/05/09 07:23:46  rjongbloed
00031  * More work on XMPP, thanks Federico Pinna and Reitek S.p.A.
00032  *
00033  * Revision 1.2  2004/04/26 01:51:57  rjongbloed
00034  * More implementation of XMPP, thanks a lot to Federico Pinna & Reitek S.p.A.
00035  *
00036  * Revision 1.1  2004/04/22 12:31:00  rjongbloed
00037  * Added PNotifier extensions and XMPP (Jabber) support,
00038  *   thanks to Federico Pinna and Reitek S.p.A.
00039  *
00040  *
00041  */
00042 
00043 #ifndef _XMPP
00044 #define _XMPP
00045 
00046 #ifdef P_USE_PRAGMA
00047 #pragma interface
00048 #endif
00049 
00050 #include <ptlib.h>
00051 
00052 #if P_EXPAT
00053 
00054 #include <ptclib/pxml.h>
00055 #include <ptlib/notifier_ext.h>
00056 
00057 
00059 
00060 namespace XMPP
00061 {
00064   extern const PString Language;
00065   extern const PString Namespace;
00066   extern const PString MessageStanza;
00067   extern const PString PresenceStanza;
00068   extern const PString IQStanza;
00069   extern const PString IQQuery;
00070 
00071   class JID : public PObject
00072   {
00073     PCLASSINFO(JID, PObject);
00074 
00075   public:
00076     JID(const char * jid = 0);
00077     JID(const PString& jid);
00078     JID(const PString& user, const PString& server, const PString& resource = PString::Empty());
00079 
00080     virtual Comparison Compare(
00081       const PObject & obj   // Object to compare against.
00082       ) const;
00083 
00084     JID& operator=(
00085       const PString & jid  
00086       );
00087 
00088     operator const PString&() const;
00089 
00090     virtual PObject * Clone() const { return new JID(m_JID); }
00091 
00092     PString   GetUser() const         { return m_User; }
00093     PString   GetServer() const       { return m_Server; }
00094 
00095     virtual PString GetResource() const { return m_Resource; }
00096 
00097     virtual void SetUser(const PString& user);
00098     virtual void SetServer(const PString& server);
00099     virtual void SetResource(const PString& resource);
00100 
00101     virtual BOOL IsBare() const       { return m_Resource.IsEmpty(); }
00102     virtual void PrintOn(ostream & strm) const;
00103 
00104   protected:
00105     virtual void ParseJID(const PString& jid);
00106     virtual void BuildJID() const;
00107 
00108     PString   m_User;
00109     PString   m_Server;
00110     PString   m_Resource;
00111 
00112     mutable PString m_JID;
00113     mutable BOOL    m_IsDirty;
00114   };
00115 
00116   // A bare jid is a jid with no resource
00117   class BareJID : public JID
00118   {
00119     PCLASSINFO(BareJID, JID);
00120 
00121   public:
00122     BareJID(const char * jid = 0) : JID(jid) { }
00123     BareJID(const PString& jid) : JID(jid) { }
00124     BareJID(const PString& user, const PString& server, const PString& resource = PString::Empty())
00125       : JID(user, server, resource) { }
00126 
00127     virtual Comparison Compare(
00128       const PObject & obj   // Object to compare against.
00129       ) const;
00130 
00131     BareJID& operator=(
00132       const PString & jid  
00133       );
00134 
00135     virtual PObject * Clone() const { return new BareJID(m_JID); }
00136     virtual PString GetResource() const { return PString::Empty(); }
00137     virtual void SetResource(const PString&) { }
00138     virtual BOOL IsBare() const { return TRUE; }
00139   };
00140 
00146   class Transport : public PIndirectChannel
00147   {
00148     PCLASSINFO(Transport, PIndirectChannel);
00149 
00150   public:
00151     virtual BOOL Open() = 0;
00152     virtual BOOL Close() = 0;
00153   };
00154 
00155 
00159   class Stream : public PIndirectChannel
00160   {
00161     PCLASSINFO(Stream, PIndirectChannel);
00162 
00163   public:
00164     Stream(Transport * transport = 0);
00165     ~Stream();
00166 
00167     virtual BOOL        OnOpen()            { return m_OpenHandlers.Fire(*this); }
00168     PNotifierList&      OpenHandlers()      { return m_OpenHandlers; }
00169 
00170     virtual BOOL        Close();
00171     virtual void        OnClose()           { m_CloseHandlers.Fire(*this); }
00172     PNotifierList&      CloseHandlers()     { return m_CloseHandlers; }
00173 
00174     virtual BOOL        Write(const void * buf, PINDEX len);
00175     virtual BOOL        Write(const PString& data);
00176     virtual BOOL        Write(const PXML& pdu);
00177 
00180     virtual PXML *      Read();
00181 
00185     virtual void        Reset();
00186     PXMLStreamParser *  GetParser()     { return m_Parser; }
00187 
00188   protected:
00189     PXMLStreamParser *  m_Parser;
00190     PNotifierList       m_OpenHandlers;
00191     PNotifierList       m_CloseHandlers;
00192   };
00193 
00194 
00195   class BaseStreamHandler : public PThread
00196   {
00197     PCLASSINFO(BaseStreamHandler, PThread);
00198 
00199   public:
00200     BaseStreamHandler();
00201     ~BaseStreamHandler();
00202 
00203     virtual BOOL        Start(Transport * transport = 0);
00204     virtual BOOL        Stop(const PString& error = PString::Empty());
00205 
00206     void                SetAutoReconnect(BOOL b = TRUE, long timeout = 1000);
00207 
00208     PNotifierList&      ElementHandlers()   { return m_ElementHandlers; }
00209     Stream *            GetStream()         { return m_Stream; }
00210 
00211     virtual BOOL        Write(const void * buf, PINDEX len);
00212     virtual BOOL        Write(const PString& data);
00213     virtual BOOL        Write(const PXML& pdu);
00214     virtual void        OnElement(PXML& pdu);
00215 
00216     virtual void        Main();
00217 
00218   protected:
00219     PDECLARE_NOTIFIER(Stream, BaseStreamHandler, OnOpen);
00220     PDECLARE_NOTIFIER(Stream, BaseStreamHandler, OnClose);
00221 
00222     Stream *        m_Stream;
00223     BOOL            m_AutoReconnect;
00224     PTimeInterval   m_ReconnectTimeout;
00225 
00226     PNotifierList   m_ElementHandlers;
00227   };
00228 
00229 
00234   class Stanza : public PXML
00235   {
00236     PCLASSINFO(Stanza, PXML)
00237 
00238   public:
00241     static const PString ID;
00242     static const PString From;
00243     static const PString To;
00244 
00245     virtual BOOL IsValid() const = 0;
00246 
00247     virtual PString GetID() const;
00248     virtual PString GetFrom() const;
00249     virtual PString GetTo() const;
00250 
00251     virtual void SetID(const PString& id);
00252     virtual void SetFrom(const PString& from);
00253     virtual void SetTo(const PString& to);
00254 
00255     virtual PXMLElement * GetElement(const PString& name, PINDEX i = 0);
00256     virtual void AddElement(PXMLElement * elem);
00257 
00258     static PString GenerateID();
00259   };
00260 
00261   PLIST(StanzaList, Stanza);
00262 
00263 
00264   class Message : public Stanza
00265   {
00266     PCLASSINFO(Message, Stanza)
00267 
00268   public:
00269     enum MessageType {
00270       Normal,
00271       Chat,
00272       Error,
00273       GroupChat,
00274       HeadLine,
00275       Unknown = 999
00276     };
00277 
00280     static const PString Type;
00281     static const PString Subject;
00282     static const PString Body;
00283     static const PString Thread;
00284 
00287     Message();
00288 
00293     Message(PXML& pdu);
00294     Message(PXML * pdu);
00295 
00296     virtual BOOL IsValid() const;
00297     static BOOL IsValid(const PXML * pdu);
00298 
00299     virtual MessageType GetType(PString * typeName = 0) const;
00300     virtual PString     GetLanguage() const;
00301 
00306     virtual PString GetSubject(const PString& lang = PString::Empty());
00307     virtual PString GetBody(const PString& lang = PString::Empty());
00308     virtual PString GetThread();
00309 
00310     virtual PXMLElement * GetSubjectElement(const PString& lang = PString::Empty());
00311     virtual PXMLElement * GetBodyElement(const PString& lang = PString::Empty());
00312 
00313     virtual void SetType(MessageType type);
00314     virtual void SetType(const PString& type); // custom, possibly non standard, type
00315     virtual void SetLanguage(const PString& lang);
00316 
00317     virtual void SetSubject(const PString& subj, const PString& lang = PString::Empty());
00318     virtual void SetBody(const PString& body, const PString& lang = PString::Empty());
00319     virtual void SetThread(const PString& thrd);
00320   };
00321 
00322 
00323   class Presence : public Stanza
00324   {
00325     PCLASSINFO(Presence, Stanza)
00326 
00327   public:
00328     enum PresenceType {
00329       Available,
00330       Unavailable,
00331       Subscribe,
00332       Subscribed,
00333       Unsubscribe,
00334       Unsubscribed,
00335       Probe,
00336       Error,
00337       Unknown = 999
00338     };
00339 
00340     enum ShowType {
00341       Online,
00342       Away,
00343       Chat,
00344       DND,
00345       XA,
00346       Other = 999
00347     };
00348 
00351     static const PString Type;
00352     static const PString Show;
00353     static const PString Status;
00354     static const PString Priority;
00355 
00358     Presence();
00359 
00364     Presence(PXML& pdu);
00365     Presence(PXML * pdu);
00366 
00367     virtual BOOL IsValid() const;
00368     static BOOL IsValid(const PXML * pdu);
00369 
00370     virtual PresenceType GetType(PString * typeName = 0) const;
00371     virtual ShowType     GetShow(PString * showName = 0) const;
00372     virtual BYTE         GetPriority() const;
00373 
00378     virtual PString GetStatus(const PString& lang = PString::Empty());
00379     virtual PXMLElement * GetStatusElement(const PString& lang = PString::Empty());
00380 
00381     virtual void SetType(PresenceType type);
00382     virtual void SetType(const PString& type); // custom, possibly non standard, type
00383     virtual void SetShow(ShowType show);
00384     virtual void SetShow(const PString& show); // custom, possibly non standard, type
00385     virtual void SetPriority(BYTE priority);
00386 
00387     virtual void SetStatus(const PString& status, const PString& lang = PString::Empty());
00388   };
00389 
00390 
00391   class IQ : public Stanza
00392   {
00393     PCLASSINFO(IQ, Stanza)
00394 
00395   public:
00396     enum IQType {
00397       Get,
00398       Set,
00399       Result,
00400       Error,
00401       Unknown = 999
00402     };
00403 
00406     static const PString Type;
00407 
00408     IQ(IQType type, PXMLElement * body = 0);
00409     IQ(PXML& pdu);
00410     IQ(PXML * pdu);
00411     ~IQ();
00412 
00413     virtual BOOL IsValid() const;
00414     static BOOL IsValid(const PXML * pdu);
00415 
00421     void SetProcessed()             { m_Processed = TRUE; }
00422     BOOL HasBeenProcessed() const   { return m_Processed; }
00423 
00424     virtual IQType        GetType(PString * typeName = 0) const;
00425     virtual PXMLElement * GetBody();
00426 
00427     virtual void SetType(IQType type);
00428     virtual void SetType(const PString& type); // custom, possibly non standard, type
00429     virtual void SetBody(PXMLElement * body);
00430 
00431     // If the this message is response, returns a pointer to the
00432     // original set/get message
00433     virtual IQ *  GetOriginalMessage() const      { return m_OriginalIQ; }
00434     virtual void  SetOriginalMessage(IQ * iq);
00435 
00439     virtual IQ *  BuildResult() const;
00440 
00443     virtual IQ *  BuildError(const PString& type, const PString& code) const;
00444 
00445     virtual PNotifierList GetResponseHandlers()   { return m_ResponseHandlers; }
00446 
00447   protected:
00448     BOOL            m_Processed;
00449     IQ *            m_OriginalIQ;
00450     PNotifierList   m_ResponseHandlers;
00451   };
00454   namespace Disco
00455   {
00456     class Item : public PObject
00457     {
00458       PCLASSINFO(Item, PObject);
00459     public:
00460       Item(PXMLElement * item);
00461       Item(const PString& jid, const PString& node = PString::Empty());
00462 
00463       const JID&      GetJID() const    { return m_JID; }
00464       const PString&  GetNode() const   { return m_Node; }
00465 
00466       PXMLElement *   AsXML(PXMLElement * parent) const;
00467 
00468     protected:
00469       const JID     m_JID;
00470       const PString m_Node;
00471     };
00472 
00473     PDECLARE_LIST(ItemList, Item)
00474     public:
00475       ItemList(PXMLElement * list);
00476       PXMLElement * AsXML(PXMLElement * parent) const;
00477     };
00478 
00479     class Identity : public PObject
00480     {
00481       PCLASSINFO(Identity, PObject);
00482     public:
00483       Identity(PXMLElement * identity);
00484       Identity(const PString& category, const PString& type, const PString& name);
00485 
00486       const PString&  GetCategory() const   { return m_Category; }
00487       const PString&  GetType() const       { return m_Type; }
00488       const PString&  GetName() const       { return m_Name; }
00489 
00490       PXMLElement *   AsXML(PXMLElement * parent) const;
00491 
00492     protected:
00493       const PString m_Category;
00494       const PString m_Type;
00495       const PString m_Name;
00496     };
00497 
00498     PDECLARE_LIST(IdentityList, Identity)
00499     public:
00500       IdentityList(PXMLElement * list);
00501       PXMLElement * AsXML(PXMLElement * parent) const;
00502     };
00503 
00504     class Info : public PObject
00505     {
00506       PCLASSINFO(Info, PObject);
00507     public:
00508       Info(PXMLElement * info);
00509       
00510       IdentityList&   GetIdentities() { return m_Identities; }
00511       PStringSet&     GetFeatures()   { return m_Features; }
00512 
00513       PXMLElement *   AsXML(PXMLElement * parent) const;
00514 
00515     protected:
00516       IdentityList  m_Identities;
00517       PStringSet    m_Features;
00518     };
00519   } // namespace Disco
00520 
00521 }; // class XMPP
00522 
00523 
00524 #endif  // P_EXPAT
00525 
00526 #endif  // _XMPP
00527 
00528 // End of File ///////////////////////////////////////////////////////////////
00529 
00530 

Generated on Tue Mar 15 10:44:52 2005 for PWLib by  doxygen 1.4.0