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() { activate.Signal(); }
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 unsigned short port = 4569
00115 );
00116
00118 ~IAX2EndPoint();
00120
00127 virtual PBoolean NewIncomingConnection(
00128 OpalTransport * transport
00129 );
00130
00160 virtual PSafePtr<OpalConnection> MakeConnection(
00161 OpalCall & call,
00162 const PString & party,
00163 void * userData = NULL,
00164 unsigned int options = 0,
00165 OpalConnection::StringOptions * stringOptions = NULL
00166 );
00167
00171 virtual IAX2Connection * CreateConnection(
00172 OpalCall & call,
00173 const PString & token,
00174 void * userData,
00175 const PString & remoteParty,
00176 const PString & remotePartyName = PString::Empty()
00177 );
00179
00184 PBoolean Initialise();
00185
00187 virtual void IncomingEthernetFrame (IAX2Frame *frame);
00188
00194 PBoolean ConectionForFrameIsAlive(IAX2Frame *f);
00195
00202 PINDEX NextSrcCallNumber(IAX2Processor * processor);
00203
00206 void ReportStoredConnections();
00207
00209 WORD ListenPortNumber() { return 4569; }
00210
00212 IAX2Transmit *transmitter;
00213
00215 IAX2Receiver *receiver;
00216
00218 PString GetLocalUserName() { return localUserName; }
00219
00221 PString GetLocalNumber() { return localNumber; }
00222
00224 void SetLocalUserName(PString newValue);
00225
00227 void SetLocalNumber(PString newValue);
00228
00230 PString & GetPassword() { return password; }
00231
00233 void SetPassword(PString newValue);
00234
00241 PBoolean ConnectionForFrameIsAlive(IAX2Frame *f);
00242
00244 PINDEX GetOutSequenceNumberForStatusQuery();
00245
00247 void StartRinging(PString remoteCaller);
00248
00260 void NewIncomingConnection(
00261 IAX2Frame *f
00262 );
00263
00269 void OnEstablished(
00270 OpalConnection & con
00271 );
00272
00278 virtual void OnReleased(
00279 OpalConnection & connection
00280 );
00281
00291 virtual OpalMediaFormatList GetMediaFormats() const;
00292
00294 PINDEX GetSupportedCodecs(OpalMediaFormatList & list);
00295
00297 PINDEX GetPreferredCodec(OpalMediaFormatList & list);
00298
00301 void GetCodecLengths(PINDEX src, PINDEX &compressedBytes, PINDEX &duration);
00302
00308 enum IAX2RemoteAddressFields {
00309 protoIndex = 0,
00310 userIndex = 1,
00311 transportIndex = 2,
00312 addressIndex = 3,
00313 portIndex = 4,
00314 extensionIndex = 5,
00315 contextIndex = 6,
00316 maximumIndex = 7
00317 };
00318
00325 static PStringArray DissectRemoteParty(const PString & other);
00326
00330 void ProcessReceivedEthernetFrames();
00331
00334 void ReportTransmitterLists(PString & answer, bool getFullReport = false);
00335
00337 void CopyLocalMediaFormats(OpalMediaFormatList & list);
00338
00344 void Register(
00345 const PString & host,
00346 const PString & username,
00347 const PString & password = PString::Empty(),
00348 PINDEX requestedRefreshTime = 60
00349 );
00350
00351 enum RegisteredError {
00352 RegisteredFailureUnknown
00353 };
00354
00357 virtual void OnRegistered(
00358 const PString & host,
00359 const PString & userName,
00360 PBoolean isFailure,
00361 RegisteredError reason = RegisteredFailureUnknown);
00362
00365 void Unregister(
00366 const PString & host,
00367 const PString & username);
00368
00369 enum UnregisteredError {
00370 UnregisteredFailureUnknown
00371 };
00372
00377 virtual void OnUnregistered(
00378 const PString & host,
00379 const PString & userName,
00380 PBoolean isFailure,
00381 UnregisteredError reason = UnregisteredFailureUnknown);
00382
00383
00385 PBoolean IsRegistered(const PString & host, const PString & username);
00386
00388 PINDEX GetRegistrationsCount();
00389
00391 PString BuildUrl(
00392 const PString & host,
00393 const PString & userName = PString::Empty(),
00394 const PString & extension = PString::Empty(),
00395 const PString & context = PString::Empty(),
00396 const PString & transport = PString::Empty()
00397 );
00398
00400 PBoolean InitialisedOK() { return (transmitter != NULL) && (receiver != NULL); }
00401
00404 PBoolean EthernetFramesToBeProcessed()
00405 { return packetsReadFromEthernet.GetSize() > 0; }
00407
00408 protected:
00415 IAX2IncomingEthernetFrames incomingFrameHandler;
00416
00419 IAX2FrameList packetsReadFromEthernet;
00420
00422 PUDPSocket *sock;
00423
00425 unsigned short localPort;
00426
00428 int callnumbs;
00429
00431 PMutex callNumbLock;
00432
00434 PTime callStartTime;
00435
00437 PString localUserName;
00438
00440 PString localNumber;
00441
00443 PString password;
00444
00446 PINDEX statusQueryCounter;
00447
00449 PMutex statusQueryMutex;
00450
00453 IAX2SpecialProcessor * specialPacketHandler;
00454
00462 PBoolean ProcessInMatchingConnection(IAX2Frame *f);
00463
00472 PBoolean ProcessFrameInConnection(IAX2Frame *f, const PString & token);
00473
00480 PBoolean ProcessInConnectionTestAll(IAX2Frame *f);
00481
00494 PStringToString tokenTable;
00495
00499 PReadWriteMutex mutexTokenTable;
00500
00503 PAtomicInteger callsEstablished;
00504
00506 OpalMediaFormatList localMediaFormats;
00507
00509 PMutex regProcessorsMutex;
00510
00515 PArrayObjects regProcessors;
00516
00517 };
00518
00519
00520 #endif // OPAL_IAX2
00521
00522 #endif // OPAL_IAX2_IAX2EP_H
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532