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
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097 #ifndef PROCESSOR_H
00098 #define PROCESSOR_H
00099
00100 #ifndef _PTLIB_H
00101 #include <ptlib.h>
00102 #endif
00103
00104 #include <opal/connection.h>
00105
00106 #include <iax2/frame.h>
00107 #include <iax2/iedata.h>
00108 #include <iax2/remote.h>
00109 #include <iax2/safestrings.h>
00110 #include <iax2/sound.h>
00111
00112 class IAX2EndPoint;
00113 class IAX2Connection;
00114 class IAX2ThreadHelper;
00115
00117
00138 class IAX2WaitingForAck : public PObject
00139 {
00140 PCLASSINFO(IAX2WaitingForAck, PObject);
00141
00142 public:
00144 enum ResponseToAck {
00145 RingingAcked = 0,
00146 AcceptAcked = 1,
00147 AuthRepAcked = 2,
00148 AnswerAcked = 3
00149 };
00150
00152 IAX2WaitingForAck();
00153
00155 void Assign(IAX2FullFrame *f, ResponseToAck _response);
00156
00158 BOOL MatchingAckPacket(IAX2FullFrame *f);
00159
00161 ResponseToAck GetResponse() { return response; }
00162
00164 PString GetResponseAsString() const;
00165
00167 virtual void PrintOn(ostream & strm) const;
00168
00170 void ZeroValues();
00171
00172 private:
00174 DWORD timeStamp;
00175
00177 PINDEX seqNo;
00178
00180 ResponseToAck response;
00181 };
00182
00184
00197 class IAX2Processor : public PThread
00198 {
00199 PCLASSINFO(IAX2Processor, PObject);
00200
00201 public:
00203 IAX2Processor(IAX2EndPoint & ep);
00204
00206 virtual ~IAX2Processor();
00207
00209 IAX2SequenceNumbers & GetSequenceInfo() { return sequence; }
00210
00212 IAX2Encryption & GetEncryptionInfo() { return encryption; }
00213
00215 void IncomingEthernetFrame (IAX2Frame *frame);
00216
00219 virtual void PrintOn(ostream & strm) const = 0;
00220
00222 IAX2EndPoint & GetEndPoint() { return endpoint; };
00223
00233 void SetCallToken(const PString & newToken);
00234
00236 PString GetCallToken();
00237
00239 IAX2Remote & GetRemoteInfo() { return remote; }
00240
00242 const PTimeInterval & GetCallStartTick() { return callStartTick; }
00243
00247 void Main();
00248
00251 BOOL IsStatusQueryEthernetFrame(IAX2Frame *frame);
00252
00255 void SetSpecialPackets(BOOL newValue) { specialPackets = newValue; }
00256
00258 void Terminate();
00259
00262 void Activate();
00263
00264 protected:
00265
00267 IAX2EndPoint & endpoint;
00268
00272 PTimeInterval callStartTick;
00273
00275 IAX2Remote remote;
00276
00279 void StartNoResponseTimer(PINDEX msToWait = 60000);
00280
00282 void StopNoResponseTimer() { noResponseTimer.Stop(); }
00283
00285 PTimer noResponseTimer;
00286
00288 void CleanPendingLists() { activate.Signal(); }
00289
00292 IAX2WaitingForAck nextTask;
00293
00295 PSyncPoint activate;
00296
00298 BOOL endThread;
00299
00301 IAX2Encryption encryption;
00302
00304 IAX2SequenceNumbers sequence;
00305
00307 IAX2FrameList frameList;
00308
00311 SafeString callToken;
00312
00314 virtual void OnNoResponseTimeout() = 0;
00315
00318 enum DefinedNoResponseTimePeriod {
00319 NoResponseTimePeriod = 5000
00320 };
00321
00325 BOOL IsHandlingSpecialPackets() { return specialPackets; };
00326
00329 BOOL specialPackets;
00330
00333 virtual void ProcessLists() = 0;
00334
00337 virtual void ProcessFullFrame(IAX2FullFrame & fullFrame) = 0;
00338
00341 virtual void ProcessIaxCmdLagRq(IAX2FullFrameProtocol *src);
00342
00345 virtual void ProcessIaxCmdLagRp(IAX2FullFrameProtocol *src);
00346
00349 virtual void ProcessIaxCmdVnak(IAX2FullFrameProtocol *src);
00350
00353 virtual void ProcessIaxCmdPing(IAX2FullFrameProtocol *src);
00354
00357 virtual void ProcessIaxCmdPong(IAX2FullFrameProtocol *src);
00358
00362 BOOL ProcessOneIncomingEthernetFrame();
00363
00365 PAtomicInteger controlFramesSent;
00366
00368 PAtomicInteger controlFramesRcvd;
00369
00371 void IncControlFramesSent() { ++controlFramesSent; }
00372
00374 void IncControlFramesRcvd() { ++controlFramesRcvd; }
00375
00378 virtual void ProcessNetworkFrame(IAX2MiniFrame * src) = 0;
00379
00380
00381
00382
00383
00384
00385
00386
00387 virtual BOOL ProcessNetworkFrame(IAX2FullFrameProtocol * src);
00388
00392 void TransmitFrameToRemoteEndpoint(IAX2Frame *src);
00393
00399 void TransmitFrameToRemoteEndpoint(IAX2FullFrame *src,
00400 IAX2WaitingForAck::ResponseToAck response
00401 );
00402
00406 void TransmitFrameNow(IAX2Frame *src);
00407
00409 void TransmitFrameToRemoteEndpoint(IAX2FullFrameProtocol *src);
00410
00413 BOOL Authenticate(IAX2FullFrameProtocol *reply,
00414 PString & password
00415 );
00416
00418 IAX2IeData ieData;
00419
00422 void SendAckFrame(IAX2FullFrame *inReplyTo);
00423
00427 void SendVnakFrame(IAX2FullFrame *inReplyTo);
00428
00430 void SendUnsupportedFrame(IAX2FullFrame *inReplyTo);
00431
00432 private:
00433 #ifdef DOC_PLUS_PLUS
00434
00441 void OnNoResponseTimeoutStart(PTimer &, INT);
00442 #else
00443 PDECLARE_NOTIFIER(PTimer, IAX2Processor, OnNoResponseTimeoutStart);
00444 #endif
00445
00446 protected:
00453 DWORD currentSoundTimeStamp;
00454 };
00455
00456 #endif // PROCESSOR_H