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