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
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 #ifndef IAX_ENDPOINT_H
00104 #define IAX_ENDPOINT_H
00105
00106 #ifndef _PTLIB_H
00107 #include <ptlib.h>
00108 #endif
00109
00110 #ifdef P_USE_PRAGMA
00111 #pragma interface
00112 #endif
00113
00114 #include <opal/buildopts.h>
00115
00116 #include <opal/endpoint.h>
00117 #include <iax2/iax2con.h>
00118 #include <iax2/processor.h>
00119 #include <iax2/regprocessor.h>
00120 #include <iax2/specialprocessor.h>
00121
00122 class IAX2Receiver;
00123 class IAX2Transmit;
00124 class IAX2Processor;
00125
00129 class IAX2IncomingEthernetFrames : public PThread
00130 {
00131 PCLASSINFO(IAX2IncomingEthernetFrames, PThread);
00132 public:
00133
00137 IAX2IncomingEthernetFrames();
00138
00140 ~IAX2IncomingEthernetFrames() { }
00141
00144
00145 virtual void Main();
00146
00148 void Assign(IAX2EndPoint *ep);
00149
00152 void ProcessList();
00153
00155 void Terminate();
00156
00158 protected:
00160 IAX2EndPoint *endpoint;
00161
00163 PSyncPoint activate;
00164
00166 PBoolean keepGoing;
00167 };
00168
00169
00170
00171
00173 class IAX2EndPoint : public OpalEndPoint
00174 {
00175 PCLASSINFO(IAX2EndPoint, OpalEndPoint);
00176 public:
00181 IAX2EndPoint(
00182 OpalManager & manager
00183 );
00184
00186 ~IAX2EndPoint();
00188
00195 virtual PBoolean NewIncomingConnection(
00196 OpalTransport * transport
00197 );
00198
00228 virtual PBoolean MakeConnection(
00229 OpalCall & call,
00230 const PString & party,
00231 void * userData = NULL,
00232 unsigned int options = 0,
00233 OpalConnection::StringOptions * stringOptions = NULL
00234 );
00235
00239 virtual IAX2Connection * CreateConnection(
00240 OpalCall & call,
00241 const PString & token,
00242 void * userData,
00243 const PString & remoteParty,
00244 const PString & remotePartyName = PString::Empty()
00245 );
00247
00252 PBoolean Initialise();
00253
00255 virtual void IncomingEthernetFrame (IAX2Frame *frame);
00256
00262 PBoolean ConectionForFrameIsAlive(IAX2Frame *f);
00263
00270 PINDEX NextSrcCallNumber(IAX2Processor * processor);
00271
00274 void ReportStoredConnections();
00275
00277 WORD ListenPortNumber() { return 4569; }
00278
00280 IAX2Transmit *transmitter;
00281
00283 IAX2Receiver *receiver;
00284
00286 PString GetLocalUserName() { return localUserName; }
00287
00289 PString GetLocalNumber() { return localNumber; }
00290
00292 void SetLocalUserName(PString newValue);
00293
00295 void SetLocalNumber(PString newValue);
00296
00298 PString & GetPassword() { return password; }
00299
00301 void SetPassword(PString newValue);
00302
00309 PBoolean ConnectionForFrameIsAlive(IAX2Frame *f);
00310
00312 PINDEX GetOutSequenceNumberForStatusQuery();
00313
00315 void StartRinging(PString remoteCaller);
00316
00328 void NewIncomingConnection(
00329 IAX2Frame *f
00330 );
00331
00337 void OnEstablished(
00338 OpalConnection & con
00339 );
00340
00346 virtual void OnReleased(
00347 OpalConnection & connection
00348 );
00349
00359 virtual OpalMediaFormatList GetMediaFormats() const;
00360
00361 virtual PBoolean OnIncomingCall(IAX2Connection & conn);
00362
00364 PINDEX GetSupportedCodecs(OpalMediaFormatList & list);
00365
00367 PINDEX GetPreferredCodec(OpalMediaFormatList & list);
00368
00371 void GetCodecLengths(PINDEX src, PINDEX &compressedBytes, PINDEX &duration);
00372
00378 enum IAX2RemoteAddressFields {
00379 protoIndex = 0,
00380 userIndex = 1,
00381 transportIndex = 2,
00382 addressIndex = 3,
00383 extensionIndex = 4,
00384 contextIndex = 5,
00385 maximumIndex = 6
00386 };
00387
00394 static PStringArray DissectRemoteParty(const PString & other);
00395
00399 void ProcessReceivedEthernetFrames();
00400
00403 void ReportTransmitterLists(PString & answer, bool getFullReport = false);
00404
00406 void CopyLocalMediaFormats(OpalMediaFormatList & list);
00407
00413 void Register(
00414 const PString & host,
00415 const PString & username,
00416 const PString & password = PString::Empty(),
00417 PINDEX requestedRefreshTime = 60
00418 );
00419
00420 enum RegisteredError {
00421 RegisteredFailureUnknown
00422 };
00423
00426 virtual void OnRegistered(
00427 const PString & host,
00428 const PString & userName,
00429 PBoolean isFailure,
00430 RegisteredError reason = RegisteredFailureUnknown);
00431
00434 void Unregister(
00435 const PString & host,
00436 const PString & username);
00437
00438 enum UnregisteredError {
00439 UnregisteredFailureUnknown
00440 };
00441
00446 virtual void OnUnregistered(
00447 const PString & host,
00448 const PString & userName,
00449 PBoolean isFailure,
00450 UnregisteredError reason = UnregisteredFailureUnknown);
00451
00452
00454 PBoolean IsRegistered(const PString & host, const PString & username);
00455
00457 PINDEX GetRegistrationsCount();
00458
00460 PString BuildUrl(
00461 const PString & host,
00462 const PString & userName = PString::Empty(),
00463 const PString & extension = PString::Empty(),
00464 const PString & context = PString::Empty(),
00465 const PString & transport = PString::Empty()
00466 );
00467
00469
00470 protected:
00477 IAX2IncomingEthernetFrames incomingFrameHandler;
00478
00481 IAX2FrameList packetsReadFromEthernet;
00482
00484 PUDPSocket *sock;
00485
00487 int callnumbs;
00488
00490 PMutex callNumbLock;
00491
00493 PTime callStartTime;
00494
00496 PString localUserName;
00497
00499 PString localNumber;
00500
00502 PString password;
00503
00505 PINDEX statusQueryCounter;
00506
00508 PMutex statusQueryMutex;
00509
00512 IAX2SpecialProcessor * specialPacketHandler;
00513
00521 PBoolean ProcessInMatchingConnection(IAX2Frame *f);
00522
00530 PBoolean AddNewTranslationEntry(IAX2Frame *f);
00531
00544 PStringToString tokenTable;
00545
00549 PReadWriteMutex mutexTokenTable;
00550
00553 PAtomicInteger callsEstablished;
00554
00556 OpalMediaFormatList localMediaFormats;
00557
00559 PMutex regProcessorsMutex;
00560
00565 PArrayObjects regProcessors;
00566
00567 };
00568
00569 #endif // IAX_ENDPOINT_H
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579