sippres.h

Go to the documentation of this file.
00001 /*
00002  * sippres.h
00003  *
00004  * SIP Presence classes for Opal
00005  *
00006  * Open Phone Abstraction Library (OPAL)
00007  *
00008  * Copyright (c) 2009 Post Increment
00009  *
00010  * The contents of this file are subject to the Mozilla Public License
00011  * Version 1.0 (the "License"); you may not use this file except in
00012  * compliance with the License. You may obtain a copy of the License at
00013  * http://www.mozilla.org/MPL/
00014  *
00015  * Software distributed under the License is distributed on an "AS IS"
00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00017  * the License for the specific language governing rights and limitations
00018  * under the License.
00019  *
00020  * The Original Code is Open Phone Abstraction Library.
00021  *
00022  * The Initial Developer of the Original Code is Post Increment
00023  *
00024  * Contributor(s): ______________________________________.
00025  *
00026  * $Revision: 28081 $
00027  * $Author: rjongbloed $
00028  * $Date: 2012-07-22 07:24:14 -0500 (Sun, 22 Jul 2012) $
00029  */
00030 
00031 #ifndef OPAL_SIP_SIPPRES_H
00032 #define OPAL_SIP_SIPPRES_H
00033 
00034 #include <ptlib.h>
00035 #include <opal/buildopts.h>
00036 #include <sip/sipep.h>
00037 
00038 #if P_EXPAT && OPAL_SIP
00039 
00040 #include <opal/pres_ent.h>
00041 #include <ptclib/pxml.h>
00042 
00043 
00044 class XCAPClient : public PHTTPClient
00045 {
00046   public:
00047     struct ElementSelector {
00048       ElementSelector(
00049         const PString & name = PString::Empty(),
00050         const PString & position = PString::Empty()
00051       ) : m_name(name)
00052         , m_position(position)
00053       { PAssert(!m_name.IsEmpty(), PInvalidParameter); }
00054 
00055       ElementSelector(
00056         const PString & name,
00057         const PString & attribute,
00058         const PString & value
00059       ) : m_name(name)
00060         , m_attribute(attribute)
00061         , m_value(value)
00062       { PAssert(!m_name.IsEmpty(), PInvalidParameter); }
00063 
00064       ElementSelector(
00065         const PString & name,
00066         const PString & position,
00067         const PString & attribute,
00068         const PString & value
00069       ) : m_name(name)
00070         , m_position(position)
00071         , m_attribute(attribute)
00072         , m_value(value)
00073       { PAssert(!m_name.IsEmpty(), PInvalidParameter); }
00074 
00075       PString AsString() const;
00076 
00077       PString m_name;
00078       PString m_position;
00079       PString m_attribute;
00080       PString m_value;
00081     };
00082 
00083     class NodeSelector : public std::list<ElementSelector>
00084     {
00085       public:
00086         NodeSelector()
00087           { }
00088         NodeSelector(
00089           const ElementSelector & selector
00090         ) { push_back(selector); }
00091         NodeSelector(
00092           const ElementSelector & selector1,
00093           const ElementSelector & selector2
00094         ) { push_back(selector1); push_back(selector2); }
00095         NodeSelector(
00096           const ElementSelector & selector1,
00097           const ElementSelector & selector2,
00098           const ElementSelector & selector3
00099         ) { push_back(selector1); push_back(selector2); push_back(selector3); }
00100 
00101         void AddElement(
00102           const PString & name,
00103           const PString & position = PString::Empty()
00104         ) { push_back(ElementSelector(name, position)); }
00105 
00106         void AddElement(
00107           const PString & name,
00108           const PString & attribute,
00109           const PString & value
00110         ) { push_back(ElementSelector(name, attribute, value)); }
00111 
00112         void AddElement(
00113           const PString & name,
00114           const PString & position,
00115           const PString & attribute,
00116           const PString & value
00117         ) { push_back(ElementSelector(name, position, attribute, value)); }
00118 
00119         void SetNamespace(
00120           const PString & space,
00121           const PString & alias = PString::Empty()
00122         ) { PAssert(!space.IsEmpty(), PInvalidParameter); m_namespaces[alias] = space; }
00123 
00124         void AddToURL(
00125           PURL & url
00126         ) const;
00127 
00128       protected:
00129         std::map<PString, PString> m_namespaces;
00130     };
00131 
00132 
00133     XCAPClient();
00134 
00135     bool GetXml(
00136       PXML & xml
00137     ) { return GetXml(BuildURL(), xml); }
00138 
00139     bool GetXml(
00140       const PURL & url,
00141       PXML & xml
00142     );
00143 
00144     bool PutXml(
00145       const PXML & xml
00146     ) { return PutXml(BuildURL(), xml); }
00147 
00148     bool PutXml(
00149       const PURL & url,
00150       const PXML & xml
00151     );
00152 
00153     bool DeleteXml() { return DeleteDocument(BuildURL()); }
00154 
00155 
00156     PURL BuildURL();
00157 
00158 
00159     void SetRoot(
00160       const PURL & server
00161     ) { m_root = server; }
00162     const PURL & GetRoot() const { return m_root; }
00163 
00164     void SetApplicationUniqueID(
00165       const PString & id
00166     ) { m_auid = id; }
00167     const PString & GetApplicationUniqueID() const { return m_auid; }
00168 
00169     void SetGlobal() { m_global = true; }
00170     bool IsGlobal() const { return m_global; }
00171 
00172     void SetUserIdentifier(
00173       const PString & id
00174     ) { m_global = false; m_xui = id; }
00175     const PString & GetUserIdentifier() const { return m_xui; }
00176 
00177     void SetFilename(
00178       const PString & fn
00179     ) { m_filename = fn; }
00180     const PString & GetFilename() const { return m_filename; }
00181 
00182     void SetNode(
00183       const NodeSelector & node
00184     ) { m_node = node; }
00185     const NodeSelector & GetNode() const { return m_node; }
00186     void ClearNode() { m_node.clear(); }
00187 
00188     void SetContentType(
00189       const PString & type
00190     ) { m_contentType = type; }
00191     const PString & GetContentType() const { return m_contentType; }
00192 
00193   protected:
00194     PURL         m_root;
00195     PString      m_auid;
00196     bool         m_global;
00197     PString      m_xui;
00198     PString      m_filename;
00199     NodeSelector m_node;
00200     PString      m_contentType;
00201 };
00202 
00203 
00204 class SIPWatcherInfoCommand : public OpalPresentityCommand {
00205   public:
00206     SIPWatcherInfoCommand(bool unsubscribe = false) : m_unsubscribe(unsubscribe) { }
00207 
00208     bool m_unsubscribe;
00209 };
00210 
00211 
00214 class SIP_Presentity : public OpalPresentityWithCommandThread
00215 {
00216     PCLASSINFO(SIP_Presentity, OpalPresentityWithCommandThread);
00217 
00218   public:
00219     SIP_Presentity();
00220     SIP_Presentity(const SIP_Presentity & other);
00221     ~SIP_Presentity();
00222 
00223     virtual PObject * Clone() const { return new SIP_Presentity(*this); }
00224 
00225     enum SubProtocol {
00226       // Note order is important
00227       e_PeerToPeer,
00228       e_WithAgent,
00229       e_XCAP,
00230       e_OMA
00231     };
00232 
00233     static const PCaselessString & PIDFEntityKey();
00234     static const PCaselessString & SubProtocolKey();
00235     static const PCaselessString & PresenceAgentKey();
00236     static const PCaselessString & TransportKey();
00237     static const PCaselessString & XcapRootKey();
00238     static const PCaselessString & XcapAuthIdKey();
00239     static const PCaselessString & XcapPasswordKey();
00240     static const PCaselessString & XcapAuthAuidKey();
00241     static const PCaselessString & XcapAuthFileKey();
00242     static const PCaselessString & XcapBuddyListKey();
00243 
00244     virtual PStringArray GetAttributeNames() const;
00245     virtual PStringArray GetAttributeTypes() const;
00246 
00247     virtual bool Open();
00248     virtual bool Close();
00249     virtual BuddyStatus GetBuddyListEx(BuddyList & buddies);
00250     virtual BuddyStatus SetBuddyListEx(const BuddyList & buddies);
00251     virtual BuddyStatus DeleteBuddyListEx();
00252     virtual BuddyStatus GetBuddyEx(BuddyInfo & buddy);
00253     virtual BuddyStatus SetBuddyEx(const BuddyInfo & buddy);
00254     virtual BuddyStatus DeleteBuddyEx(const PURL & presentity);
00255     virtual BuddyStatus SubscribeBuddyListEx(PINDEX & successful, bool subscribe = true);
00256 
00257     SIPEndPoint & GetEndpoint() { return *m_endpoint; }
00258 
00259     void Internal_SendLocalPresence(const OpalSetLocalPresenceCommand & cmd);
00260     void Internal_SubscribeToPresence(const OpalSubscribeToPresenceCommand & cmd);
00261     void Internal_SubscribeToWatcherInfo(const SIPWatcherInfoCommand & cmd);
00262     void Internal_AuthorisationRequest(const OpalAuthorisationRequestCommand & cmd);
00263 
00264     unsigned GetExpiryTime() const;
00265 
00266   protected:
00267     PDECLARE_NOTIFIER2(SIPSubscribeHandler, SIP_Presentity, OnPresenceSubscriptionStatus, const SIPSubscribe::SubscriptionStatus &);
00268     PDECLARE_NOTIFIER2(SIPSubscribeHandler, SIP_Presentity, OnPresenceNotify, SIPSubscribe::NotifyCallbackInfo &);
00269     PDECLARE_NOTIFIER2(SIPSubscribeHandler, SIP_Presentity, OnWatcherInfoSubscriptionStatus, const SIPSubscribe::SubscriptionStatus &);
00270     PDECLARE_NOTIFIER2(SIPSubscribeHandler, SIP_Presentity, OnWatcherInfoNotify, SIPSubscribe::NotifyCallbackInfo &);
00271     void OnReceivedWatcherStatus(PXMLElement * watcher);
00272     void SetPIDFEntity(PURL & entity);
00273     bool ChangeAuthNode(XCAPClient & xcap, const OpalAuthorisationRequestCommand & cmd);
00274     void InitRootXcap(XCAPClient & xcap);
00275     void InitBuddyXcap(
00276       XCAPClient & xcap,
00277       const PString & entryName = PString::Empty(),
00278       const PString & listName = PString::Empty()
00279     );
00280 
00281     SIPEndPoint * m_endpoint;
00282     SubProtocol   m_subProtocol;
00283     PString       m_presenceAgent;
00284     PString       m_watcherSubscriptionAOR;
00285     int           m_watcherInfoVersion;
00286     PString       m_publishedTupleId;
00287 
00288     typedef std::map<PString, PString> StringMap;
00289     StringMap m_watcherAorById;
00290     StringMap m_presenceIdByAor;
00291     StringMap m_presenceAorById;
00292     StringMap m_authorisationIdByAor;
00293 
00294   private:
00295     void operator=(const SIP_Presentity &) { }
00296 };
00297 
00298 
00299 #endif // P_EXPAT && OPAL_SIP
00300 
00301 #endif // OPAL_SIP_SIPPRES_H

Generated on 14 Aug 2013 for OPAL by  doxygen 1.4.7