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 #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
00212 class SIP_Presentity : public OpalPresentityWithCommandThread
00213 {
00214 PCLASSINFO(SIP_Presentity, OpalPresentityWithCommandThread);
00215
00216 public:
00217 static const PString & DefaultPresenceServerKey();
00218 static const PString & PresenceServerKey();
00219
00220 ~SIP_Presentity();
00221
00222 virtual bool Open();
00223 virtual bool IsOpen() const;
00224 virtual bool Close();
00225
00226 SIPEndPoint & GetEndpoint() { return *m_endpoint; }
00227
00233 static bool SetDefaultPresentity(
00234 const PString & prefix
00235 );
00236
00237 protected:
00238 SIP_Presentity();
00239
00240 SIPEndPoint * m_endpoint;
00241 int m_watcherInfoVersion;
00242 PString m_publishedTupleId;
00243 };
00244
00245
00246 class SIPLocal_Presentity : public SIP_Presentity
00247 {
00248 PCLASSINFO(SIPLocal_Presentity, SIP_Presentity);
00249
00250 public:
00251 ~SIPLocal_Presentity();
00252 };
00253
00254
00255 class SIPXCAP_Presentity : public SIP_Presentity
00256 {
00257 PCLASSINFO(SIPXCAP_Presentity, SIP_Presentity);
00258
00259 public:
00260 static const PString & XcapRootKey();
00261 static const PString & XcapAuthIdKey();
00262 static const PString & XcapPasswordKey();
00263 static const PString & XcapAuthAuidKey();
00264 static const PString & XcapAuthFileKey();
00265 static const PString & XcapBuddyListKey();
00266
00267 SIPXCAP_Presentity();
00268 ~SIPXCAP_Presentity();
00269
00271 virtual bool Open();
00272 virtual bool Close();
00273
00274 virtual bool GetBuddyList(BuddyList & buddies);
00275 virtual bool SetBuddyList(const BuddyList & buddies);
00276 virtual bool DeleteBuddyList();
00277 virtual bool GetBuddy(BuddyInfo & buddy);
00278 virtual bool SetBuddy(const BuddyInfo & buddy);
00279 virtual bool DeleteBuddy(const PURL & presentity);
00280 virtual bool SubscribeBuddyList(bool subscribe = true);
00282
00283 void Internal_SendLocalPresence(const OpalSetLocalPresenceCommand & cmd);
00284 void Internal_SubscribeToPresence(const OpalSubscribeToPresenceCommand & cmd);
00285 void Internal_AuthorisationRequest(const OpalAuthorisationRequestCommand & cmd);
00286 void Internal_SubscribeToWatcherInfo(const SIPWatcherInfoCommand & cmd);
00287
00288 protected:
00289 PDECLARE_NOTIFIER2(SIPSubscribeHandler, SIPXCAP_Presentity, OnWatcherInfoSubscriptionStatus, const SIPSubscribe::SubscriptionStatus &);
00290 PDECLARE_NOTIFIER2(SIPSubscribeHandler, SIPXCAP_Presentity, OnWatcherInfoNotify, SIPSubscribe::NotifyCallbackInfo &);
00291 PDECLARE_NOTIFIER2(SIPSubscribeHandler, SIPXCAP_Presentity, OnPresenceSubscriptionStatus, const SIPSubscribe::SubscriptionStatus &);
00292 PDECLARE_NOTIFIER2(SIPSubscribeHandler, SIPXCAP_Presentity, OnPresenceNotify, SIPSubscribe::NotifyCallbackInfo &);
00293
00294 unsigned GetExpiryTime() const;
00295 virtual void OnReceivedWatcherStatus(PXMLElement * watcher);
00296 virtual void InitRuleSet(PXML & xml);
00297 bool ChangeAuthNode(XCAPClient & xcap, const OpalAuthorisationRequestCommand & cmd);
00298 void InitBuddyXcap(
00299 XCAPClient & xcap,
00300 const PString & entryName = PString::Empty(),
00301 const PString & listName = PString::Empty()
00302 );
00303
00304 PIPSocketAddressAndPort m_presenceServer;
00305 PString m_watcherSubscriptionAOR;
00306
00307 typedef std::map<PString, PString> StringMap;
00308 StringMap m_watcherAorById;
00309 StringMap m_presenceIdByAor;
00310 StringMap m_presenceAorById;
00311 StringMap m_authorisationIdByAor;
00312 };
00313
00314
00315 class SIPOMA_Presentity : public SIPXCAP_Presentity
00316 {
00317 PCLASSINFO(SIPOMA_Presentity, SIPXCAP_Presentity);
00318
00319 public:
00320 SIPOMA_Presentity();
00321
00322 protected:
00323 virtual void InitRuleSet(PXML & xml);
00324 };
00325
00326
00327 #endif // P_EXPAT && OPAL_SIP
00328
00329 #endif // OPAL_SIP_SIPPRES_H