home *** CD-ROM | disk | FTP | other *** search
/ ftp.muug.mb.ca / 2014.06.ftp.muug.mb.ca.tar / ftp.muug.mb.ca / pub / openh323.tar.gz / openh323.tar / openh323 / include / h323pdu.h < prev    next >
Text File  |  2003-04-10  |  24KB  |  676 lines

  1. /*
  2.  * h323pdu.h
  3.  *
  4.  * H.323 protocol handler
  5.  *
  6.  * Open H323 Library
  7.  *
  8.  * Copyright (c) 1998-2000 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Open H323 Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions of this code were written with the assisance of funding from
  25.  * Vovida Networks, Inc. http://www.vovida.com.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: h323pdu.h,v $
  30.  * Revision 1.65  2003/04/10 09:36:52  robertj
  31.  * Added some more functions for converting to alias addresses.
  32.  *
  33.  * Revision 1.64  2003/04/01 03:11:01  robertj
  34.  * Added function to get array of AliasAddress into PStringArray.
  35.  *
  36.  * Revision 1.63  2003/03/25 04:56:17  robertj
  37.  * Fixed issues to do with multiple inheritence in transaction reply cache.
  38.  *
  39.  * Revision 1.62  2003/03/20 01:51:07  robertj
  40.  * More abstraction of H.225 RAS and H.501 protocols transaction handling.
  41.  *
  42.  * Revision 1.61  2003/03/01 00:23:42  craigs
  43.  * New PeerElement implementation
  44.  *
  45.  * Revision 1.60  2003/02/25 06:48:15  robertj
  46.  * More work on PDU transaction abstraction.
  47.  *
  48.  * Revision 1.59  2003/02/21 05:28:39  craigs
  49.  * Factored out code for user with peer elements
  50.  *
  51.  * Revision 1.58  2003/02/01 13:31:14  robertj
  52.  * Changes to support CAT authentication in RAS.
  53.  *
  54.  * Revision 1.57  2002/11/28 04:41:44  robertj
  55.  * Added support for RAS ServiceControlIndication command.
  56.  *
  57.  * Revision 1.56  2002/09/16 01:14:15  robertj
  58.  * Added #define so can select if #pragma interface/implementation is used on
  59.  *   platform basis (eg MacOS) rather than compiler, thanks Robert Monaghan.
  60.  *
  61.  * Revision 1.55  2002/09/03 06:19:37  robertj
  62.  * Normalised the multi-include header prevention ifdef/define symbol.
  63.  *
  64.  * Revision 1.54  2002/08/12 05:38:21  robertj
  65.  * Changes to the RAS subsystem to support ability to make requests to client
  66.  *   from gkserver without causing bottlenecks and race conditions.
  67.  *
  68.  * Revision 1.53  2002/08/05 10:03:47  robertj
  69.  * Cosmetic changes to normalise the usage of pragma interface/implementation.
  70.  *
  71.  * Revision 1.52  2002/08/05 05:17:37  robertj
  72.  * Fairly major modifications to support different authentication credentials
  73.  *   in ARQ to the logged in ones on RRQ. For both client and server.
  74.  * Various other H.235 authentication bugs and anomalies fixed on the way.
  75.  *
  76.  * Revision 1.51  2002/07/25 10:55:40  robertj
  77.  * Changes to allow more granularity in PDU dumps, hex output increasing
  78.  *   with increasing trace level.
  79.  *
  80.  * Revision 1.50  2002/07/11 07:04:12  robertj
  81.  * Added build InfoRequest pdu type to RAS.
  82.  *
  83.  * Revision 1.49  2002/05/29 03:55:17  robertj
  84.  * Added protocol version number checking infrastructure, primarily to improve
  85.  *   interoperability with stacks that are unforgiving of new features.
  86.  *
  87.  * Revision 1.48  2002/05/29 00:03:15  robertj
  88.  * Fixed unsolicited IRR support in gk client and server,
  89.  *   including support for IACK and INAK.
  90.  *
  91.  * Revision 1.47  2002/05/07 03:18:12  robertj
  92.  * Added application info (name/version etc) into registered endpoint data.
  93.  *
  94.  * Revision 1.46  2002/05/03 09:18:45  robertj
  95.  * Added automatic retransmission of RAS responses to retried requests.
  96.  *
  97.  * Revision 1.45  2002/03/14 07:57:02  robertj
  98.  * Added ability to specify alias type in H323SetAliasAddress, if not specified
  99.  *   then defaults to previous behaviour, thanks Nils Bokerman.
  100.  *
  101.  * Revision 1.44  2001/12/15 07:09:56  robertj
  102.  * Added functions to get E.164 address from alias address or addresses.
  103.  *
  104.  * Revision 1.43  2001/12/14 06:38:47  robertj
  105.  * Broke out conversion of Q.850 and H.225 release complete codes to
  106.  *   OpenH323 call end reasons enum.
  107.  *
  108.  * Revision 1.42  2001/12/13 10:56:04  robertj
  109.  * Added build of request in progress pdu.
  110.  *
  111.  * Revision 1.41  2001/08/16 07:49:16  robertj
  112.  * Changed the H.450 support to be more extensible. Protocol handlers
  113.  *   are now in separate classes instead of all in H323Connection.
  114.  *
  115.  * Revision 1.40  2001/08/10 11:03:49  robertj
  116.  * Major changes to H.235 support in RAS to support server.
  117.  *
  118.  * Revision 1.39  2001/08/06 07:44:52  robertj
  119.  * Fixed problems with building without SSL
  120.  *
  121.  * Revision 1.38  2001/08/06 03:08:11  robertj
  122.  * Fission of h323.h to h323ep.h & h323con.h, h323.h now just includes files.
  123.  *
  124.  * Revision 1.37  2001/06/14 06:25:13  robertj
  125.  * Added further H.225 PDU build functions.
  126.  * Moved some functionality from connection to PDU class.
  127.  *
  128.  * Revision 1.36  2001/06/14 00:45:19  robertj
  129.  * Added extra parameters for Q.931 fields, thanks Rani Assaf
  130.  *
  131.  * Revision 1.35  2001/05/30 23:34:54  robertj
  132.  * Added functions to send TCS=0 for transmitter side pause.
  133.  *
  134.  * Revision 1.34  2001/04/11 03:01:27  robertj
  135.  * Added H.450.2 (call transfer), thanks a LOT to Graeme Reid & Norwood Systems
  136.  *
  137.  * Revision 1.33  2001/03/24 00:34:35  robertj
  138.  * Added read/write hook functions so don't have to duplicate code in
  139.  *    H323RasH235PDU descendant class of H323RasPDU.
  140.  *
  141.  * Revision 1.32  2001/03/21 04:52:40  robertj
  142.  * Added H.235 security to gatekeepers, thanks Fⁿrbass Franz!
  143.  *
  144.  * Revision 1.31  2001/02/09 05:16:24  robertj
  145.  * Added #pragma interface for GNU C++.
  146.  *
  147.  * Revision 1.30  2001/01/19 01:20:38  robertj
  148.  * Added non-const function to get access to Q.931 PDU in H323SignalPDU.
  149.  *
  150.  * Revision 1.29  2000/10/04 05:59:09  robertj
  151.  * Minor reorganisation of the H.245 secondary channel start up to make it simpler
  152.  *    to override its behaviour.
  153.  *
  154.  * Revision 1.28  2000/09/25 06:47:54  robertj
  155.  * Removed use of alias if there is no alias present, ie only have transport address.
  156.  *
  157.  * Revision 1.27  2000/09/22 01:35:02  robertj
  158.  * Added support for handling LID's that only do symmetric codecs.
  159.  *
  160.  * Revision 1.26  2000/07/15 09:50:49  robertj
  161.  * Changed adding of Q.931 party numbers to only occur in SETUP.
  162.  *
  163.  * Revision 1.25  2000/06/21 08:07:39  robertj
  164.  * Added cause/reason to release complete PDU, where relevent.
  165.  *
  166.  * Revision 1.24  2000/05/23 11:32:27  robertj
  167.  * Rewrite of capability table to combine 2 structures into one and move functionality into that class
  168.  *    allowing some normalisation of usage across several applications.
  169.  * Changed H323Connection so gets a copy of capabilities instead of using endponts, allows adjustments
  170.  *    to be done depending on the remote client application.
  171.  *
  172.  * Revision 1.23  2000/05/08 14:07:26  robertj
  173.  * Improved the provision and detection of calling and caller numbers, aliases and hostnames.
  174.  *
  175.  * Revision 1.22  2000/05/08 05:05:43  robertj
  176.  * Fixed bug in H.245 close logical channel timeout, thanks XuPeili.
  177.  *
  178.  * Revision 1.21  2000/05/02 04:32:24  robertj
  179.  * Fixed copyright notice comment.
  180.  *
  181.  * Revision 1.20  2000/04/10 20:39:30  robertj
  182.  * Added support for more sophisticated DTMF and hook flash user indication.
  183.  * Added function to extract E164 address from Q.931/H.225 PDU.
  184.  *
  185.  * Revision 1.19  2000/03/25 02:00:39  robertj
  186.  * Added adjustable caller name on connection by connection basis.
  187.  *
  188.  * Revision 1.18  2000/03/21 01:22:01  robertj
  189.  * Fixed incorrect call reference code being used in originated call.
  190.  *
  191.  * Revision 1.17  1999/12/11 02:20:58  robertj
  192.  * Added ability to have multiple aliases on local endpoint.
  193.  *
  194.  * Revision 1.16  1999/09/10 03:36:48  robertj
  195.  * Added simple Q.931 Status response to Q.931 Status Enquiry
  196.  *
  197.  * Revision 1.15  1999/08/31 12:34:18  robertj
  198.  * Added gatekeeper support.
  199.  *
  200.  * Revision 1.14  1999/08/25 05:07:49  robertj
  201.  * File fission (critical mass reached).
  202.  *
  203.  * Revision 1.13  1999/07/16 06:15:59  robertj
  204.  * Corrected semantics for tunnelled master/slave determination in fast start.
  205.  *
  206.  * Revision 1.12  1999/07/16 02:15:30  robertj
  207.  * Fixed more tunneling problems.
  208.  *
  209.  * Revision 1.11  1999/07/15 14:45:35  robertj
  210.  * Added propagation of codec open error to shut down logical channel.
  211.  * Fixed control channel start up bug introduced with tunnelling.
  212.  *
  213.  * Revision 1.10  1999/07/10 02:51:53  robertj
  214.  * Added mutexing in H245 procedures.
  215.  *
  216.  * Revision 1.9  1999/07/09 06:09:49  robertj
  217.  * Major implementation. An ENORMOUS amount of stuff added everywhere.
  218.  *
  219.  * Revision 1.8  1999/06/25 10:25:35  robertj
  220.  * Added maintentance of callIdentifier variable in H.225 channel.
  221.  *
  222.  * Revision 1.7  1999/06/14 05:15:56  robertj
  223.  * Changes for using RTP sessions correctly in H323 Logical Channel context
  224.  *
  225.  * Revision 1.6  1999/06/13 12:41:14  robertj
  226.  * Implement logical channel transmitter.
  227.  * Fixed H245 connect on receiving call.
  228.  *
  229.  * Revision 1.5  1999/06/09 05:26:20  robertj
  230.  * Major restructuring of classes.
  231.  *
  232.  * Revision 1.4  1999/06/06 06:06:36  robertj
  233.  * Changes for new ASN compiler and v2 protocol ASN files.
  234.  *
  235.  * Revision 1.3  1999/04/26 06:14:47  craigs
  236.  * Initial implementation for RTP decoding and lots of stuff
  237.  * As a whole, these changes are called "First Noise"
  238.  *
  239.  * Revision 1.2  1999/01/16 02:35:04  robertj
  240.  * GNi compiler compatibility.
  241.  *
  242.  * Revision 1.1  1999/01/16 01:30:58  robertj
  243.  * Initial revision
  244.  *
  245.  */
  246.  
  247. #ifndef __OPAL_H323PDU_H
  248. #define __OPAL_H323PDU_H
  249.  
  250. #ifdef P_USE_PRAGMA
  251. #pragma interface
  252. #endif
  253.  
  254.  
  255. #include <ptlib/sockets.h>
  256. #include "h323con.h"
  257. #include "transports.h"
  258. #include "q931.h"
  259. #include "h225.h"
  260. #include "h245.h"
  261. #include "h323trans.h"
  262.  
  263.  
  264. class H225_RAS;
  265.  
  266.  
  267. #define H225_PROTOCOL_VERSION 4
  268. #define H245_PROTOCOL_VERSION 7
  269.  
  270.  
  271. ///////////////////////////////////////////////////////////////////////////////
  272.  
  273. /**Wrapper class for the H323 signalling channel.
  274.  */
  275. class H323SignalPDU : public H225_H323_UserInformation
  276. {
  277.   PCLASSINFO(H323SignalPDU, H225_H323_UserInformation);
  278.  
  279.   public:
  280.   /**@name Construction */
  281.   //@{
  282.     /**Create a new H.323 signalling channel (H.225/Q.931) PDU.
  283.      */
  284.     H323SignalPDU();
  285.  
  286.     /**Build a SETUP message.
  287.       */
  288.     H225_Setup_UUIE & BuildSetup(
  289.       const H323Connection & connection,    /// Connection PDU is generated for
  290.       const H323TransportAddress & destAddr /// Destination address for packet
  291.     );
  292.  
  293.     /**Build a CALL-PROCEEDING message.
  294.       */
  295.     H225_CallProceeding_UUIE & BuildCallProceeding(
  296.       const H323Connection & connection    /// Connection PDU is generated for
  297.     );
  298.  
  299.     /**Build a CONNECT message.
  300.       */
  301.     H225_Connect_UUIE & BuildConnect(
  302.       const H323Connection & connection    /// Connection PDU is generated for
  303.     );
  304.  
  305.     /**Build a CONNECT message with H.245 address.
  306.       */
  307.     H225_Connect_UUIE & BuildConnect(
  308.       const H323Connection & connection,    /// Connection PDU is generated for
  309.       const PIPSocket::Address & h245Address, /// H.245 IP address
  310.       WORD port                               /// H.245 TCP port
  311.     );
  312.  
  313.     /**Build an ALERTING message.
  314.       */
  315.     H225_Alerting_UUIE & BuildAlerting(
  316.       const H323Connection & connection    /// Connection PDU is generated for
  317.     );
  318.  
  319.     /**Build a INFORMATION message.
  320.       */
  321.     H225_Information_UUIE & BuildInformation(
  322.       const H323Connection & connection    /// Connection PDU is generated for
  323.     );
  324.  
  325.     /**Build a RELEASE-COMPLETE message.
  326.       */
  327.     H225_ReleaseComplete_UUIE & BuildReleaseComplete(
  328.       const H323Connection & connection    /// Connection PDU is generated for
  329.     );
  330.  
  331.     /**Build a FACILITY message.
  332.       */
  333.     H225_Facility_UUIE * BuildFacility(
  334.       const H323Connection & connection,  /// Connection PDU is generated for
  335.       BOOL empty                          /// Flag for empty facility message
  336.     );
  337.  
  338.     /**Build a PROGRESS message.
  339.       */
  340.     H225_Progress_UUIE & BuildProgress(
  341.       const H323Connection & connection    /// Connection PDU is generated for
  342.     );
  343.  
  344.     /**Build a STATUS message.
  345.       */
  346.     H225_Status_UUIE & BuildStatus(
  347.       const H323Connection & connection    /// Connection PDU is generated for
  348.     );
  349.  
  350.     /**Build a STATUS-INQUIRY message.
  351.       */
  352.     H225_StatusInquiry_UUIE & BuildStatusInquiry(
  353.       const H323Connection & connection    /// Connection PDU is generated for
  354.     );
  355.  
  356.     /**Build a SETUP-ACKNOWLEDGE message.
  357.       */
  358.     H225_SetupAcknowledge_UUIE & BuildSetupAcknowledge(
  359.       const H323Connection & connection    /// Connection PDU is generated for
  360.     );
  361.  
  362.     /**Build a NOTIFY message.
  363.       */
  364.     H225_Notify_UUIE & BuildNotify(
  365.       const H323Connection & connection    /// Connection PDU is generated for
  366.     );
  367.   //@}
  368.  
  369.  
  370.   /**@name Operations */
  371.   //@{
  372.     /**Print PDU to stream.
  373.       */
  374.     void PrintOn(
  375.       ostream & strm
  376.     ) const;
  377.  
  378.     /**Read PDU from the specified transport.
  379.       */
  380.     BOOL Read(
  381.       H323Transport & transport   /// Transport to read from
  382.     );
  383.  
  384.     /**Write the PDU to the transport.
  385.       */
  386.     BOOL Write(
  387.       H323Transport & transport   /// Transport to write to
  388.     );
  389.  
  390.     /**Get the Q.931 wrapper PDU for H.225 signalling PDU.
  391.       */
  392.     const Q931 & GetQ931() const { return q931pdu; }
  393.  
  394.     /**Get the Q.931 wrapper PDU for H.225 signalling PDU.
  395.       */
  396.     Q931 & GetQ931() { return q931pdu; }
  397.  
  398.     /**Build the Q.931 wrapper PDU for H.225 signalling PDU.
  399.        This must be called after altering fields in the H.225 part of the PDU.
  400.        If it has never been done, then the Write() functions will do so.
  401.       */
  402.     void BuildQ931();
  403.  
  404.     /**Get the source alias names for the remote endpoint.
  405.        This returns a human readable set of names that was provided by the
  406.        remote endpoint to identify it, eg phone number, display name etc etc
  407.       */
  408.     PString GetSourceAliases(
  409.       const H323Transport * transport = NULL  /// Transport PDU was read from.
  410.     ) const;
  411.  
  412.     /**Get the destination alias name(s) for the local endpoint.
  413.        The alias returned here can be used to determine the routing of an
  414.        incoming connection.
  415.       */
  416.     PString GetDestinationAlias(
  417.       BOOL firstAliasOnly = FALSE   /// Only return the first possible alias
  418.     ) const;
  419.  
  420.     /**Get the source endpoints identification as a phone number.
  421.        This returns FALSE if the remote never provided any alias or Q.931
  422.        field that indicated a valid e.164 telephone number.
  423.       */
  424.     BOOL GetSourceE164(
  425.       PString & number    /// String to receive number
  426.     ) const;
  427.  
  428.     /**Get the destiation  phone number.
  429.        This returns FALSE if the remote never provided any alias or Q.931
  430.        field that indicated a valid e.164 telephone number.
  431.       */
  432.     BOOL GetDestinationE164(
  433.       PString & number    /// String to receive number
  434.     ) const;
  435.  
  436.     /**Get the distinctive ring code if present.
  437.        This returns zero if no distinctive ring information is provided.
  438.       */
  439.     unsigned GetDistinctiveRing() const;
  440.  
  441.     /**Set the Q.931 fields in the PDU.
  442.        This sets the default values for various fields, eg caller party number
  443.        into the Q.931 from the supplied connection.
  444.       */
  445.     void SetQ931Fields(
  446.       const H323Connection & connection,
  447.       BOOL insertPartyNumbers = FALSE,
  448.       unsigned plan = 1,
  449.       unsigned type = 0,
  450.       int presentation = -1,
  451.       int screening = -1
  452.     );
  453.  
  454.   protected:
  455.     // Even though we generally deal with the H323 protocol (H225) it is
  456.     // actually contained within a field of the Q931 protocol.
  457.     Q931 q931pdu;
  458. };
  459.  
  460.  
  461. /////////////////////////////////////////////////////////////////////////////
  462.  
  463. /**Wrapper class for the H323 control channel.
  464.  */
  465. class H323ControlPDU : public H245_MultimediaSystemControlMessage
  466. {
  467.   PCLASSINFO(H323ControlPDU, H245_MultimediaSystemControlMessage);
  468.  
  469.   public:
  470.     H245_RequestMessage    & Build(H245_RequestMessage   ::Choices request);
  471.     H245_ResponseMessage   & Build(H245_ResponseMessage  ::Choices response);
  472.     H245_CommandMessage    & Build(H245_CommandMessage   ::Choices command);
  473.     H245_IndicationMessage & Build(H245_IndicationMessage::Choices indication);
  474.  
  475.     H245_MasterSlaveDetermination & BuildMasterSlaveDetermination(
  476.       unsigned terminalType,
  477.       unsigned statusDeterminationNumber
  478.     );
  479.     H245_MasterSlaveDeterminationAck & BuildMasterSlaveDeterminationAck(
  480.       BOOL isMaster
  481.     );
  482.     H245_MasterSlaveDeterminationReject & BuildMasterSlaveDeterminationReject(
  483.       unsigned cause
  484.     );
  485.  
  486.     H245_TerminalCapabilitySet & BuildTerminalCapabilitySet(
  487.       const H323Connection & connection,
  488.       unsigned sequenceNumber,
  489.       BOOL empty
  490.     );
  491.     H245_TerminalCapabilitySetAck & BuildTerminalCapabilitySetAck(
  492.       unsigned sequenceNumber
  493.     );
  494.     H245_TerminalCapabilitySetReject & BuildTerminalCapabilitySetReject(
  495.       unsigned sequenceNumber,
  496.       unsigned cause
  497.     );
  498.  
  499.     H245_OpenLogicalChannel & BuildOpenLogicalChannel(
  500.       unsigned forwardLogicalChannelNumber
  501.     );
  502.     H245_RequestChannelClose & BuildRequestChannelClose(
  503.       unsigned channelNumber,
  504.       unsigned reason
  505.     );
  506.     H245_CloseLogicalChannel & BuildCloseLogicalChannel(
  507.       unsigned channelNumber
  508.     );
  509.     H245_OpenLogicalChannelAck & BuildOpenLogicalChannelAck(
  510.       unsigned channelNumber
  511.     );
  512.     H245_OpenLogicalChannelReject & BuildOpenLogicalChannelReject(
  513.       unsigned channelNumber,
  514.       unsigned cause
  515.     );
  516.     H245_OpenLogicalChannelConfirm & BuildOpenLogicalChannelConfirm(
  517.       unsigned channelNumber
  518.     );
  519.     H245_CloseLogicalChannelAck & BuildCloseLogicalChannelAck(
  520.       unsigned channelNumber
  521.     );
  522.     H245_RequestChannelCloseAck & BuildRequestChannelCloseAck(
  523.       unsigned channelNumber
  524.     );
  525.     H245_RequestChannelCloseReject & BuildRequestChannelCloseReject(
  526.       unsigned channelNumber
  527.     );
  528.     H245_RequestChannelCloseRelease & BuildRequestChannelCloseRelease(
  529.       unsigned channelNumber
  530.     );
  531.  
  532.     H245_RequestMode & BuildRequestMode(
  533.       unsigned sequenceNumber
  534.     );
  535.     H245_RequestModeAck & BuildRequestModeAck(
  536.       unsigned sequenceNumber,
  537.       unsigned response
  538.     );
  539.     H245_RequestModeReject & BuildRequestModeReject(
  540.       unsigned sequenceNumber,
  541.       unsigned cause
  542.     );
  543.  
  544.     H245_RoundTripDelayRequest & BuildRoundTripDelayRequest(
  545.       unsigned sequenceNumber
  546.     );
  547.     H245_RoundTripDelayResponse & BuildRoundTripDelayResponse(
  548.       unsigned sequenceNumber
  549.     );
  550.  
  551.     H245_UserInputIndication & BuildUserInputIndication(
  552.       const PString & value
  553.     );
  554.     H245_UserInputIndication & BuildUserInputIndication(
  555.       char tone,               /// DTMF tone code
  556.       unsigned duration,       /// Duration of tone in milliseconds
  557.       unsigned logicalChannel, /// Logical channel number for RTP sync.
  558.       unsigned rtpTimestamp    /// RTP timestamp in logical channel sync.
  559.     );
  560.  
  561.     H245_FunctionNotUnderstood & BuildFunctionNotUnderstood(
  562.       const H323ControlPDU & pdu
  563.     );
  564.  
  565.     H245_EndSessionCommand & BuildEndSessionCommand(
  566.       unsigned reason
  567.     );
  568. };
  569.  
  570.  
  571. /////////////////////////////////////////////////////////////////////////////
  572.  
  573. /**Wrapper class for the H323 gatekeeper RAS channel.
  574.  */
  575. class H323RasPDU : public H225_RasMessage, public H323TransactionPDU
  576. {
  577.   PCLASSINFO(H323RasPDU, H225_RasMessage);
  578.  
  579.   public:
  580.     H323RasPDU();
  581.     H323RasPDU(
  582.       const H235Authenticators & authenticators
  583.     );
  584.  
  585.     // overrides from PObject
  586.     virtual PObject * Clone() const;
  587.  
  588.     // overrides from H323TransactionPDU
  589.     virtual PASN_Object & GetPDU();
  590.     virtual PASN_Choice & GetChoice();
  591.     virtual const PASN_Object & GetPDU() const;
  592.     virtual const PASN_Choice & GetChoice() const;
  593.     virtual unsigned GetSequenceNumber() const;
  594.     virtual unsigned GetRequestInProgressDelay() const;
  595. #if PTRACING
  596.     virtual const char * GetProtocolName() const;
  597. #endif
  598.     virtual H323TransactionPDU * ClonePDU() const;
  599.     virtual void DeletePDU();
  600.  
  601.     // new functions
  602.     H225_GatekeeperRequest       & BuildGatekeeperRequest(unsigned seqNum);
  603.     H225_GatekeeperConfirm       & BuildGatekeeperConfirm(unsigned seqNum);
  604.     H225_GatekeeperReject        & BuildGatekeeperReject(unsigned seqNum, unsigned reason = H225_GatekeeperRejectReason::e_undefinedReason);
  605.     H225_RegistrationRequest     & BuildRegistrationRequest(unsigned seqNum);
  606.     H225_RegistrationConfirm     & BuildRegistrationConfirm(unsigned seqNum);
  607.     H225_RegistrationReject      & BuildRegistrationReject(unsigned seqNum, unsigned reason = H225_RegistrationRejectReason::e_undefinedReason);
  608.     H225_UnregistrationRequest   & BuildUnregistrationRequest(unsigned seqNum);
  609.     H225_UnregistrationConfirm   & BuildUnregistrationConfirm(unsigned seqNum);
  610.     H225_UnregistrationReject    & BuildUnregistrationReject(unsigned seqNum, unsigned reason = H225_UnregRejectReason::e_undefinedReason);
  611.     H225_LocationRequest         & BuildLocationRequest(unsigned seqNum);
  612.     H225_LocationConfirm         & BuildLocationConfirm(unsigned seqNum);
  613.     H225_LocationReject          & BuildLocationReject(unsigned seqNum, unsigned reason = H225_LocationRejectReason::e_undefinedReason);
  614.     H225_AdmissionRequest        & BuildAdmissionRequest(unsigned seqNum);
  615.     H225_AdmissionConfirm        & BuildAdmissionConfirm(unsigned seqNum);
  616.     H225_AdmissionReject         & BuildAdmissionReject(unsigned seqNum, unsigned reason = H225_AdmissionRejectReason::e_undefinedReason);
  617.     H225_DisengageRequest        & BuildDisengageRequest(unsigned seqNum);
  618.     H225_DisengageConfirm        & BuildDisengageConfirm(unsigned seqNum);
  619.     H225_DisengageReject         & BuildDisengageReject(unsigned seqNum, unsigned reason = H225_DisengageRejectReason::e_securityDenial);
  620.     H225_BandwidthRequest        & BuildBandwidthRequest(unsigned seqNum);
  621.     H225_BandwidthConfirm        & BuildBandwidthConfirm(unsigned seqNum, unsigned bandwidth = 0);
  622.     H225_BandwidthReject         & BuildBandwidthReject(unsigned seqNum, unsigned reason = H225_BandRejectReason::e_undefinedReason);
  623.     H225_InfoRequest             & BuildInfoRequest(unsigned seqNum, unsigned callRef = 0, const OpalGloballyUniqueID * id = NULL);
  624.     H225_InfoRequestResponse     & BuildInfoRequestResponse(unsigned seqNum);
  625.     H225_InfoRequestAck          & BuildInfoRequestAck(unsigned seqNum);
  626.     H225_InfoRequestNak          & BuildInfoRequestNak(unsigned seqNum, unsigned reason = H225_InfoRequestNakReason::e_undefinedReason);
  627.     H225_ServiceControlIndication& BuildServiceControlIndication(unsigned seqNum, const OpalGloballyUniqueID * id = NULL);
  628.     H225_ServiceControlResponse  & BuildServiceControlResponse(unsigned seqNum);
  629.     H225_UnknownMessageResponse  & BuildUnknownMessageResponse(unsigned seqNum);
  630.     H225_RequestInProgress       & BuildRequestInProgress(unsigned seqNum, unsigned delay);
  631. };
  632.  
  633.  
  634. /////////////////////////////////////////////////////////////////////////////
  635.  
  636. void H323SetAliasAddresses(const H323TransportAddressArray & addresses, H225_ArrayOf_AliasAddress & aliases);
  637. void H323SetAliasAddresses(const PStringArray & names, H225_ArrayOf_AliasAddress & aliases, int tag = -1);
  638. void H323SetAliasAddresses(const PStringList & names, H225_ArrayOf_AliasAddress & aliases, int tag = -1);
  639. void H323SetAliasAddress(const H323TransportAddress & address, H225_AliasAddress & alias);
  640. void H323SetAliasAddress(const PString & name, H225_AliasAddress & alias, int tag = -1);
  641. PStringArray H323GetAliasAddressStrings(const H225_ArrayOf_AliasAddress & aliases);
  642. PString H323GetAliasAddressString(const H225_AliasAddress & alias);
  643. PString H323GetAliasAddressE164(const H225_AliasAddress & alias);
  644. PString H323GetAliasAddressE164(const H225_ArrayOf_AliasAddress & aliases);
  645.  
  646. H323Connection::CallEndReason H323TranslateToCallEndReason(
  647.   Q931::CauseValues cause,
  648.   const H225_ReleaseCompleteReason & reason
  649. );
  650. Q931::CauseValues H323TranslateFromCallEndReason(
  651.   const H323Connection & connection,
  652.   H225_ReleaseCompleteReason & rcReason
  653. );
  654.  
  655. PString H323GetApplicationInfo(const H225_VendorIdentifier & vendor);
  656.  
  657.  
  658. #if PTRACING
  659. void H323TraceDumpPDU(
  660.   const char * proto,
  661.   BOOL writing,
  662.   const PBYTEArray & rawData,
  663.   const PASN_Object & pdu,
  664.   const PASN_Choice & tag1,
  665.   unsigned seqNum
  666. );
  667. #else
  668. #define H323TraceDumpPDU(proto, writing, rawData, pdu, tag1, seqNum)
  669. #endif
  670.  
  671.  
  672. #endif // __OPAL_H323PDU_H
  673.  
  674.  
  675. /////////////////////////////////////////////////////////////////////////////
  676.