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

Generated on Sat Jul 24 15:35:57 2004 for PWLib by doxygen 1.3.7