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_H323CON_H
00035 #define OPAL_H323_H323CON_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/rtpconn.h>
00046 #include <opal/guid.h>
00047 #include <opal/buildopts.h>
00048 #include <h323/h323caps.h>
00049 #include <ptclib/dtmf.h>
00050
00051
00052
00053
00054
00055
00056
00057 class PPER_Stream;
00058 class PASN_OctetString;
00059
00060 class H225_EndpointType;
00061 class H225_TransportAddress;
00062 class H225_ArrayOf_PASN_OctetString;
00063 class H225_ProtocolIdentifier;
00064 class H225_AdmissionRequest;
00065 class H225_AdmissionConfirm;
00066 class H225_AdmissionReject;
00067 class H225_InfoRequestResponse;
00068 class H225_DisengageRequest;
00069 class H225_FeatureSet;
00070
00071 class H245_TerminalCapabilitySet;
00072 class H245_TerminalCapabilitySetReject;
00073 class H245_OpenLogicalChannel;
00074 class H245_OpenLogicalChannelAck;
00075 class H245_TransportAddress;
00076 class H245_UserInputIndication;
00077 class H245_RequestMode;
00078 class H245_RequestModeAck;
00079 class H245_RequestModeReject;
00080 class H245_ModeDescription;
00081 class H245_ArrayOf_ModeDescription;
00082 class H245_SendTerminalCapabilitySet;
00083 class H245_MultiplexCapability;
00084 class H245_FlowControlCommand;
00085 class H245_MiscellaneousCommand;
00086 class H245_MiscellaneousIndication;
00087 class H245_JitterIndication;
00088
00089 class H323SignalPDU;
00090 class H323ControlPDU;
00091 class H323EndPoint;
00092 class H323TransportAddress;
00093
00094 class H235Authenticators;
00095
00096 class H245NegMasterSlaveDetermination;
00097 class H245NegTerminalCapabilitySet;
00098 class H245NegLogicalChannels;
00099 class H245NegRequestMode;
00100 class H245NegRoundTripDelay;
00101
00102 class H450xDispatcher;
00103 class H4502Handler;
00104 class H4504Handler;
00105 class H4506Handler;
00106 class H4507Handler;
00107 class H45011Handler;
00108
00109 class OpalCall;
00110
00111 #if OPAL_H460
00112 class H460_FeatureSet;
00113 #endif
00114
00115
00117
00124 class H323Connection : public OpalRTPConnection
00125 {
00126 PCLASSINFO(H323Connection, OpalRTPConnection);
00127
00128 public:
00133 H323Connection(
00134 OpalCall & call,
00135 H323EndPoint & endpoint,
00136 const PString & token,
00137 const PString & alias,
00138 const H323TransportAddress & address,
00139 unsigned options = 0,
00140 OpalConnection::StringOptions * stringOptions = NULL
00141 );
00142
00145 ~H323Connection();
00147
00158 virtual bool IsNetworkConnection() const { return true; }
00159
00162 virtual PString GetPrefixName() const;
00163
00170 virtual PBoolean SetUpConnection();
00171
00181 virtual PBoolean SetAlerting(
00182 const PString & calleeName,
00183 PBoolean withMedia
00184 );
00185
00190 virtual PBoolean SetConnected();
00191
00196 virtual PBoolean SetProgressed();
00197
00205 virtual void OnEstablished();
00206
00224 virtual void OnReleased();
00225
00230 virtual PString GetDestinationAddress();
00231
00245 virtual PString GetAlertingType() const;
00246
00260 virtual bool SetAlertingType(const PString & info);
00261
00269 virtual OpalMediaFormatList GetMediaFormats() const;
00270
00273 virtual OpalMediaStreamPtr OpenMediaStream(
00274 const OpalMediaFormat & mediaFormat,
00275 unsigned sessionID,
00276 bool isSource
00277 );
00278
00283 virtual bool CloseMediaStream(
00284 OpalMediaStream & stream
00285 );
00286
00291 virtual PBoolean GetMediaInformation(
00292 unsigned sessionID,
00293 MediaInformation & info
00294 ) const;
00296
00302 virtual void OnCleared();
00303
00309 PBoolean IsEstablished() const { return connectionState == EstablishedConnection; }
00310
00319 virtual void CleanUpOnCallEnd();
00320
00321 virtual void ApplyStringOptions(OpalConnection::StringOptions & stringOptions);
00323
00324
00329 void AttachSignalChannel(
00330 const PString & token,
00331 H323Transport * channel,
00332 PBoolean answeringCall
00333 );
00334
00337 PBoolean WriteSignalPDU(
00338 H323SignalPDU & pdu
00339 );
00340
00344 virtual void HandleSignallingChannel();
00345
00349 virtual PBoolean HandleSignalPDU(
00350 H323SignalPDU & pdu
00351 );
00352
00356 virtual void HandleTunnelPDU(
00357 H323SignalPDU * txPDU
00358 );
00359
00367 virtual PBoolean OnReceivedSignalSetup(
00368 const H323SignalPDU & pdu
00369 );
00370
00377 virtual PBoolean OnReceivedSignalSetupAck(
00378 const H323SignalPDU & pdu
00379 );
00380
00387 virtual PBoolean OnReceivedSignalInformation(
00388 const H323SignalPDU & pdu
00389 );
00390
00399 virtual PBoolean OnReceivedCallProceeding(
00400 const H323SignalPDU & pdu
00401 );
00402
00411 virtual PBoolean OnReceivedProgress(
00412 const H323SignalPDU & pdu
00413 );
00414
00421 virtual PBoolean OnReceivedAlerting(
00422 const H323SignalPDU & pdu
00423 );
00424
00433 virtual PBoolean OnReceivedSignalConnect(
00434 const H323SignalPDU & pdu
00435 );
00436
00445 virtual PBoolean OnReceivedFacility(
00446 const H323SignalPDU & pdu
00447 );
00448
00455 virtual PBoolean OnReceivedSignalNotify(
00456 const H323SignalPDU & pdu
00457 );
00458
00465 virtual PBoolean OnReceivedSignalStatus(
00466 const H323SignalPDU & pdu
00467 );
00468
00475 virtual PBoolean OnReceivedStatusEnquiry(
00476 const H323SignalPDU & pdu
00477 );
00478
00483 virtual void OnReceivedReleaseComplete(
00484 const H323SignalPDU & pdu
00485 );
00486
00493 virtual PBoolean OnUnknownSignalPDU(
00494 const H323SignalPDU & pdu
00495 );
00496
00503 virtual void OnSendARQ(
00504 H225_AdmissionRequest & arq
00505 );
00506
00512 virtual void OnReceivedACF(
00513 const H225_AdmissionConfirm & acf
00514 );
00515
00521 virtual void OnReceivedARJ(
00522 const H225_AdmissionReject & arj
00523 );
00524
00531 virtual void OnSendIRR(
00532 H225_InfoRequestResponse & irr
00533 ) const;
00534
00541 virtual void OnSendDRQ(
00542 H225_DisengageRequest & drq
00543 ) const;
00544
00556 virtual PBoolean OnIncomingCall(
00557 const H323SignalPDU & setupPDU,
00558 H323SignalPDU & alertingPDU
00559 );
00560
00570 virtual PBoolean ForwardCall(
00571 const PString & forwardParty
00572 );
00573
00580 virtual bool TransferConnection(
00581 const PString & remoteParty
00582 );
00583
00587 virtual bool HoldConnection();
00588
00593 virtual bool RetrieveConnection();
00594
00598 virtual PBoolean IsConnectionOnHold();
00599
00600 #if OPAL_H450
00601
00606 bool TransferCall(
00607 const PString & remoteParty,
00608 const PString & callIdentity = PString::Empty()
00610 );
00611
00616 void ConsultationTransfer(
00617 const PString & primaryCallToken
00618 );
00619
00626 virtual void HandleConsultationTransfer(
00627 const PString & callIdentity,
00629 H323Connection & incoming
00630 );
00631
00634 PBoolean IsTransferringCall() const;
00635
00638 PBoolean IsTransferredCall() const;
00639
00644 virtual void HandleTransferCall(
00645 const PString & token,
00646 const PString & identity
00647 );
00648
00653 int GetCallTransferInvokeId();
00654
00662 virtual void HandleCallTransferFailure(
00663 const int returnError
00664 );
00665
00670 void SetAssociatedCallToken(
00671 const PString & token
00672 );
00673
00678 virtual void OnConsultationTransferSuccess(
00679 H323Connection & secondaryCall
00680 );
00681
00686 bool HoldCall(
00687 PBoolean localHold
00688 );
00689
00695 bool RetrieveCall();
00696
00703 void SetHoldMedia(
00704 PChannel * audioChannel
00705 );
00706
00709 PBoolean IsMediaOnHold() const;
00710
00713 PBoolean IsLocalHold() const;
00714
00717 PBoolean IsRemoteHold() const;
00718
00721 PBoolean IsCallOnHold() const;
00722
00727 virtual void IntrudeCall(
00728 unsigned capabilityLevel
00729 );
00730
00735 virtual void HandleIntrudeCall(
00736 const PString & token,
00737 const PString & identity
00738 );
00739
00745 void SetCallIntrusion() { isCallIntrusion = PTrue; }
00746
00747 PBoolean IsCallIntrusion() { return isCallIntrusion; }
00748
00751 unsigned GetLocalCallIntrusionProtectionLevel() { return callIntrusionProtectionLevel; }
00752
00756 virtual PBoolean GetRemoteCallIntrusionProtectionLevel(
00757 const PString & callToken,
00758 unsigned callIntrusionProtectionLevel
00759 );
00760
00761 virtual void SetIntrusionImpending();
00762
00763 virtual void SetForcedReleaseAccepted();
00764
00765 virtual void SetIntrusionNotAuthorized();
00766
00773 void SendCallWaitingIndication(
00774 const unsigned nbOfAddWaitingCalls = 0
00775 );
00776
00777 #endif
00778
00805 virtual AnswerCallResponse OnAnswerCall(
00806 const PString & callerName,
00807 const H323SignalPDU & setupPDU,
00808 H323SignalPDU & connectPDU,
00809 H323SignalPDU & progressPDU
00810 );
00811
00812 virtual AnswerCallResponse OnAnswerCall(
00813 const PString & callerName
00814 );
00815
00826 void AnsweringCall(
00827 AnswerCallResponse response
00828 );
00829
00840 virtual CallEndReason SendSignalSetup(
00841 const PString & alias,
00842 const H323TransportAddress & address
00843 );
00844
00856 virtual PBoolean OnSendSignalSetup(
00857 H323SignalPDU & setupPDU
00858 );
00859
00868 virtual PBoolean OnSendCallProceeding(
00869 H323SignalPDU & callProceedingPDU
00870 );
00871
00883 virtual PBoolean OnSendReleaseComplete(
00884 H323SignalPDU & releaseCompletePDU
00885 );
00886
00897 virtual PBoolean OnAlerting(
00898 const H323SignalPDU & alertingPDU,
00899 const PString & user
00900 );
00901
00916 virtual PBoolean OnInsufficientDigits();
00917
00930 virtual void SendMoreDigits(
00931 const PString & digits
00932 );
00933
00943 virtual PBoolean OnOutgoingCall(
00944 const H323SignalPDU & connectPDU
00945 );
00946
00958 virtual PBoolean SendFastStartAcknowledge(
00959 H225_ArrayOf_PASN_OctetString & array
00960 );
00961
00973 virtual PBoolean HandleFastStartAcknowledge(
00974 const H225_ArrayOf_PASN_OctetString & array
00975 );
00977
00991 virtual PBoolean CreateOutgoingControlChannel(
00992 const H225_TransportAddress & h245Address
00993 );
00994
01007 virtual PBoolean CreateIncomingControlChannel(
01008 H225_TransportAddress & h245Address
01009 );
01010
01015 virtual PBoolean WriteControlPDU(
01016 const H323ControlPDU & pdu
01017 );
01018
01021 virtual PBoolean StartControlNegotiations();
01022
01025 virtual void HandleControlChannel();
01026
01033 virtual PBoolean HandleControlData(
01034 PPER_Stream & strm
01035 );
01036
01043 virtual PBoolean HandleControlPDU(
01044 const H323ControlPDU & pdu
01045 );
01046
01056 virtual PBoolean OnUnknownControlPDU(
01057 const H323ControlPDU & pdu
01058 );
01059
01063 virtual PBoolean OnH245Request(
01064 const H323ControlPDU & pdu
01065 );
01066
01070 virtual PBoolean OnH245Response(
01071 const H323ControlPDU & pdu
01072 );
01073
01077 virtual PBoolean OnH245Command(
01078 const H323ControlPDU & pdu
01079 );
01080
01084 virtual PBoolean OnH245Indication(
01085 const H323ControlPDU & pdu
01086 );
01087
01090 virtual PBoolean OnH245_SendTerminalCapabilitySet(
01091 const H245_SendTerminalCapabilitySet & pdu
01092 );
01093
01098 virtual PBoolean OnH245_FlowControlCommand(
01099 const H245_FlowControlCommand & pdu
01100 );
01101
01106 virtual PBoolean OnH245_MiscellaneousCommand(
01107 const H245_MiscellaneousCommand & pdu
01108 );
01109
01114 virtual PBoolean OnH245_MiscellaneousIndication(
01115 const H245_MiscellaneousIndication & pdu
01116 );
01117
01122 virtual PBoolean OnH245_JitterIndication(
01123 const H245_JitterIndication & pdu
01124 );
01125
01128 enum ControlProtocolErrors {
01129 e_MasterSlaveDetermination,
01130 e_CapabilityExchange,
01131 e_LogicalChannel,
01132 e_ModeRequest,
01133 e_RoundTripDelay
01134 };
01135
01147 virtual PBoolean OnControlProtocolError(
01148 ControlProtocolErrors errorSource,
01149 const void * errorData = NULL
01150 );
01151
01159 virtual void OnSendCapabilitySet(
01160 H245_TerminalCapabilitySet & pdu
01161 );
01162
01174 virtual PBoolean OnReceivedCapabilitySet(
01175 const H323Capabilities & remoteCaps,
01176 const H245_MultiplexCapability * muxCap,
01177 H245_TerminalCapabilitySetReject & reject
01178 );
01179
01182 virtual bool SendCapabilitySet(
01183 PBoolean empty
01184 );
01185
01188 virtual bool IsSendingCapabilitySet();
01189
01198 virtual void OnSetLocalCapabilities();
01199
01202 PBoolean IsH245Master() const;
01203
01206 void StartRoundTripDelay();
01207
01210 PTimeInterval GetRoundTripDelay() const;
01212
01252 virtual void OnSelectLogicalChannels();
01253
01256 virtual void SelectDefaultLogicalChannel(
01257 const OpalMediaType & mediaType,
01258 unsigned sessionID
01259 );
01260
01264 virtual void SelectFastStartChannels(
01265 unsigned sessionID,
01266 PBoolean transmitter,
01267 PBoolean receiver
01268 );
01269
01273 virtual void StartFastStartChannel(
01274 unsigned sessionID,
01275 H323Channel::Directions direction
01276 );
01277
01292 virtual PBoolean OpenLogicalChannel(
01293 const H323Capability & capability,
01294 unsigned sessionID,
01295 H323Channel::Directions dir
01296 );
01297
01298 virtual void SendFlowControlCommand(
01299 unsigned channelNumber,
01300 unsigned newBitRate
01301 );
01302
01312 virtual PBoolean OnOpenLogicalChannel(
01313 const H245_OpenLogicalChannel & openPDU,
01314 H245_OpenLogicalChannelAck & ackPDU,
01315 unsigned & errorCode
01316 );
01317
01325 virtual PBoolean OnConflictingLogicalChannel(
01326 H323Channel & channel
01327 );
01328
01333 virtual H323Channel * CreateLogicalChannel(
01334 const H245_OpenLogicalChannel & open,
01335 PBoolean startingFast,
01336 unsigned & errorCode
01337 );
01338
01373 virtual H323Channel * CreateRealTimeLogicalChannel(
01374 const H323Capability & capability,
01375 H323Channel::Directions dir,
01376 unsigned sessionID,
01377 const H245_H2250LogicalChannelParameters * param,
01379 RTP_QOS * rtpqos = NULL
01380 );
01381
01385 virtual H323_RTPChannel * CreateRTPChannel(
01386 const H323Capability & capability,
01387 H323Channel::Directions direction,
01388 RTP_Session & rtp
01389 );
01390
01401 virtual PBoolean OnCreateLogicalChannel(
01402 const H323Capability & capability,
01403 H323Channel::Directions dir,
01404 unsigned & errorCode
01405 );
01406
01411 virtual PBoolean OnStartLogicalChannel(
01412 H323Channel & channel
01413 );
01414
01417 virtual void CloseLogicalChannel(
01418 unsigned number,
01419 PBoolean fromRemote
01420 );
01421
01424 virtual void CloseLogicalChannelNumber(
01425 const H323ChannelNumber & number
01426 );
01427
01430 virtual void CloseAllLogicalChannels(
01431 PBoolean fromRemote
01432 );
01433
01439 virtual void OnClosedLogicalChannel(
01440 const H323Channel & channel
01441 );
01442
01451 virtual PBoolean OnClosingLogicalChannel(
01452 H323Channel & channel
01453 );
01454
01463 virtual void OnLogicalChannelFlowControl(
01464 H323Channel * channel,
01465 long bitRateRestriction
01466 );
01467
01476 virtual void OnLogicalChannelJitter(
01477 H323Channel * channel,
01478 DWORD jitter,
01479 int skippedFrameCount,
01480 int additionalBuffer
01481 );
01482
01486 H323Channel * GetLogicalChannel(
01487 unsigned number,
01488 PBoolean fromRemote
01489 ) const;
01490
01496 H323Channel * FindChannel(
01497 unsigned sessionId,
01498 PBoolean fromRemote
01499 ) const;
01501
01508 virtual PBoolean SetBandwidthAvailable(
01509 unsigned newBandwidth,
01510 PBoolean force = PFalse
01511 );
01512
01517 virtual unsigned GetBandwidthUsed() const;
01519
01527 virtual SendUserInputModes GetRealSendUserInputMode() const;
01528
01542 virtual PBoolean SendUserInputString(
01543 const PString & value
01544 );
01545
01570 virtual PBoolean SendUserInputTone(
01571 char tone,
01572 unsigned duration = 0
01573 );
01574
01581 virtual PBoolean SendUserInputIndicationQ931(
01582 const PString & value
01583 );
01584
01591 virtual PBoolean SendUserInputIndicationString(
01592 const PString & value
01593 );
01594
01599 virtual PBoolean SendUserInputIndicationTone(
01600 char tone,
01601 unsigned duration = 0,
01602 unsigned logicalChannel = 0,
01603 unsigned rtpTimestamp = 0
01604 );
01605
01614 virtual PBoolean SendUserInputIndication(
01615 const H245_UserInputIndication & pdu
01616 );
01617
01622 virtual void OnUserInputIndication(
01623 const H245_UserInputIndication & pdu
01624 );
01626
01632 virtual H323_RTP_Session * GetSessionCallbacks(
01633 unsigned sessionID
01634 ) const;
01635
01645 virtual RTP_Session * UseSession(
01646 const OpalTransport & transport,
01647 unsigned sessionID,
01648 const OpalMediaType & mediatype,
01649 RTP_QOS * rtpqos = NULL
01650 );
01651
01655 virtual void ReleaseSession(
01656 unsigned sessionID
01657 );
01658
01666 virtual void OnRTPStatistics(
01667 const RTP_Session & session
01668 ) const;
01669
01673 virtual PString GetSessionCodecNames(
01674 unsigned sessionID
01675 ) const;
01676
01678
01696 virtual PBoolean RequestModeChange(
01697 const PString & newModes
01698 );
01699
01707 virtual PBoolean RequestModeChange(
01708 const H245_ArrayOf_ModeDescription & newModes
01709 );
01710
01713 virtual PBoolean OnRequestModeChange(
01714 const H245_RequestMode & pdu,
01715 H245_RequestModeAck & ack,
01716 H245_RequestModeReject & reject,
01717 PINDEX & selectedMode
01718 );
01719
01726 virtual void OnModeChanged(
01727 const H245_ModeDescription & newMode
01728 );
01729
01734 virtual void OnAcceptModeChange(
01735 const H245_RequestModeAck & pdu
01736 );
01737
01742 virtual void OnRefusedModeChange(
01743 const H245_RequestModeReject * pdu
01744 );
01746
01751 virtual PBoolean RequestModeChangeT38(
01752 const char * capabilityNames = "T.38\nT38FaxUDP"
01753 );
01754
01764 virtual PBoolean GetAdmissionRequestAuthentication(
01765 const H225_AdmissionRequest & arq,
01766 H235Authenticators & authenticators
01767 );
01769
01774 H323EndPoint & GetEndPoint() const { return endpoint; }
01775
01778 PBoolean HadAnsweredCall() const { return !originating; }
01779
01782 PBoolean IsGatekeeperRouted() const { return gatekeeperRouted; }
01783
01788 unsigned GetDistinctiveRing() const { return distinctiveRing; }
01789
01796 void SetDistinctiveRing(unsigned pattern) { distinctiveRing = pattern&7; }
01797
01801 const PString & GetCallToken() const { return GetToken(); }
01802
01805 unsigned GetCallReference() const { return callReference; }
01806
01809 inline const OpalGloballyUniqueID & GetCallIdentifier() const
01810 { return callIdentifier; }
01811
01814 virtual PString GetIdentifier() const;
01815
01818 const OpalGloballyUniqueID & GetConferenceIdentifier() const { return conferenceIdentifier; }
01819
01822 void SetLocalPartyName(const PString & name);
01823
01826 const PStringList & GetLocalAliasNames() const { return localAliasNames; }
01827
01830 virtual void SetRemotePartyInfo(
01831 const H323SignalPDU & pdu
01832 );
01833
01836 void SetRemoteApplication(
01837 const H225_EndpointType & pdu
01838 );
01839
01844 PString GetRemotePartyURL() const;
01845
01848 const H323Capabilities & GetLocalCapabilities() const { return localCapabilities; }
01849
01852 const H323Capabilities & GetRemoteCapabilities() const { return remoteCapabilities; }
01853
01856 unsigned GetRemoteMaxAudioDelayJitter() const { return remoteMaxAudioDelayJitter; }
01857
01860 const H323Transport * GetSignallingChannel() const { return signallingChannel; }
01861
01864 unsigned GetSignallingVersion() const { return h225version; }
01865
01868 const H323Transport & GetControlChannel() const;
01869
01872 OpalTransport & GetTransport() const;
01873
01876 unsigned GetControlVersion() const { return h245version; }
01877
01880 unsigned GetUUIEsRequested() const { return uuiesRequested; }
01881
01884 void SetUUIEsRequested(unsigned mask) { uuiesRequested = mask; }
01885
01888 const PString GetGkAccessTokenOID() const { return gkAccessTokenOID; }
01889
01892 void SetGkAccessTokenOID(const PString & oid) { gkAccessTokenOID = oid; }
01893
01896 const PBYTEArray & GetGkAccessTokenData() const { return gkAccessTokenData; }
01897
01900 void SetDestExtraCallInfo(
01901 const PString & info
01902 ) { destExtraCallInfo = info; }
01903
01906 void SetRemotCallWaiting(const unsigned value) { remoteCallWaiting = value; }
01907
01913 int GetRemoteCallWaiting() const { return remoteCallWaiting; }
01914
01919 void SetEnforcedDurationLimit(
01920 unsigned seconds
01921 );
01923
01924 virtual PBoolean OnSendFeatureSet(unsigned, H225_FeatureSet &) const;
01925
01926 virtual void OnReceiveFeatureSet(unsigned, const H225_FeatureSet &) const;
01927
01928 #if OPAL_H460
01929
01931 virtual H460_FeatureSet * GetFeatureSet();
01932 #endif
01933
01934
01935 #if OPAL_H450
01936
01940 H4507Handler& getH4507handler(){return *h4507handler;}
01941 #endif
01942
01943 virtual void OnMediaCommand(OpalMediaCommand & note, INT extra);
01944
01945
01946
01947 unsigned GetExternalSessionID(unsigned internalSessionID) const;
01948 unsigned GetExternalSessionID(unsigned internalSessionID, const OpalMediaType & mediaType);
01949 unsigned GetInternalSessionID(unsigned externalSessionID, const OpalMediaType & mediaType);
01950
01951 protected:
01957 virtual void InternalEstablishedConnectionCheck();
01958 PBoolean InternalEndSessionCheck(PPER_Stream & strm);
01959 void SetRemoteVersions(const H225_ProtocolIdentifier & id);
01960 void MonitorCallStatus();
01961 PDECLARE_NOTIFIER(PThread, H323Connection, StartOutgoing);
01962 PDECLARE_NOTIFIER(PThread, H323Connection, NewOutgoingControlChannel);
01963 PDECLARE_NOTIFIER(PThread, H323Connection, NewIncomingControlChannel);
01964
01965 H323EndPoint & endpoint;
01966
01967 int remoteCallWaiting;
01968 PBoolean gatekeeperRouted;
01969 unsigned distinctiveRing;
01970 unsigned callReference;
01971 OpalGloballyUniqueID callIdentifier;
01972 OpalGloballyUniqueID conferenceIdentifier;
01973
01974 PString localDestinationAddress;
01975 PStringList localAliasNames;
01976 H323Capabilities localCapabilities;
01977 PString destExtraCallInfo;
01978 H323Capabilities remoteCapabilities;
01979 unsigned remoteMaxAudioDelayJitter;
01980 PTimer roundTripDelayTimer;
01981 WORD maxAudioDelayJitter;
01982 unsigned uuiesRequested;
01983 PString gkAccessTokenOID;
01984 PBYTEArray gkAccessTokenData;
01985 PBoolean addAccessTokenToSetup;
01986 PBoolean alertDone;
01987
01988 H323Transport * signallingChannel;
01989 H323Transport * controlChannel;
01990 OpalListener * controlListener;
01991 PBoolean h245Tunneling;
01992 H323SignalPDU * h245TunnelRxPDU;
01993 H323SignalPDU * h245TunnelTxPDU;
01994 H323SignalPDU * setupPDU;
01995 H323SignalPDU * alertingPDU;
01996 H323SignalPDU * connectPDU;
01997 H323SignalPDU * progressPDU;
01998
01999 enum ConnectionStates {
02000 NoConnectionActive,
02001 AwaitingGatekeeperAdmission,
02002 AwaitingTransportConnect,
02003 AwaitingSignalConnect,
02004 AwaitingLocalAnswer,
02005 HasExecutedSignalConnect,
02006 EstablishedConnection,
02007 ShuttingDownConnection,
02008 NumConnectionStates
02009 } connectionState;
02010
02011 unsigned h225version;
02012 unsigned h245version;
02013 PBoolean h245versionSet;
02014 PBoolean doH245inSETUP;
02015 PBoolean lastPDUWasH245inSETUP;
02016
02017 PBoolean mustSendDRQ;
02018 PBoolean mediaWaitForConnect;
02019 PBoolean transmitterSidePaused;
02020 bool remoteTransmitPaused;
02021 PBoolean earlyStart;
02022 PString t38ModeChangeCapabilities;
02023 PSyncPoint digitsWaitFlag;
02024 PBoolean endSessionNeeded;
02025 PSyncPoint endSessionReceived;
02026 PTimer enforcedDurationLimit;
02027
02028
02029 PChannel * holdMediaChannel;
02030 PBoolean isConsultationTransfer;
02031
02033 PBoolean isCallIntrusion;
02034 unsigned callIntrusionProtectionLevel;
02035
02036 enum FastStartStates {
02037 FastStartDisabled,
02038 FastStartInitiate,
02039 FastStartResponse,
02040 FastStartAcknowledged,
02041 NumFastStartStates
02042 };
02043 FastStartStates fastStartState;
02044 H323LogicalChannelList fastStartChannels;
02045 OpalMediaStreamPtr fastStartMediaStream;
02046
02047
02048 PBoolean defaultAudioSessionIDAssigned, defaultVideoSessionIDAssigned;
02049 unsigned nextSessionID;
02050 typedef std::map<unsigned, unsigned> InternalToExternalSessionIDMap;
02051 typedef std::map<OpalMediaType, unsigned> MediaTypeToInternalSessionIDMap;
02052 InternalToExternalSessionIDMap internalToExternalSessionIDMap;
02053 MediaTypeToInternalSessionIDMap mediaTypeToInternalSessionIDMap;
02054 PMutex sessionIDHandlingMutex;
02055
02056 #if PTRACING
02057 static const char * GetConnectionStatesName(ConnectionStates s);
02058 friend ostream & operator<<(ostream & o, ConnectionStates s) { return o << GetConnectionStatesName(s); }
02059 static const char * GetFastStartStateName(FastStartStates s);
02060 friend ostream & operator<<(ostream & o, FastStartStates s) { return o << GetFastStartStateName(s); }
02061 #endif
02062
02063
02064
02065
02066 H245NegMasterSlaveDetermination * masterSlaveDeterminationProcedure;
02067 H245NegTerminalCapabilitySet * capabilityExchangeProcedure;
02068 H245NegLogicalChannels * logicalChannels;
02069 H245NegRequestMode * requestModeProcedure;
02070 H245NegRoundTripDelay * roundTripDelayProcedure;
02071
02072 #if OPAL_H450
02073 H450xDispatcher * h450dispatcher;
02074 H4502Handler * h4502handler;
02075 H4504Handler * h4504handler;
02076 H4506Handler * h4506handler;
02077 H4507Handler * h4507handler;
02078 H45011Handler * h45011handler;
02079 #endif
02080
02081 #if OPAL_H460
02082 H460_FeatureSet * features;
02083 #endif
02084
02085 private:
02086 PChannel * SwapHoldMediaChannels(PChannel * newChannel);
02087 };
02088
02089
02090 PDICTIONARY(H323CallIdentityDict, PString, H323Connection);
02091
02092
02093 #endif // OPAL_H323
02094
02095 #endif // OPAL_H323_H323CON_H
02096
02097