00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
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
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);
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);
00386 virtual void SetShow(ShowType show);
00387 virtual void SetShow(const PString& show);
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);
00432 virtual void SetBody(PXMLElement * body);
00433
00434
00435
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 }
00523
00524 };
00525
00526
00527 #endif // P_EXPAT
00528
00529 #endif // _XMPP
00530
00531
00532
00533