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 #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
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);
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);
00371 virtual void SetShow(ShowType show);
00372 virtual void SetShow(const PString& show);
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);
00417 virtual void SetBody(PXMLElement * body);
00418
00419
00420
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 }
00508
00509 };
00510
00511
00512 #endif // P_EXPAT
00513
00514 #endif // _XMPP
00515
00516
00517
00518