PWLib
1.10.10
|
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