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
01754 virtual PBoolean P_DEPRECATED RequestModeChangeT38(
01755 const char * capabilityNames = "T.38\nT38FaxUDP"
01756 );
01757
01767 virtual PBoolean GetAdmissionRequestAuthentication(
01768 const H225_AdmissionRequest & arq,
01769 H235Authenticators & authenticators
01770 );
01772
01777 H323EndPoint & GetEndPoint() const { return endpoint; }
01778
01781 PBoolean HadAnsweredCall() const { return !originating; }
01782
01785 PBoolean IsGatekeeperRouted() const { return gatekeeperRouted; }
01786
01791 unsigned GetDistinctiveRing() const { return distinctiveRing; }
01792
01799 void SetDistinctiveRing(unsigned pattern) { distinctiveRing = pattern&7; }
01800
01804 const PString & GetCallToken() const { return GetToken(); }
01805
01808 unsigned GetCallReference() const { return callReference; }
01809
01812 inline const OpalGloballyUniqueID & GetCallIdentifier() const
01813 { return callIdentifier; }
01814
01817 virtual PString GetIdentifier() const;
01818
01821 const OpalGloballyUniqueID & GetConferenceIdentifier() const { return conferenceIdentifier; }
01822
01825 void SetLocalPartyName(const PString & name);
01826
01829 const PStringList & GetLocalAliasNames() const { return localAliasNames; }
01830
01833 virtual void SetRemotePartyInfo(
01834 const H323SignalPDU & pdu
01835 );
01836
01839 void SetRemoteApplication(
01840 const H225_EndpointType & pdu
01841 );
01842
01847 PString GetRemotePartyURL() const;
01848
01851 const H323Capabilities & GetLocalCapabilities() const { return localCapabilities; }
01852
01855 const H323Capabilities & GetRemoteCapabilities() const { return remoteCapabilities; }
01856
01859 unsigned GetRemoteMaxAudioDelayJitter() const { return remoteMaxAudioDelayJitter; }
01860
01863 const H323Transport * GetSignallingChannel() const { return signallingChannel; }
01864
01867 unsigned GetSignallingVersion() const { return h225version; }
01868
01871 const H323Transport & GetControlChannel() const;
01872
01875 OpalTransport & GetTransport() const;
01876
01879 unsigned GetControlVersion() const { return h245version; }
01880
01883 unsigned GetUUIEsRequested() const { return uuiesRequested; }
01884
01887 void SetUUIEsRequested(unsigned mask) { uuiesRequested = mask; }
01888
01891 const PString GetGkAccessTokenOID() const { return gkAccessTokenOID; }
01892
01895 void SetGkAccessTokenOID(const PString & oid) { gkAccessTokenOID = oid; }
01896
01899 const PBYTEArray & GetGkAccessTokenData() const { return gkAccessTokenData; }
01900
01903 void SetDestExtraCallInfo(
01904 const PString & info
01905 ) { destExtraCallInfo = info; }
01906
01909 void SetRemotCallWaiting(const unsigned value) { remoteCallWaiting = value; }
01910
01916 int GetRemoteCallWaiting() const { return remoteCallWaiting; }
01917
01922 void SetEnforcedDurationLimit(
01923 unsigned seconds
01924 );
01926
01927 virtual PBoolean OnSendFeatureSet(unsigned, H225_FeatureSet &) const;
01928
01929 virtual void OnReceiveFeatureSet(unsigned, const H225_FeatureSet &) const;
01930
01931 #if OPAL_H460
01932
01934 virtual H460_FeatureSet * GetFeatureSet();
01935 #endif
01936
01937
01938 #if OPAL_H450
01939
01943 H4507Handler& getH4507handler(){return *h4507handler;}
01944 #endif
01945
01946 virtual void OnMediaCommand(OpalMediaCommand & note, INT extra);
01947
01948
01949
01950 unsigned GetExternalSessionID(unsigned internalSessionID) const;
01951 unsigned GetExternalSessionID(unsigned internalSessionID, const OpalMediaType & mediaType);
01952 unsigned GetInternalSessionID(unsigned externalSessionID, const OpalMediaType & mediaType);
01953
01954 protected:
01960 virtual void InternalEstablishedConnectionCheck();
01961 PBoolean InternalEndSessionCheck(PPER_Stream & strm);
01962 void SetRemoteVersions(const H225_ProtocolIdentifier & id);
01963 void MonitorCallStatus();
01964 PDECLARE_NOTIFIER(PThread, H323Connection, StartOutgoing);
01965 PDECLARE_NOTIFIER(PThread, H323Connection, NewOutgoingControlChannel);
01966 PDECLARE_NOTIFIER(PThread, H323Connection, NewIncomingControlChannel);
01967
01968 H323EndPoint & endpoint;
01969
01970 int remoteCallWaiting;
01971 PBoolean gatekeeperRouted;
01972 unsigned distinctiveRing;
01973 unsigned callReference;
01974 OpalGloballyUniqueID callIdentifier;
01975 OpalGloballyUniqueID conferenceIdentifier;
01976
01977 PString localDestinationAddress;
01978 PStringList localAliasNames;
01979 H323Capabilities localCapabilities;
01980 PString destExtraCallInfo;
01981 H323Capabilities remoteCapabilities;
01982 unsigned remoteMaxAudioDelayJitter;
01983 PTimer roundTripDelayTimer;
01984 WORD maxAudioDelayJitter;
01985 unsigned uuiesRequested;
01986 PString gkAccessTokenOID;
01987 PBYTEArray gkAccessTokenData;
01988 PBoolean addAccessTokenToSetup;
01989
01990 H323Transport * signallingChannel;
01991 H323Transport * controlChannel;
01992 OpalListener * controlListener;
01993 PBoolean h245Tunneling;
01994 H323SignalPDU * h245TunnelRxPDU;
01995 H323SignalPDU * h245TunnelTxPDU;
01996 H323SignalPDU * setupPDU;
01997 H323SignalPDU * alertingPDU;
01998 H323SignalPDU * connectPDU;
01999 H323SignalPDU * progressPDU;
02000
02001 enum ConnectionStates {
02002 NoConnectionActive,
02003 AwaitingGatekeeperAdmission,
02004 AwaitingTransportConnect,
02005 AwaitingSignalConnect,
02006 AwaitingLocalAnswer,
02007 HasExecutedSignalConnect,
02008 EstablishedConnection,
02009 ShuttingDownConnection,
02010 NumConnectionStates
02011 } connectionState;
02012
02013 unsigned h225version;
02014 unsigned h245version;
02015 PBoolean h245versionSet;
02016 PBoolean doH245inSETUP;
02017 PBoolean lastPDUWasH245inSETUP;
02018
02019 PBoolean mustSendDRQ;
02020 PBoolean mediaWaitForConnect;
02021 PBoolean transmitterSidePaused;
02022 bool remoteTransmitPaused;
02023 PBoolean earlyStart;
02024 PString t38ModeChangeCapabilities;
02025 PSyncPoint digitsWaitFlag;
02026 PBoolean endSessionNeeded;
02027 PSyncPoint endSessionReceived;
02028 PTimer enforcedDurationLimit;
02029
02030
02031 PChannel * holdMediaChannel;
02032 PBoolean isConsultationTransfer;
02033
02035 PBoolean isCallIntrusion;
02036 unsigned callIntrusionProtectionLevel;
02037
02038 enum FastStartStates {
02039 FastStartDisabled,
02040 FastStartInitiate,
02041 FastStartResponse,
02042 FastStartAcknowledged,
02043 NumFastStartStates
02044 };
02045 FastStartStates fastStartState;
02046 H323LogicalChannelList fastStartChannels;
02047 OpalMediaStreamPtr fastStartMediaStream;
02048
02049
02050 unsigned nextSessionID;
02051 typedef std::map<unsigned, unsigned> InternalToExternalSessionIDMap;
02052 typedef std::map<OpalMediaType, unsigned> MediaTypeToInternalSessionIDMap;
02053 InternalToExternalSessionIDMap internalToExternalSessionIDMap;
02054 MediaTypeToInternalSessionIDMap mediaTypeToInternalSessionIDMap;
02055 PMutex sessionIDHandlingMutex;
02056
02057 #if PTRACING
02058 static const char * GetConnectionStatesName(ConnectionStates s);
02059 friend ostream & operator<<(ostream & o, ConnectionStates s) { return o << GetConnectionStatesName(s); }
02060 static const char * GetFastStartStateName(FastStartStates s);
02061 friend ostream & operator<<(ostream & o, FastStartStates s) { return o << GetFastStartStateName(s); }
02062 #endif
02063
02064
02065
02066
02067 H245NegMasterSlaveDetermination * masterSlaveDeterminationProcedure;
02068 H245NegTerminalCapabilitySet * capabilityExchangeProcedure;
02069 H245NegLogicalChannels * logicalChannels;
02070 H245NegRequestMode * requestModeProcedure;
02071 H245NegRoundTripDelay * roundTripDelayProcedure;
02072
02073 #if OPAL_H450
02074 H450xDispatcher * h450dispatcher;
02075 H4502Handler * h4502handler;
02076 H4504Handler * h4504handler;
02077 H4506Handler * h4506handler;
02078 H4507Handler * h4507handler;
02079 H45011Handler * h45011handler;
02080 #endif
02081
02082 #if OPAL_H460
02083 H460_FeatureSet * features;
02084 #endif
02085
02086 private:
02087 PChannel * SwapHoldMediaChannels(PChannel * newChannel);
02088 };
02089
02090
02091 PDICTIONARY(H323CallIdentityDict, PString, H323Connection);
02092
02093
02094 #endif // OPAL_H323
02095
02096 #endif // OPAL_H323_H323CON_H
02097
02098