31 #ifndef OPAL_T38_T38PROTO_H
32 #define OPAL_T38_T38PROTO_H
40 #if OPAL_T38_CAPABILITY
49 class OpalFaxConnection;
53 class PASN_OctetString;
56 #define OPAL_OPT_STATION_ID "Station-Id"
57 #define OPAL_OPT_HEADER_INFO "Header-Info"
58 #define OPAL_NO_G111_FAX "No-G711-Fax"
59 #define OPAL_SWITCH_ON_CED "Switch-On-CED"
60 #define OPAL_T38_SWITCH_TIME "T38-Switch-Time"
62 #define OPAL_FAX_TIFF_FILE "TIFF-File"
64 #define OPAL_T38FaxRateManagement "T38FaxRateManagement"
65 #define OPAL_T38localTCF "localTCF"
66 #define OPAL_T38transferredTCF "transferredTCF"
67 #define OPAL_T38FaxVersion "T38FaxVersion"
68 #define OPAL_T38MaxBitRate "T38MaxBitRate"
69 #define OPAL_T38FaxMaxBuffer "T38FaxMaxBuffer"
70 #define OPAL_T38FaxMaxDatagram "T38FaxMaxDatagram"
71 #define OPAL_T38FaxUdpEC "T38FaxUdpEC"
72 #define OPAL_T38UDPFEC "t38UDPFEC"
73 #define OPAL_T38UDPRedundancy "t38UDPRedundancy"
74 #define OPAL_T38FaxFillBitRemoval "T38FaxFillBitRemoval"
75 #define OPAL_T38FaxTranscodingMMR "T38FaxTranscodingMMR"
76 #define OPAL_T38FaxTranscodingJBIG "T38FaxTranscodingJBIG"
77 #define OPAL_T38UseECM "Use-ECM"
78 #define OPAL_FaxStationIdentifier "Station-Identifier"
79 #define OPAL_FaxHeaderInfo "Header-Info"
80 #define OPAL_UDPTLRawMode "UDPTL-Raw-Mode"
87 class OpalFaxConnection;
110 const char * g711Prefix =
"fax",
111 const char * t38Prefix =
"t38"
123 const PString & party,
124 void * userData = NULL,
125 unsigned int options = 0,
143 virtual bool IsAvailable()
const;
151 const PString & filename,
159 virtual void OnFaxCompleted(
160 OpalFaxConnection & connection,
168 const PString & GetDefaultDirectory()
const {
return m_defaultDirectory; }
172 void SetDefaultDirectory(
174 ) { m_defaultDirectory = dir; }
176 const PString & GetT38Prefix()
const {
return m_t38Prefix; }
181 PDirectory m_defaultDirectory;
213 OpalFaxEndPoint & endpoint,
214 const PString & filename,
222 ~OpalFaxConnection();
237 virtual bool SwitchFaxMediaStreams(
bool toT38);
238 virtual void OnSwitchedFaxMediaStreams(
bool toT38,
bool success);
239 virtual bool OnSwitchingFaxMediaStreams(
bool toT38);
248 virtual void OnFaxCompleted(
254 virtual void GetStatistics(
260 const PString & GetFileName()
const {
return m_filename; }
264 bool IsReceive()
const {
return m_receiving; }
269 void InternalOpenFaxStreams();
270 void InternalOnFaxCompleted();
278 unsigned m_switchTime;
281 PTimer m_switchTimer;
284 PAtomicBoolean m_completed;
288 typedef OpalFaxConnection OpalT38Connection;
290 class T38_UDPTLPacket;
295 static const PCaselessString & UDPTL();
297 OpalFaxSession(
const Init & init);
300 virtual const PCaselessString &
GetSessionType()
const {
return UDPTL(); }
302 virtual bool IsOpen()
const;
303 virtual bool Close();
325 void SetFrameFromIFP(
RTP_DataFrame & frame,
const PASN_OctetString & ifp,
unsigned sequenceNumber);
326 void DecrementSentPacketRedundancy(
bool stripRedundancy);
329 Transport m_savedTransport;
330 PIPSocket * m_dataSocket;
334 PINDEX m_datagramSize;
336 int m_consecutiveBadPackets;
337 bool m_awaitingGoodPacket;
338 T38_UDPTLPacket * m_receivedPacket;
339 unsigned m_expectedSequenceNumber;
340 int m_secondaryPacket;
342 std::map<int, int> m_redundancy;
343 PTimeInterval m_redundancyInterval;
344 PTimeInterval m_keepAliveInterval;
345 bool m_optimiseOnRetransmit;
346 std::vector<int> m_sentPacketRedundancy;
347 T38_UDPTLPacket * m_sentPacket;
349 PTimer m_timerWriteDataIdle;
350 PDECLARE_NOTIFIER(PTimer, OpalFaxSession, OnWriteDataIdle);
353 unsigned m_txPackets;
355 unsigned m_rxPackets;
356 unsigned m_missingPackets;
368 OpalFaxSession & session);
370 virtual PBoolean
Open();
380 OpalFaxSession & m_session;
384 #endif // OPAL_T38_CAPABILITY
386 #endif // OPAL_T38_T38PROTO_H