OPAL  Version 3.10.10
handlers.h
Go to the documentation of this file.
1 /*
2  * handlers.h
3  *
4  * Session Initiation Protocol endpoint.
5  *
6  * Open Phone Abstraction Library (OPAL)
7  *
8  * Copyright (c) 2000 Equivalence Pty. Ltd.
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 Open Phone Abstraction Library.
21  *
22  * The Initial Developer of the Original Code is Damien Sandras.
23  *
24  * Contributor(s): ______________________________________.
25  *
26  * $Revision: 28428 $
27  * $Author: rjongbloed $
28  * $Date: 2012-10-01 03:38:50 -0500 (Mon, 01 Oct 2012) $
29  */
30 
31 #ifndef OPAL_SIP_HANDLERS_H
32 #define OPAL_SIP_HANDLERS_H
33 
34 #ifdef P_USE_PRAGMA
35 #pragma interface
36 #endif
37 
38 #ifndef _PTLIB_H
39 #include <ptlib.h>
40 #endif
41 
42 #include <opal/buildopts.h>
43 
44 #if OPAL_SIP
45 
46 #include <opal/pres_ent.h>
47 #include <opal/connection.h>
48 #include <sip/sippdu.h>
49 
50 
51 /* Class to handle SIP REGISTER, SUBSCRIBE, MESSAGE, and renew
52  * the 'bindings' before they expire.
53  */
54 class SIPHandler : public PSafeObject
55 {
56  PCLASSINFO(SIPHandler, PSafeObject);
57 
58 protected:
59  SIPHandler(
60  SIP_PDU::Methods method,
61  SIPEndPoint & ep,
62  const SIPParameters & params
63  );
64 
65 public:
66  ~SIPHandler();
67 
68  virtual Comparison Compare(const PObject & other) const;
69 
70  virtual bool ShutDown();
71 
72  enum State {
73  Subscribed, // The registration is active
74  Subscribing, // The registration is in process
75  Unavailable, // The registration is offline and still being attempted
76  Refreshing, // The registration is being refreshed
77  Restoring, // The registration is trying to be restored after being offline
78  Unsubscribing, // The unregistration is in process
79  Unsubscribed, // The registrating is inactive
81  };
82 
83  void SetState (SIPHandler::State s);
84 
86  { return m_state; }
87 
88  virtual OpalTransport * GetTransport();
89 
91  { return m_authentication; }
92 
93  virtual const SIPURL & GetAddressOfRecord()
94  { return m_addressOfRecord; }
95 
96  virtual PBoolean OnReceivedNOTIFY(SIP_PDU & response);
97 
98  virtual void SetExpire(int e);
99 
100  virtual int GetExpire()
101  { return m_currentExpireTime; }
102 
103  virtual const PString & GetCallID() const
104  { return m_callID; }
105 
106  virtual void SetBody(const PString & /*body*/) { }
107 
108  virtual bool IsDuplicateCSeq(unsigned ) { return false; }
109 
111 
112  SIP_PDU::Methods GetMethod() const { return m_method; }
114 
115  virtual void OnReceivedResponse(SIPTransaction & transaction, SIP_PDU & response);
116  virtual void OnReceivedIntervalTooBrief(SIPTransaction & transaction, SIP_PDU & response);
117  virtual void OnReceivedTemporarilyUnavailable(SIPTransaction & transaction, SIP_PDU & response);
118  virtual void OnReceivedAuthenticationRequired(SIPTransaction & transaction, SIP_PDU & response);
119  virtual void OnReceivedOK(SIPTransaction & transaction, SIP_PDU & response);
120  virtual void OnTransactionFailed(SIPTransaction & transaction);
121 
122  virtual void OnFailed(const SIP_PDU & response);
123  virtual void OnFailed(SIP_PDU::StatusCodes);
124 
125  bool ActivateState(SIPHandler::State state);
126  virtual bool SendNotify(const PObject * /*body*/) { return false; }
127 
128  SIPEndPoint & GetEndPoint() const { return endpoint; }
129 
130  const OpalProductInfo & GetProductInfo() const { return m_productInfo; }
131 
132  const PString & GetUsername() const { return m_username; }
133  const PString & GetPassword() const { return m_password; }
134  const PString & GetRealm() const { return m_realm; }
135  const SIPURL & GetRemoteAddress() const { return m_remoteAddress; }
136  const SIPURL & GetProxy() const { return m_proxy; }
137 
139 
140 protected:
141  virtual PBoolean SendRequest(SIPHandler::State state);
142  void RetryLater(unsigned after);
143  PDECLARE_NOTIFIER(PTimer, SIPHandler, OnExpireTimeout);
144  static PBoolean WriteSIPHandler(OpalTransport & transport, void * info);
145  virtual bool WriteSIPHandler(OpalTransport & transport, bool forked);
146 
148 
151  PString m_username;
152  PString m_password;
153  PString m_realm;
154 
155  PSafeList<SIPTransaction> m_transactions;
157 
161  PString m_callID;
162  unsigned m_lastCseq;
167  queue<State> m_stateQueue;
169  PTimer m_expireTimer;
172 
173  // Keep a copy of the keys used for easy removal on destruction
174  typedef std::map<PString, PSafePtr<SIPHandler> > IndexMap;
175  std::pair<IndexMap::iterator, bool> m_byCallID;
176  std::pair<IndexMap::iterator, bool> m_byAorAndPackage;
177  std::pair<IndexMap::iterator, bool> m_byAuthIdAndRealm;
178  std::pair<IndexMap::iterator, bool> m_byAorUserAndRealm;
179 
180  friend class SIPHandlersList;
181 };
182 
183 #if PTRACING
184 ostream & operator<<(ostream & strm, SIPHandler::State state);
185 #endif
186 
187 
189 {
190  PCLASSINFO(SIPRegisterHandler, SIPHandler);
191 
192 public:
194  SIPEndPoint & ep,
195  const SIPRegister::Params & params
196  );
197 
199  virtual void OnReceivedOK(SIPTransaction & transaction, SIP_PDU & response);
200 
201  virtual void OnFailed(SIP_PDU::StatusCodes r);
202 
203  void UpdateParameters(const SIPRegister::Params & params);
204 
205  const SIPRegister::Params & GetParams() const { return m_parameters; }
206 
207  const SIPURLList & GetContacts() const { return m_contactAddresses; }
208  const SIPURLList & GetServiceRoute() const { return m_serviceRoute; }
209 
210 protected:
211  virtual PBoolean SendRequest(SIPHandler::State state);
212  void SendStatus(SIP_PDU::StatusCodes code, State state);
213 
219 };
220 
221 
223 {
224  PCLASSINFO(SIPSubscribeHandler, SIPHandler);
225 public:
228 
230  virtual void OnReceivedOK(SIPTransaction & transaction, SIP_PDU & response);
231  virtual PBoolean OnReceivedNOTIFY(SIP_PDU & response);
232  virtual void OnFailed(const SIP_PDU & response);
234  { return m_parameters.m_eventPackage; }
235 
236  void UpdateParameters(const SIPSubscribe::Params & params);
237 
238  virtual bool IsDuplicateCSeq(unsigned sequenceNumber) { return m_dialog.IsDuplicateCSeq(sequenceNumber); }
239 
240  const SIPSubscribe::Params & GetParams() const { return m_parameters; }
241 
242 protected:
243  virtual PBoolean SendRequest(SIPHandler::State state);
244  virtual bool WriteSIPHandler(OpalTransport & transport, bool forked);
245  void SendStatus(SIP_PDU::StatusCodes code, State state);
246  bool DispatchNOTIFY(SIP_PDU & request, SIP_PDU & response);
247 
252 
254 };
255 
256 
258 {
259  PCLASSINFO(SIPNotifyHandler, SIPHandler);
260 public:
262  SIPEndPoint & ep,
263  const PString & targetAddress,
264  const SIPEventPackage & eventPackage,
265  const SIPDialogContext & dialog
266  );
268 
271  { return m_eventPackage; }
272 
273  virtual void SetBody(const PString & body) { m_body = body; }
274 
275  virtual bool IsDuplicateCSeq(unsigned sequenceNumber) { return m_dialog.IsDuplicateCSeq(sequenceNumber); }
276  virtual bool SendNotify(const PObject * body);
277 
278  enum Reasons {
285  };
286 
287 protected:
288  virtual PBoolean SendRequest(SIPHandler::State state);
289  virtual bool WriteSIPHandler(OpalTransport & transport, bool forked);
290 
295  PString m_body;
296 };
297 
298 
300 {
301  PCLASSINFO(SIPPublishHandler, SIPHandler);
302 
303 public:
305  const SIPSubscribe::Params & params,
306  const PString & body);
307 
308  virtual void SetBody(const PString & body) { m_body = body; }
309 
311  virtual void OnReceivedOK(SIPTransaction & transaction, SIP_PDU & response);
313 
314 protected:
316  PString m_body;
317  PString m_sipETag;
318 };
319 
320 
322 {
323  PCLASSINFO(SIPMessageHandler, SIPHandler);
324 public:
325  SIPMessageHandler(SIPEndPoint & ep, const SIPMessage::Params & params);
326 
328  virtual void OnFailed(SIP_PDU::StatusCodes);
329  virtual void OnReceivedOK(SIPTransaction & transaction, SIP_PDU & response);
330 
331  void UpdateParameters(const SIPMessage::Params & params);
332 
333 protected:
335 };
336 
337 
339 {
340  PCLASSINFO(SIPOptionsHandler, SIPHandler);
341 public:
342  SIPOptionsHandler(SIPEndPoint & ep, const SIPOptions::Params & params);
343 
345  virtual void OnFailed(SIP_PDU::StatusCodes);
346  virtual void OnFailed(const SIP_PDU & response);
347  virtual void OnReceivedOK(SIPTransaction & transaction, SIP_PDU & response);
348 
349 protected:
351 };
352 
353 
355 {
356  PCLASSINFO(SIPPingHandler, SIPHandler);
357 public:
358  SIPPingHandler(SIPEndPoint & ep, const PURL & to);
360 };
361 
362 
367 {
368  public:
371  void Append(SIPHandler * handler);
372 
377  void Remove(SIPHandler * handler);
378 
381  void Update(SIPHandler * handler);
382 
386  { return m_handlersList.DeleteObjectsToBeRemoved(); }
387 
391  PSafePtr<SIPHandler> GetFirstHandler(PSafetyMode mode = PSafeReference) const
392  { return PSafePtr<SIPHandler>(m_handlersList, mode); }
393 
397  unsigned GetCount(SIP_PDU::Methods meth, const PString & eventPackage = PString::Empty()) const;
398 
402  PStringList GetAddresses(bool includeOffline, SIP_PDU::Methods meth, const PString & eventPackage = PString::Empty()) const;
403 
407  PSafePtr<SIPHandler> FindSIPHandlerByCallID(const PString & callID, PSafetyMode m);
408 
412  PSafePtr<SIPHandler> FindSIPHandlerByAuthRealm(const PString & authRealm, PSafetyMode m);
413 
417  PSafePtr<SIPHandler> FindSIPHandlerByAuthRealm(const PString & authRealm, const PString & userName, PSafetyMode m);
418 
426  PSafePtr<SIPHandler> FindSIPHandlerByUrl(const PURL & url, SIP_PDU::Methods meth, PSafetyMode m);
427  PSafePtr<SIPHandler> FindSIPHandlerByUrl(const PURL & url, SIP_PDU::Methods meth, const PString & eventPackage, PSafetyMode m);
428 
434  PSafePtr <SIPHandler> FindSIPHandlerByDomain(const PString & name, SIP_PDU::Methods meth, PSafetyMode m);
435 
436  protected:
437  void RemoveIndexes(SIPHandler * handler);
438 
439  PMutex m_extraMutex;
440  PSafeList<SIPHandler> m_handlersList;
441 
443  PSafePtr<SIPHandler> FindBy(IndexMap & by, const PString & key, PSafetyMode m);
444 
449 };
450 
451 
455 {
456 public:
458  State state = Unchanged
459  );
460 
461  // basic presence defined by RFC 3863
462  PString m_tupleId;
463  PString m_contact;
464 
465  // presence extensions defined by RFC 4480
466  PStringArray m_activities; // list of activities, seperated by newline
467 
468  // presence agent
470 
471  PString AsXML() const;
472 
473 #if P_EXPAT
474  static bool ParseXML(
475  const PString & body,
476  list<SIPPresenceInfo> & info,
477  PString & error
478  );
479 #endif
480 
481  void PrintOn(ostream & strm) const;
482  friend ostream & operator<<(ostream & strm, const SIPPresenceInfo & info) { info.PrintOn(strm); return strm; }
483 
484  static State FromSIPActivityString(const PString & str);
485 
486  static bool AsSIPActivityString(State state, PString & str);
487  bool AsSIPActivityString(PString & str) const;
488 
489  PString m_personId;
490 };
491 
492 
495 struct SIPDialogNotification : public PObject
496 {
498 
499  enum States {
505 
508  };
509  friend States operator++(States & state) { return (state = (States)(state+1)); }
510  friend States operator--(States & state) { return (state = (States)(state-1)); }
511  static PString GetStateName(States state);
512  PString GetStateName() const { return GetStateName(m_state); }
513 
514  enum Events {
515  NoEvent = -1,
523 
526  };
527  friend Events operator++(Events & evt) { return (evt = (Events)(evt+1)); }
528  friend Events operator--(Events & evt) { return (evt = (Events)(evt-1)); }
529  static PString GetEventName(Events state);
530  PString GetEventName() const { return GetEventName(m_eventType); }
531 
532  enum Rendering {
536  };
537 
538  PString m_entity;
539  PString m_dialogId;
540  PString m_callId;
544  unsigned m_eventCode;
545  struct Participant {
547  PString m_URI;
548  PString m_dialogTag;
549  PString m_identity;
550  PString m_display;
552  bool m_byeless;
554  } m_local, m_remote;
555 
556  SIPDialogNotification(const PString & entity = PString::Empty());
557 
558  void PrintOn(ostream & strm) const;
559 };
560 
561 
562 #endif // OPAL_SIP
563 
564 #endif // OPAL_SIP_HANDLERS_H