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_T38_T38PROTO_H
00032 #define OPAL_T38_T38PROTO_H
00033
00034 #ifdef P_USE_PRAGMA
00035 #pragma interface
00036 #endif
00037
00038 #include <opal/buildopts.h>
00039
00040
00041 #if OPAL_FAX
00042
00043 #include <ptlib/pipechan.h>
00044
00045 #include <opal/mediafmt.h>
00046 #include <opal/mediastrm.h>
00047 #include <opal/endpoint.h>
00048
00049
00050 class OpalTransport;
00051 class T38_IFPPacket;
00052 class PASN_OctetString;
00053
00054
00055 namespace PWLibStupidLinkerHacks {
00056 extern int t38Loader;
00057 };
00058
00060
00066 class OpalFaxAudioFormat : public OpalMediaFormat
00067 {
00068 friend class OpalPluginCodecManager;
00069 PCLASSINFO(OpalFaxAudioFormat, OpalMediaFormat);
00070 public:
00071 OpalFaxAudioFormat(
00072 const char * fullName,
00073 RTP_DataFrame::PayloadTypes rtpPayloadType,
00074 const char * encodingName,
00075 PINDEX frameSize,
00076 unsigned frameTime,
00077 unsigned rxFrames,
00078 unsigned txFrames,
00079 unsigned maxFrames = 256,
00080 unsigned clockRate = 8000,
00081 time_t timeStamp = 0
00082 );
00083 };
00084
00085
00087
00088 class OpalFaxCallInfo {
00089 public:
00090 OpalFaxCallInfo();
00091 PUDPSocket socket;
00092 PPipeChannel spanDSP;
00093 unsigned refCount;
00094 PIPSocket::Address spanDSPAddr;
00095 WORD spanDSPPort;
00096 };
00097
00099
00102 class OpalFaxMediaStream : public OpalMediaStream
00103 {
00104 PCLASSINFO(OpalFaxMediaStream, OpalMediaStream);
00105 public:
00110 OpalFaxMediaStream(
00111 OpalConnection & conn,
00112 const OpalMediaFormat & mediaFormat,
00113 unsigned sessionID,
00114 PBoolean isSource ,
00115 const PString & token,
00116 const PString & filename,
00117 PBoolean receive,
00118 const PString & stationId
00119 );
00121
00128 virtual PBoolean Open();
00129
00134 virtual PBoolean Close();
00135
00141 virtual PBoolean Start();
00142
00146 virtual PBoolean ReadPacket(
00147 RTP_DataFrame & packet
00148 );
00149
00153 virtual PBoolean WritePacket(
00154 RTP_DataFrame & packet
00155 );
00156
00160 virtual PBoolean IsSynchronous() const;
00161
00162 virtual PString GetSpanDSPCommandLine(OpalFaxCallInfo &);
00163
00165
00166 protected:
00167 PMutex infoMutex;
00168 PString sessionToken;
00169 OpalFaxCallInfo * faxCallInfo;
00170 PFilePath filename;
00171 PBoolean receive;
00172 BYTE writeBuffer[320];
00173 PINDEX writeBufferLen;
00174 PString stationId;
00175 };
00176
00178
00181 class OpalT38MediaStream : public OpalFaxMediaStream
00182 {
00183 PCLASSINFO(OpalT38MediaStream, OpalFaxMediaStream);
00184 public:
00185 OpalT38MediaStream(
00186 OpalConnection & conn,
00187 const OpalMediaFormat & mediaFormat,
00188 unsigned sessionID,
00189 PBoolean isSource ,
00190 const PString & token,
00191 const PString & filename,
00192 PBoolean receive,
00193 const PString & stationId
00194 );
00195
00196 PString GetSpanDSPCommandLine(OpalFaxCallInfo &);
00197
00198 PBoolean ReadPacket(RTP_DataFrame & packet);
00199 PBoolean WritePacket(RTP_DataFrame & packet);
00200
00201 RTP_DataFrameList queuedFrames;
00202 };
00203
00205
00206 class OpalFaxConnection;
00207
00216 class OpalFaxEndPoint : public OpalEndPoint
00217 {
00218 PCLASSINFO(OpalFaxEndPoint, OpalEndPoint);
00219 public:
00224 OpalFaxEndPoint(
00225 OpalManager & manager,
00226 const char * prefix = "fax"
00227 );
00228
00231 ~OpalFaxEndPoint();
00233
00234 virtual PBoolean MakeConnection(
00235 OpalCall & call,
00236 const PString & party,
00237 void * userData = NULL,
00238 unsigned int options = 0,
00239 OpalConnection::StringOptions * stringOptions = NULL
00240 );
00241
00244 virtual OpalFaxConnection * CreateConnection(
00245 OpalCall & call,
00246 const PString & filename,
00247 PBoolean receive,
00248 void * userData = NULL,
00249 OpalConnection::StringOptions * stringOptions = NULL
00250 );
00251
00261 virtual OpalMediaFormatList GetMediaFormats() const;
00262
00263 virtual PString MakeToken();
00264
00268 virtual void AcceptIncomingConnection(
00269 const PString & connectionToken
00270 );
00271
00276 virtual void OnPatchMediaStream(
00277 const OpalFaxConnection & connection,
00278 PBoolean isSource,
00279 OpalMediaPatch & patch
00280 );
00282
00286 const PFilePath & GetSpanDSP() const { return m_spanDSP; }
00287
00290 void SetSpanDSP(
00291 const PString & path
00292 ) { m_spanDSP = path; }
00293
00296 const PString & GetDefaultDirectory() const { return m_defaultDirectory; }
00297
00300 void SetDefaultDirectory(
00301 const PString & dir
00302 ) { m_defaultDirectory = dir; }
00304
00305 protected:
00306 PFilePath m_spanDSP;
00307 PDirectory m_defaultDirectory;
00308 };
00309
00311
00314 class OpalFaxConnection : public OpalConnection
00315 {
00316 PCLASSINFO(OpalFaxConnection, OpalConnection);
00317 public:
00322 OpalFaxConnection(
00323 OpalCall & call,
00324 OpalFaxEndPoint & endpoint,
00325 const PString & filename,
00326 PBoolean receive,
00327 const PString & _token,
00328 OpalConnection::StringOptions * stringOptions = NULL
00329 );
00330
00333 ~OpalFaxConnection();
00335
00346 virtual bool IsNetworkConnection() const { return false; }
00347
00354 virtual PBoolean SetUpConnection();
00355
00366 virtual PBoolean SetAlerting(
00367 const PString & calleeName,
00368 PBoolean withMedia
00369 );
00370
00378 virtual OpalMediaFormatList GetMediaFormats() const;
00379
00380 OpalMediaStream * CreateMediaStream(const OpalMediaFormat & mediaFormat, unsigned sessionID, PBoolean isSource);
00381
00389 virtual void OnPatchMediaStream(
00390 PBoolean isSource,
00391 OpalMediaPatch & patch
00392 );
00393
00398 virtual void AcceptIncoming();
00399
00401
00402 void AdjustMediaFormats(OpalMediaFormatList & mediaFormats) const;
00403
00404 protected:
00405 OpalFaxEndPoint & endpoint;
00406 PString filename;
00407 PBoolean receive;
00408 PBoolean forceFaxAudio;
00409 PString stationId;
00410 };
00411
00413
00414 class OpalT38Connection;
00415
00424 class OpalT38EndPoint : public OpalFaxEndPoint
00425 {
00426 PCLASSINFO(OpalT38EndPoint, OpalFaxEndPoint);
00427 public:
00432 OpalT38EndPoint(
00433 OpalManager & manager,
00434 const char * prefix = "t38"
00435 );
00436 OpalMediaFormatList GetMediaFormats() const;
00437 PString MakeToken();
00438 virtual OpalFaxConnection * CreateConnection(OpalCall & call, const PString & filename, PBoolean receive, void * , OpalConnection::StringOptions * stringOptions);
00439 };
00440
00442
00445 class OpalT38Connection : public OpalFaxConnection
00446 {
00447 PCLASSINFO(OpalT38Connection, OpalFaxConnection);
00448 public:
00453 OpalT38Connection(
00454 OpalCall & call,
00455 OpalT38EndPoint & endpoint,
00456 const PString & filename,
00457 PBoolean receive,
00458 const PString & _token,
00459 OpalConnection::StringOptions * stringOptions = NULL
00460 );
00461
00462 ~OpalT38Connection();
00463
00464 void OnPatchMediaStream(PBoolean isSource, OpalMediaPatch & patch);
00465 OpalMediaStream * CreateMediaStream(const OpalMediaFormat & mediaFormat, unsigned sessionID, PBoolean isSource);
00466 OpalMediaFormatList GetMediaFormats() const;
00467
00468
00469 enum {
00470 T38Mode_Wait = 0,
00471 T38Mode_InBandCED = 1,
00472 T38Mode_NSECED = 2,
00473 T38Mode_Timeout = 4,
00474 T38Mode_Auto = 7
00475 };
00476
00477 virtual PBoolean SendUserInputTone(
00478 char tone,
00479 unsigned duration
00480 );
00481
00482 PDECLARE_NOTIFIER(PTimer, OpalT38Connection, OnFaxChangeTimeout);
00483
00484 protected:
00485 void RequestFaxMode(bool fax);
00486 void InFaxMode(bool fax);
00487
00488 unsigned t38WaitMode;
00489
00490 PMutex modeMutex;
00491 bool currentMode, newMode;
00492 bool modeChangeTriggered;
00493 PTimer faxTimer;
00494 bool faxStartup;
00495 };
00496
00497
00498 #endif // OPAL_FAX
00499
00500 #endif // OPAL_T38_T38PROTO_H