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