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_LIDS_CAPI_EP_H
00032 #define OPAL_LIDS_CAPI_EP_H
00033
00034 #ifdef P_USE_PRAGMA
00035 #pragma interface
00036 #endif
00037
00038 #include <opal/buildopts.h>
00039
00040 #if OPAL_CAPI
00041
00042 #include <opal/endpoint.h>
00043
00044
00045 class OpalCapiFunctions;
00046 class OpalCapiConnection;
00047 struct OpalCapiMessage;
00048
00049
00050 #define OPAL_OPT_CAPI_B_PROTO "B-Proto"
00051
00052
00055 class OpalCapiEndPoint : public OpalEndPoint
00056 {
00057 PCLASSINFO(OpalCapiEndPoint, OpalEndPoint);
00058
00059 public:
00064 OpalCapiEndPoint(
00065 OpalManager & manager
00066 );
00067
00069 ~OpalCapiEndPoint();
00071
00097 virtual PSafePtr<OpalConnection> MakeConnection(
00098 OpalCall & call,
00099 const PString & party,
00100 void * userData = NULL,
00101 unsigned int options = 0,
00102 OpalConnection::StringOptions * stringOptions = NULL
00103 );
00104
00114 virtual OpalMediaFormatList GetMediaFormats() const;
00116
00119 virtual OpalCapiConnection * CreateConnection(
00120 OpalCall & call,
00121 void * userData,
00122 unsigned int options,
00123 OpalConnection::StringOptions * stringOptions,
00124 unsigned controller,
00125 unsigned bearer
00126 );
00128
00133 unsigned OpenControllers();
00134
00138 PString GetDriverInfo() const;
00140
00143
00144
00145 protected:
00146 bool GetFreeLine(unsigned & controller, unsigned & bearer);
00147 PDECLARE_NOTIFIER(PThread, OpalCapiEndPoint, ProcessMessages);
00148 virtual void ProcessMessage(const OpalCapiMessage & message);
00149 void ProcessConnectInd(const OpalCapiMessage & message);
00150 virtual bool PutMessage(OpalCapiMessage & message);
00151
00152 OpalCapiFunctions * m_capi;
00153 PThread * m_thread;
00154 unsigned m_applicationId;
00155 PSyncPoint m_listenCompleted;
00156
00157 struct Controller {
00158 Controller() : m_active(false) { }
00159
00160 bool GetFreeLine(unsigned & bearer);
00161
00162 bool m_active;
00163 vector<bool> m_bearerInUse;
00164 };
00165 typedef std::vector<Controller> ControllerVector;
00166 ControllerVector m_controllers;
00167 PMutex m_controllerMutex;
00168
00169 struct IdToConnMap : public std::map<DWORD, PSafePtr<OpalCapiConnection> >
00170 {
00171 bool Forward(const OpalCapiMessage & message, DWORD id);
00172 PMutex m_mutex;
00173 };
00174
00175 IdToConnMap m_cbciToConnection;
00176 IdToConnMap m_plciToConnection;
00177
00178 friend class OpalCapiConnection;
00179 };
00180
00181
00184 class OpalCapiConnection : public OpalConnection
00185 {
00186 PCLASSINFO(OpalCapiConnection, OpalConnection);
00187
00188 public:
00193 OpalCapiConnection(
00194 OpalCall & call,
00195 OpalCapiEndPoint & endpoint,
00196 unsigned int options,
00197 OpalConnection::StringOptions * stringOptions,
00198 unsigned controller,
00199 unsigned bearer
00200 );
00202
00213 virtual bool IsNetworkConnection() const;
00214
00221 virtual PBoolean SetUpConnection();
00222
00233 virtual PBoolean SetAlerting(
00234 const PString & calleeName,
00235 PBoolean withMedia
00236 );
00237
00242 virtual PBoolean SetConnected();
00243
00262 virtual void OnReleased();
00263
00270 virtual PString GetDestinationAddress();
00271
00278 virtual OpalMediaFormatList GetMediaFormats() const;
00279
00294 virtual OpalMediaStream * CreateMediaStream(
00295 const OpalMediaFormat & mediaFormat,
00296 unsigned sessionID,
00297 PBoolean isSource
00298 );
00299
00306 virtual PBoolean SendUserInputTone(
00307 char tone,
00308 int duration
00309 );
00310
00312 virtual void OnApplyStringOptions();
00314
00317
00318
00319 protected:
00320 virtual void ProcessMessage(const OpalCapiMessage & message);
00321 virtual bool PutMessage(OpalCapiMessage & message);
00322
00323 OpalCapiEndPoint & m_endpoint;
00324 unsigned m_controller;
00325 unsigned m_bearer;
00326 DWORD m_PLCI;
00327 DWORD m_NCCI;
00328
00329 PSyncPoint m_disconnected;
00330
00331 PBYTEArray m_Bprotocol;
00332
00333 friend class OpalCapiEndPoint;
00334 friend struct OpalCapiEndPoint::IdToConnMap;
00335 friend class OpalCapiMediaStream;
00336 };
00337
00338
00342 class OpalCapiMediaStream : public OpalMediaStream
00343 {
00344 PCLASSINFO(OpalCapiMediaStream, OpalMediaStream);
00345 public:
00350 OpalCapiMediaStream(
00351 OpalCapiConnection & conn,
00352 const OpalMediaFormat & mediaFormat,
00353 unsigned sessionID,
00354 PBoolean isSource
00355 );
00357
00358
00364 virtual PBoolean ReadData(
00365 BYTE * data,
00366 PINDEX size,
00367 PINDEX & length
00368 );
00369
00373 virtual PBoolean WriteData(
00374 const BYTE * data,
00375 PINDEX length,
00376 PINDEX & written
00377 );
00378
00382 virtual PBoolean IsSynchronous() const;
00384
00387
00388
00389 protected:
00390 virtual void InternalClose();
00391
00392 OpalCapiConnection & m_connection;
00393 PQueueChannel m_queue;
00394 PSyncPoint m_written;
00395 PAdaptiveDelay m_delay;
00396
00397 friend class OpalCapiConnection;
00398 };
00399
00400
00401 #endif // OPAL_CAPI
00402
00403 #endif // OPAL_LIDS_CAPI_EP_H
00404
00405
00406