h323con.h

Go to the documentation of this file.
00001 /*
00002  * h323con.h
00003  *
00004  * H.323 protocol handler
00005  *
00006  * Open H323 Library
00007  *
00008  * Copyright (c) 1998-2001 Equivalence Pty. Ltd.
00009  *
00010  * The contents of this file are subject to the Mozilla Public License
00011  * Version 1.0 (the "License"); you may not use this file except in
00012  * compliance with the License. You may obtain a copy of the License at
00013  * http://www.mozilla.org/MPL/
00014  *
00015  * Software distributed under the License is distributed on an "AS IS"
00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00017  * the License for the specific language governing rights and limitations
00018  * under the License.
00019  *
00020  * The Original Code is Open H323 Library.
00021  *
00022  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
00023  *
00024  * Portions of this code were written with the assisance of funding from
00025  * Vovida Networks, Inc. http://www.vovida.com.
00026  *
00027  * Contributor(s): ______________________________________.
00028  *
00029  * $Revision: 23729 $
00030  * $Author: rjongbloed $
00031  * $Date: 2009-10-29 23:46:33 +0000 (Thu, 29 Oct 2009) $
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 /* The following classes have forward references to avoid including the VERY
00053    large header files for H225 and H245. If an application requires access
00054    to the protocol classes they can include them, but for simple usage their
00055    inclusion can be avoided.
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     // H.245 - compliant handling of session IDs
01949     // if no internal session ID is found, zero is returned
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; // Number of call's waiting at the remote endpoint
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; // Capabilities local system supports
01980     PString            destExtraCallInfo;
01981     H323Capabilities   remoteCapabilities; // Capabilities remote system supports
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     // Used as part of a local call hold operation involving MOH
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     // H.245 - compliant handling of session IDs
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     // The following pointers are to protocol procedures, they are pointers to
02066     // hide their complexity from the H323Connection classes users.
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 

Generated on Mon Feb 1 00:25:43 2010 for OPAL by  doxygen 1.5.1