frame.h

Go to the documentation of this file.
00001 /*
00002  *
00003  * Inter Asterisk Exchange 2
00004  * 
00005  * Open Phone Abstraction Library (OPAL)
00006  *
00007  * Define the classes that carry information over the ethernet.
00008  *
00009  * Copyright (c) 2005 Indranet Technologies Ltd.
00010  *
00011  * The contents of this file are subject to the Mozilla Public License
00012  * Version 1.0 (the "License"); you may not use this file except in
00013  * compliance with the License. You may obtain a copy of the License at
00014  * http://www.mozilla.org/MPL/
00015  *
00016  * Software distributed under the License is distributed on an "AS IS"
00017  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00018  * the License for the specific language governing rights and limitations
00019  * under the License.
00020  *
00021  * The Original Code is Open Phone Abstraction Library.
00022  *
00023  * The Initial Developer of the Original Code is Indranet Technologies Ltd.
00024  *
00025  * The author of this code is Derek J Smithies
00026  *
00027  * $Revision: 21283 $
00028  * $Author: rjongbloed $
00029  * $Date: 2008-10-11 07:10:58 +0000 (Sat, 11 Oct 2008) $
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 * /*processor*/) { }
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 /* The comment below is magic for those who use emacs to edit this file. */
01220 /* With the comment below, the tab key does auto indent to 2 spaces.     */
01221 
01222 /*
01223  * Local Variables:
01224  * mode:c
01225  * c-basic-offset:2
01226  * End:
01227  */

Generated on Mon Feb 23 02:01:06 2009 for OPAL by  doxygen 1.5.1