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
00032 #ifndef OPAL_IAX2_PROCESSOR_H
00033 #define OPAL_IAX2_PROCESSOR_H
00034
00035 #ifndef _PTLIB_H
00036 #include <ptlib.h>
00037 #endif
00038
00039 #include <opal/buildopts.h>
00040
00041 #if OPAL_IAX2
00042
00043 #include <opal/connection.h>
00044
00045 #include <iax2/frame.h>
00046 #include <iax2/iedata.h>
00047 #include <iax2/remote.h>
00048 #include <iax2/safestrings.h>
00049 #include <iax2/sound.h>
00050
00051 class IAX2EndPoint;
00052 class IAX2Connection;
00053 class IAX2ThreadHelper;
00054
00056
00077 class IAX2WaitingForAck : public PObject
00078 {
00079 PCLASSINFO(IAX2WaitingForAck, PObject);
00080
00081 public:
00083 enum ResponseToAck {
00084 RingingAcked = 0,
00085 AcceptAcked = 1,
00086 AuthRepAcked = 2,
00087 AnswerAcked = 3
00088 };
00089
00091 IAX2WaitingForAck();
00092
00094 void Assign(IAX2FullFrame *f, ResponseToAck _response);
00095
00097 PBoolean MatchingAckPacket(IAX2FullFrame *f);
00098
00100 ResponseToAck GetResponse() { return response; }
00101
00103 PString GetResponseAsString() const;
00104
00106 virtual void PrintOn(ostream & strm) const;
00107
00109 void ZeroValues();
00110
00111 private:
00113 DWORD timeStamp;
00114
00116 PINDEX seqNo;
00117
00119 ResponseToAck response;
00120 };
00121
00123
00136 class IAX2Processor : public PThread
00137 {
00138 PCLASSINFO(IAX2Processor, PObject);
00139
00140 public:
00142 IAX2Processor(IAX2EndPoint & ep);
00143
00145 virtual ~IAX2Processor();
00146
00148 IAX2SequenceNumbers & GetSequenceInfo() { return sequence; }
00149
00151 IAX2Encryption & GetEncryptionInfo() { return encryption; }
00152
00154 void IncomingEthernetFrame (IAX2Frame *frame);
00155
00158 virtual void PrintOn(ostream & strm) const = 0;
00159
00161 IAX2EndPoint & GetEndPoint() { return endpoint; };
00162
00172 void SetCallToken(const PString & newToken);
00173
00175 PString GetCallToken();
00176
00178 IAX2Remote & GetRemoteInfo() { return remote; }
00179
00181 const PTimeInterval & GetCallStartTick() { return callStartTick; }
00182
00186 void Main();
00187
00190 PBoolean IsStatusQueryEthernetFrame(IAX2Frame *frame);
00191
00194 void SetSpecialPackets(PBoolean newValue) { specialPackets = newValue; }
00195
00197 void Terminate();
00198
00203 void Activate();
00204
00211 virtual PBoolean IncomingMessageOutOfOrder(IAX2FullFrame *ff)= 0;
00212
00214 void ReportLists(PString & answer);
00215
00216 protected:
00217
00219 IAX2EndPoint & endpoint;
00220
00224 PTimeInterval callStartTick;
00225
00227 IAX2Remote remote;
00228
00231 void StartNoResponseTimer(PINDEX msToWait = 60000);
00232
00234 void StopNoResponseTimer() { noResponseTimer.Stop(); }
00235
00237 PTimer noResponseTimer;
00238
00240 void CleanPendingLists() { activate.Signal(); }
00241
00244 IAX2WaitingForAck nextTask;
00245
00247 PSyncPoint activate;
00248
00250 PBoolean endThread;
00251
00253 IAX2Encryption encryption;
00254
00256 IAX2SequenceNumbers sequence;
00257
00259 IAX2ActiveFrameList frameList;
00260
00263 SafeString callToken;
00264
00266 virtual void OnNoResponseTimeout() = 0;
00267
00270 enum DefinedNoResponseTimePeriod {
00271 NoResponseTimePeriod = 5000
00272 };
00273
00277 PBoolean IsHandlingSpecialPackets() { return specialPackets; };
00278
00281 PBoolean specialPackets;
00282
00285 virtual void ProcessLists() = 0;
00286
00289 virtual void ProcessFullFrame(IAX2FullFrame & fullFrame) = 0;
00290
00293 virtual void ProcessIaxCmdLagRq(IAX2FullFrameProtocol *src);
00294
00297 virtual void ProcessIaxCmdLagRp(IAX2FullFrameProtocol *src);
00298
00301 virtual void ProcessIaxCmdVnak(IAX2FullFrameProtocol *src);
00302
00305 virtual void ProcessIaxCmdPing(IAX2FullFrameProtocol *src);
00306
00309 virtual void ProcessIaxCmdPong(IAX2FullFrameProtocol *src);
00310
00314 PBoolean ProcessOneIncomingEthernetFrame();
00315
00317 PAtomicInteger controlFramesSent;
00318
00320 PAtomicInteger controlFramesRcvd;
00321
00323 void IncControlFramesSent() { ++controlFramesSent; }
00324
00326 void IncControlFramesRcvd() { ++controlFramesRcvd; }
00327
00330 virtual void ProcessNetworkFrame(IAX2MiniFrame * src) = 0;
00331
00332
00333
00334
00335
00336
00337
00338
00339 virtual PBoolean ProcessNetworkFrame(IAX2FullFrameProtocol * src);
00340
00344 void TransmitFrameToRemoteEndpoint(IAX2Frame *src);
00345
00351 void TransmitFrameToRemoteEndpoint(IAX2FullFrame *src,
00352 IAX2WaitingForAck::ResponseToAck response
00353 );
00354
00358 void TransmitFrameNow(IAX2Frame *src);
00359
00361 void TransmitFrameToRemoteEndpoint(IAX2FullFrameProtocol *src);
00362
00365 PBoolean Authenticate(IAX2FullFrameProtocol *reply,
00366 PString & password
00367 );
00368
00370 IAX2IeData ieData;
00371
00374 void SendAckFrame(IAX2FullFrame *inReplyTo);
00375
00379 void SendVnakFrame(IAX2FullFrame *inReplyTo);
00380
00382 void SendUnsupportedFrame(IAX2FullFrame *inReplyTo);
00383
00384 private:
00385 #ifdef DOC_PLUS_PLUS
00386
00393 void OnNoResponseTimeoutStart(PTimer &, INT);
00394 #else
00395 PDECLARE_NOTIFIER(PTimer, IAX2Processor, OnNoResponseTimeoutStart);
00396 #endif
00397
00398 protected:
00405 DWORD currentSoundTimeStamp;
00406 };
00407
00408
00409 #endif // OPAL_IAX2
00410
00411 #endif // OPAL_IAX2_PROCESSOR_H