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  * $Revision: 20385 $
00027  * $Author: rjongbloed $
00028  * $Date: 2008-06-04 10:40:38 +0000 (Wed, 04 Jun 2008) $
00029  */
00030 
00031 #ifndef _XMPP
00032 #define _XMPP
00033 
00034 #ifdef P_USE_PRAGMA
00035 #pragma interface
00036 #endif
00037 
00038 #include <ptlib.h>
00039 
00040 #if P_EXPAT
00041 
00042 #include <ptclib/pxml.h>
00043 #include <ptlib/notifier_ext.h>
00044 
00045 
00047 
00048 namespace XMPP
00049 {
00052   extern const PString & LanguageTag();
00053   extern const PString & NamespaceTag();
00054   extern const PString & MessageStanzaTag();
00055   extern const PString & PresenceStanzaTag();
00056   extern const PString & IQStanzaTag();
00057   extern const PString & IQQueryTag();
00058 
00059   class JID : public PObject
00060   {
00061     PCLASSINFO(JID, PObject);
00062 
00063   public:
00064     JID(const char * jid = 0);
00065     JID(const PString& jid);
00066     JID(const PString& user, const PString& server, const PString& resource = PString::Empty());
00067 
00068     virtual Comparison Compare(
00069       const PObject & obj   
00070       ) const;
00071 
00072     JID& operator=(
00073       const PString & jid  
00074       );
00075 
00076     operator const PString&() const;
00077 
00078     virtual PObject * Clone() const { return new JID(m_JID); }
00079 
00080     PString   GetUser() const         { return m_User; }
00081     PString   GetServer() const       { return m_Server; }
00082 
00083     virtual PString GetResource() const { return m_Resource; }
00084 
00085     virtual void SetUser(const PString& user);
00086     virtual void SetServer(const PString& server);
00087     virtual void SetResource(const PString& resource);
00088 
00089     virtual PBoolean IsBare() const       { return m_Resource.IsEmpty(); }
00090     virtual void PrintOn(ostream & strm) const;
00091 
00092   protected:
00093     virtual void ParseJID(const PString& jid);
00094     virtual void BuildJID() const;
00095 
00096     PString   m_User;
00097     PString   m_Server;
00098     PString   m_Resource;
00099 
00100     mutable PString m_JID;
00101     mutable PBoolean    m_IsDirty;
00102   };
00103 
00104   // A bare jid is a jid with no resource
00105   class BareJID : public JID
00106   {
00107     PCLASSINFO(BareJID, JID);
00108 
00109   public:
00110     BareJID(const char * jid = 0) : JID(jid) { }
00111     BareJID(const PString& jid) : JID(jid) { }
00112     BareJID(const PString& user, const PString& server, const PString& resource = PString::Empty())
00113       : JID(user, server, resource) { }
00114 
00115     virtual Comparison Compare(
00116       const PObject & obj   
00117       ) const;
00118 
00119     BareJID& operator=(
00120       const PString & jid  
00121       );
00122 
00123     virtual PObject * Clone() const { return new BareJID(m_JID); }
00124     virtual PString GetResource() const { return PString::Empty(); }
00125     virtual void SetResource(const PString&) { }
00126     virtual PBoolean IsBare() const { return PTrue; }
00127   };
00128 
00134   class Transport : public PIndirectChannel
00135   {
00136     PCLASSINFO(Transport, PIndirectChannel);
00137 
00138   public:
00139     virtual PBoolean Open() = 0;
00140     virtual PBoolean Close() = 0;
00141   };
00142 
00143 
00147   class Stream : public PIndirectChannel
00148   {
00149     PCLASSINFO(Stream, PIndirectChannel);
00150 
00151   public:
00152     Stream(Transport * transport = 0);
00153     ~Stream();
00154 
00155     virtual PBoolean        OnOpen()            { return m_OpenHandlers.Fire(*this); }
00156     PNotifierList&      OpenHandlers()      { return m_OpenHandlers; }
00157 
00158     virtual PBoolean        Close();
00159     virtual void        OnClose()           { m_CloseHandlers.Fire(*this); }
00160     PNotifierList&      CloseHandlers()     { return m_CloseHandlers; }
00161 
00162     virtual PBoolean        Write(const void * buf, PINDEX len);
00163     virtual PBoolean        Write(const PString& data);
00164     virtual PBoolean        Write(const PXML& pdu);
00165 
00168     virtual PXML *      Read();
00169 
00173     virtual void        Reset();
00174     PXMLStreamParser *  GetParser()     { return m_Parser; }
00175 
00176   protected:
00177     PXMLStreamParser *  m_Parser;
00178     PNotifierList       m_OpenHandlers;
00179     PNotifierList       m_CloseHandlers;
00180   };
00181 
00182 
00183   class BaseStreamHandler : public PThread
00184   {
00185     PCLASSINFO(BaseStreamHandler, PThread);
00186 
00187   public:
00188     BaseStreamHandler();
00189     ~BaseStreamHandler();
00190 
00191     virtual PBoolean        Start(Transport * transport = 0);
00192     virtual PBoolean        Stop(const PString& error = PString::Empty());
00193 
00194     void                SetAutoReconnect(PBoolean b = PTrue, long timeout = 1000);
00195 
00196     PNotifierList&      ElementHandlers()   { return m_ElementHandlers; }
00197     Stream *            GetStream()         { return m_Stream; }
00198 
00199     virtual PBoolean        Write(const void * buf, PINDEX len);
00200     virtual PBoolean        Write(const PString& data);
00201     virtual PBoolean        Write(const PXML& pdu);
00202     virtual void        OnElement(PXML& pdu);
00203 
00204     virtual void        Main();
00205 
00206   protected:
00207     PDECLARE_NOTIFIER(Stream, BaseStreamHandler, OnOpen);
00208     PDECLARE_NOTIFIER(Stream, BaseStreamHandler, OnClose);
00209 
00210     Stream *        m_Stream;
00211     PBoolean            m_AutoReconnect;
00212     PTimeInterval   m_ReconnectTimeout;
00213 
00214     PNotifierList   m_ElementHandlers;
00215   };
00216 
00217 
00222   class Stanza : public PXML
00223   {
00224     PCLASSINFO(Stanza, PXML)
00225 
00226   public:
00229     static const PString & IDTag();
00230     static const PString & FromTag();
00231     static const PString & ToTag();
00232 
00233     virtual PBoolean IsValid() const = 0;
00234 
00235     virtual PString GetID() const;
00236     virtual PString GetFrom() const;
00237     virtual PString GetTo() const;
00238 
00239     virtual void SetID(const PString& id);
00240     virtual void SetFrom(const PString& from);
00241     virtual void SetTo(const PString& to);
00242 
00243     virtual PXMLElement * GetElement(const PString& name, PINDEX i = 0);
00244     virtual void AddElement(PXMLElement * elem);
00245 
00246     static PString GenerateID();
00247   };
00248 
00249   PLIST(StanzaList, Stanza);
00250 
00251 
00252   class Message : public Stanza
00253   {
00254     PCLASSINFO(Message, Stanza)
00255 
00256   public:
00257     enum MessageType {
00258       Normal,
00259       Chat,
00260       Error,
00261       GroupChat,
00262       HeadLine,
00263       Unknown = 999
00264     };
00265 
00268     static const PString & TypeTag();
00269     static const PString & SubjectTag();
00270     static const PString & BodyTag();
00271     static const PString & ThreadTag();
00272 
00275     Message();
00276 
00281     Message(PXML& pdu);
00282     Message(PXML * pdu);
00283 
00284     virtual PBoolean IsValid() const;
00285     static PBoolean IsValid(const PXML * pdu);
00286 
00287     virtual MessageType GetType(PString * typeName = 0) const;
00288     virtual PString     GetLanguage() const;
00289 
00294     virtual PString GetSubject(const PString& lang = PString::Empty());
00295     virtual PString GetBody(const PString& lang = PString::Empty());
00296     virtual PString GetThread();
00297 
00298     virtual PXMLElement * GetSubjectElement(const PString& lang = PString::Empty());
00299     virtual PXMLElement * GetBodyElement(const PString& lang = PString::Empty());
00300 
00301     virtual void SetType(MessageType type);
00302     virtual void SetType(const PString& type); // custom, possibly non standard, type
00303     virtual void SetLanguage(const PString& lang);
00304 
00305     virtual void SetSubject(const PString& subj, const PString& lang = PString::Empty());
00306     virtual void SetBody(const PString& body, const PString& lang = PString::Empty());
00307     virtual void SetThread(const PString& thrd);
00308   };
00309 
00310 
00311   class Presence : public Stanza
00312   {
00313     PCLASSINFO(Presence, Stanza)
00314 
00315   public:
00316     enum PresenceType {
00317       Available,
00318       Unavailable,
00319       Subscribe,
00320       Subscribed,
00321       Unsubscribe,
00322       Unsubscribed,
00323       Probe,
00324       Error,
00325       Unknown = 999
00326     };
00327 
00328     enum ShowType {
00329       Online,
00330       Away,
00331       Chat,
00332       DND,
00333       XA,
00334       Other = 999
00335     };
00336 
00339     static const PString & TypeTag();
00340     static const PString & ShowTag();
00341     static const PString & StatusTag();
00342     static const PString & PriorityTag();
00343 
00346     Presence();
00347 
00352     Presence(PXML& pdu);
00353     Presence(PXML * pdu);
00354 
00355     virtual PBoolean IsValid() const;
00356     static PBoolean IsValid(const PXML * pdu);
00357 
00358     virtual PresenceType GetType(PString * typeName = 0) const;
00359     virtual ShowType     GetShow(PString * showName = 0) const;
00360     virtual BYTE         GetPriority() const;
00361 
00366     virtual PString GetStatus(const PString& lang = PString::Empty());
00367     virtual PXMLElement * GetStatusElement(const PString& lang = PString::Empty());
00368 
00369     virtual void SetType(PresenceType type);
00370     virtual void SetType(const PString& type); // custom, possibly non standard, type
00371     virtual void SetShow(ShowType show);
00372     virtual void SetShow(const PString& show); // custom, possibly non standard, type
00373     virtual void SetPriority(BYTE priority);
00374 
00375     virtual void SetStatus(const PString& status, const PString& lang = PString::Empty());
00376   };
00377 
00378 
00379   class IQ : public Stanza
00380   {
00381     PCLASSINFO(IQ, Stanza)
00382 
00383   public:
00384     enum IQType {
00385       Get,
00386       Set,
00387       Result,
00388       Error,
00389       Unknown = 999
00390     };
00391 
00394     static const PString & TypeTag();
00395 
00396     IQ(IQType type, PXMLElement * body = 0);
00397     IQ(PXML& pdu);
00398     IQ(PXML * pdu);
00399     ~IQ();
00400 
00401     virtual PBoolean IsValid() const;
00402     static PBoolean IsValid(const PXML * pdu);
00403 
00409     void SetProcessed()             { m_Processed = PTrue; }
00410     PBoolean HasBeenProcessed() const   { return m_Processed; }
00411 
00412     virtual IQType        GetType(PString * typeName = 0) const;
00413     virtual PXMLElement * GetBody();
00414 
00415     virtual void SetType(IQType type);
00416     virtual void SetType(const PString& type); // custom, possibly non standard, type
00417     virtual void SetBody(PXMLElement * body);
00418 
00419     // If the this message is response, returns a pointer to the
00420     // original set/get message
00421     virtual IQ *  GetOriginalMessage() const      { return m_OriginalIQ; }
00422     virtual void  SetOriginalMessage(IQ * iq);
00423 
00427     virtual IQ *  BuildResult() const;
00428 
00431     virtual IQ *  BuildError(const PString& type, const PString& code) const;
00432 
00433     virtual PNotifierList GetResponseHandlers()   { return m_ResponseHandlers; }
00434 
00435   protected:
00436     PBoolean            m_Processed;
00437     IQ *            m_OriginalIQ;
00438     PNotifierList   m_ResponseHandlers;
00439   };
00442   namespace Disco
00443   {
00444     class Item : public PObject
00445     {
00446       PCLASSINFO(Item, PObject);
00447     public:
00448       Item(PXMLElement * item);
00449       Item(const PString& jid, const PString& node = PString::Empty());
00450 
00451       const JID&      GetJID() const    { return m_JID; }
00452       const PString&  GetNode() const   { return m_Node; }
00453 
00454       PXMLElement *   AsXML(PXMLElement * parent) const;
00455 
00456     protected:
00457       const JID     m_JID;
00458       const PString m_Node;
00459     };
00460 
00461     PDECLARE_LIST(ItemList, Item)
00462     public:
00463       ItemList(PXMLElement * list);
00464       PXMLElement * AsXML(PXMLElement * parent) const;
00465     };
00466 
00467     class Identity : public PObject
00468     {
00469       PCLASSINFO(Identity, PObject);
00470     public:
00471       Identity(PXMLElement * identity);
00472       Identity(const PString& category, const PString& type, const PString& name);
00473 
00474       const PString&  GetCategory() const   { return m_Category; }
00475       const PString&  GetType() const       { return m_Type; }
00476       const PString&  GetName() const       { return m_Name; }
00477 
00478       PXMLElement *   AsXML(PXMLElement * parent) const;
00479 
00480     protected:
00481       const PString m_Category;
00482       const PString m_Type;
00483       const PString m_Name;
00484     };
00485 
00486     PDECLARE_LIST(IdentityList, Identity)
00487     public:
00488       IdentityList(PXMLElement * list);
00489       PXMLElement * AsXML(PXMLElement * parent) const;
00490     };
00491 
00492     class Info : public PObject
00493     {
00494       PCLASSINFO(Info, PObject);
00495     public:
00496       Info(PXMLElement * info);
00497       
00498       IdentityList&   GetIdentities() { return m_Identities; }
00499       PStringSet&     GetFeatures()   { return m_Features; }
00500 
00501       PXMLElement *   AsXML(PXMLElement * parent) const;
00502 
00503     protected:
00504       IdentityList  m_Identities;
00505       PStringSet    m_Features;
00506     };
00507   } // namespace Disco
00508 
00509 }; // class XMPP
00510 
00511 
00512 #endif  // P_EXPAT
00513 
00514 #endif  // _XMPP
00515 
00516 // End of File ///////////////////////////////////////////////////////////////
00517 
00518 

Generated on Mon Sep 15 01:21:35 2008 for PTLib by  doxygen 1.5.1