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/endpoint.h>
00115 #include <iax2/iax2con.h>
00116 #include <iax2/processor.h>
00117 #include <iax2/regprocessor.h>
00118 #include <iax2/specialprocessor.h>
00119
00120 class IAX2Receiver;
00121 class IAX2Transmit;
00122 class IAX2Processor;
00123
00127 class IAX2IncomingEthernetFrames : public PThread
00128 {
00129 PCLASSINFO(IAX2IncomingEthernetFrames, PThread);
00130 public:
00131
00135 IAX2IncomingEthernetFrames();
00136
00138 ~IAX2IncomingEthernetFrames() { }
00139
00142
00143 virtual void Main();
00144
00146 void Assign(IAX2EndPoint *ep);
00147
00150 void ProcessList();
00151
00153 void Terminate();
00154
00156 protected:
00158 IAX2EndPoint *endpoint;
00159
00161 PSyncPoint activate;
00162
00164 BOOL keepGoing;
00165 };
00166
00167
00168
00169
00171 class IAX2EndPoint : public OpalEndPoint
00172 {
00173 PCLASSINFO(IAX2EndPoint, OpalEndPoint);
00174 public:
00179 IAX2EndPoint(
00180 OpalManager & manager
00181 );
00182
00184 ~IAX2EndPoint();
00186
00193 virtual BOOL NewIncomingConnection(
00194 OpalTransport * transport
00195 );
00196
00226 virtual BOOL MakeConnection(
00227 OpalCall & call,
00228 const PString & party,
00229 void * userData = NULL,
00230 unsigned int options = 0,
00231 OpalConnection::StringOptions * stringOptions = NULL
00232 );
00233
00237 virtual IAX2Connection * CreateConnection(
00238 OpalCall & call,
00239 const PString & token,
00240 void * userData,
00241 const PString & remoteParty,
00242 const PString & remotePartyName = PString::Empty()
00243 );
00245
00250 BOOL Initialise();
00251
00253 virtual void IncomingEthernetFrame (IAX2Frame *frame);
00254
00260 BOOL ConectionForFrameIsAlive(IAX2Frame *f);
00261
00268 PINDEX NextSrcCallNumber(IAX2Processor * processor);
00269
00272 void ReportStoredConnections();
00273
00275 WORD ListenPortNumber() { return 4569; }
00276
00278 IAX2Transmit *transmitter;
00279
00281 IAX2Receiver *receiver;
00282
00284 PString GetLocalUserName() { return localUserName; }
00285
00287 PString GetLocalNumber() { return localNumber; }
00288
00290 void SetLocalUserName(PString newValue);
00291
00293 void SetLocalNumber(PString newValue);
00294
00296 PString & GetPassword() { return password; }
00297
00299 void SetPassword(PString newValue);
00300
00307 BOOL ConnectionForFrameIsAlive(IAX2Frame *f);
00308
00310 PINDEX GetOutSequenceNumberForStatusQuery();
00311
00313 void StartRinging(PString remoteCaller);
00314
00326 void NewIncomingConnection(
00327 IAX2Frame *f
00328 );
00329
00332 void OnEstablished(
00333 OpalConnection & con
00334 );
00335
00345 virtual OpalMediaFormatList GetMediaFormats() const;
00346
00347 virtual BOOL OnIncomingCall(IAX2Connection & conn);
00348
00350 PINDEX GetSupportedCodecs(OpalMediaFormatList & list);
00351
00353 PINDEX GetPreferredCodec(OpalMediaFormatList & list);
00354
00357 void GetCodecLengths(PINDEX src, PINDEX &compressedBytes, PINDEX &duration);
00358
00364 enum IAX2RemoteAddressFields {
00365 protoIndex = 0,
00366 userIndex = 1,
00367 transportIndex = 2,
00368 addressIndex = 3,
00369 extensionIndex = 4,
00370 contextIndex = 5,
00371 maximumIndex = 6
00372 };
00373
00380 static PStringList DissectRemoteParty(const PString & other);
00381
00385 void ProcessReceivedEthernetFrames();
00386
00387
00390 void ReportTransmitterLists();
00391
00393 void CopyLocalMediaFormats(OpalMediaFormatList & list);
00394
00400 void Register(
00401 const PString & host,
00402 const PString & username,
00403 const PString & password = PString::Empty(),
00404 PINDEX requestedRefreshTime = 60
00405 );
00406
00407 enum RegisteredError {
00408 RegisteredFailureUnknown
00409 };
00410
00413 virtual void OnRegistered(
00414 const PString & host,
00415 const PString & userName,
00416 BOOL isFailure,
00417 RegisteredError reason = RegisteredFailureUnknown);
00418
00421 void Unregister(
00422 const PString & host,
00423 const PString & username);
00424
00425 enum UnregisteredError {
00426 UnregisteredFailureUnknown
00427 };
00428
00433 virtual void OnUnregistered(
00434 const PString & host,
00435 const PString & userName,
00436 BOOL isFailure,
00437 UnregisteredError reason = UnregisteredFailureUnknown);
00438
00439
00441 BOOL IsRegistered(const PString & host, const PString & username);
00442
00444 PINDEX GetRegistrationsCount();
00445
00447 PString BuildUrl(
00448 const PString & host,
00449 const PString & userName = PString::Empty(),
00450 const PString & extension = PString::Empty(),
00451 const PString & context = PString::Empty(),
00452 const PString & transport = PString::Empty()
00453 );
00454
00456
00457 protected:
00464 IAX2IncomingEthernetFrames incomingFrameHandler;
00465
00468 IAX2FrameList packetsReadFromEthernet;
00469
00471 PUDPSocket *sock;
00472
00474 int callnumbs;
00475
00477 PMutex callNumbLock;
00478
00480 PTime callStartTime;
00481
00483 PString localUserName;
00484
00486 PString localNumber;
00487
00489 PString password;
00490
00492 PINDEX statusQueryCounter;
00493
00495 PMutex statusQueryMutex;
00496
00499 IAX2SpecialProcessor * specialPacketHandler;
00500
00508 BOOL ProcessInMatchingConnection(IAX2Frame *f);
00509
00517 BOOL AddNewTranslationEntry(IAX2Frame *f);
00518
00531 PStringToString tokenTable;
00532
00534 PMutex mutexTokenTable;
00535
00538 PAtomicInteger callsEstablished;
00539
00541 OpalMediaFormatList localMediaFormats;
00542
00544 PMutex regProcessorsMutex;
00545
00550 PArrayObjects regProcessors;
00551
00552 };
00553
00554 #endif // IAX_ENDPOINT_H
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565