remote.h

Go to the documentation of this file.
00001 /*
00002  *
00003  *
00004  * Inter Asterisk Exchange 2
00005  * 
00006  * A class to describe the node we are talking to.
00007  * 
00008  * Open Phone Abstraction Library (OPAL)
00009  *
00010  * Copyright (c) 2005 Indranet Technologies Ltd.
00011  *
00012  * The contents of this file are subject to the Mozilla Public License
00013  * Version 1.0 (the "License"); you may not use this file except in
00014  * compliance with the License. You may obtain a copy of the License at
00015  * http://www.mozilla.org/MPL/
00016  *
00017  * Software distributed under the License is distributed on an "AS IS"
00018  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00019  * the License for the specific language governing rights and limitations
00020  * under the License.
00021  *
00022  * The Original Code is Open Phone Abstraction Library.
00023  *
00024  * The Initial Developer of the Original Code is Indranet Technologies Ltd.
00025  *
00026  * The author of this code is Derek J Smithies
00027  *
00028  * $Revision: 28283 $
00029  * $Author: rjongbloed $
00030  * $Date: 2012-08-30 21:08:15 -0500 (Thu, 30 Aug 2012) $
00031  */
00032 
00033 #ifndef OPAL_IAX2_REMOTE_H
00034 #define OPAL_IAX2_REMOTE_H
00035 
00036 #ifndef _PTLIB_H
00037 #include <ptlib.h>
00038 #endif
00039 
00040 #include <opal/buildopts.h>
00041 
00042 #if OPAL_IAX2
00043 
00044 #include <ptlib/sockets.h>
00045 #include <ptclib/pssl.h>
00046 
00047 #ifdef P_USE_PRAGMA
00048 #pragma interface
00049 #endif
00050 
00051 class IAX2FullFrame;
00052 
00053 
00056 class IAX2Remote : public PObject
00057 { 
00058   PCLASSINFO(IAX2Remote, PObject);
00059   
00060  public:
00061   
00063   IAX2Remote();
00064   
00065   virtual ~IAX2Remote() { };
00066   
00069   PINDEX DestCallNumber() { return destCallNumber; }
00070   
00074   PINDEX SourceCallNumber() { return sourceCallNumber; }
00075  
00077   virtual void PrintOn(ostream & strm) const; 
00078   
00080   enum {
00081     callNumberUndefined = 0xffff 
00082   };
00083   
00085   PIPSocket::Address RemoteAddress() { return remoteAddress; }
00086   
00090   PString BuildConnectionToken();
00091 
00093   PString BuildOurConnectionToken();
00094 
00096   PINDEX   RemotePort() { return remotePort; }
00097   
00099   void Assign(IAX2Remote &);
00100   
00102   void SetRemoteAddress(PIPSocket::Address &newVal) { remoteAddress = newVal; }
00103   
00105   void SetRemoteAddress(int newVal) { remoteAddress = newVal; }
00106   
00108   void SetRemotePort (PINDEX newVal) { remotePort = newVal; }
00109   
00111   void SetSourceCallNumber(PINDEX newVal) { sourceCallNumber = newVal; }
00112   
00114   void SetDestCallNumber(PINDEX newVal);
00115   
00119   PBoolean operator == (IAX2Remote & other);
00120   
00123   PBoolean operator *= (IAX2Remote & other);
00124   
00125   
00127   PBoolean operator != (IAX2Remote & other);
00128   
00129   
00130  protected:
00132   PINDEX       sourceCallNumber;    
00133   
00135   PINDEX       destCallNumber;      
00136   
00138   PIPSocket::Address remoteAddress; 
00139   
00141   PINDEX               remotePort;    
00142 
00143 };
00144 
00146 
00155 class IAX2FrameIdValue : public PObject
00156 {
00157   PCLASSINFO(IAX2FrameIdValue, PObject);
00158  public:
00160   IAX2FrameIdValue (PINDEX timeStamp, PINDEX seqVal);
00161 
00163   IAX2FrameIdValue (PINDEX val);
00164 
00166   PINDEX GetTimeStamp() const;
00167 
00169   PINDEX GetSequenceVal() const;
00170 
00174   PINDEX GetPlainSequence() const;
00175 
00177   virtual void PrintOn(ostream & strm) const;
00178 
00181   virtual Comparison Compare(const PObject & obj) const;
00182 
00183  protected:
00184 
00187   PUInt64 value;
00188 };
00189 
00191 
00196 PDECLARE_SORTED_LIST(IAX2PacketIdList, IAX2FrameIdValue)
00197 #ifdef DOC_PLUS_PLUS
00198 class IAX2PacketIdList : public PSortedList
00199 {
00200 #endif
00201   
00204   PBoolean Contains(IAX2FrameIdValue &src);
00205   
00208   PINDEX GetFirstValue();
00209   
00211   void AppendNewFrame(IAX2FullFrame &src);
00212   
00214   virtual void PrintOn(ostream & strm) const;   
00215   
00216  protected:
00222   void RemoveOldContiguousValues();
00223 };
00224 
00226 
00227 class IAX2SequenceNumbers
00228 {
00229  public:
00233   enum IncomingOrder {
00234     InSequence,  
00235     SkippedFrame, 
00236     RepeatedFrame 
00237   };
00238 
00239 
00240 
00242   IAX2SequenceNumbers() 
00243     { ZeroAllValues();   };
00244   
00246   virtual ~IAX2SequenceNumbers() { }
00247   
00249   void ZeroAllValues();
00250   
00252   PINDEX InSeqNo();
00253   
00255   PINDEX OutSeqNo();
00256   
00259   PBoolean IsFirstReplyFrame();
00260 
00263   PBoolean IsSequenceNosZero();
00264 
00266   void SetInSeqNo(PINDEX newVal);
00267   
00269   void SetOutSeqNo(PINDEX newVal);
00270 
00273   void SetInOutSeqNo(PINDEX inVal, PINDEX outVal);
00274   
00277   void SetAckSequenceInfo(IAX2SequenceNumbers & other);
00278   
00280   PBoolean  operator !=(IAX2SequenceNumbers &other);
00281   
00283   PBoolean operator ==(IAX2SequenceNumbers &other);
00284   
00286   void MassageSequenceForSending(IAX2FullFrame &src /*<!src will be transmitted to the remote node */
00287                                  );
00288 
00292   void WrapAroundFrameSequence(IAX2SequenceNumbers & src);
00293   
00297   IncomingOrder IncomingMessageInOrder
00298     (IAX2FullFrame &src /*<!frame to be compared with current data base.*/  );
00299   
00301   void CopyContents(IAX2SequenceNumbers &src);
00302   
00304   PString AsString() const;
00305   
00307   virtual void PrintOn(ostream & strm) const;
00308 
00311   PBoolean IsFirstReply() { return (inSeqNo == 1) && (outSeqNo == 0); }
00312 
00314   void AddWrapAroundValue(PINDEX newOffset);
00315 
00316 
00317  protected:
00318 
00320   enum sequenceDefines {
00321     minSpacing = 3   
00322   };
00323   
00325   PINDEX inSeqNo;  
00326   
00328   PINDEX outSeqNo; 
00329 
00331   PMutex mutex;
00332 
00334   PINDEX lastSentTimeStamp;
00335 
00337   IAX2PacketIdList receivedLog;
00338 };
00339 
00341 
00342 class IAX2Encryption : public PObject 
00343 {
00344   PCLASSINFO(IAX2Encryption, PObject);
00345  public:
00347   IAX2Encryption();
00348 
00350   void SetEncryptionOn (PBoolean newState = true);
00351 
00353   void SetEncryptionKey(PString & newKey);
00354 
00356   void SetChallengeKey(PString & newKey);
00357 
00359   const PString & EncryptionKey() const;
00360 
00362   const PString & ChallengeKey() const;
00363 
00365   PBoolean IsEncrypted() const;
00366 
00367 #ifdef P_SSL_AES
00368 
00369   PAESContext & AesEncryptKey() { return m_aesEncryptKey; }
00370 
00372   PAESContext & AesDecryptKey() { return m_aesDecryptKey; }
00373 #endif
00374 
00375  protected:
00378   void CalculateAesKeys();
00379 
00381   PString encryptionKey;
00382 
00384   PString challengeKey;
00385 
00387   PBoolean encryptionEnabled;
00388 
00389 #ifdef P_SSL_AES
00390 
00391   PAESContext m_aesEncryptKey;
00392 
00394   PAESContext m_aesDecryptKey;
00395 #endif
00396 };
00397 
00399 
00400 
00401 #endif // OPAL_IAX2
00402 
00403 #endif // OPAL_IAX2_REMOTE_H
00404 
00405 /* The comment below is magic for those who use emacs to edit this file.
00406  * With the comment below, the tab key does auto indent to 2 spaces.    
00407  *
00408  * Local Variables:
00409  * mode:c
00410  * c-basic-offset:2
00411  * End:
00412  */

Generated on 21 Jun 2013 for OPAL by  doxygen 1.4.7