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
00047
00048
00049
00050 #ifndef _XMPP
00051 #define _XMPP
00052
00053 #ifdef P_USE_PRAGMA
00054 #pragma interface
00055 #endif
00056
00057 #include <ptlib.h>
00058
00059 #if P_EXPAT
00060
00061 #include <ptclib/pxml.h>
00062 #include <ptlib/notifier_ext.h>
00063
00064
00066
00067 namespace XMPP
00068 {
00071 extern const PString & LanguageTag();
00072 extern const PString & NamespaceTag();
00073 extern const PString & MessageStanzaTag();
00074 extern const PString & PresenceStanzaTag();
00075 extern const PString & IQStanzaTag();
00076 extern const PString & IQQueryTag();
00077
00078 class JID : public PObject
00079 {
00080 PCLASSINFO(JID, PObject);
00081
00082 public:
00083 JID(const char * jid = 0);
00084 JID(const PString& jid);
00085 JID(const PString& user, const PString& server, const PString& resource = PString::Empty());
00086
00087 virtual Comparison Compare(
00088 const PObject & obj
00089 ) const;
00090
00091 JID& operator=(
00092 const PString & jid
00093 );
00094
00095 operator const PString&() const;
00096
00097 virtual PObject * Clone() const { return new JID(m_JID); }
00098
00099 PString GetUser() const { return m_User; }
00100 PString GetServer() const { return m_Server; }
00101
00102 virtual PString GetResource() const { return m_Resource; }
00103
00104 virtual void SetUser(const PString& user);
00105 virtual void SetServer(const PString& server);
00106 virtual void SetResource(const PString& resource);
00107
00108 virtual BOOL IsBare() const { return m_Resource.IsEmpty(); }
00109 virtual void PrintOn(ostream & strm) const;
00110
00111 protected:
00112 virtual void ParseJID(const PString& jid);
00113 virtual void BuildJID() const;
00114
00115 PString m_User;
00116 PString m_Server;
00117 PString m_Resource;
00118
00119 mutable PString m_JID;
00120 mutable BOOL m_IsDirty;
00121 };
00122
00123
00124 class BareJID : public JID
00125 {
00126 PCLASSINFO(BareJID, JID);
00127
00128 public:
00129 BareJID(const char * jid = 0) : JID(jid) { }
00130 BareJID(const PString& jid) : JID(jid) { }
00131 BareJID(const PString& user, const PString& server, const PString& resource = PString::Empty())
00132 : JID(user, server, resource) { }
00133
00134 virtual Comparison Compare(
00135 const PObject & obj
00136 ) const;
00137
00138 BareJID& operator=(
00139 const PString & jid
00140 );
00141
00142 virtual PObject * Clone() const { return new BareJID(m_JID); }
00143 virtual PString GetResource() const { return PString::Empty(); }
00144 virtual void SetResource(const PString&) { }
00145 virtual BOOL IsBare() const { return TRUE; }
00146 };
00147
00153 class Transport : public PIndirectChannel
00154 {
00155 PCLASSINFO(Transport, PIndirectChannel);
00156
00157 public:
00158 virtual BOOL Open() = 0;
00159 virtual BOOL Close() = 0;
00160 };
00161
00162
00166 class Stream : public PIndirectChannel
00167 {
00168 PCLASSINFO(Stream, PIndirectChannel);
00169
00170 public:
00171 Stream(Transport * transport = 0);
00172 ~Stream();
00173
00174 virtual BOOL OnOpen() { return m_OpenHandlers.Fire(*this); }
00175 PNotifierList& OpenHandlers() { return m_OpenHandlers; }
00176
00177 virtual BOOL Close();
00178 virtual void OnClose() { m_CloseHandlers.Fire(*this); }
00179 PNotifierList& CloseHandlers() { return m_CloseHandlers; }
00180
00181 virtual BOOL Write(const void * buf, PINDEX len);
00182 virtual BOOL Write(const PString& data);
00183 virtual BOOL Write(const PXML& pdu);
00184
00187 virtual PXML * Read();
00188
00192 virtual void Reset();
00193 PXMLStreamParser * GetParser() { return m_Parser; }
00194
00195 protected:
00196 PXMLStreamParser * m_Parser;
00197 PNotifierList m_OpenHandlers;
00198 PNotifierList m_CloseHandlers;
00199 };
00200
00201
00202 class BaseStreamHandler : public PThread
00203 {
00204 PCLASSINFO(BaseStreamHandler, PThread);
00205
00206 public:
00207 BaseStreamHandler();
00208 ~BaseStreamHandler();
00209
00210 virtual BOOL Start(Transport * transport = 0);
00211 virtual BOOL Stop(const PString& error = PString::Empty());
00212
00213 void SetAutoReconnect(BOOL b = TRUE, long timeout = 1000);
00214
00215 PNotifierList& ElementHandlers() { return m_ElementHandlers; }
00216 Stream * GetStream() { return m_Stream; }
00217
00218 virtual BOOL Write(const void * buf, PINDEX len);
00219 virtual BOOL Write(const PString& data);
00220 virtual BOOL Write(const PXML& pdu);
00221 virtual void OnElement(PXML& pdu);
00222
00223 virtual void Main();
00224
00225 protected:
00226 PDECLARE_NOTIFIER(Stream, BaseStreamHandler, OnOpen);
00227 PDECLARE_NOTIFIER(Stream, BaseStreamHandler, OnClose);
00228
00229 Stream * m_Stream;
00230 BOOL m_AutoReconnect;
00231 PTimeInterval m_ReconnectTimeout;
00232
00233 PNotifierList m_ElementHandlers;
00234 };
00235
00236
00241 class Stanza : public PXML
00242 {
00243 PCLASSINFO(Stanza, PXML)
00244
00245 public:
00248 static const PString & IDTag();
00249 static const PString & FromTag();
00250 static const PString & ToTag();
00251
00252 virtual BOOL IsValid() const = 0;
00253
00254 virtual PString GetID() const;
00255 virtual PString GetFrom() const;
00256 virtual PString GetTo() const;
00257
00258 virtual void SetID(const PString& id);
00259 virtual void SetFrom(const PString& from);
00260 virtual void SetTo(const PString& to);
00261
00262 virtual PXMLElement * GetElement(const PString& name, PINDEX i = 0);
00263 virtual void AddElement(PXMLElement * elem);
00264
00265 static PString GenerateID();
00266 };
00267
00268 PLIST(StanzaList, Stanza);
00269
00270
00271 class Message : public Stanza
00272 {
00273 PCLASSINFO(Message, Stanza)
00274
00275 public:
00276 enum MessageType {
00277 Normal,
00278 Chat,
00279 Error,
00280 GroupChat,
00281 HeadLine,
00282 Unknown = 999
00283 };
00284
00287 static const PString & TypeTag();
00288 static const PString & SubjectTag();
00289 static const PString & BodyTag();
00290 static const PString & ThreadTag();
00291
00294 Message();
00295
00300 Message(PXML& pdu);
00301 Message(PXML * pdu);
00302
00303 virtual BOOL IsValid() const;
00304 static BOOL IsValid(const PXML * pdu);
00305
00306 virtual MessageType GetType(PString * typeName = 0) const;
00307 virtual PString GetLanguage() const;
00308
00313 virtual PString GetSubject(const PString& lang = PString::Empty());
00314 virtual PString GetBody(const PString& lang = PString::Empty());
00315 virtual PString GetThread();
00316
00317 virtual PXMLElement * GetSubjectElement(const PString& lang = PString::Empty());
00318 virtual PXMLElement * GetBodyElement(const PString& lang = PString::Empty());
00319
00320 virtual void SetType(MessageType type);
00321 virtual void SetType(const PString& type);
00322 virtual void SetLanguage(const PString& lang);
00323
00324 virtual void SetSubject(const PString& subj, const PString& lang = PString::Empty());
00325 virtual void SetBody(const PString& body, const PString& lang = PString::Empty());
00326 virtual void SetThread(const PString& thrd);
00327 };
00328
00329
00330 class Presence : public Stanza
00331 {
00332 PCLASSINFO(Presence, Stanza)
00333
00334 public:
00335 enum PresenceType {
00336 Available,
00337 Unavailable,
00338 Subscribe,
00339 Subscribed,
00340 Unsubscribe,
00341 Unsubscribed,
00342 Probe,
00343 Error,
00344 Unknown = 999
00345 };
00346
00347 enum ShowType {
00348 Online,
00349 Away,
00350 Chat,
00351 DND,
00352 XA,
00353 Other = 999
00354 };
00355
00358 static const PString & TypeTag();
00359 static const PString & ShowTag();
00360 static const PString & StatusTag();
00361 static const PString & PriorityTag();
00362
00365 Presence();
00366
00371 Presence(PXML& pdu);
00372 Presence(PXML * pdu);
00373
00374 virtual BOOL IsValid() const;
00375 static BOOL IsValid(const PXML * pdu);
00376
00377 virtual PresenceType GetType(PString * typeName = 0) const;
00378 virtual ShowType GetShow(PString * showName = 0) const;
00379 virtual BYTE GetPriority() const;
00380
00385 virtual PString GetStatus(const PString& lang = PString::Empty());
00386 virtual PXMLElement * GetStatusElement(const PString& lang = PString::Empty());
00387
00388 virtual void SetType(PresenceType type);
00389 virtual void SetType(const PString& type);
00390 virtual void SetShow(ShowType show);
00391 virtual void SetShow(const PString& show);
00392 virtual void SetPriority(BYTE priority);
00393
00394 virtual void SetStatus(const PString& status, const PString& lang = PString::Empty());
00395 };
00396
00397
00398 class IQ : public Stanza
00399 {
00400 PCLASSINFO(IQ, Stanza)
00401
00402 public:
00403 enum IQType {
00404 Get,
00405 Set,
00406 Result,
00407 Error,
00408 Unknown = 999
00409 };
00410
00413 static const PString & TypeTag();
00414
00415 IQ(IQType type, PXMLElement * body = 0);
00416 IQ(PXML& pdu);
00417 IQ(PXML * pdu);
00418 ~IQ();
00419
00420 virtual BOOL IsValid() const;
00421 static BOOL IsValid(const PXML * pdu);
00422
00428 void SetProcessed() { m_Processed = TRUE; }
00429 BOOL HasBeenProcessed() const { return m_Processed; }
00430
00431 virtual IQType GetType(PString * typeName = 0) const;
00432 virtual PXMLElement * GetBody();
00433
00434 virtual void SetType(IQType type);
00435 virtual void SetType(const PString& type);
00436 virtual void SetBody(PXMLElement * body);
00437
00438
00439
00440 virtual IQ * GetOriginalMessage() const { return m_OriginalIQ; }
00441 virtual void SetOriginalMessage(IQ * iq);
00442
00446 virtual IQ * BuildResult() const;
00447
00450 virtual IQ * BuildError(const PString& type, const PString& code) const;
00451
00452 virtual PNotifierList GetResponseHandlers() { return m_ResponseHandlers; }
00453
00454 protected:
00455 BOOL m_Processed;
00456 IQ * m_OriginalIQ;
00457 PNotifierList m_ResponseHandlers;
00458 };
00461 namespace Disco
00462 {
00463 class Item : public PObject
00464 {
00465 PCLASSINFO(Item, PObject);
00466 public:
00467 Item(PXMLElement * item);
00468 Item(const PString& jid, const PString& node = PString::Empty());
00469
00470 const JID& GetJID() const { return m_JID; }
00471 const PString& GetNode() const { return m_Node; }
00472
00473 PXMLElement * AsXML(PXMLElement * parent) const;
00474
00475 protected:
00476 const JID m_JID;
00477 const PString m_Node;
00478 };
00479
00480 PDECLARE_LIST(ItemList, Item)
00481 public:
00482 ItemList(PXMLElement * list);
00483 PXMLElement * AsXML(PXMLElement * parent) const;
00484 };
00485
00486 class Identity : public PObject
00487 {
00488 PCLASSINFO(Identity, PObject);
00489 public:
00490 Identity(PXMLElement * identity);
00491 Identity(const PString& category, const PString& type, const PString& name);
00492
00493 const PString& GetCategory() const { return m_Category; }
00494 const PString& GetType() const { return m_Type; }
00495 const PString& GetName() const { return m_Name; }
00496
00497 PXMLElement * AsXML(PXMLElement * parent) const;
00498
00499 protected:
00500 const PString m_Category;
00501 const PString m_Type;
00502 const PString m_Name;
00503 };
00504
00505 PDECLARE_LIST(IdentityList, Identity)
00506 public:
00507 IdentityList(PXMLElement * list);
00508 PXMLElement * AsXML(PXMLElement * parent) const;
00509 };
00510
00511 class Info : public PObject
00512 {
00513 PCLASSINFO(Info, PObject);
00514 public:
00515 Info(PXMLElement * info);
00516
00517 IdentityList& GetIdentities() { return m_Identities; }
00518 PStringSet& GetFeatures() { return m_Features; }
00519
00520 PXMLElement * AsXML(PXMLElement * parent) const;
00521
00522 protected:
00523 IdentityList m_Identities;
00524 PStringSet m_Features;
00525 };
00526 }
00527
00528 };
00529
00530
00531 #endif // P_EXPAT
00532
00533 #endif // _XMPP
00534
00535
00536
00537