PTLib  Version 2.14.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
xmpp.h
Go to the documentation of this file.
1 /*
2  * xmpp.h
3  *
4  * Extensible Messaging and Presence Protocol (XMPP) Core
5  *
6  * Portable Windows Library
7  *
8  * Copyright (c) 2004 Reitek S.p.A.
9  *
10  * The contents of this file are subject to the Mozilla Public License
11  * Version 1.0 (the "License"); you may not use this file except in
12  * compliance with the License. You may obtain a copy of the License at
13  * http://www.mozilla.org/MPL/
14  *
15  * Software distributed under the License is distributed on an "AS IS"
16  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
17  * the License for the specific language governing rights and limitations
18  * under the License.
19  *
20  * The Original Code is Portable Windows Library.
21  *
22  * The Initial Developer of the Original Code is Post Increment
23  *
24  * Contributor(s): ______________________________________.
25  *
26  * $Revision: 28497 $
27  * $Author: rjongbloed $
28  * $Date: 2012-10-05 22:38:38 +1000 (Fri, 05 Oct 2012) $
29  */
30 
31 #ifndef PTLIB_XMPP_H
32 #define PTLIB_XMPP_H
33 
34 #ifdef P_USE_PRAGMA
35 #pragma interface
36 #endif
37 
38 #include <ptlib.h>
39 
40 #if P_EXPAT
41 
42 #include <ptclib/pxml.h>
43 #include <ptlib/notifier_ext.h>
44 
45 
47 
48 namespace XMPP
49 {
52  extern const PCaselessString & LanguageTag();
53  extern const PCaselessString & NamespaceTag();
54  extern const PCaselessString & MessageStanzaTag();
55  extern const PCaselessString & PresenceStanzaTag();
56  extern const PCaselessString & IQStanzaTag();
57  extern const PCaselessString & IQQueryTag();
58 
59  class JID : public PObject
60  {
61  PCLASSINFO(JID, PObject);
62 
63  public:
64  JID(const char * jid = 0);
65  JID(const PString& jid);
66  JID(const PString& user, const PString& server, const PString& resource = PString::Empty());
67 
68  virtual Comparison Compare(
69  const PObject & obj
70  ) const;
71 
72  JID& operator=(
73  const PString & jid
74  );
75 
76  operator const PString&() const;
77 
78  virtual PObject * Clone() const { return new JID(m_JID); }
79 
80  PString GetUser() const { return m_User; }
81  PString GetServer() const { return m_Server; }
82 
83  virtual PString GetResource() const { return m_Resource; }
84 
85  virtual void SetUser(const PString& user);
86  virtual void SetServer(const PString& server);
87  virtual void SetResource(const PString& resource);
88 
89  virtual PBoolean IsBare() const { return m_Resource.IsEmpty(); }
90  virtual void PrintOn(ostream & strm) const;
91 
92  protected:
93  virtual void ParseJID(const PString& jid);
94  virtual void BuildJID() const;
95 
99 
100  mutable PString m_JID;
102  };
103 
104  // A bare jid is a jid with no resource
105  class BareJID : public JID
106  {
107  PCLASSINFO(BareJID, JID);
108 
109  public:
110  BareJID(const char * jid = 0) : JID(jid) { }
111  BareJID(const PString& jid) : JID(jid) { }
112  BareJID(const PString& user, const PString& server, const PString& resource = PString::Empty())
113  : JID(user, server, resource) { }
114 
115  virtual Comparison Compare(
116  const PObject & obj
117  ) const;
118 
120  const PString & jid
121  );
122 
123  virtual PObject * Clone() const { return new BareJID(m_JID); }
124  virtual PString GetResource() const { return PString::Empty(); }
125  virtual void SetResource(const PString&) { }
126  virtual PBoolean IsBare() const { return true; }
127  };
128 
135  {
136  PCLASSINFO(Transport, PIndirectChannel);
137 
138  public:
139  virtual PBoolean Open() = 0;
140  virtual PBoolean Close() = 0;
141  };
142 
143 
147  class Stream : public PIndirectChannel
148  {
149  PCLASSINFO(Stream, PIndirectChannel);
150 
151  public:
152  Stream(Transport * transport = 0);
153  ~Stream();
154 
155  virtual bool OnOpen() { m_OpenHandlers(*this, 0); return true; }
157 
158  virtual PBoolean Close();
159  virtual void OnClose() { m_CloseHandlers(*this, 0); }
161 
162  virtual PBoolean Write(const void * buf, PINDEX len);
163  virtual PBoolean Write(const PString& data);
164 // virtual PBoolean Write(const PXMLElement & pdu);
165  virtual PBoolean Write(const PXML & pdu);
166 
169  virtual PXMLElement * Read();
170 
174  virtual void Reset();
176 
177  protected:
182  };
183 
184 
185  class BaseStreamHandler : public PThread
186  {
187  PCLASSINFO(BaseStreamHandler, PThread);
188 
189  public:
192 
193  virtual PBoolean Start(Transport * transport = 0);
194  virtual PBoolean Stop(const PString& error = PString::Empty());
195 
196  void SetAutoReconnect(PBoolean b = true, long timeout = 1000);
197 
198  void AddNotifier(const PNotifierTemplate<PXMLElement&> & notifier) { m_ElementHandlers.Add(notifier); }
199 
200  Stream * GetStream() const { return m_Stream; }
201 
202  virtual PBoolean Write(const void * buf, PINDEX len);
203  virtual PBoolean Write(const PString& data);
204  virtual PBoolean Write(const PXML & pdu);
205  virtual void OnElement(PXMLElement& pdu);
206 
207  virtual void Main();
208 
209  protected:
212 
216 
218  };
219 
220 
225  class Stanza : public PXML
226  {
228 
229  public:
232  static const PCaselessString & IDTag();
233  static const PCaselessString & FromTag();
234  static const PCaselessString & ToTag();
235 
236  virtual PBoolean IsValid() const = 0;
237 
238  virtual PString GetID() const;
239  virtual PString GetFrom() const;
240  virtual PString GetTo() const;
241 
242  virtual void SetID(const PString& id);
243  virtual void SetFrom(const PString& from);
244  virtual void SetTo(const PString& to);
245 
246  virtual PXMLElement * GetElement(const PString& name, PINDEX i = 0);
247 
248  static PString GenerateID();
249  };
250 
251  PLIST(StanzaList, Stanza);
252 
253 
254  class Message : public Stanza
255  {
257 
258  public:
259  enum MessageType {
265  Unknown = 999
266  };
267 
270  static const PCaselessString & TypeTag();
271  static const PCaselessString & SubjectTag();
272  static const PCaselessString & BodyTag();
273  static const PCaselessString & ThreadTag();
274 
277  Message();
278 
283  Message(PXMLElement & pdu);
284 
285  virtual PBoolean IsValid() const;
286 
287  virtual MessageType GetType(PString * typeName = 0) const;
288  virtual PString GetLanguage() const;
289 
294  virtual PString GetSubject(const PString& lang = PString::Empty());
295  virtual PString GetBody(const PString& lang = PString::Empty());
296  virtual PString GetThread();
297 
298  virtual PXMLElement * GetSubjectElement(const PString& lang = PString::Empty());
299  virtual PXMLElement * GetBodyElement(const PString& lang = PString::Empty());
300 
301  virtual void SetType(MessageType type);
302  virtual void SetType(const PString& type); // custom, possibly non standard, type
303  virtual void SetLanguage(const PString& lang);
304 
305  virtual void SetSubject(const PString& subj, const PString& lang = PString::Empty());
306  virtual void SetBody(const PString& body, const PString& lang = PString::Empty());
307  virtual void SetThread(const PString& thrd);
308  };
309 
310 
311  class Presence : public Stanza
312  {
314 
315  public:
325  Unknown = 999
326  };
327 
328  enum ShowType {
333  XA,
334  Other = 999
335  };
336 
339  static const PCaselessString & TypeTag();
340  static const PCaselessString & ShowTag();
341  static const PCaselessString & StatusTag();
342  static const PCaselessString & PriorityTag();
343 
346  Presence();
347 
352  Presence(PXMLElement & pdu);
353 
354  virtual PBoolean IsValid() const;
355 
356  virtual PresenceType GetType(PString * typeName = 0) const;
357  virtual ShowType GetShow(PString * showName = 0) const;
358  virtual BYTE GetPriority() const;
359 
364  virtual PString GetStatus(const PString& lang = PString::Empty());
365  virtual PXMLElement * GetStatusElement(const PString& lang = PString::Empty());
366 
367  virtual void SetType(PresenceType type);
368  virtual void SetType(const PString& type); // custom, possibly non standard, type
369  virtual void SetShow(ShowType show);
370  virtual void SetShow(const PString& show); // custom, possibly non standard, type
371  virtual void SetPriority(BYTE priority);
372 
373  virtual void SetStatus(const PString& status, const PString& lang = PString::Empty());
374  };
375 
376 
377  class IQ : public Stanza
378  {
380 
381  public:
382  enum IQType {
387  Unknown = 999
388  };
389 
392  static const PCaselessString & TypeTag();
393 
394  IQ(IQType type);
395  IQ(PXMLElement & pdu);
396  ~IQ();
397 
398  virtual PBoolean IsValid() const;
399 
405  void SetProcessed() { m_Processed = true; }
407 
408  virtual IQType GetType(PString * typeName = 0) const;
409  virtual PXMLElement * GetBody();
410 
411  virtual void SetType(IQType type);
412  virtual void SetType(const PString& type); // custom, possibly non standard, type
413  virtual void SetBody(PXMLElement * body);
414 
415  // If the this message is response, returns a pointer to the
416  // original set/get message
417  virtual IQ * GetOriginalMessage() const { return m_OriginalIQ; }
418  virtual void SetOriginalMessage(IQ * iq);
419 
423  virtual IQ * BuildResult() const;
424 
427  virtual IQ * BuildError(const PString& type, const PString& code) const;
428 
430 
431  protected:
435  };
438  namespace Disco
439  {
440  class Item : public PObject
441  {
442  PCLASSINFO(Item, PObject);
443  public:
444  Item(PXMLElement * item);
445  Item(const PString& jid, const PString& node = PString::Empty());
446 
447  const JID& GetJID() const { return m_JID; }
448  const PString& GetNode() const { return m_Node; }
449 
450  PXMLElement * AsXML(PXMLElement * parent) const;
451 
452  protected:
453  const JID m_JID;
455  };
456 
458  public:
459  ItemList(PXMLElement * list);
460  PXMLElement * AsXML(PXMLElement * parent) const;
461  };
462 
463  class Identity : public PObject
464  {
465  PCLASSINFO(Identity, PObject);
466  public:
467  Identity(PXMLElement * identity);
468  Identity(const PString& category, const PString& type, const PString& name);
469 
470  const PString& GetCategory() const { return m_Category; }
471  const PString& GetType() const { return m_Type; }
472  const PString& GetName() const { return m_Name; }
473 
474  PXMLElement * AsXML(PXMLElement * parent) const;
475 
476  protected:
480  };
481 
483  public:
484  IdentityList(PXMLElement * list);
485  PXMLElement * AsXML(PXMLElement * parent) const;
486  };
487 
488  class Info : public PObject
489  {
490  PCLASSINFO(Info, PObject);
491  public:
492  Info(PXMLElement * info);
493 
494  IdentityList& GetIdentities() { return m_Identities; }
495  PStringSet& GetFeatures() { return m_Features; }
496 
497  PXMLElement * AsXML(PXMLElement * parent) const;
498 
499  protected:
502  };
503  } // namespace Disco
504 
505 }; // class XMPP
506 
507 
508 #endif // P_EXPAT
509 
510 #endif // PTLIB_XMPP_H
511 
512 // End of File ///////////////////////////////////////////////////////////////