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_FRAME_H
00033 #define OPAL_IAX2_FRAME_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 <iax2/ies.h>
00044 #include <iax2/remote.h>
00045
00046 #include <ptlib/sockets.h>
00047
00048 #ifdef P_USE_PRAGMA
00049 #pragma interface
00050 #endif
00051
00052 class IAX2Frame;
00053 class IAX2FrameList;
00054 class IAX2FullFrame;
00055 class IAX2FullFrameCng;
00056 class IAX2FullFrameDtmf;
00057 class IAX2FullFrameHtml;
00058 class IAX2FullFrameImage;
00059 class IAX2FullFrameNull;
00060 class IAX2FullFrameProtocol;
00061 class IAX2FullFrameSessionControl;
00062 class IAX2FullFrameText;
00063 class IAX2FullFrameVideo;
00064 class IAX2FullFrameVoice;
00065 class IAX2EndPoint;
00066 class IAX2Processor;
00067 class IAX2CallProcessor;
00068 class IAX2IeList;
00069 class IAX2MiniFrame;
00070 class IAX2Transmitter;
00071
00072
00073
00075 class IAX2Frame : public PObject
00076 {
00077 PCLASSINFO(IAX2Frame, PObject);
00078 public:
00080 IAX2Frame(IAX2EndPoint &_endpoint);
00081
00083 virtual ~IAX2Frame();
00084
00087 PBoolean ReadNetworkPacket(PUDPSocket &sock);
00088
00090 virtual PBoolean ProcessNetworkPacket();
00091
00093 virtual PBoolean IsFullFrame();
00094
00096 PBoolean IsVideo() const;
00097
00099 PBoolean IsAudio() const;
00100
00104 virtual BYTE *GetMediaDataPointer() { return data.GetPointer(); }
00105
00109 virtual PINDEX GetMediaDataSize() { return DataSize();}
00110
00112 PINDEX DataSize() { return data.GetSize(); }
00113
00115 IAX2Remote & GetRemoteInfo() { return remote; }
00116
00118 const BYTE * GetDataPointer() { return data + currentReadIndex; }
00119
00126 IAX2Frame * BuildAppropriateFrameType(IAX2Encryption &encryptionInfo);
00127
00129 IAX2Frame * BuildAppropriateFrameType();
00130
00132 PINDEX GetUnReadBytes() { return data.GetSize() - currentReadIndex; }
00133
00135 virtual PBoolean WriteHeader() { return PFalse; }
00136
00139 virtual PBoolean TransmitPacket(PUDPSocket &sock);
00140
00142 virtual void PrintOn(ostream & strm) const;
00143
00145 static DWORD CalcTimeStamp(const PTimeInterval & callStartTick);
00146
00150 virtual void BuildTimeStamp(const PTimeInterval & callStartTick);
00151
00153 IAX2EndPoint & GetEndpoint() { return endpoint; }
00154
00157 PString IdString() const;
00158
00160 DWORD GetTimeStamp() { return timeStamp; }
00161
00163 virtual PBoolean CallMustBeActive() { return PTrue; }
00164
00166 enum IAX2FrameType {
00167 undefType = 0,
00168 dtmfType = 1,
00169 voiceType = 2,
00170 videoType = 3,
00171 controlType = 4,
00172 nullType = 5,
00173 iax2ProtocolType = 6,
00174 textType = 7,
00175 imageType = 8,
00176 htmlType = 9,
00177 cngType = 10,
00178 numFrameTypes = 11
00179 };
00180
00183 IAX2FrameType GetFrameType() { return frameType; }
00184
00188 virtual void InitialiseHeader(IAX2Processor * ) { }
00189
00192 PBoolean CanRetransmitFrame() const {return canRetransmitFrame; }
00193
00196 PString GetConnectionToken() const { return connectionToken; }
00197
00200 void SetConnectionToken(PString newToken) { connectionToken = newToken; }
00201
00204 void BuildConnectionTokenId();
00205
00208 PBoolean EncryptContents(IAX2Encryption &encData);
00209
00211 virtual PINDEX GetEncryptionOffset();
00212
00213 protected:
00214
00218 PBoolean DecryptContents(IAX2Encryption & encryption);
00219
00222 IAX2Remote remote;
00223
00226 IAX2FrameType frameType;
00227
00230 PBoolean Read1Byte(BYTE & res);
00231
00234 PBoolean Read2Bytes(PINDEX & res);
00235
00238 PBoolean Read2Bytes(WORD & res);
00239
00242 PBoolean Read4Bytes(DWORD & res);
00243
00246 void Write1Byte(BYTE newVal);
00247
00250 void Write1Byte(PINDEX newVal);
00251
00254 void Write2Bytes(PINDEX newVal);
00255
00258 void Write4Bytes(unsigned int newVal);
00259
00261 void ZeroAllValues();
00262
00264 IAX2EndPoint & endpoint;
00265
00268 PBYTEArray data;
00269
00271 PBoolean isFullFrame;
00272
00274 PBoolean isVideo;
00275
00277 PBoolean isAudio;
00278
00280 PINDEX currentReadIndex;
00281
00283 PINDEX currentWriteIndex;
00284
00286 DWORD timeStamp;
00287
00289 PBoolean canRetransmitFrame;
00290
00295 PString connectionToken;
00296
00299 DWORD presetTimeStamp;
00300 };
00301
00303
00304 class IAX2MiniFrame : public IAX2Frame
00305 {
00306 PCLASSINFO(IAX2MiniFrame, IAX2Frame);
00307 public:
00310 IAX2MiniFrame(const IAX2Frame & srcFrame);
00311
00313 IAX2MiniFrame(IAX2EndPoint & _endpoint);
00314
00323 IAX2MiniFrame(IAX2Processor * con, PBYTEArray &sound, PBoolean isAudio, DWORD usersTimeStamp = 0);
00324
00326 virtual ~IAX2MiniFrame();
00327
00330 virtual PBoolean ProcessNetworkPacket();
00331
00333 virtual PBoolean WriteHeader();
00334
00336 virtual void PrintOn(ostream & strm) const;
00337
00340 virtual BYTE *GetMediaDataPointer();
00341
00343 virtual PINDEX GetMediaDataSize();
00344
00346 void AlterTimeStamp(PINDEX newValue);
00347
00353 virtual void InitialiseHeader(IAX2Processor *processor);
00354
00356 virtual PINDEX GetEncryptionOffset();
00357
00358 protected:
00360 void ZeroAllValues();
00361 };
00362
00365
00366 class IAX2FullFrame : public IAX2Frame
00367 {
00368 PCLASSINFO(IAX2FullFrame, IAX2Frame);
00369 public:
00372 IAX2FullFrame(const IAX2Frame & srcFrame);
00373
00376 IAX2FullFrame(IAX2EndPoint &_endpoint);
00377
00380 virtual ~IAX2FullFrame();
00381
00383 PBoolean IsAckFrame() { return isAckFrame; }
00384
00386 PBoolean IsPingFrame();
00387
00389 PBoolean IsNewFrame();
00390
00392 PBoolean IsLagRqFrame();
00393
00395 PBoolean IsLagRpFrame();
00396
00398 PBoolean IsPongFrame();
00399
00401 PBoolean IsAuthReqFrame();
00402
00404 PBoolean IsVnakFrame();
00405
00407 PBoolean IsRegReqFrame();
00408
00410 PBoolean IsRegAuthFrame();
00411
00413 PBoolean IsRegAckFrame();
00414
00416 PBoolean IsRegRelFrame();
00417
00419 PBoolean IsRegRejFrame();
00420
00423 PBoolean FrameIncrementsInSeqNo();
00424
00427 virtual PBoolean IsFullFrame() { return PTrue; }
00428
00432 PBoolean IsHangupFrame();
00433
00435 void ZeroAllValues();
00436
00439 virtual PBoolean ProcessNetworkPacket();
00440
00443 virtual PBoolean TransmitPacket(PUDPSocket &sock);
00444
00446 PString GetFullFrameName() const;
00447
00449 virtual PString GetSubClassName() const
00450 { return PString(" subclass=") + PString(subClass); }
00451
00455 void MarkDeleteNow();
00456
00461 void MarkVnakSendNow();
00462
00465 virtual BYTE *GetMediaDataPointer();
00466
00468 virtual PINDEX GetMediaDataSize();
00469
00471 PINDEX GetSubClass() const { return subClass; }
00472
00474 void SetSubClass(PINDEX newValue) { subClass = newValue;}
00475
00479 virtual PBoolean WriteHeader();
00480
00483 void ModifyFrameHeaderSequenceNumbers(PINDEX inNo, PINDEX outNo);
00484
00489 void ModifyFrameTimeStamp(PINDEX newTimeStamp);
00490
00492 virtual PBoolean InformationElementsPresent() { return PFalse; }
00493
00496 PBoolean SendFrameNow() { return sendFrameNow; }
00497
00500 PBoolean DeleteFrameNow() { return deleteFrameNow; }
00501
00503 IAX2SequenceNumbers & GetSequenceInfo() { return sequence; }
00504
00506 virtual void PrintOn(ostream & strm) const;
00507
00509 void MarkAsResent();
00510
00513 PBoolean operator *= (IAX2FullFrame & other);
00514
00517 enum ConnectionRequired {
00518 callActive,
00519 callIrrelevant
00520 };
00521
00523 virtual BYTE GetFullFrameType() { return 0; }
00524
00526 virtual PINDEX GetEncryptionOffset() { return 4; }
00527
00528 protected:
00530 virtual PBoolean CallMustBeActive() { return callMustBeActive; }
00531
00533 void UnCompressSubClass(BYTE a);
00534
00536 int CompressSubClass();
00537
00539 void ClearListFlags();
00540
00546 virtual void InitialiseHeader(IAX2Processor *processor);
00547
00548 #ifdef DOC_PLUS_PLUS
00549
00552 void OnTransmissionTimeout(PTimer &, INT);
00553 #else
00554 PDECLARE_NOTIFIER(PTimer, IAX2FullFrame, OnTransmissionTimeout);
00555 #endif
00556
00557 PTimer transmissionTimer;
00558
00560 PINDEX subClass;
00561
00563 PTimeInterval retryDelta;
00564
00566 PTimeInterval timeOffset;
00567
00569 PINDEX retries;
00570
00572 enum RetryTime {
00573 minRetryTime = 500,
00574 maxRetryTime = 010000,
00575 maxRetries = 3
00576 };
00577
00579 IAX2SequenceNumbers sequence;
00580
00582 PBoolean sendFrameNow;
00583
00585 PBoolean deleteFrameNow;
00586
00588 PBoolean packetResent;
00589
00591 PBoolean callMustBeActive;
00592
00594 PBoolean isAckFrame;
00595 };
00596
00598
00603 class IAX2FullFrameDtmf : public IAX2FullFrame
00604 {
00605 PCLASSINFO(IAX2FullFrameDtmf, IAX2FullFrame);
00606 public:
00609 IAX2FullFrameDtmf(const IAX2Frame & srcFrame);
00610
00613 IAX2FullFrameDtmf(const IAX2FullFrame & srcFrame);
00614
00617 IAX2FullFrameDtmf(IAX2Processor *processor,
00618 char subClassValue
00619 );
00620
00623 IAX2FullFrameDtmf(IAX2Processor *processor,
00624 PString subClassValue
00625 );
00626
00627
00629 virtual PString GetSubClassName() const;
00630
00632 enum DtmfSc {
00633 dtmf0 = 48,
00634 dtmf1 = 49,
00635 dtmf2 = 50,
00636 dtmf3 = 51,
00637 dtmf4 = 52,
00638 dtmf5 = 53,
00639 dtmf6 = 54,
00640 dtmf7 = 55,
00641 dtmf8 = 56,
00642 dtmf9 = 57,
00643 dtmfA = 65,
00644 dtmfB = 66,
00645 dtmfC = 67,
00646 dtmfD = 68,
00647 dtmfStar = 42,
00648 dtmfHash = 35
00649 };
00650
00652 virtual BYTE GetFullFrameType() { return dtmfType; }
00653
00654 protected:
00655 };
00656
00658
00665 class IAX2FullFrameVoice : public IAX2FullFrame
00666 {
00667 PCLASSINFO(IAX2FullFrameVoice, IAX2FullFrame);
00668 public:
00669
00672 IAX2FullFrameVoice(const IAX2Frame & srcFrame);
00673
00676 IAX2FullFrameVoice(const IAX2FullFrame & srcFrame);
00677
00686 IAX2FullFrameVoice(IAX2CallProcessor *processor, PBYTEArray &sound,
00687 PINDEX usersTimeStamp = 0);
00688
00690 virtual ~IAX2FullFrameVoice();
00691
00693 virtual PString GetSubClassName() const;
00694
00697 static PString GetSubClassName(unsigned short testValue)
00698 { return GetSubClassName((unsigned int) testValue); }
00699
00702 static PString GetSubClassName(unsigned int testValue);
00703
00707 static PString GetOpalNameOfCodec(PINDEX testValue);
00708
00710 static PString GetSubClassName(int testValue)
00711 { return GetSubClassName((unsigned short) testValue); }
00712
00715 static unsigned short OpalNameToIax2Value(const PString opalName);
00716
00718 enum AudioSc {
00719 g7231 = 1,
00720 gsm = 2,
00721 g711ulaw = 4,
00722 g711alaw = 8,
00723 mp3 = 0x10,
00724 adpcm = 0x20,
00725 pcm = 0x40,
00726 lpc10 = 0x80,
00727 g729 = 0x100,
00728 speex = 0x200,
00729 ilbc = 0x400,
00730 supportedCodecs = 11
00731 };
00732
00734 virtual BYTE GetFullFrameType() { return voiceType; }
00735 };
00737
00742 class IAX2FullFrameVideo : public IAX2FullFrame
00743 {
00744 PCLASSINFO(IAX2FullFrameVideo, IAX2FullFrame);
00745 public:
00746
00749 IAX2FullFrameVideo(const IAX2Frame & srcFrame);
00750
00753 IAX2FullFrameVideo(const IAX2FullFrame & srcFrame);
00754
00756 virtual PString GetSubClassName() const;
00757
00759 enum VideoSc {
00760 jpeg = 0x10000,
00761 png = 0x20000,
00762 h261 = 0x40000,
00763 h263 = 0x80000
00764 };
00765
00767 virtual BYTE GetFullFrameType() { return videoType; }
00768 protected:
00769 };
00770
00772
00777 class IAX2FullFrameSessionControl : public IAX2FullFrame
00778 {
00779 PCLASSINFO(IAX2FullFrameSessionControl, IAX2FullFrame);
00780 public:
00781
00783 enum SessionSc {
00784 hangup = 1,
00785 ring = 2,
00786 ringing = 3,
00787 answer = 4,
00788 busy = 5,
00789 tkoffhk = 6,
00790 offhook = 7,
00791 congestion = 8,
00792 flashhook = 9,
00793 wink = 10,
00794 option = 11,
00795 keyRadio = 12,
00796 unkeyRadio = 13,
00797 callProgress = 14,
00798 callProceeding = 15,
00799 callOnHold = 16,
00800 callHoldRelease = 17,
00801 stopSounds = 255
00802 };
00803
00804
00805
00808 IAX2FullFrameSessionControl(const IAX2Frame & srcFrame);
00809
00812 IAX2FullFrameSessionControl(const IAX2FullFrame & srcFrame);
00813
00816 IAX2FullFrameSessionControl(IAX2Processor *processor,
00817 PINDEX subClassValue
00818 );
00819
00822 IAX2FullFrameSessionControl(IAX2Processor *processor,
00823 SessionSc subClassValue
00824 );
00825
00827 virtual ~IAX2FullFrameSessionControl() { }
00828
00830 virtual PString GetSubClassName() const;
00831
00833 virtual BYTE GetFullFrameType() { return controlType; }
00834
00835 protected:
00836 };
00837
00839
00845 class IAX2FullFrameNull : public IAX2FullFrame
00846 {
00847 PCLASSINFO(IAX2FullFrameNull, IAX2FullFrame);
00848 public:
00851 IAX2FullFrameNull(IAX2EndPoint & endpoint) : IAX2FullFrame(endpoint) { }
00852
00856 IAX2FullFrameNull(const IAX2Frame & srcFrame);
00857
00861 IAX2FullFrameNull(const IAX2FullFrame & srcFrame);
00862
00864 virtual PString GetSubClassName() const { return PString(""); }
00865
00867 virtual BYTE GetFullFrameType() { return nullType; }
00868
00869 protected:
00870 };
00871
00873
00879 class IAX2FullFrameProtocol : public IAX2FullFrame
00880 {
00881 PCLASSINFO(IAX2FullFrameProtocol, IAX2FullFrame);
00882 public:
00883
00885 enum ProtocolSc {
00886 cmdNew = 1,
00887 cmdPing = 2,
00888 cmdPong = 3,
00889 cmdAck = 4,
00890 cmdHangup = 5,
00891 cmdReject = 6,
00892 cmdAccept = 7,
00893 cmdAuthReq = 8,
00894 cmdAuthRep = 9,
00895 cmdInval = 10,
00896 cmdLagRq = 11,
00897 cmdLagRp = 12,
00898 cmdRegReq = 13,
00899 cmdRegAuth = 14,
00900 cmdRegAck = 15,
00901 cmdRegRej = 16,
00902 cmdRegRel = 17,
00903 cmdVnak = 18,
00904 cmdDpReq = 19,
00905 cmdDpRep = 20,
00906 cmdDial = 21,
00907 cmdTxreq = 22,
00908 cmdTxcnt = 23,
00909 cmdTxacc = 24,
00910 cmdTxready = 25,
00911 cmdTxrel = 26,
00912 cmdTxrej = 27,
00913 cmdQuelch = 28,
00914 cmdUnquelch = 29,
00915 cmdPoke = 30,
00916 cmdPage = 31,
00917 cmdMwi = 32,
00918 cmdUnsupport = 33,
00919 cmdTransfer = 34,
00920 cmdProvision = 35,
00921 cmdFwDownl = 36,
00922 cmdFwData = 37
00923 };
00924
00928 IAX2FullFrameProtocol(const IAX2Frame & srcFrame);
00929
00933 IAX2FullFrameProtocol(const IAX2FullFrame & srcFrame);
00934
00937 IAX2FullFrameProtocol(IAX2Processor *processor,
00938 PINDEX subClassValue,
00939 ConnectionRequired needCon = IAX2FullFrame::callActive
00941 );
00942
00945 IAX2FullFrameProtocol(IAX2Processor *processor,
00946 ProtocolSc subClassValue,
00947 ConnectionRequired needCon=IAX2FullFrame::callActive
00949 );
00950
00956 IAX2FullFrameProtocol(IAX2Processor *processor,
00957 ProtocolSc subClassValue,
00958 IAX2FullFrame *inReplyTo,
00959 ConnectionRequired needCon = IAX2FullFrame::callActive
00961 );
00962
00964 virtual ~IAX2FullFrameProtocol();
00965
00967 void SetRetransmissionRequired();
00968
00970 virtual PBoolean InformationElementsPresent() { return !ieElements.IsEmpty(); }
00971
00973 ProtocolSc GetSubClass() const { return (ProtocolSc) subClass; }
00974
00976 virtual PString GetSubClassName() const;
00977
00979 static PString GetSubClassName(PINDEX t);
00980
00983 IAX2Ie *GetIeAt(PINDEX i) { return ieElements.GetIeAt(i); }
00984
00986 void AppendIe(IAX2Ie *newElement) { ieElements.AppendIe(newElement); }
00987
00990 void WriteIeAsBinaryData();
00991
00995 void CopyDataFromIeListTo(IAX2IeData &res);
00996
00999 void GetRemoteCapability(unsigned int & capability, unsigned int & preferred);
01000
01002 virtual BYTE GetFullFrameType() { return iax2ProtocolType; }
01003
01005 virtual void PrintOn(ostream & strm) const;
01006
01007 protected:
01008
01011 PBoolean ReadInformationElements();
01012
01014 IAX2IeList ieElements;
01015
01017 #if PTRACING
01018 friend ostream & operator<<(ostream & o, ProtocolSc t);
01019 #endif
01020 };
01021
01023
01028 class IAX2FullFrameText : public IAX2FullFrame
01029 {
01030 PCLASSINFO(IAX2FullFrameText, IAX2FullFrame);
01031 public:
01032
01035 IAX2FullFrameText(IAX2Processor *processor,
01036 const PString& textValue
01037 );
01038
01041 IAX2FullFrameText(const IAX2Frame & srcFrame);
01042
01045 IAX2FullFrameText(const IAX2FullFrame & srcFrame);
01046
01048 virtual PString GetSubClassName() const;
01049
01051 virtual BYTE GetFullFrameType() { return textType; }
01052
01054 PString GetTextString() const;
01055
01056 protected:
01057
01059 PString internalText;
01060 };
01062
01067 class IAX2FullFrameImage : public IAX2FullFrame
01068 {
01069 PCLASSINFO(IAX2FullFrameImage, IAX2FullFrame);
01070 public:
01071
01074 IAX2FullFrameImage(const IAX2Frame & srcFrame);
01075
01078 IAX2FullFrameImage(const IAX2FullFrame & srcFrame);
01079
01081 virtual PString GetSubClassName() const;
01082
01084 virtual BYTE GetFullFrameType() { return imageType; }
01085 protected:
01086 };
01087
01089
01094 class IAX2FullFrameHtml : public IAX2FullFrame
01095 {
01096 PCLASSINFO(IAX2FullFrameHtml, IAX2FullFrame);
01097 public:
01098
01101 IAX2FullFrameHtml(const IAX2Frame & srcFrame);
01102
01105 IAX2FullFrameHtml(const IAX2FullFrame & srcFrame);
01106
01108 virtual PString GetSubClassName() const;
01109
01111 virtual BYTE GetFullFrameType() { return htmlType; }
01112 protected:
01113 };
01114
01116
01120 class IAX2FullFrameCng : public IAX2FullFrame
01121 {
01122 PCLASSINFO(IAX2FullFrameCng, IAX2FullFrame);
01123 public:
01124
01127 IAX2FullFrameCng(const IAX2Frame & srcFrame);
01128
01131 IAX2FullFrameCng(const IAX2FullFrame & srcFrame);
01132
01134 virtual PString GetSubClassName() const;
01135
01137 virtual BYTE GetFullFrameType() { return cngType; }
01138 protected:
01139 };
01140
01142
01143 PDECLARE_LIST (IAX2FrameList, IAX2Frame *)
01144 #ifdef DOC_PLUS_PLUS //This makes emacs bracket matching code happy.
01145
01151 class IAX2FrameList : public IAX2Frame *
01152 {
01153 #endif
01154 public:
01155 ~IAX2FrameList();
01156
01158 void ReportList(PString & answer);
01159
01161 IAX2Frame *GetLastFrame();
01162
01164 void Initialise();
01165
01167 PBoolean Empty() { return GetSize() == 0; }
01168
01170 void GrabContents(IAX2FrameList &src);
01171
01174 void DeleteMatchingSendFrame(IAX2FullFrame *reply);
01175
01179 void SendVnakRequestedFrames(IAX2FullFrameProtocol &src);
01180
01182 void AddNewFrame(IAX2Frame *src);
01183
01185 void GetResendFramesDeleteOldFrames(IAX2FrameList & framesToSend);
01186
01188 virtual PINDEX GetSize() { PWaitAndSignal m(mutex); return PAbstractList::GetSize(); }
01189
01191 void MarkAllAsResent();
01192
01193 protected:
01195 virtual PINDEX GetEntries() { return PAbstractList::GetSize(); }
01196
01198 PMutex mutex;
01199 };
01200
01202
01206 class IAX2ActiveFrameList : public IAX2FrameList
01207 {
01208 PCLASSINFO(IAX2ActiveFrameList, IAX2FrameList);
01209 public:
01210 IAX2ActiveFrameList() { Initialise(); }
01211 };
01213
01214
01215 #endif // OPAL_IAX2
01216
01217 #endif // OPAL_IAX2_FRAME_H
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227