OPAL  Version 3.14.3
frame.h
Go to the documentation of this file.
1 /*
2  *
3  * Inter Asterisk Exchange 2
4  *
5  * Open Phone Abstraction Library (OPAL)
6  *
7  * Define the classes that carry information over the ethernet.
8  *
9  * Copyright (c) 2005 Indranet Technologies Ltd.
10  *
11  * The contents of this file are subject to the Mozilla Public License
12  * Version 1.0 (the "License"); you may not use this file except in
13  * compliance with the License. You may obtain a copy of the License at
14  * http://www.mozilla.org/MPL/
15  *
16  * Software distributed under the License is distributed on an "AS IS"
17  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
18  * the License for the specific language governing rights and limitations
19  * under the License.
20  *
21  * The Original Code is Open Phone Abstraction Library.
22  *
23  * The Initial Developer of the Original Code is Indranet Technologies Ltd.
24  *
25  * The author of this code is Derek J Smithies
26  *
27  * $Revision: 29536 $
28  * $Author: rjongbloed $
29  * $Date: 2013-04-19 18:55:15 +1000 (Fri, 19 Apr 2013) $
30  */
31 
32 #ifndef OPAL_IAX2_FRAME_H
33 #define OPAL_IAX2_FRAME_H
34 
35 #ifndef _PTLIB_H
36 #include <ptlib.h>
37 #endif
38 
39 #include <opal_config.h>
40 
41 #if OPAL_IAX2
42 
43 #include <iax2/ies.h>
44 #include <iax2/remote.h>
45 
46 #include <ptlib/sockets.h>
47 
48 #ifdef P_USE_PRAGMA
49 #pragma interface
50 #endif
51 
52 class IAX2Frame;
53 class IAX2FrameList;
54 class IAX2FullFrame;
55 class IAX2FullFrameCng;
56 class IAX2FullFrameDtmf;
57 class IAX2FullFrameHtml;
58 class IAX2FullFrameImage;
59 class IAX2FullFrameNull;
62 class IAX2FullFrameText;
63 class IAX2FullFrameVideo;
64 class IAX2FullFrameVoice;
65 class IAX2EndPoint;
66 class IAX2Processor;
67 class IAX2CallProcessor;
68 class IAX2IeList;
69 class IAX2MiniFrame;
70 class IAX2Transmitter;
71 
72 
73 
75 class IAX2Frame : public PObject
76 {
77  PCLASSINFO(IAX2Frame, PObject);
78  public:
80  IAX2Frame(IAX2EndPoint &_endpoint);
81 
83  virtual ~IAX2Frame();
84 
87  PBoolean ReadNetworkPacket(PUDPSocket &sock);
88 
90  virtual PBoolean ProcessNetworkPacket();
91 
93  virtual PBoolean IsFullFrame() { return isFullFrame; }
94 
96  PBoolean IsVideo() const { return isVideo; }
97 
99  PBoolean IsAudio() const { return isAudio; }
100 
104  virtual BYTE *GetMediaDataPointer() { return data.GetPointer(); }
105 
109  virtual PINDEX GetMediaDataSize() { return DataSize();}
110 
112  PINDEX DataSize() { return data.GetSize(); }
113 
116 
118  const BYTE * GetDataPointer() { return data + currentReadIndex; }
119 
127 
130 
132  PINDEX GetUnReadBytes() { return data.GetSize() - currentReadIndex; }
133 
135  virtual PBoolean WriteHeader() { return false; }
136 
139  virtual PBoolean TransmitPacket(PUDPSocket &sock);
140 
142  virtual void PrintOn(ostream & strm) const;
143 
145  static DWORD CalcTimeStamp(const PTimeInterval & callStartTick);
146 
150  virtual void BuildTimeStamp(const PTimeInterval & callStartTick);
151 
154 
157  PString IdString() const;
158 
160  DWORD GetTimeStamp() { return timeStamp; }
161 
163  void SetTimeStamp(DWORD newValue);
164 
166  virtual PBoolean CallMustBeActive() { return true; }
167 
170  undefType = 0,
171  dtmfType = 1,
172  voiceType = 2,
173  videoType = 3,
175  nullType = 5,
177  textType = 7,
178  imageType = 8,
179  htmlType = 9,
180  cngType = 10,
182  };
183 
187 
191  virtual void InitialiseHeader(IAX2Processor * /*processor*/) { }
192 
195  PBoolean CanRetransmitFrame() const {return canRetransmitFrame; }
196 
199  PString GetConnectionToken() const { return connectionToken; }
200 
203  void SetConnectionToken(PString newToken) { connectionToken = newToken; }
204 
207  void BuildConnectionToken();
208 
211  PBoolean EncryptContents(IAX2Encryption &encData);
212 
214  virtual PINDEX GetEncryptionOffset();
215 
216  protected:
217 
221  PBoolean DecryptContents(IAX2Encryption & encryption);
222 
226 
230 
233  PBoolean Read1Byte(BYTE & res);
234 
237  PBoolean Read2Bytes(PINDEX & res);
238 
241  PBoolean Read2Bytes(WORD & res);
242 
245  PBoolean Read4Bytes(DWORD & res);
246 
249  void Write1Byte(BYTE newVal);
250 
253  void Write1Byte(PINDEX newVal);
254 
257  void Write2Bytes(PINDEX newVal);
258 
261  void Write4Bytes(unsigned int newVal);
262 
264  void ZeroAllValues();
265 
268 
271  PBYTEArray data;
272 
274  PBoolean isFullFrame;
275 
277  PBoolean isVideo;
278 
280  PBoolean isAudio;
281 
284 
287 
289  DWORD timeStamp;
290 
293 
299 
303 };
304 
306 
307 class IAX2MiniFrame : public IAX2Frame
308 {
309  PCLASSINFO(IAX2MiniFrame, IAX2Frame);
310  public:
313  IAX2MiniFrame(const IAX2Frame & srcFrame);
314 
316  IAX2MiniFrame(IAX2EndPoint & _endpoint);
317 
326  IAX2MiniFrame(IAX2Processor * con, PBYTEArray &sound, PBoolean isAudio, DWORD usersTimeStamp = 0);
327 
329  virtual ~IAX2MiniFrame();
330 
333  virtual PBoolean ProcessNetworkPacket();
334 
336  virtual PBoolean WriteHeader();
337 
339  virtual void PrintOn(ostream & strm) const;
340 
343  virtual BYTE *GetMediaDataPointer();
344 
346  virtual PINDEX GetMediaDataSize();
347 
349  void AlterTimeStamp(PINDEX newValue);
350 
356  virtual void InitialiseHeader(IAX2Processor *processor);
357 
359  virtual PINDEX GetEncryptionOffset();
360 
361  protected:
363  void ZeroAllValues();
364 };
365 
368 
369 class IAX2FullFrame : public IAX2Frame
370 {
371  PCLASSINFO(IAX2FullFrame, IAX2Frame);
372  public:
375  IAX2FullFrame(const IAX2Frame & srcFrame);
376 
379  IAX2FullFrame(IAX2EndPoint &_endpoint);
380 
383  virtual ~IAX2FullFrame();
384 
386  PBoolean IsAckFrame() { return isAckFrame; }
387 
389  PBoolean IsPingFrame();
390 
392  PBoolean IsNewFrame();
393 
395  PBoolean IsLagRqFrame();
396 
398  PBoolean IsLagRpFrame();
399 
401  PBoolean IsPongFrame();
402 
404  PBoolean IsAuthReqFrame();
405 
407  PBoolean IsVnakFrame();
408 
410  PBoolean IsRegReqFrame();
411 
413  PBoolean IsRegAuthFrame();
414 
416  PBoolean IsRegAckFrame();
417 
419  PBoolean IsRegRelFrame();
420 
422  PBoolean IsRegRejFrame();
423 
425  PBoolean IsCallTokenFrame();
426 
429  PBoolean FrameIncrementsInSeqNo();
430 
433  virtual PBoolean IsFullFrame() { return true; }
434 
438  PBoolean IsHangupFrame();
439 
441  void ZeroAllValues();
442 
445  virtual PBoolean ProcessNetworkPacket();
446 
449  virtual PBoolean TransmitPacket(PUDPSocket &sock);
450 
452  PString GetFullFrameName() const;
453 
455  virtual PString GetSubClassName() const
456  { return PString(" subclass=") + PString(subClass); }
457 
461  void MarkDeleteNow();
462 
467  void MarkVnakSendNow();
468 
471  virtual BYTE *GetMediaDataPointer();
472 
474  virtual PINDEX GetMediaDataSize();
475 
477  PINDEX GetSubClass() const { return subClass; }
478 
480  void SetSubClass(PINDEX newValue) { subClass = newValue;}
481 
485  virtual PBoolean WriteHeader();
486 
489  void ModifyFrameHeaderSequenceNumbers(PINDEX inNo, PINDEX outNo);
490 
495  void ModifyFrameTimeStamp(PINDEX newTimeStamp);
496 
498  virtual PBoolean InformationElementsPresent() { return false; }
499 
502  PBoolean SendFrameNow() { return sendFrameNow; }
503 
506  PBoolean DeleteFrameNow() { return deleteFrameNow; }
507 
510 
512  virtual void PrintOn(ostream & strm) const;
513 
515  void MarkAsResent();
516 
519  PBoolean operator *= (IAX2FullFrame & other);
520 
526  };
527 
529  virtual BYTE GetFullFrameType() { return 0; }
530 
532  virtual PINDEX GetEncryptionOffset() { return 4; }
533 
534  protected:
536  virtual PBoolean CallMustBeActive() { return callMustBeActive; }
537 
539  void UnCompressSubClass(BYTE a);
540 
542  int CompressSubClass();
543 
545  void ClearListFlags();
546 
552  virtual void InitialiseHeader(IAX2Processor *processor);
553 
554 #ifdef DOC_PLUS_PLUS
555 
558  void OnTransmissionTimeout(PTimer &, INT);
559 #else
560  PDECLARE_NOTIFIER(PTimer, IAX2FullFrame, OnTransmissionTimeout);
561 #endif
562 
564 
566  int subClass;
567 
569  PTimeInterval retryDelta;
570 
572  PTimeInterval timeOffset;
573 
575  PINDEX retries;
576 
578  enum RetryTime {
579  minRetryTime = 1000,
580  maxRetryTime = 010000,
582  };
583 
586 
588  PBoolean sendFrameNow;
589 
591  PBoolean deleteFrameNow;
592 
594  PBoolean packetResent;
595 
598 
600  PBoolean isAckFrame;
601 };
602 
604 
610 {
611  PCLASSINFO(IAX2FullFrameDtmf, IAX2FullFrame);
612  public:
615  IAX2FullFrameDtmf(const IAX2Frame & srcFrame);
616 
619  IAX2FullFrameDtmf(const IAX2FullFrame & srcFrame);
620 
623  IAX2FullFrameDtmf(IAX2Processor *processor,
624  char subClassValue
625  );
626 
629  IAX2FullFrameDtmf(IAX2Processor *processor,
630  PString subClassValue
631  );
632 
633 
635  virtual PString GetSubClassName() const;
636 
638  enum DtmfSc {
639  dtmf0 = 48,
640  dtmf1 = 49,
641  dtmf2 = 50,
642  dtmf3 = 51,
643  dtmf4 = 52,
644  dtmf5 = 53,
645  dtmf6 = 54,
646  dtmf7 = 55,
647  dtmf8 = 56,
648  dtmf9 = 57,
649  dtmfA = 65,
650  dtmfB = 66,
651  dtmfC = 67,
652  dtmfD = 68,
653  dtmfStar = 42,
654  dtmfHash = 35
655  };
656 
658  virtual BYTE GetFullFrameType() { return dtmfType; }
659 
660  protected:
661 };
662 
664 
672 {
673  PCLASSINFO(IAX2FullFrameVoice, IAX2FullFrame);
674  public:
675 
678  IAX2FullFrameVoice(const IAX2Frame & srcFrame);
679 
682  IAX2FullFrameVoice(const IAX2FullFrame & srcFrame);
683 
692  IAX2FullFrameVoice(IAX2CallProcessor *processor, PBYTEArray &sound,
693  PINDEX usersTimeStamp = 0);
694 
696  virtual ~IAX2FullFrameVoice();
697 
699  virtual PString GetSubClassName() const;
700 
703  static PString GetSubClassName(unsigned testValue);
704 
708  static PString GetOpalNameOfCodec(PINDEX testValue);
709 
712  static unsigned short OpalNameToIax2Value(const PString opalName);
713 
715  enum AudioSc {
716  g7231 = 1,
717  gsm = 2,
718  g711ulaw = 4,
719  g711alaw = 8,
720  mp3 = 0x10,
721  adpcm = 0x20,
722  pcm = 0x40,
723  lpc10 = 0x80,
724  g729 = 0x100,
725  speex = 0x200,
726  ilbc = 0x400,
728  };
729 
731  virtual BYTE GetFullFrameType() { return voiceType; }
732 };
734 
740 {
741  PCLASSINFO(IAX2FullFrameVideo, IAX2FullFrame);
742  public:
743 
746  IAX2FullFrameVideo(const IAX2Frame & srcFrame);
747 
750  IAX2FullFrameVideo(const IAX2FullFrame & srcFrame);
751 
753  virtual PString GetSubClassName() const;
754 
756  enum VideoSc {
757  jpeg = 0x10000,
758  png = 0x20000,
759  h261 = 0x40000,
760  h263 = 0x80000
761  };
762 
764  virtual BYTE GetFullFrameType() { return videoType; }
765  protected:
766 };
767 
769 
775 {
777  public:
778 
780  enum SessionSc {
781  hangup = 1,
782  ring = 2,
783  ringing = 3,
784  answer = 4,
785  busy = 5,
786  tkoffhk = 6,
787  offhook = 7,
789  flashhook = 9,
790  wink = 10,
791  option = 11,
792  keyRadio = 12,
793  unkeyRadio = 13,
796  callOnHold = 16,
798  stopSounds = 255
799  };
800 
801 
802 
805  IAX2FullFrameSessionControl(const IAX2Frame & srcFrame);
806 
809  IAX2FullFrameSessionControl(const IAX2FullFrame & srcFrame);
810 
814  PINDEX subClassValue
815  );
816 
820  SessionSc subClassValue
821  );
822 
825 
827  virtual PString GetSubClassName() const;
828 
830  virtual BYTE GetFullFrameType() { return controlType; }
831 
832  protected:
833 };
834 
836 
843 {
844  PCLASSINFO(IAX2FullFrameNull, IAX2FullFrame);
845  public:
849 
853  IAX2FullFrameNull(const IAX2Frame & srcFrame);
854 
858  IAX2FullFrameNull(const IAX2FullFrame & srcFrame);
859 
861  virtual PString GetSubClassName() const { return PString(""); }
862 
864  virtual BYTE GetFullFrameType() { return nullType; }
865 
866  protected:
867 };
868 
870 
877 {
879  public:
880 
882  enum ProtocolSc {
883  cmdNew = 1,
884  cmdPing = 2,
885  cmdPong = 3,
886  cmdAck = 4,
887  cmdHangup = 5,
888  cmdReject = 6,
889  cmdAccept = 7,
892  cmdInval = 10,
893  cmdLagRq = 11,
894  cmdLagRp = 12,
895  cmdRegReq = 13,
896  cmdRegAuth = 14,
897  cmdRegAck = 15,
898  cmdRegRej = 16,
899  cmdRegRel = 17,
900  cmdVnak = 18,
901  cmdDpReq = 19,
902  cmdDpRep = 20,
903  cmdDial = 21,
904  cmdTxreq = 22,
905  cmdTxcnt = 23,
906  cmdTxacc = 24,
907  cmdTxready = 25,
908  cmdTxrel = 26,
909  cmdTxrej = 27,
910  cmdQuelch = 28,
911  cmdUnquelch = 29,
912  cmdPoke = 30,
913  cmdPage = 31,
914  cmdMwi = 32,
916  cmdTransfer = 34,
918  cmdFwDownl = 36,
919  cmdFwData = 37,
920  cmdTxMedia = 38,
921  cmdRtKey = 39,
923  };
924 
928  IAX2FullFrameProtocol(const IAX2Frame & srcFrame);
929 
933  IAX2FullFrameProtocol(const IAX2FullFrame & srcFrame);
934 
938  PINDEX subClassValue,
941  );
942 
946  ProtocolSc subClassValue,
949  );
950 
957  ProtocolSc subClassValue,
958  IAX2FullFrame *inReplyTo,
961  );
962 
964  virtual ~IAX2FullFrameProtocol();
965 
968 
970  virtual PBoolean InformationElementsPresent() { return !ieElements.IsEmpty(); }
971 
974 
976  virtual PString GetSubClassName() const;
977 
979  static PString GetSubClassName(unsigned t);
980 
982  void AppendIe(IAX2Ie *newElement) { ieElements.Append(newElement); }
983 
986  void WriteIeAsBinaryData();
987 
991  void CopyDataFromIeListTo(IAX2IeData &res);
992 
995  void GetRemoteCapability(unsigned int & capability,
996  unsigned int & preferred);
997 
1000  virtual BYTE GetFullFrameType() { return iax2ProtocolType; }
1001 
1003  virtual void PrintOn(ostream & strm) const;
1004 
1007  PBoolean GetCallTokenIe(IAX2IeCallToken & callToken);
1008 
1009  protected:
1010 
1013  PBoolean ReadInformationElements();
1014 
1015 
1019 
1021 #if PTRACING
1022  friend ostream & operator<<(ostream & o, ProtocolSc t);
1023 #endif
1024 };
1025 
1027 
1033 {
1034  PCLASSINFO(IAX2FullFrameText, IAX2FullFrame);
1035  public:
1036 
1039  IAX2FullFrameText(IAX2Processor *processor,
1040  const PString& textValue
1041  );
1042 
1045  IAX2FullFrameText(const IAX2Frame & srcFrame);
1046 
1049  IAX2FullFrameText(const IAX2FullFrame & srcFrame);
1050 
1052  virtual PString GetSubClassName() const;
1053 
1055  virtual BYTE GetFullFrameType() { return textType; }
1056 
1058  PString GetTextString() const;
1059 
1060  protected:
1061 
1063  PString internalText;
1064 };
1066 
1072 {
1073  PCLASSINFO(IAX2FullFrameImage, IAX2FullFrame);
1074  public:
1075 
1078  IAX2FullFrameImage(const IAX2Frame & srcFrame);
1079 
1082  IAX2FullFrameImage(const IAX2FullFrame & srcFrame);
1083 
1085  virtual PString GetSubClassName() const;
1086 
1088  virtual BYTE GetFullFrameType() { return imageType; }
1089  protected:
1090 };
1091 
1093 
1099 {
1100  PCLASSINFO(IAX2FullFrameHtml, IAX2FullFrame);
1101  public:
1102 
1105  IAX2FullFrameHtml(const IAX2Frame & srcFrame);
1106 
1109  IAX2FullFrameHtml(const IAX2FullFrame & srcFrame);
1110 
1112  virtual PString GetSubClassName() const;
1113 
1115  virtual BYTE GetFullFrameType() { return htmlType; }
1116  protected:
1117 };
1118 
1120 
1125 {
1126  PCLASSINFO(IAX2FullFrameCng, IAX2FullFrame);
1127  public:
1128 
1131  IAX2FullFrameCng(const IAX2Frame & srcFrame);
1132 
1135  IAX2FullFrameCng(const IAX2FullFrame & srcFrame);
1136 
1138  virtual PString GetSubClassName() const;
1139 
1141  virtual BYTE GetFullFrameType() { return cngType; }
1142  protected:
1143 };
1144 
1146 
1153 class IAX2FrameList : public PList<IAX2Frame>
1154 {
1155  public:
1157  void ReportList(PString & answer);
1158 
1161 
1163  void Initialise();
1164 
1166  void GrabContents(IAX2FrameList &src);
1167 
1171 
1176 
1178  void AddNewFrame(IAX2Frame *src);
1179 
1181  void GetResendFramesDeleteOldFrames(IAX2FrameList & framesToSend);
1182 
1184  void MarkAllAsResent();
1185 
1186  protected:
1188  PMutex mutex;
1189 };
1190 
1192 
1197 {
1198  PCLASSINFO(IAX2ActiveFrameList, IAX2FrameList);
1199  public:
1201 };
1203 
1204 
1205 #endif // OPAL_IAX2
1206 
1207 #endif // OPAL_IAX2_FRAME_H
1208 
1209 /* The comment below is magic for those who use emacs to edit this file.
1210  * With the comment below, the tab key does auto indent to 2 spaces.
1211  *
1212  * Local Variables:
1213  * mode:c
1214  * c-basic-offset:2
1215  * End:
1216  */