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