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