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 #ifndef __OPAL_H323EP_H
00035 #define __OPAL_H323EP_H
00036
00037 #ifdef P_USE_PRAGMA
00038 #pragma interface
00039 #endif
00040
00041
00042 #include <opal/endpoint.h>
00043 #include <opal/manager.h>
00044 #include <opal/call.h>
00045 #include <opal/transports.h>
00046 #include <h323/h323con.h>
00047 #include <h323/h323caps.h>
00048 #include <h323/h235auth.h>
00049
00050 #ifdef H323_H460
00051 #include <h323/h4601.h>
00052 #endif
00053
00054
00055 class H225_EndpointType;
00056 class H225_VendorIdentifier;
00057 class H225_H221NonStandard;
00058 class H225_ServiceControlDescriptor;
00059 class H225_FeatureSet;
00060
00061 class H235SecurityInfo;
00062
00063 class H323Gatekeeper;
00064 class H323SignalPDU;
00065 class H323ServiceControlSession;
00066
00068
00081 class H323EndPoint : public OpalEndPoint
00082 {
00083 PCLASSINFO(H323EndPoint, OpalEndPoint);
00084
00085 public:
00086 enum {
00087 DefaultTcpSignalPort = 1720
00088 };
00089
00094 H323EndPoint(
00095 OpalManager & manager
00096 );
00097
00100 ~H323EndPoint();
00102
00109 virtual void ShutDown();
00110
00140 virtual PBoolean MakeConnection(
00141 OpalCall & call,
00142 const PString & party,
00143 void * userData = NULL,
00144 unsigned int options = NULL,
00145 OpalConnection::StringOptions * stringOptions = NULL
00146 );
00147
00157 virtual OpalMediaFormatList GetMediaFormats() const;
00159
00164 virtual void SetEndpointTypeInfo(
00165 H225_EndpointType & info
00166 ) const;
00167
00170 virtual void SetVendorIdentifierInfo(
00171 H225_VendorIdentifier & info
00172 ) const;
00173
00176 virtual void SetH221NonStandardInfo(
00177 H225_H221NonStandard & info
00178 ) const;
00180
00181
00192 void AddCapability(
00193 H323Capability * capability
00194 );
00195
00216 PINDEX SetCapability(
00217 PINDEX descriptorNum,
00218 PINDEX simultaneous,
00219 H323Capability * cap
00220 );
00221
00226 PINDEX AddAllCapabilities(
00227 PINDEX descriptorNum,
00228 PINDEX simultaneous,
00229 const PString & name
00230 );
00231
00234 void AddAllUserInputCapabilities(
00235 PINDEX descriptorNum,
00236 PINDEX simultaneous
00237 );
00238
00241 void RemoveCapabilities(
00242 const PStringArray & codecNames
00243 );
00244
00247 void ReorderCapabilities(
00248 const PStringArray & preferenceOrder
00249 );
00250
00253 H323Capability * FindCapability(
00254 const H245_Capability & cap
00255 ) const;
00256
00259 H323Capability * FindCapability(
00260 const H245_DataType & dataType
00261 ) const;
00262
00265 H323Capability * FindCapability(
00266 H323Capability::MainTypes mainType,
00267 unsigned subType
00268 ) const;
00270
00290 PBoolean UseGatekeeper(
00291 const PString & address = PString::Empty(),
00292 const PString & identifier = PString::Empty(),
00293 const PString & localAddress = PString::Empty()
00294 );
00295
00306 PBoolean SetGatekeeper(
00307 const PString & address,
00308 H323Transport * transport = NULL
00309 );
00310
00325 PBoolean SetGatekeeperZone(
00326 const PString & address,
00327 const PString & identifier,
00328 H323Transport * transport = NULL
00329 );
00330
00340 PBoolean LocateGatekeeper(
00341 const PString & identifier,
00342 H323Transport * transport = NULL
00343 );
00344
00353 PBoolean DiscoverGatekeeper(
00354 H323Transport * transport = NULL
00355 );
00356
00364 virtual H323Gatekeeper * CreateGatekeeper(
00365 H323Transport * transport
00366 );
00367
00370 H323Gatekeeper * GetGatekeeper() const { return gatekeeper; }
00371
00374 PBoolean IsRegisteredWithGatekeeper() const;
00375
00381 PBoolean RemoveGatekeeper(
00382 int reason = -1
00383 );
00384
00387 virtual void SetGatekeeperPassword(
00388 const PString & password,
00389 const PString & username = PString::Empty()
00390 );
00391
00394 virtual const PString & GetGatekeeperUsername() const { return gatekeeperUsername; }
00395
00398 virtual const PString & GetGatekeeperPassword() const { return gatekeeperPassword; }
00399
00402 virtual H235Authenticators CreateAuthenticators();
00403
00406 virtual void OnGatekeeperConfirm();
00407
00410 virtual void OnGatekeeperReject();
00411
00414 virtual void OnRegistrationConfirm();
00415
00418 virtual void OnRegistrationReject();
00420
00425 virtual PBoolean NewIncomingConnection(
00426 OpalTransport * transport
00427 );
00428
00431 virtual H323Connection * CreateConnection(
00432 OpalCall & call,
00433 const PString & token,
00434 void * userData,
00435 OpalTransport & transport,
00436 const PString & alias,
00437 const H323TransportAddress & address,
00438 H323SignalPDU * setupPDU,
00439 unsigned options = 0,
00440 OpalConnection::StringOptions * stringOptions = NULL
00441 );
00442
00458 virtual PBoolean SetupTransfer(
00459 const PString & token,
00460 const PString & callIdentity,
00461 const PString & remoteParty,
00462 void * userData = NULL
00463 );
00464
00470 void TransferCall(
00471 const PString & token,
00472 const PString & remoteParty,
00473 const PString & callIdentity = PString::Empty()
00475 );
00476
00483 void ConsultationTransfer(
00484 const PString & primaryCallToken,
00485 const PString & secondaryCallToken
00486 );
00487
00491 void HoldCall(
00492 const PString & token,
00493 PBoolean localHold
00494 );
00495
00499 PBoolean IntrudeCall(
00500 const PString & remoteParty,
00501 unsigned capabilityLevel,
00502 void * userData = NULL
00503 );
00504
00511 PBoolean ParsePartyName(
00512 const PString & party,
00513 PString & alias,
00514 H323TransportAddress & address
00515 );
00516
00527 PSafePtr<H323Connection> FindConnectionWithLock(
00528 const PString & token,
00529 PSafetyMode mode = PSafeReadWrite
00530 );
00531
00539 virtual PBoolean OnSendSignalSetup(H323Connection & connection,
00540 H323SignalPDU & setupPDU);
00541
00553 virtual PBoolean OnSendCallProceeding(H323Connection & connection,
00554 H323SignalPDU & callProceedingPDU
00555 );
00556
00568 virtual PBoolean OnSendConnect(H323Connection & connection,
00569 H323SignalPDU & connectPDU
00570 );
00571
00583 virtual PBoolean OnIncomingCall(
00584 H323Connection & connection,
00585 const H323SignalPDU & setupPDU,
00586 H323SignalPDU & alertingPDU
00587 );
00588
00595 virtual PBoolean OnOutgoingCall(
00596 H323Connection & conn,
00597 const H323SignalPDU & connectPDU
00598 );
00599
00604 virtual PBoolean OnCallTransferInitiate(
00605 H323Connection & connection,
00606 const PString & remoteParty
00607 );
00608
00613 virtual PBoolean OnCallTransferIdentify(
00614 H323Connection & connection
00615 );
00616
00621 virtual void OnSendARQ(
00622 H323Connection & conn,
00623 H225_AdmissionRequest & arq
00624 );
00625
00632 virtual OpalConnection::AnswerCallResponse OnAnswerCall(
00633 H323Connection & connection,
00634 const PString & callerName,
00635 const H323SignalPDU & setupPDU,
00636 H323SignalPDU & connectPDU,
00637 H323SignalPDU & progressPDU
00638 );
00639 virtual OpalConnection::AnswerCallResponse OnAnswerCall(
00640 OpalConnection & connection,
00641 const PString & caller
00642 );
00643
00654 virtual PBoolean OnAlerting(
00655 H323Connection & connection,
00656 const H323SignalPDU & alertingPDU,
00657 const PString & user
00658 );
00659
00665 virtual PBoolean OnSendAlerting(H323Connection & connection,
00666 H323SignalPDU & alerting,
00667 const PString & calleeName,
00668 PBoolean withMedia
00669 );
00670
00675 virtual PBoolean OnSentAlerting(H323Connection & connection);
00676
00685 virtual PBoolean OnConnectionForwarded(
00686 H323Connection & connection,
00687 const PString & forwardParty,
00688 const H323SignalPDU & pdu
00689 );
00690
00699 virtual PBoolean ForwardConnection(
00700 H323Connection & connection,
00701 const PString & forwardParty,
00702 const H323SignalPDU & pdu
00703 );
00704
00711 virtual void OnConnectionEstablished(
00712 H323Connection & connection,
00713 const PString & token
00714 );
00715
00718 virtual PBoolean IsConnectionEstablished(
00719 const PString & token
00720 );
00721
00728 virtual void OnConnectionCleared(
00729 H323Connection & connection,
00730 const PString & token
00731 );
00733
00734
00741 virtual PBoolean OnStartLogicalChannel(
00742 H323Connection & connection,
00743 H323Channel & channel
00744 );
00745
00750 virtual void OnClosedLogicalChannel(
00751 H323Connection & connection,
00752 const H323Channel & channel
00753 );
00754
00762 virtual void OnRTPStatistics(
00763 const H323Connection & connection,
00764 const RTP_Session & session
00765 ) const;
00766
00772 virtual void OnGatekeeperNATDetect(
00773 PIPSocket::Address publicAddr,
00774 PString & gkIdentifier,
00775 H323TransportAddress & gkRouteAddress
00776 );
00778
00788 virtual void OnHTTPServiceControl(
00789 unsigned operation,
00790 unsigned sessionId,
00791 const PString & url
00792 );
00793
00803 virtual void OnCallCreditServiceControl(
00804 const PString & amount,
00805 PBoolean mode
00806 );
00807
00811 virtual void OnServiceControlSession(
00812 unsigned type,
00813 unsigned sessionid,
00814 const H323ServiceControlSession & session,
00815 H323Connection * connection
00816 );
00817
00820 virtual H323ServiceControlSession * CreateServiceControlSession(
00821 const H225_ServiceControlDescriptor & contents
00822 );
00824
00832 virtual PBoolean OnConferenceInvite(
00833 const H323SignalPDU & setupPDU
00834 );
00835
00841 virtual PBoolean OnCallIndependentSupplementaryService(
00842 const H323SignalPDU & setupPDU
00843 );
00844
00850 virtual PBoolean OnNegotiateConferenceCapabilities(
00851 const H323SignalPDU & setupPDU
00852 );
00854
00865 virtual void SetLocalUserName(
00866 const PString & name
00867 );
00868
00873 virtual const PString & GetLocalUserName() const { return localAliasNames.front(); }
00874
00881 PBoolean AddAliasName(
00882 const PString & name
00883 );
00884
00888 PBoolean RemoveAliasName(
00889 const PString & name
00890 );
00891
00896 const PStringList & GetAliasNames() const { return localAliasNames; }
00897
00900 const PStringList & GetAliasNamePatterns() const { return localAliasPatterns; }
00901
00905 PBoolean AddAliasNamePattern(
00906 const PString & pattern
00907 );
00908
00911 const PString & GetDefaultILSServer() const { return manager.GetDefaultILSServer(); }
00912
00915 void SetDefaultILSServer(
00916 const PString & server
00917 ) { manager.SetDefaultILSServer(server); }
00918
00921 PBoolean IsFastStartDisabled() const
00922 { return disableFastStart; }
00923
00926 void DisableFastStart(
00927 PBoolean mode
00928 ) { disableFastStart = mode; }
00929
00932 PBoolean IsH245TunnelingDisabled() const
00933 { return disableH245Tunneling; }
00934
00937 void DisableH245Tunneling(
00938 PBoolean mode
00939 ) { disableH245Tunneling = mode; }
00940
00943 PBoolean IsH245inSetupDisabled() const
00944 { return disableH245inSetup; }
00945
00948 void DisableH245inSetup(
00949 PBoolean mode
00950 ) { disableH245inSetup = mode; }
00951
00955 PBoolean IsH245Disabled() const
00956 { return m_bH245Disabled; }
00957
00961 void DisableH245(PBoolean bH245Disabled) { m_bH245Disabled = bH245Disabled; }
00962
00965 PBoolean CanDisplayAmountString() const
00966 { return canDisplayAmountString; }
00967
00970 void SetCanDisplayAmountString(
00971 PBoolean mode
00972 ) { canDisplayAmountString = mode; }
00973
00976 PBoolean CanEnforceDurationLimit() const
00977 { return canEnforceDurationLimit; }
00978
00981 void SetCanEnforceDurationLimit(
00982 PBoolean mode
00983 ) { canEnforceDurationLimit = mode; }
00984
00985 #if OPAL_H450
00986
00988 unsigned GetCallIntrusionProtectionLevel() const { return callIntrusionProtectionLevel; }
00989
00992 void SetCallIntrusionProtectionLevel(
00993 unsigned level
00994 ) { PAssert(level<=3, PInvalidParameter); callIntrusionProtectionLevel = level; }
00995 #endif
00996
00999 virtual void OnReceivedInitiateReturnError();
01000
01001 #if OPAL_VIDEO
01002
01004 PBoolean CanAutoStartReceiveVideo() const { return manager.CanAutoStartReceiveVideo(); }
01005
01008 PBoolean CanAutoStartTransmitVideo() const { return manager.CanAutoStartTransmitVideo(); }
01009 #endif
01010
01011 #if OPAL_T38FAX
01012
01014 PBoolean CanAutoStartReceiveFax() const { return autoStartReceiveFax; }
01015
01018 PBoolean CanAutoStartTransmitFax() const { return autoStartTransmitFax; }
01019 #endif
01020
01023 PBoolean IsH224Enabled() const { return isH224Enabled; }
01024
01027 void SetIsH224Enabled(PBoolean flag) { isH224Enabled = flag; }
01028
01031 PBoolean CanAutoCallForward() const { return autoCallForward; }
01032
01035 const H323Capabilities & GetCapabilities() const;
01036
01039 enum TerminalTypes {
01040 e_TerminalOnly = 50,
01041 e_TerminalAndMC = 70,
01042 e_GatewayOnly = 60,
01043 e_GatewayAndMC = 80,
01044 e_GatewayAndMCWithDataMP = 90,
01045 e_GatewayAndMCWithAudioMP = 100,
01046 e_GatewayAndMCWithAVMP = 110,
01047 e_GatekeeperOnly = 120,
01048 e_GatekeeperWithDataMP = 130,
01049 e_GatekeeperWithAudioMP = 140,
01050 e_GatekeeperWithAVMP = 150,
01051 e_MCUOnly = 160,
01052 e_MCUWithDataMP = 170,
01053 e_MCUWithAudioMP = 180,
01054 e_MCUWithAVMP = 190
01055 };
01056
01059 TerminalTypes GetTerminalType() const { return terminalType; }
01060
01063 PBoolean IsTerminal() const;
01064
01067 PBoolean IsGateway() const;
01068
01071 PBoolean IsGatekeeper() const;
01072
01075 PBoolean IsMCU() const;
01076
01080 unsigned GetMinAudioJitterDelay() const { return manager.GetMinAudioJitterDelay(); }
01081
01085 unsigned GetMaxAudioJitterDelay() const { return manager.GetMaxAudioJitterDelay(); }
01086
01089 void SetAudioJitterDelay(
01090 unsigned minDelay,
01091 unsigned maxDelay
01092 ) { manager.SetAudioJitterDelay(minDelay, maxDelay); }
01093
01096 unsigned GetInitialBandwidth() const { return initialBandwidth; }
01097
01100 void SetInitialBandwidth(unsigned bandwidth) { initialBandwidth = bandwidth; }
01101
01104 virtual PBoolean OnSendFeatureSet(unsigned, H225_FeatureSet &);
01105
01108 virtual void OnReceiveFeatureSet(unsigned, const H225_FeatureSet &);
01109
01110 #ifdef H323_H460
01111
01113 H460_FeatureSet & GetFeatureSet() { return features; };
01114 #endif
01115
01118 virtual PBoolean IsLocalAddress(
01119 const PIPSocket::Address & remoteAddress
01120 ) const { return manager.IsLocalAddress(remoteAddress); }
01121
01124 virtual void TranslateTCPAddress(
01125 PIPSocket::Address & localAddr,
01126 const PIPSocket::Address & remoteAddr
01127 );
01128
01131 WORD GetTCPPortBase() const { return manager.GetTCPPortBase(); }
01132
01135 WORD GetTCPPortMax() const { return manager.GetTCPPortMax(); }
01136
01139 void SetTCPPorts(unsigned tcpBase, unsigned tcpMax) { manager.SetTCPPorts(tcpBase, tcpMax); }
01140
01143 WORD GetNextTCPPort() { return manager.GetNextTCPPort(); }
01144
01147 WORD GetUDPPortBase() const { return manager.GetUDPPortBase(); }
01148
01151 WORD GetUDPPortMax() const { return manager.GetUDPPortMax(); }
01152
01155 void SetUDPPorts(unsigned udpBase, unsigned udpMax) { manager.SetUDPPorts(udpBase, udpMax); }
01156
01159 WORD GetNextUDPPort() { return manager.GetNextUDPPort(); }
01160
01163 WORD GetRtpIpPortBase() const { return manager.GetRtpIpPortBase(); }
01164
01167 WORD GetRtpIpPortMax() const { return manager.GetRtpIpPortMax(); }
01168
01171 void SetRtpIpPorts(unsigned udpBase, unsigned udpMax) { manager.SetRtpIpPorts(udpBase, udpMax); }
01172
01175 WORD GetRtpIpPortPair() { return manager.GetRtpIpPortPair(); }
01176
01179 BYTE GetRtpIpTypeofService() const { return manager.GetRtpIpTypeofService(); }
01180
01183 void SetRtpIpTypeofService(unsigned tos) { manager.SetRtpIpTypeofService(tos); }
01184
01187 const PTimeInterval & GetSignallingChannelCallTimeout() const { return signallingChannelCallTimeout; }
01188
01191 const PTimeInterval & GetControlChannelStartTimeout() const { return controlChannelStartTimeout; }
01192
01195 const PTimeInterval & GetEndSessionTimeout() const { return endSessionTimeout; }
01196
01199 const PTimeInterval & GetMasterSlaveDeterminationTimeout() const { return masterSlaveDeterminationTimeout; }
01200
01203 unsigned GetMasterSlaveDeterminationRetries() const { return masterSlaveDeterminationRetries; }
01204
01207 const PTimeInterval & GetCapabilityExchangeTimeout() const { return capabilityExchangeTimeout; }
01208
01211 const PTimeInterval & GetLogicalChannelTimeout() const { return logicalChannelTimeout; }
01212
01215 const PTimeInterval & GetRequestModeTimeout() const { return logicalChannelTimeout; }
01216
01219 const PTimeInterval & GetRoundTripDelayTimeout() const { return roundTripDelayTimeout; }
01220
01223 const PTimeInterval & GetRoundTripDelayRate() const { return roundTripDelayRate; }
01224
01227 PBoolean ShouldClearCallOnRoundTripFail() const { return clearCallOnRoundTripFail; }
01228
01231 const PTimeInterval & GetNoMediaTimeout() const { return manager.GetNoMediaTimeout(); }
01232
01235 PBoolean SetNoMediaTimeout(
01236 const PTimeInterval & newInterval
01237 ) { return manager.SetNoMediaTimeout(newInterval); }
01238
01241 const PTimeInterval & GetGatekeeperRequestTimeout() const { return gatekeeperRequestTimeout; }
01242
01245 unsigned GetGatekeeperRequestRetries() const { return gatekeeperRequestRetries; }
01246
01249 const PTimeInterval & GetRasRequestTimeout() const { return rasRequestTimeout; }
01250
01253 unsigned GetRasRequestRetries() const { return rasRequestRetries; }
01254
01258 const PTimeInterval & GetGatekeeperTimeToLive() const { return registrationTimeToLive; }
01259
01263 void SetGatekeeperTimeToLive(const PTimeInterval & ttl) { registrationTimeToLive = ttl; }
01264
01267 const PString & GetGkAccessTokenOID() const { return gkAccessTokenOID; }
01268
01271 void SetGkAccessTokenOID(const PString & token) { gkAccessTokenOID = token; }
01272
01275 PBoolean GetSendGRQ() const
01276 { return sendGRQ; }
01277
01280 void SetSendGRQ(PBoolean v)
01281 { sendGRQ = v; }
01282
01285 const PTimeInterval & GetCallTransferT1() const { return callTransferT1; }
01286
01289 const PTimeInterval & GetCallTransferT2() const { return callTransferT2; }
01290
01293 const PTimeInterval & GetCallTransferT3() const { return callTransferT3; }
01294
01297 const PTimeInterval & GetCallTransferT4() const { return callTransferT4; }
01298
01300 const PTimeInterval & GetCallIntrusionT1() const { return callIntrusionT1; }
01301 const PTimeInterval & GetCallIntrusionT2() const { return callIntrusionT2; }
01302 const PTimeInterval & GetCallIntrusionT3() const { return callIntrusionT3; }
01303 const PTimeInterval & GetCallIntrusionT4() const { return callIntrusionT4; }
01304 const PTimeInterval & GetCallIntrusionT5() const { return callIntrusionT5; }
01305 const PTimeInterval & GetCallIntrusionT6() const { return callIntrusionT6; }
01306
01309 H323CallIdentityDict& GetCallIdentityDictionary() { return secondaryConnectionsActive; }
01310
01313 #if OPAL_H450
01314 unsigned GetNextH450CallIdentityValue() const { return ++nextH450CallIdentity; }
01315 #endif
01316
01317 PString GetDefaultTransport() const;
01319
01320 protected:
01321 H323Gatekeeper * InternalCreateGatekeeper(H323Transport * transport);
01322 PBoolean InternalRegisterGatekeeper(H323Gatekeeper * gk, PBoolean discovered);
01323 PBoolean InternalMakeCall(
01324 OpalCall & call,
01325 const PString & existingToken,
01326 const PString & callIdentity,
01327 unsigned capabilityLevel,
01328 const PString & remoteParty,
01329 void * userData,
01330 unsigned int options = 0,
01331 OpalConnection::StringOptions * stringOptions = NULL
01332 );
01333
01334
01335 PStringList localAliasNames;
01336 PStringList localAliasPatterns;
01337 PBoolean autoStartReceiveFax;
01338 PBoolean autoStartTransmitFax;
01339 PBoolean isH224Enabled;
01340 PBoolean autoCallForward;
01341 PBoolean disableFastStart;
01342 PBoolean disableH245Tunneling;
01343 PBoolean disableH245inSetup;
01344 PBoolean m_bH245Disabled;
01345 PBoolean canDisplayAmountString;
01346 PBoolean canEnforceDurationLimit;
01347 #if OPAL_H450
01348 unsigned callIntrusionProtectionLevel;
01349 #endif
01350
01351 TerminalTypes terminalType;
01352
01353 PBoolean clearCallOnRoundTripFail;
01354
01355
01356 PTimeInterval signallingChannelCallTimeout;
01357 PTimeInterval controlChannelStartTimeout;
01358 PTimeInterval endSessionTimeout;
01359 PTimeInterval masterSlaveDeterminationTimeout;
01360 unsigned masterSlaveDeterminationRetries;
01361 PTimeInterval capabilityExchangeTimeout;
01362 PTimeInterval logicalChannelTimeout;
01363 PTimeInterval requestModeTimeout;
01364 PTimeInterval roundTripDelayTimeout;
01365 PTimeInterval roundTripDelayRate;
01366 PTimeInterval gatekeeperRequestTimeout;
01367 unsigned gatekeeperRequestRetries;
01368 PTimeInterval rasRequestTimeout;
01369 unsigned rasRequestRetries;
01370 PTimeInterval registrationTimeToLive;
01371
01372 PString gkAccessTokenOID;
01373 PBoolean sendGRQ;
01374
01375
01376
01377 PTimeInterval callTransferT1;
01378
01379
01380 PTimeInterval callTransferT2;
01381
01382
01383 PTimeInterval callTransferT3;
01384
01385
01386 PTimeInterval callTransferT4;
01387
01389 PTimeInterval callIntrusionT1;
01390 PTimeInterval callIntrusionT2;
01391 PTimeInterval callIntrusionT3;
01392 PTimeInterval callIntrusionT4;
01393 PTimeInterval callIntrusionT5;
01394 PTimeInterval callIntrusionT6;
01395
01396
01397 mutable H323Capabilities capabilities;
01398 H323Gatekeeper * gatekeeper;
01399 PString gatekeeperUsername;
01400 PString gatekeeperPassword;
01401 H323CallIdentityDict secondaryConnectionsActive;
01402
01403 #if OPAL_H450
01404 mutable PAtomicInteger nextH450CallIdentity;
01406 #endif
01407
01408 #if OPAL_H460
01409 H460_FeatureSet features;
01410 #endif
01411
01412 };
01413
01414 #endif // __OPAL_H323EP_H
01415
01416