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_IM_EP_H
00032 #define OPAL_IM_EP_H
00033
00034 #include <ptlib.h>
00035 #include <opal/buildopts.h>
00036
00037 #if OPAL_HAS_IM
00038
00039 #include <opal/endpoint.h>
00040
00041
00044 class OpalIMEndPoint : public OpalEndPoint
00045 {
00046 public:
00047 static const PCaselessString & Prefix();
00048
00051 OpalIMEndPoint(OpalManager & manager);
00052 ~OpalIMEndPoint();
00054
00055
00058 virtual PSafePtr<OpalConnection> MakeConnection(
00059 OpalCall & call,
00060 const PString & party,
00061 void * userData = NULL,
00062 unsigned int options = 0,
00063 OpalConnection::StringOptions * stringOptions = NULL
00064 );
00065
00075 virtual OpalMediaFormatList GetMediaFormats() const;
00076
00081 virtual PBoolean GarbageCollection();
00082
00085 virtual void ShutDown();
00087
00088
00098 PSafePtr<OpalIMContext> CreateContext(
00099 const PURL & localURL,
00100 const PURL & remoteURL,
00101 const char * scheme = NULL
00102 ) { return InternalCreateContext(localURL, remoteURL, scheme, false, NULL, NULL); }
00103
00106 PSafePtr<OpalIMContext> CreateContext(
00107 OpalCall & call
00108 );
00109
00114 void RemoveContext(OpalIMContext * context, bool byRemote);
00115
00119 PSafePtr<OpalIMContext> FindContextByIdWithLock(
00120 const PString & key,
00121 PSafetyMode mode = PSafeReadWrite
00122 );
00123
00127 PSafePtr<OpalIMContext> FindContextByNamesWithLock(
00128 const PURL & local,
00129 const PURL & remote,
00130 PSafetyMode mode = PSafeReadWrite
00131 );
00132
00136 PSafePtr<OpalIMContext> FindContextForMessageWithLock(
00137 OpalIM & im,
00138 OpalConnection * conn = NULL
00139 );
00141
00142
00149 virtual void OnConversation(
00150 const OpalIMContext::ConversationInfo & info
00151 );
00152
00154 typedef PNotifierTemplate<OpalIMContext::ConversationInfo> ConversationNotifier;
00155
00157 #define PDECLARE_ConversationNotifier(cls, fn) PDECLARE_NOTIFIER2(OpalIMContext, cls, fn, OpalIMContext::ConversationInfo)
00158
00160 #define PDECLARE_ASYNC_ConversationNotifier(cls, fn) PDECLARE_ASYNC_NOTIFIER2(OpalIMContext, cls, fn, OpalIMContext::ConversationInfo)
00161
00163 #define PCREATE_ConversationNotifier(fn) PCREATE_NOTIFIER2(fn, OpalIMContext::ConversationInfo)
00164
00171 void AddNotifier(
00172 const ConversationNotifier & notifier,
00173 const PString & scheme
00174 );
00175
00178 bool RemoveNotifier(const ConversationNotifier & notifier, const PString & scheme);
00180
00181
00182 OpalIMContext::MessageDisposition OnRawMessageReceived(
00183 OpalIM & message,
00184 OpalConnection * connnection,
00185 PString & errorInfo
00186 );
00187
00188 OpalManager & GetManager() const { return m_manager; }
00189
00190 protected:
00191 PSafePtr<OpalIMContext> InternalCreateContext(
00192 const PURL & localURL,
00193 const PURL & remoteURL,
00194 const char * scheme,
00195 bool byRemote,
00196 OpalCall * call,
00197 const char * conversationID
00198 );
00199
00200 OpalManager & m_manager;
00201 typedef PSafeDictionary<PString, OpalIMContext> ContextsByConversationId;
00202 ContextsByConversationId m_contextsByConversationId;
00203
00204 PMutex m_contextsByNamesMutex;
00205 typedef std::multimap<PString, PString> ContextsByNames;
00206 ContextsByNames m_contextsByNames;
00207
00208 PMutex m_notifierMutex;
00209 typedef std::multimap<PString, ConversationNotifier> ConversationMap;
00210 ConversationMap m_notifiers;
00211
00212 PTime m_lastGarbageCollection;
00213 bool m_deleting;
00214 };
00215
00216
00221 class OpalIMConnection : public OpalConnection
00222 {
00223 PCLASSINFO(OpalIMConnection, OpalConnection);
00224 public:
00229 OpalIMConnection(
00230 OpalCall & call,
00231 OpalIMEndPoint & endpoint,
00232 void * userData,
00233 unsigned options,
00234 OpalConnection::StringOptions * stringOptions
00235 );
00237
00248 virtual PBoolean IsNetworkConnection() const { return false; }
00249
00253 virtual PBoolean OnSetUpConnection();
00254
00266 virtual void OnEstablished();
00267
00274 virtual void OnReleased();
00276
00277 protected:
00278 OpalIMContext * m_context;
00279 };
00280
00281
00282 #endif // OPAL_HAS_IM
00283
00284 #endif // OPAL_IM_EP_H