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
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 #ifndef __OPAL_ENDPOINT_H
00133 #define __OPAL_ENDPOINT_H
00134
00135 #ifdef P_USE_PRAGMA
00136 #pragma interface
00137 #endif
00138
00139 #include <opal/buildopts.h>
00140
00141 #include <opal/manager.h>
00142 #include <opal/mediafmt.h>
00143 #include <opal/transports.h>
00144
00145
00146 class OpalCall;
00147 class OpalMediaStream;
00148
00149
00169 class OpalEndPoint : public PObject
00170 {
00171 PCLASSINFO(OpalEndPoint, PObject);
00172 public:
00173 enum Attributes {
00174 CanTerminateCall = 1,
00175 HasLineInterface = 2
00176 };
00177
00182 OpalEndPoint(
00183 OpalManager & manager,
00184 const PCaselessString & prefix,
00185 unsigned attributes
00186 );
00187
00190 ~OpalEndPoint();
00192
00199 void PrintOn(
00200 ostream & strm
00201 ) const;
00203
00213 BOOL StartListeners(
00214 const PStringArray & interfaces
00215 );
00216
00224 BOOL StartListener(
00225 const OpalTransportAddress & iface
00226 );
00227
00233 BOOL StartListener(
00234 OpalListener * listener
00235 );
00236
00241 virtual PStringArray GetDefaultListeners() const;
00242
00246 BOOL RemoveListener(
00247 OpalListener * listener
00248 );
00249
00252 OpalTransportAddressArray GetInterfaceAddresses(
00253 BOOL excludeLocalHost = TRUE,
00254 OpalTransport * associatedTransport = NULL
00256 );
00257
00262 PDECLARE_NOTIFIER(PThread, OpalEndPoint, ListenerCallback);
00263
00272 virtual BOOL NewIncomingConnection(
00273 OpalTransport * transport
00274 );
00276
00308 virtual BOOL MakeConnection(
00309 OpalCall & call,
00310 const PString & party,
00311 void * userData
00312 ) = 0;
00313
00335 virtual BOOL OnIncomingConnection(
00336 OpalConnection & connection
00337 );
00338
00354 virtual void OnAlerting(
00355 OpalConnection & connection
00356 );
00357
00374 virtual OpalConnection::AnswerCallResponse OnAnswerCall(
00375 OpalConnection & connection,
00376 const PString & caller
00377 );
00378
00389 virtual void OnConnected(
00390 OpalConnection & connection
00391 );
00392
00404 virtual void OnEstablished(
00405 OpalConnection & connection
00406 );
00407
00426 virtual void OnReleased(
00427 OpalConnection & connection
00428 );
00429
00436 void OnHold(
00437 OpalConnection & connection
00438 );
00439
00444 virtual BOOL OnForwarded(
00445 OpalConnection & connection,
00446 const PString & remoteParty
00447 );
00448
00456 virtual BOOL ClearCall(
00457 const PString & token,
00458 OpalConnection::CallEndReason reason = OpalConnection::EndedByLocalUser,
00459 PSyncPoint * sync = NULL
00460 );
00461
00466 virtual BOOL ClearCallSynchronous(
00467 const PString & token,
00468 OpalConnection::CallEndReason reason = OpalConnection::EndedByLocalUser,
00469 PSyncPoint * sync = NULL
00470 );
00471
00478 virtual void ClearAllCalls(
00479 OpalConnection::CallEndReason reason = OpalConnection::EndedByLocalUser,
00480 BOOL wait = TRUE
00481 );
00482
00487 PSafePtr<OpalConnection> GetConnectionWithLock(
00488 const PString & token,
00489 PSafetyMode mode = PSafeReadWrite
00490 ) { return connectionsActive.FindWithLock(token, mode); }
00491
00494 PStringList GetAllConnections();
00495
00498 virtual BOOL HasConnection(
00499 const PString & token
00500 );
00501
00504 virtual void DestroyConnection(
00505 OpalConnection * connection
00506 );
00508
00520 virtual OpalMediaFormatList GetMediaFormats() const = 0;
00521
00530 virtual void AdjustMediaFormats(
00531 const OpalConnection & connection,
00532 OpalMediaFormatList & mediaFormats
00533 ) const;
00534
00546 virtual BOOL OnOpenMediaStream(
00547 OpalConnection & connection,
00548 OpalMediaStream & stream
00549 );
00550
00555 virtual void OnClosedMediaStream(
00556 const OpalMediaStream & stream
00557 );
00558
00563 virtual void AddVideoMediaFormats(
00564 OpalMediaFormatList & mediaFormats,
00565 const OpalConnection * connection = NULL
00566 ) const;
00567
00570 virtual BOOL CreateVideoInputDevice(
00571 const OpalConnection & connection,
00572 const OpalMediaFormat & mediaFormat,
00573 PVideoInputDevice * & device,
00574 BOOL & autoDelete
00575 );
00576
00580 virtual BOOL CreateVideoOutputDevice(
00581 const OpalConnection & connection,
00582 const OpalMediaFormat & mediaFormat,
00583 BOOL preview,
00584 PVideoOutputDevice * & device,
00585 BOOL & autoDelete
00586 );
00588
00595 virtual void OnUserInputString(
00596 OpalConnection & connection,
00597 const PString & value
00598 );
00599
00606 virtual void OnUserInputTone(
00607 OpalConnection & connection,
00608 char tone,
00609 int duration
00610 );
00612
00625 virtual OpalT120Protocol * CreateT120ProtocolHandler(
00626 const OpalConnection & connection
00627 ) const;
00628
00639 virtual OpalT38Protocol * CreateT38ProtocolHandler(
00640 const OpalConnection & connection
00641 ) const;
00642
00644
00649 OpalManager & GetManager() const { return manager; }
00650
00653 const PString & GetPrefixName() const { return prefixName; }
00654
00657 BOOL HasAttribute(Attributes opt) const { return (attributeBits&opt) != 0; }
00658
00661 WORD GetDefaultSignalPort() const { return defaultSignalPort; }
00662
00665 const PString & GetDefaultLocalPartyName() const { return defaultLocalPartyName; }
00666
00669 void SetDefaultLocalPartyName(const PString & name) { defaultLocalPartyName = name; }
00670
00673 const PString & GetDefaultDisplayName() const { return defaultDisplayName; }
00674
00677 void SetDefaultDisplayName(const PString & name) { defaultDisplayName = name; }
00678
00681 unsigned GetInitialBandwidth() const { return initialBandwidth; }
00682
00685 void SetInitialBandwidth(unsigned bandwidth) { initialBandwidth = bandwidth; }
00686
00689 const OpalListenerList & GetListeners() const { return listeners; }
00691
00692
00693 protected:
00694 OpalManager & manager;
00695 PCaselessString prefixName;
00696 unsigned attributeBits;
00697 WORD defaultSignalPort;
00698 PString defaultLocalPartyName;
00699 PString defaultDisplayName;
00700
00701 unsigned initialBandwidth;
00702
00703 OpalListenerList listeners;
00704 PSyncPoint allConnectionsCleared;
00705
00706 class ConnectionDict : public PSafeDictionary<PString, OpalConnection>
00707 {
00708 virtual void DeleteObject(PObject * object) const;
00709 } connectionsActive;
00710
00711 PMutex inUseFlag;
00712
00713 friend void OpalManager::GarbageCollection();
00714 friend void OpalConnection::Release(CallEndReason reason);
00715 };
00716
00717
00718 #endif // __OPAL_ENDPOINT_H
00719
00720
00721