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_IAX2EP_H
00033 #define OPAL_IAX2_IAX2EP_H
00034 
00035 #ifndef _PTLIB_H
00036 #include <ptlib.h>
00037 #endif
00038 
00039 #ifdef P_USE_PRAGMA
00040 #pragma interface
00041 #endif
00042 
00043 #include <opal/buildopts.h>
00044 
00045 #if OPAL_IAX2
00046 
00047 #include <opal/endpoint.h>
00048 #include <iax2/iax2con.h>
00049 #include <iax2/processor.h>
00050 #include <iax2/regprocessor.h>
00051 #include <iax2/specialprocessor.h>
00052 
00053 class IAX2Receiver;
00054 class IAX2Transmit;
00055 class IAX2Processor;
00056 
00060 class IAX2IncomingEthernetFrames : public PThread
00061 {
00062   PCLASSINFO(IAX2IncomingEthernetFrames, PThread);
00063 public:
00064 
00068   IAX2IncomingEthernetFrames();
00069    
00071   ~IAX2IncomingEthernetFrames() { }
00072 
00075   
00076   virtual void Main();
00077    
00079   void Assign(IAX2EndPoint *ep);
00080 
00083   void ProcessList();
00084 
00086   void Terminate();
00087 
00089  protected:
00091   IAX2EndPoint *endpoint;
00092    
00094   PSyncPoint activate;
00095 
00097   PBoolean           keepGoing;
00098 };
00099 
00100 
00101 
00102 
00104 class IAX2EndPoint : public OpalEndPoint
00105 {
00106   PCLASSINFO(IAX2EndPoint, OpalEndPoint);
00107  public:
00112   IAX2EndPoint(
00113     OpalManager & manager
00114   );
00115   
00117   ~IAX2EndPoint();
00119   
00126   virtual PBoolean NewIncomingConnection(
00127     OpalTransport * transport  
00128   );
00129   
00159   virtual PBoolean MakeConnection(
00160                               OpalCall & call,          
00161                               const PString & party,    
00162                               void * userData = NULL,   
00163                               unsigned int options = 0, 
00164                               OpalConnection::StringOptions * stringOptions = NULL
00165                               );
00166   
00170   virtual IAX2Connection * CreateConnection(
00171                                            OpalCall & call,            
00172                                            const PString & token,      
00173                                            void * userData,             
00174                                            const PString & remoteParty, 
00175              const PString & remotePartyName = PString::Empty() 
00176                                            );
00178   
00183   PBoolean Initialise();
00184 
00186   virtual void IncomingEthernetFrame (IAX2Frame *frame);
00187   
00193   PBoolean ConectionForFrameIsAlive(IAX2Frame *f);
00194   
00201   PINDEX NextSrcCallNumber(IAX2Processor * processor);
00202       
00205   void ReportStoredConnections();
00206   
00208   WORD ListenPortNumber()  { return 4569; }
00209       
00211   IAX2Transmit *transmitter;
00212   
00214   IAX2Receiver    *receiver;
00215   
00217   PString GetLocalUserName() { return localUserName; }
00218   
00220   PString GetLocalNumber() { return localNumber; }
00221   
00223   void SetLocalUserName(PString newValue); 
00224   
00226   void SetLocalNumber(PString newValue);
00227   
00229   PString & GetPassword() { return password; }
00230   
00232   void SetPassword(PString newValue);
00233 
00240   PBoolean ConnectionForFrameIsAlive(IAX2Frame *f);
00241  
00243   PINDEX GetOutSequenceNumberForStatusQuery();
00244   
00246   void StartRinging(PString remoteCaller);
00247   
00259     void NewIncomingConnection(
00260       IAX2Frame *f  
00261                 );
00262 
00268     void OnEstablished(
00269        OpalConnection & con
00270     );
00271 
00277     virtual void OnReleased(
00278       OpalConnection & connection   
00279     );
00280 
00290   virtual OpalMediaFormatList GetMediaFormats() const;
00291 
00293   PINDEX GetSupportedCodecs(OpalMediaFormatList & list);
00294   
00296   PINDEX GetPreferredCodec(OpalMediaFormatList & list);
00297 
00300   void GetCodecLengths(PINDEX src, PINDEX &compressedBytes, PINDEX &duration);
00301   
00307   enum IAX2RemoteAddressFields {
00308     protoIndex     = 0,     
00309     userIndex      = 1,     
00310     transportIndex = 2,     
00311     addressIndex   = 3,     
00312     extensionIndex = 4,     
00313     contextIndex   = 5,     
00314     maximumIndex   = 6      
00315   };
00316 
00323   static PStringArray DissectRemoteParty(const PString & other);
00324 
00328   void ProcessReceivedEthernetFrames();
00329 
00332   void ReportTransmitterLists(PString & answer, bool getFullReport = false);
00333 
00335   void CopyLocalMediaFormats(OpalMediaFormatList & list);
00336   
00342   void Register(
00343       const PString & host,
00344       const PString & username,
00345       const PString & password = PString::Empty(),
00346       PINDEX requestedRefreshTime = 60
00347     );
00348   
00349   enum RegisteredError {
00350     RegisteredFailureUnknown
00351   };
00352   
00355   virtual void OnRegistered(
00356       const PString & host,
00357       const PString & userName,
00358       PBoolean isFailure,
00359       RegisteredError reason = RegisteredFailureUnknown);
00360    
00363   void Unregister(
00364       const PString & host,
00365       const PString & username);
00366       
00367   enum UnregisteredError {
00368     UnregisteredFailureUnknown
00369   };
00370       
00375   virtual void OnUnregistered(
00376       const PString & host,
00377       const PString & userName,
00378       PBoolean isFailure,
00379       UnregisteredError reason = UnregisteredFailureUnknown);
00380       
00381   
00383   PBoolean IsRegistered(const PString & host, const PString & username);
00384   
00386   PINDEX GetRegistrationsCount();
00387   
00389   PString BuildUrl(
00390     const PString & host,
00391     const PString & userName = PString::Empty(),
00392     const PString & extension = PString::Empty(),
00393     const PString & context = PString::Empty(),
00394     const PString & transport = PString::Empty()
00395   );
00396   
00398   PBoolean InitialisedOK() { return (transmitter != NULL) && (receiver != NULL); }
00400   
00401  protected:
00408   IAX2IncomingEthernetFrames incomingFrameHandler;
00409 
00412   IAX2FrameList   packetsReadFromEthernet;
00413   
00415   PUDPSocket  *sock;
00416   
00418   int callnumbs;
00419   
00421   PMutex callNumbLock;
00422   
00424   PTime callStartTime;
00425   
00427   PString localUserName;
00428   
00430   PString localNumber;
00431   
00433   PString password;
00434   
00436   PINDEX statusQueryCounter;
00437   
00439   PMutex statusQueryMutex;
00440   
00443   IAX2SpecialProcessor * specialPacketHandler;
00444     
00452   PBoolean ProcessInMatchingConnection(IAX2Frame *f);  
00453     
00461   PBoolean AddNewTranslationEntry(IAX2Frame *f);
00462   
00475   PStringToString    tokenTable;
00476   
00480   PReadWriteMutex    mutexTokenTable;
00481 
00484   PAtomicInteger callsEstablished;
00485 
00487   OpalMediaFormatList localMediaFormats;
00488   
00490   PMutex regProcessorsMutex;
00491   
00496   PArrayObjects regProcessors;
00497   
00498 };
00499 
00500 
00501 #endif // OPAL_IAX2
00502 
00503 #endif // OPAL_IAX2_IAX2EP_H
00504 
00505 
00506 
00507 
00508 
00509 
00510 
00511 
00512 
00513 
00514