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_H323_H323EP_H
00035 #define OPAL_H323_H323EP_H
00036
00037 #ifdef P_USE_PRAGMA
00038 #pragma interface
00039 #endif
00040
00041 #include <opal/buildopts.h>
00042
00043 #if OPAL_H323
00044
00045 #include <opal/rtpep.h>
00046 #include <opal/manager.h>
00047 #include <opal/call.h>
00048 #include <opal/transports.h>
00049 #include <h323/h323con.h>
00050 #include <h323/h323caps.h>
00051 #include <h323/h235auth.h>
00052
00053 #if OPAL_H460
00054 #include <h460/h4601.h>
00055 #endif
00056
00057
00058 class H225_EndpointType;
00059 class H225_VendorIdentifier;
00060 class H225_H221NonStandard;
00061 class H225_ServiceControlDescriptor;
00062 class H225_FeatureSet;
00063
00064 class H235SecurityInfo;
00065
00066 class H323Gatekeeper;
00067 class H323SignalPDU;
00068 class H323ServiceControlSession;
00069
00071
00084 class H323EndPoint : public OpalRTPEndPoint
00085 {
00086 PCLASSINFO(H323EndPoint, OpalRTPEndPoint);
00087
00088 public:
00089 enum {
00090 DefaultTcpSignalPort = 1720
00091 };
00092
00097 H323EndPoint(
00098 OpalManager & manager
00099 );
00100
00103 ~H323EndPoint();
00105
00112 virtual void ShutDown();
00113
00143 virtual PBoolean MakeConnection(
00144 OpalCall & call,
00145 const PString & party,
00146 void * userData = NULL,
00147 unsigned int options = NULL,
00148 OpalConnection::StringOptions * stringOptions = NULL
00149 );
00151
00156 virtual void SetEndpointTypeInfo(
00157 H225_EndpointType & info
00158 ) const;
00159
00162 virtual void SetVendorIdentifierInfo(
00163 H225_VendorIdentifier & info
00164 ) const;
00165
00168 virtual void SetH221NonStandardInfo(
00169 H225_H221NonStandard & info
00170 ) const;
00172
00173
00184 void AddCapability(
00185 H323Capability * capability
00186 );
00187
00208 PINDEX SetCapability(
00209 PINDEX descriptorNum,
00210 PINDEX simultaneous,
00211 H323Capability * cap
00212 );
00213
00218 PINDEX AddAllCapabilities(
00219 PINDEX descriptorNum,
00220 PINDEX simultaneous,
00221 const PString & name
00222 );
00223
00226 void AddAllUserInputCapabilities(
00227 PINDEX descriptorNum,
00228 PINDEX simultaneous
00229 );
00230
00233 void RemoveCapabilities(
00234 const PStringArray & codecNames
00235 );
00236
00239 void ReorderCapabilities(
00240 const PStringArray & preferenceOrder
00241 );
00242
00245 H323Capability * FindCapability(
00246 const H245_Capability & cap
00247 ) const;
00248
00251 H323Capability * FindCapability(
00252 const H245_DataType & dataType
00253 ) const;
00254
00257 H323Capability * FindCapability(
00258 H323Capability::MainTypes mainType,
00259 unsigned subType
00260 ) const;
00262
00285 PBoolean UseGatekeeper(
00286 const PString & address = PString::Empty(),
00287 const PString & identifier = PString::Empty(),
00288 const PString & localAddress = PString::Empty()
00289 );
00290
00301 PBoolean SetGatekeeper(
00302 const PString & address,
00303 H323Transport * transport = NULL
00304 );
00305
00320 PBoolean SetGatekeeperZone(
00321 const PString & address,
00322 const PString & identifier,
00323 H323Transport * transport = NULL
00324 );
00325
00335 PBoolean LocateGatekeeper(
00336 const PString & identifier,
00337 H323Transport * transport = NULL
00338 );
00339
00348 PBoolean DiscoverGatekeeper(
00349 H323Transport * transport = NULL
00350 );
00351
00359 virtual H323Gatekeeper * CreateGatekeeper(
00360 H323Transport * transport
00361 );
00362
00365 H323Gatekeeper * GetGatekeeper() const { return gatekeeper; }
00366
00369 PBoolean IsRegisteredWithGatekeeper() const;
00370
00376 PBoolean RemoveGatekeeper(
00377 int reason = -1
00378 );
00379
00382 virtual void SetGatekeeperPassword(
00383 const PString & password,
00384 const PString & username = PString::Empty()
00385 );
00386
00389 virtual const PString & GetGatekeeperUsername() const { return gatekeeperUsername; }
00390
00393 virtual const PString & GetGatekeeperPassword() const { return gatekeeperPassword; }
00394
00397 virtual H235Authenticators CreateAuthenticators();
00398
00401 virtual void OnGatekeeperConfirm();
00402
00405 virtual void OnGatekeeperReject();
00406
00409 virtual void OnRegistrationConfirm();
00410
00413 virtual void OnRegistrationReject();
00415
00420 virtual PBoolean NewIncomingConnection(
00421 OpalTransport * transport
00422 );
00423
00426 virtual H323Connection * CreateConnection(
00427 OpalCall & call,
00428 const PString & token,
00429 void * userData,
00430 OpalTransport & transport,
00431 const PString & alias,
00432 const H323TransportAddress & address,
00433 H323SignalPDU * setupPDU,
00434 unsigned options = 0,
00435 OpalConnection::StringOptions * stringOptions = NULL
00436 );
00437
00453 virtual PBoolean SetupTransfer(
00454 const PString & token,
00455 const PString & callIdentity,
00456 const PString & remoteParty,
00457 void * userData = NULL
00458 );
00459
00465 void TransferCall(
00466 const PString & token,
00467 const PString & remoteParty,
00468 const PString & callIdentity = PString::Empty()
00470 );
00471
00478 void ConsultationTransfer(
00479 const PString & primaryCallToken,
00480 const PString & secondaryCallToken
00481 );
00482
00486 void HoldCall(
00487 const PString & token,
00488 PBoolean localHold
00489 );
00490
00494 PBoolean IntrudeCall(
00495 const PString & remoteParty,
00496 unsigned capabilityLevel,
00497 void * userData = NULL
00498 );
00499
00506 PBoolean ParsePartyName(
00507 const PString & party,
00508 PString & alias,
00509 H323TransportAddress & address
00510 );
00511
00522 PSafePtr<H323Connection> FindConnectionWithLock(
00523 const PString & token,
00524 PSafetyMode mode = PSafeReadWrite
00525 );
00526
00534 virtual PBoolean OnSendSignalSetup(H323Connection & connection,
00535 H323SignalPDU & setupPDU);
00536
00548 virtual PBoolean OnSendCallProceeding(H323Connection & connection,
00549 H323SignalPDU & callProceedingPDU
00550 );
00551
00563 virtual PBoolean OnSendConnect(H323Connection & connection,
00564 H323SignalPDU & connectPDU
00565 );
00566
00578 virtual PBoolean OnIncomingCall(
00579 H323Connection & connection,
00580 const H323SignalPDU & setupPDU,
00581 H323SignalPDU & alertingPDU
00582 );
00583
00590 virtual PBoolean OnOutgoingCall(
00591 H323Connection & conn,
00592 const H323SignalPDU & connectPDU
00593 );
00594
00599 virtual PBoolean OnCallTransferInitiate(
00600 H323Connection & connection,
00601 const PString & remoteParty
00602 );
00603
00608 virtual PBoolean OnCallTransferIdentify(
00609 H323Connection & connection
00610 );
00611
00616 virtual void OnSendARQ(
00617 H323Connection & conn,
00618 H225_AdmissionRequest & arq
00619 );
00620
00627 virtual OpalConnection::AnswerCallResponse OnAnswerCall(
00628 H323Connection & connection,
00629 const PString & callerName,
00630 const H323SignalPDU & setupPDU,
00631 H323SignalPDU & connectPDU,
00632 H323SignalPDU & progressPDU
00633 );
00634 virtual OpalConnection::AnswerCallResponse OnAnswerCall(
00635 OpalConnection & connection,
00636 const PString & caller
00637 );
00638
00649 virtual PBoolean OnAlerting(
00650 H323Connection & connection,
00651 const H323SignalPDU & alertingPDU,
00652 const PString & user
00653 );
00654
00660 virtual PBoolean OnSendAlerting(H323Connection & connection,
00661 H323SignalPDU & alerting,
00662 const PString & calleeName,
00663 PBoolean withMedia
00664 );
00665
00670 virtual PBoolean OnSentAlerting(H323Connection & connection);
00671
00680 virtual PBoolean OnConnectionForwarded(
00681 H323Connection & connection,
00682 const PString & forwardParty,
00683 const H323SignalPDU & pdu
00684 );
00685
00694 virtual PBoolean ForwardConnection(
00695 H323Connection & connection,
00696 const PString & forwardParty,
00697 const H323SignalPDU & pdu
00698 );
00699
00706 virtual void OnConnectionEstablished(
00707 H323Connection & connection,
00708 const PString & token
00709 );
00710
00713 virtual PBoolean IsConnectionEstablished(
00714 const PString & token
00715 );
00716
00723 virtual void OnConnectionCleared(
00724 H323Connection & connection,
00725 const PString & token
00726 );
00728
00729
00736 virtual PBoolean OnStartLogicalChannel(
00737 H323Connection & connection,
00738 H323Channel & channel
00739 );
00740
00745 virtual void OnClosedLogicalChannel(
00746 H323Connection & connection,
00747 const H323Channel & channel
00748 );
00749
00757 virtual void OnRTPStatistics(
00758 const H323Connection & connection,
00759 const RTP_Session & session
00760 ) const;
00761
00767 virtual void OnGatekeeperNATDetect(
00768 PIPSocket::Address publicAddr,
00769 PString & gkIdentifier,
00770 H323TransportAddress & gkRouteAddress
00771 );
00773
00783 virtual void OnHTTPServiceControl(
00784 unsigned operation,
00785 unsigned sessionId,
00786 const PString & url
00787 );
00788
00798 virtual void OnCallCreditServiceControl(
00799 const PString & amount,
00800 PBoolean mode
00801 );
00802
00806 virtual void OnServiceControlSession(
00807 unsigned type,
00808 unsigned sessionid,
00809 const H323ServiceControlSession & session,
00810 H323Connection * connection
00811 );
00812
00815 virtual H323ServiceControlSession * CreateServiceControlSession(
00816 const H225_ServiceControlDescriptor & contents
00817 );
00819
00827 virtual PBoolean OnConferenceInvite(
00828 const H323SignalPDU & setupPDU
00829 );
00830
00836 virtual PBoolean OnCallIndependentSupplementaryService(
00837 const H323SignalPDU & setupPDU
00838 );
00839
00845 virtual PBoolean OnNegotiateConferenceCapabilities(
00846 const H323SignalPDU & setupPDU
00847 );
00849
00854 virtual void SetDefaultLocalPartyName(
00855 const PString & name
00856 );
00857
00866 virtual void SetLocalUserName(
00867 const PString & name
00868 );
00869
00874 virtual const PString & GetLocalUserName() const { return localAliasNames.front(); }
00875
00882 PBoolean AddAliasName(
00883 const PString & name
00884 );
00885
00889 PBoolean RemoveAliasName(
00890 const PString & name
00891 );
00892
00897 const PStringList & GetAliasNames() const { return localAliasNames; }
00898
00901 const PStringList & GetAliasNamePatterns() const { return localAliasPatterns; }
00902
00906 PBoolean AddAliasNamePattern(
00907 const PString & pattern
00908 );
00909
00912 const PString & GetDefaultILSServer() const { return manager.GetDefaultILSServer(); }
00913
00916 void SetDefaultILSServer(
00917 const PString & server
00918 ) { manager.SetDefaultILSServer(server); }
00919
00922 PBoolean IsFastStartDisabled() const
00923 { return disableFastStart; }
00924
00927 void DisableFastStart(
00928 PBoolean mode
00929 ) { disableFastStart = mode; }
00930
00933 PBoolean IsH245TunnelingDisabled() const
00934 { return disableH245Tunneling; }
00935
00938 void DisableH245Tunneling(
00939 PBoolean mode
00940 ) { disableH245Tunneling = mode; }
00941
00944 PBoolean IsH245inSetupDisabled() const
00945 { return disableH245inSetup; }
00946
00949 void DisableH245inSetup(
00950 PBoolean mode
00951 ) { disableH245inSetup = mode; }
00952
00956 PBoolean IsH245Disabled() const
00957 { return m_bH245Disabled; }
00958
00962 void DisableH245(PBoolean bH245Disabled) { m_bH245Disabled = bH245Disabled; }
00963
00966 PBoolean CanDisplayAmountString() const
00967 { return canDisplayAmountString; }
00968
00971 void SetCanDisplayAmountString(
00972 PBoolean mode
00973 ) { canDisplayAmountString = mode; }
00974
00977 PBoolean CanEnforceDurationLimit() const
00978 { return canEnforceDurationLimit; }
00979
00982 void SetCanEnforceDurationLimit(
00983 PBoolean mode
00984 ) { canEnforceDurationLimit = mode; }
00985
00986 #if OPAL_H450
00987
00989 unsigned GetCallIntrusionProtectionLevel() const { return callIntrusionProtectionLevel; }
00990
00993 void SetCallIntrusionProtectionLevel(
00994 unsigned level
00995 ) { PAssert(level<=3, PInvalidParameter); callIntrusionProtectionLevel = level; }
00996 #endif
00997
01000 virtual void OnReceivedInitiateReturnError();
01001
01004 PBoolean CanAutoCallForward() const { return autoCallForward; }
01005
01008 const H323Capabilities & GetCapabilities() const;
01009
01012 enum TerminalTypes {
01013 e_TerminalOnly = 50,
01014 e_TerminalAndMC = 70,
01015 e_GatewayOnly = 60,
01016 e_GatewayAndMC = 80,
01017 e_GatewayAndMCWithDataMP = 90,
01018 e_GatewayAndMCWithAudioMP = 100,
01019 e_GatewayAndMCWithAVMP = 110,
01020 e_GatekeeperOnly = 120,
01021 e_GatekeeperWithDataMP = 130,
01022 e_GatekeeperWithAudioMP = 140,
01023 e_GatekeeperWithAVMP = 150,
01024 e_MCUOnly = 160,
01025 e_MCUWithDataMP = 170,
01026 e_MCUWithAudioMP = 180,
01027 e_MCUWithAVMP = 190
01028 };
01029
01032 TerminalTypes GetTerminalType() const { return terminalType; }
01033
01036 PBoolean IsTerminal() const;
01037
01040 PBoolean IsGateway() const;
01041
01044 PBoolean IsGatekeeper() const;
01045
01048 PBoolean IsMCU() const;
01049
01053 unsigned GetMinAudioJitterDelay() const { return manager.GetMinAudioJitterDelay(); }
01054
01058 unsigned GetMaxAudioJitterDelay() const { return manager.GetMaxAudioJitterDelay(); }
01059
01062 void SetAudioJitterDelay(
01063 unsigned minDelay,
01064 unsigned maxDelay
01065 ) { manager.SetAudioJitterDelay(minDelay, maxDelay); }
01066
01069 unsigned GetInitialBandwidth() const { return initialBandwidth; }
01070
01073 void SetInitialBandwidth(unsigned bandwidth) { initialBandwidth = bandwidth; }
01074
01077 virtual PBoolean OnSendFeatureSet(unsigned, H225_FeatureSet &);
01078
01081 virtual void OnReceiveFeatureSet(unsigned, const H225_FeatureSet &);
01082
01086 virtual void LoadBaseFeatureSet();
01087
01092 virtual bool OnFeatureInstance(
01093 int instType,
01094 const PString & identifer
01095 );
01096
01097 #if OPAL_H460
01098
01100 bool FeatureSetDisabled() const { return disableH460; }
01101
01104 void FeatureSetDisable() { disableH460 = true; }
01105
01109 H460_FeatureSet * GetFeatureSet() { return features.DeriveNewFeatureSet(); };
01110 #endif
01111
01114 virtual PBoolean IsLocalAddress(
01115 const PIPSocket::Address & remoteAddress
01116 ) const { return manager.IsLocalAddress(remoteAddress); }
01117
01120 virtual void TranslateTCPAddress(
01121 PIPSocket::Address & localAddr,
01122 const PIPSocket::Address & remoteAddr
01123 );
01124
01127 WORD GetTCPPortBase() const { return manager.GetTCPPortBase(); }
01128
01131 WORD GetTCPPortMax() const { return manager.GetTCPPortMax(); }
01132
01135 void SetTCPPorts(unsigned tcpBase, unsigned tcpMax) { manager.SetTCPPorts(tcpBase, tcpMax); }
01136
01139 WORD GetNextTCPPort() { return manager.GetNextTCPPort(); }
01140
01143 WORD GetUDPPortBase() const { return manager.GetUDPPortBase(); }
01144
01147 WORD GetUDPPortMax() const { return manager.GetUDPPortMax(); }
01148
01151 void SetUDPPorts(unsigned udpBase, unsigned udpMax) { manager.SetUDPPorts(udpBase, udpMax); }
01152
01155 WORD GetNextUDPPort() { return manager.GetNextUDPPort(); }
01156
01159 WORD GetRtpIpPortBase() const { return manager.GetRtpIpPortBase(); }
01160
01163 WORD GetRtpIpPortMax() const { return manager.GetRtpIpPortMax(); }
01164
01167 void SetRtpIpPorts(unsigned udpBase, unsigned udpMax) { manager.SetRtpIpPorts(udpBase, udpMax); }
01168
01171 WORD GetRtpIpPortPair() { return manager.GetRtpIpPortPair(); }
01172
01175 BYTE GetRtpIpTypeofService() const { return manager.GetRtpIpTypeofService(); }
01176
01179 void SetRtpIpTypeofService(unsigned tos) { manager.SetRtpIpTypeofService(tos); }
01180
01183 const PTimeInterval & GetSignallingChannelCallTimeout() const { return signallingChannelCallTimeout; }
01184
01187 const PTimeInterval & GetControlChannelStartTimeout() const { return controlChannelStartTimeout; }
01188
01191 const PTimeInterval & GetEndSessionTimeout() const { return endSessionTimeout; }
01192
01195 const PTimeInterval & GetMasterSlaveDeterminationTimeout() const { return masterSlaveDeterminationTimeout; }
01196
01199 unsigned GetMasterSlaveDeterminationRetries() const { return masterSlaveDeterminationRetries; }
01200
01203 const PTimeInterval & GetCapabilityExchangeTimeout() const { return capabilityExchangeTimeout; }
01204
01207 const PTimeInterval & GetLogicalChannelTimeout() const { return logicalChannelTimeout; }
01208
01211 const PTimeInterval & GetRequestModeTimeout() const { return logicalChannelTimeout; }
01212
01215 const PTimeInterval & GetRoundTripDelayTimeout() const { return roundTripDelayTimeout; }
01216
01219 const PTimeInterval & GetRoundTripDelayRate() const { return roundTripDelayRate; }
01220
01223 PBoolean ShouldClearCallOnRoundTripFail() const { return clearCallOnRoundTripFail; }
01224
01227 const PTimeInterval & GetNoMediaTimeout() const { return manager.GetNoMediaTimeout(); }
01228
01231 PBoolean SetNoMediaTimeout(
01232 const PTimeInterval & newInterval
01233 ) { return manager.SetNoMediaTimeout(newInterval); }
01234
01237 const PTimeInterval & GetGatekeeperRequestTimeout() const { return gatekeeperRequestTimeout; }
01238
01241 unsigned GetGatekeeperRequestRetries() const { return gatekeeperRequestRetries; }
01242
01245 const PTimeInterval & GetRasRequestTimeout() const { return rasRequestTimeout; }
01246
01249 unsigned GetRasRequestRetries() const { return rasRequestRetries; }
01250
01254 const PTimeInterval & GetGatekeeperTimeToLive() const { return registrationTimeToLive; }
01255
01259 void SetGatekeeperTimeToLive(const PTimeInterval & ttl) { registrationTimeToLive = ttl; }
01260
01263 const PString & GetGkAccessTokenOID() const { return gkAccessTokenOID; }
01264
01267 void SetGkAccessTokenOID(const PString & token) { gkAccessTokenOID = token; }
01268
01271 PBoolean GetSendGRQ() const
01272 { return sendGRQ; }
01273
01276 void SetSendGRQ(PBoolean v)
01277 { sendGRQ = v; }
01278
01281 const PTimeInterval & GetCallTransferT1() const { return callTransferT1; }
01282
01285 const PTimeInterval & GetCallTransferT2() const { return callTransferT2; }
01286
01289 const PTimeInterval & GetCallTransferT3() const { return callTransferT3; }
01290
01293 const PTimeInterval & GetCallTransferT4() const { return callTransferT4; }
01294
01296 const PTimeInterval & GetCallIntrusionT1() const { return callIntrusionT1; }
01297 const PTimeInterval & GetCallIntrusionT2() const { return callIntrusionT2; }
01298 const PTimeInterval & GetCallIntrusionT3() const { return callIntrusionT3; }
01299 const PTimeInterval & GetCallIntrusionT4() const { return callIntrusionT4; }
01300 const PTimeInterval & GetCallIntrusionT5() const { return callIntrusionT5; }
01301 const PTimeInterval & GetCallIntrusionT6() const { return callIntrusionT6; }
01302
01305 H323CallIdentityDict& GetCallIdentityDictionary() { return secondaryConnectionsActive; }
01306
01309 #if OPAL_H450
01310 unsigned GetNextH450CallIdentityValue() const { return ++nextH450CallIdentity; }
01311 #endif
01312
01313 PString GetDefaultTransport() const;
01315
01316 protected:
01317 bool InternalCreateGatekeeper(H323Transport * transport);
01318 PBoolean InternalMakeCall(
01319 OpalCall & call,
01320 const PString & existingToken,
01321 const PString & callIdentity,
01322 unsigned capabilityLevel,
01323 const PString & remoteParty,
01324 void * userData,
01325 unsigned int options = 0,
01326 OpalConnection::StringOptions * stringOptions = NULL
01327 );
01328
01329
01330 PStringList localAliasNames;
01331 PStringList localAliasPatterns;
01332 PBoolean autoCallForward;
01333 PBoolean disableFastStart;
01334 PBoolean disableH245Tunneling;
01335 PBoolean disableH245inSetup;
01336 PBoolean m_bH245Disabled;
01337 PBoolean canDisplayAmountString;
01338 PBoolean canEnforceDurationLimit;
01339 #if OPAL_H450
01340 unsigned callIntrusionProtectionLevel;
01341 #endif
01342
01343 TerminalTypes terminalType;
01344
01345 PBoolean clearCallOnRoundTripFail;
01346
01347
01348 PTimeInterval signallingChannelCallTimeout;
01349 PTimeInterval controlChannelStartTimeout;
01350 PTimeInterval endSessionTimeout;
01351 PTimeInterval masterSlaveDeterminationTimeout;
01352 unsigned masterSlaveDeterminationRetries;
01353 PTimeInterval capabilityExchangeTimeout;
01354 PTimeInterval logicalChannelTimeout;
01355 PTimeInterval requestModeTimeout;
01356 PTimeInterval roundTripDelayTimeout;
01357 PTimeInterval roundTripDelayRate;
01358 PTimeInterval gatekeeperRequestTimeout;
01359 unsigned gatekeeperRequestRetries;
01360 PTimeInterval rasRequestTimeout;
01361 unsigned rasRequestRetries;
01362 PTimeInterval registrationTimeToLive;
01363
01364 PString gkAccessTokenOID;
01365 PBoolean sendGRQ;
01366
01367
01368
01369 PTimeInterval callTransferT1;
01370
01371
01372 PTimeInterval callTransferT2;
01373
01374
01375 PTimeInterval callTransferT3;
01376
01377
01378 PTimeInterval callTransferT4;
01379
01381 PTimeInterval callIntrusionT1;
01382 PTimeInterval callIntrusionT2;
01383 PTimeInterval callIntrusionT3;
01384 PTimeInterval callIntrusionT4;
01385 PTimeInterval callIntrusionT5;
01386 PTimeInterval callIntrusionT6;
01387
01388
01389 mutable H323Capabilities capabilities;
01390 H323Gatekeeper * gatekeeper;
01391 PString gatekeeperUsername;
01392 PString gatekeeperPassword;
01393 H323CallIdentityDict secondaryConnectionsActive;
01394
01395 #if OPAL_H450
01396 mutable PAtomicInteger nextH450CallIdentity;
01398 #endif
01399
01400 #if OPAL_H460
01401 bool disableH460;
01402 H460_FeatureSet features;
01403 #endif
01404
01405 };
01406
01407 #endif // OPAL_H323
01408
01409 #endif // OPAL_H323_H323EP_H
01410
01411