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 / q931.h < prev    next >
C/C++ Source or Header  |  2003-03-18  |  21KB  |  577 lines

  1. /*
  2.  * q931.h
  3.  *
  4.  * Q.931 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.  * Contributor(s): ______________________________________.
  25.  *
  26.  * $Log: q931.h,v $
  27.  * Revision 1.52  2003/03/18 05:54:14  robertj
  28.  * Added ChannelIdentifier IE support, thanks Eize Slange
  29.  *
  30.  * Revision 1.51  2003/02/12 00:02:06  robertj
  31.  * Added more Q.931 cause codes.
  32.  * Added ability to trace text version of cause codes and IE codes.
  33.  *
  34.  * Revision 1.50  2002/11/25 22:40:00  robertj
  35.  * Added another Q.850 code
  36.  *
  37.  * Revision 1.49  2002/11/07 03:49:49  robertj
  38.  * Added extra "congested" Q.931 codes.
  39.  *
  40.  * Revision 1.48  2002/09/16 01:14:15  robertj
  41.  * Added #define so can select if #pragma interface/implementation is used on
  42.  *   platform basis (eg MacOS) rather than compiler, thanks Robert Monaghan.
  43.  *
  44.  * Revision 1.47  2002/09/03 05:42:27  robertj
  45.  * Normalised the multi-include header prevention ifdef/define symbol.
  46.  * Removed redundent includes.
  47.  *
  48.  * Revision 1.46  2002/08/05 10:03:47  robertj
  49.  * Cosmetic changes to normalise the usage of pragma interface/implementation.
  50.  *
  51.  * Revision 1.45  2002/07/05 03:13:35  robertj
  52.  * Added copy constructor for Q.931 so makes duplicate instead of reference to IE's.
  53.  *
  54.  * Revision 1.44  2002/05/22 23:12:01  robertj
  55.  * Enhanced the display of Release-Complete cause codes.
  56.  *
  57.  * Revision 1.43  2002/05/03 05:38:16  robertj
  58.  * Added Q.931 Keypad IE mechanism for user indications (DTMF).
  59.  *
  60.  * Revision 1.42  2002/04/22 08:03:41  craigs
  61.  * Added Q931 progress codes
  62.  *
  63.  * Revision 1.41  2002/04/22 07:33:02  craigs
  64.  * Changed GetProgressIndicator to be const
  65.  * Fixed spelling mistake in SignalType enums list
  66.  *
  67.  * Revision 1.40  2002/04/18 09:35:00  robertj
  68.  * Added CallState IE processing.
  69.  *
  70.  * Revision 1.39  2002/03/27 06:04:42  robertj
  71.  * Added Temporary Failure end code for connection, an application may
  72.  *   immediately retry the call if this occurs.
  73.  *
  74.  * Revision 1.38  2002/02/08 00:05:14  robertj
  75.  * Changed release complete causes so can dsitinguish between unknown
  76.  *   cause and no cause at all.
  77.  *
  78.  * Revision 1.37  2002/01/07 04:25:41  robertj
  79.  * Added support for Connected-Number Information Element, thanks Hans Verbeek
  80.  *
  81.  * Revision 1.36  2001/09/17 02:06:38  robertj
  82.  * Added Redirecting Number IE to Q.931, thanks Frank Derks
  83.  *
  84.  * Revision 1.35  2001/09/13 02:41:32  robertj
  85.  * Fixed call reference generation to use full range and common code, thanks Carlo Kielstra
  86.  *
  87.  * Revision 1.34  2001/09/12 02:01:33  robertj
  88.  * Added "No Circuit" release complete code.
  89.  *
  90.  * Revision 1.33  2001/08/20 06:48:26  robertj
  91.  * Added Q.931 function for setting bearer capabilities, allowing
  92.  *    applications to set the data rate as they require.
  93.  *
  94.  * Revision 1.32  2001/08/03 14:12:07  robertj
  95.  * Fixed value for Call State Information Element
  96.  *
  97.  * Revision 1.31  2001/07/24 23:40:15  craigs
  98.  * Added ability to remove Q931 IE
  99.  *
  100.  * Revision 1.30  2001/06/14 06:25:13  robertj
  101.  * Added further H.225 PDU build functions.
  102.  * Moved some functionality from connection to PDU class.
  103.  *
  104.  * Revision 1.29  2001/05/30 04:38:38  robertj
  105.  * Added BuildStatusEnquiry() Q.931 function, thanks Markus Storm
  106.  *
  107.  * Revision 1.28  2001/04/11 00:12:38  robertj
  108.  * Added some enums for numbering plans and call types, thanks Markus Storm.
  109.  *
  110.  * Revision 1.27  2001/02/09 05:16:24  robertj
  111.  * Added #pragma interface for GNU C++.
  112.  *
  113.  * Revision 1.26  2001/01/19 07:01:42  robertj
  114.  * Added all of the Q.931 message type codes.
  115.  *
  116.  * Revision 1.25  2000/10/13 02:15:23  robertj
  117.  * Added support for Progress Indicator Q.931/H.225 message.
  118.  *
  119.  * Revision 1.24  2000/07/09 14:53:17  robertj
  120.  * Added facility IE to facility message.
  121.  * Changed reference to the word "field" to be more correct IE or "Information Element"
  122.  *
  123.  * Revision 1.23  2000/06/21 08:07:39  robertj
  124.  * Added cause/reason to release complete PDU, where relevent.
  125.  *
  126.  * Revision 1.22  2000/05/18 11:53:34  robertj
  127.  * Changes to support doc++ documentation generation.
  128.  *
  129.  * Revision 1.21  2000/05/09 12:19:23  robertj
  130.  * Added ability to get and set "distinctive ring" Q.931 functionality.
  131.  *
  132.  * Revision 1.20  2000/05/08 14:07:26  robertj
  133.  * Improved the provision and detection of calling and caller numbers, aliases and hostnames.
  134.  *
  135.  * Revision 1.19  2000/05/06 02:17:49  robertj
  136.  * Changed the new CallingPartyNumber code so defaults for octet3a are application dependent.
  137.  *
  138.  * Revision 1.18  2000/05/05 00:44:05  robertj
  139.  * Added presentation and screening fields to Calling Party Number field, thanks Dean Anderson.
  140.  *
  141.  * Revision 1.17  2000/05/02 04:32:25  robertj
  142.  * Fixed copyright notice comment.
  143.  *
  144.  * Revision 1.16  2000/03/21 01:07:21  robertj
  145.  * Fixed incorrect call reference code being used in originated call.
  146.  *
  147.  * Revision 1.15  1999/12/23 22:43:36  robertj
  148.  * Added calling party number field.
  149.  *
  150.  * Revision 1.14  1999/09/10 03:36:48  robertj
  151.  * Added simple Q.931 Status response to Q.931 Status Enquiry
  152.  *
  153.  * Revision 1.13  1999/08/31 12:34:18  robertj
  154.  * Added gatekeeper support.
  155.  *
  156.  * Revision 1.12  1999/08/13 06:34:38  robertj
  157.  * Fixed problem in CallPartyNumber Q.931 encoding.
  158.  * Added field name display to Q.931 protocol.
  159.  *
  160.  * Revision 1.11  1999/08/10 13:14:15  robertj
  161.  * Added Q.931 Called Number field if have "phone number" style destination addres.
  162.  *
  163.  * Revision 1.10  1999/07/23 02:36:56  robertj
  164.  * Finally found correct value for FACILITY message.
  165.  *
  166.  * Revision 1.9  1999/07/16 02:15:30  robertj
  167.  * Fixed more tunneling problems.
  168.  *
  169.  * Revision 1.8  1999/07/09 06:09:49  robertj
  170.  * Major implementation. An ENORMOUS amount of stuff added everywhere.
  171.  *
  172.  * Revision 1.7  1999/06/13 12:41:14  robertj
  173.  * Implement logical channel transmitter.
  174.  * Fixed H245 connect on receiving call.
  175.  *
  176.  * Revision 1.6  1999/06/09 05:26:20  robertj
  177.  * Major restructuring of classes.
  178.  *
  179.  * Revision 1.5  1999/02/23 11:04:29  robertj
  180.  * Added capability to make outgoing call.
  181.  *
  182.  * Revision 1.4  1999/01/16 11:31:46  robertj
  183.  * Fixed name in header comment.
  184.  *
  185.  * Revision 1.3  1999/01/16 01:31:39  robertj
  186.  * Major implementation.
  187.  *
  188.  * Revision 1.2  1999/01/02 04:00:55  robertj
  189.  * Added higher level protocol negotiations.
  190.  *
  191.  * Revision 1.1  1998/12/14 09:13:41  robertj
  192.  * Initial revision
  193.  *
  194.  */
  195.  
  196. #ifndef __OPAL_Q931_H
  197. #define __OPAL_Q931_H
  198.  
  199. #ifdef P_USE_PRAGMA
  200. #pragma interface
  201. #endif
  202.  
  203.  
  204. ///////////////////////////////////////////////////////////////////////////////
  205.  
  206. /**This class embodies a Q.931 Protocol Data Unit.
  207.   */
  208. class Q931 : public PObject
  209. {
  210.   PCLASSINFO(Q931, PObject)
  211.   public:
  212.     enum MsgTypes {
  213.       NationalEscapeMsg  = 0x00,
  214.       AlertingMsg        = 0x01,
  215.       CallProceedingMsg  = 0x02,
  216.       ConnectMsg         = 0x07,
  217.       ConnectAckMsg      = 0x0f,
  218.       ProgressMsg        = 0x03,
  219.       SetupMsg           = 0x05,
  220.       SetupAckMsg        = 0x0d,
  221.       ResumeMsg          = 0x26,
  222.       ResumeAckMsg       = 0x2e,
  223.       ResumeRejectMsg    = 0x22,
  224.       SuspendMsg         = 0x25,
  225.       SuspendAckMsg      = 0x2d,
  226.       SuspendRejectMsg   = 0x21,
  227.       UserInformationMsg = 0x20,
  228.       DisconnectMsg      = 0x45,
  229.       ReleaseMsg         = 0x4d,
  230.       ReleaseCompleteMsg = 0x5a,
  231.       RestartMsg         = 0x46,
  232.       RestartAckMsg      = 0x4e,
  233.       SegmentMsg         = 0x60,
  234.       CongestionCtrlMsg  = 0x79,
  235.       InformationMsg     = 0x7b,
  236.       NotifyMsg          = 0x6e,
  237.       StatusMsg          = 0x7d,
  238.       StatusEnquiryMsg   = 0x75,
  239.       FacilityMsg        = 0x62
  240.     };
  241.  
  242.     Q931();
  243.     Q931(const Q931 & other);
  244.     Q931 & operator=(const Q931 & other);
  245.  
  246.     void BuildFacility(int callRef, BOOL fromDest);
  247.     void BuildInformation(int callRef, BOOL fromDest);
  248.     void BuildProgress(
  249.       int callRef,
  250.       BOOL fromDest,
  251.       unsigned description,
  252.       unsigned codingStandard = 0,
  253.       unsigned location = 0
  254.     );
  255.     void BuildNotify(int callRef, BOOL fromDest);
  256.     void BuildCallProceeding(int callRef);
  257.     void BuildSetupAcknowledge(int callRef);
  258.     void BuildAlerting(int callRef);
  259.     void BuildSetup(int callRef = -1);
  260.     void BuildConnect(int callRef);
  261.     void BuildStatus(int callRef, BOOL fromDest);
  262.     void BuildStatusEnquiry(int callRef, BOOL fromDest);
  263.     void BuildReleaseComplete(int callRef, BOOL fromDest);
  264.  
  265.     BOOL Decode(const PBYTEArray & data);
  266.     BOOL Encode(PBYTEArray & data) const;
  267.  
  268.     void PrintOn(ostream & strm) const;
  269.     PString GetMessageTypeName() const;
  270.  
  271.     static unsigned GenerateCallReference();
  272.     unsigned GetCallReference() const { return callReference; }
  273.     BOOL IsFromDestination() const { return fromDestination; }
  274.     MsgTypes GetMessageType() const { return messageType; }
  275.  
  276.     enum InformationElementCodes {
  277.       BearerCapabilityIE      = 0x04,
  278.       CauseIE                 = 0x08,
  279.       ChannelIdentificationIE = 0x18,
  280.       FacilityIE              = 0x1c,
  281.       ProgressIndicatorIE     = 0x1e,
  282.       CallStateIE             = 0x14,
  283.       DisplayIE               = 0x28,
  284.       KeypadIE                = 0x2c,
  285.       SignalIE                = 0x34,
  286.       ConnectedNumberIE       = 0x4c,
  287.       CallingPartyNumberIE    = 0x6c,
  288.       CalledPartyNumberIE     = 0x70,
  289.       RedirectingNumberIE     = 0x74,
  290.       UserUserIE              = 0x7e
  291.     };
  292.     friend ostream & operator<<(ostream & strm, InformationElementCodes ie);
  293.  
  294.     BOOL HasIE(InformationElementCodes ie) const;
  295.     PBYTEArray GetIE(InformationElementCodes ie) const;
  296.     void SetIE(InformationElementCodes ie, const PBYTEArray & userData);
  297.     void RemoveIE(InformationElementCodes ie);
  298.  
  299.     enum InformationTransferCapability {
  300.       TransferSpeech,
  301.       TransferUnrestrictedDigital = 8,
  302.       TransferRestrictedDigital = 9,
  303.       Transfer3_1kHzAudio = 16,
  304.       TrasnferUnrestrictedDigitalWithTones = 17,
  305.       TransferVideo = 24
  306.     };
  307.  
  308.     void SetBearerCapabilities(
  309.       InformationTransferCapability capability,
  310.       unsigned transferRate,        // Number of 64k B channels
  311.       unsigned codingStandard = 0,  // 0 = ITU-T standardized coding
  312.       unsigned userInfoLayer1 = 5   // 5 = Recommendations H.221 and H.242
  313.     );
  314.  
  315.     BOOL GetBearerCapabilities(
  316.       InformationTransferCapability & capability,
  317.       unsigned & transferRate,        // Number of 64k B channels
  318.       unsigned * codingStandard = NULL,
  319.       unsigned * userInfoLayer1 = NULL
  320.     );
  321.  
  322.     enum CauseValues {
  323.       UnknownCauseIE               =  0,
  324.       UnallocatedNumber            =  1,
  325.       NoRouteToNetwork             =  2,
  326.       NoRouteToDestination         =  3,
  327.       SendSpecialTone              =  4,
  328.       MisdialledTrunkPrefix        =  5,
  329.       ChannelUnacceptable          =  6,
  330.       NormalCallClearing           = 16,
  331.       UserBusy                     = 17,
  332.       NoResponse                   = 18,
  333.       NoAnswer                     = 19,
  334.       SubscriberAbsent             = 20,
  335.       CallRejected                 = 21,
  336.       NumberChanged                = 22,
  337.       Redirection                  = 23,
  338.       ExchangeRoutingError         = 25,
  339.       NonSelectedUserClearing      = 26,
  340.       DestinationOutOfOrder        = 27,
  341.       InvalidNumberFormat          = 28,
  342.       FacilityRejected             = 29,
  343.       StatusEnquiryResponse        = 30,
  344.       NormalUnspecified            = 31,
  345.       NoCircuitChannelAvailable    = 34,
  346.       NetworkOutOfOrder            = 38,
  347.       TemporaryFailure             = 41,
  348.       Congestion                   = 42,
  349.       RequestedCircuitNotAvailable = 44,
  350.       ResourceUnavailable          = 47,
  351.       ServiceOptionNotAvailable    = 63,
  352.       InvalidCallReference         = 81,
  353.       ClearedRequestedCallIdentity = 86,
  354.       IncompatibleDestination      = 88,
  355.       IENonExistantOrNotImplemented= 99,
  356.       TimerExpiry                  = 102,
  357.       ProtocolErrorUnspecified     = 111,
  358.       InterworkingUnspecified      = 127,
  359.       ErrorInCauseIE               = 0x100
  360.     };
  361.     friend ostream & operator<<(ostream & strm, CauseValues cause);
  362.  
  363.     void SetCause(
  364.       CauseValues value,
  365.       unsigned standard = 0,  // 0 = ITU-T standardized coding
  366.       unsigned location = 0   // 0 = User
  367.     );
  368.     CauseValues GetCause(
  369.       unsigned * standard = NULL,  // 0 = ITU-T standardized coding
  370.       unsigned * location = NULL   // 0 = User
  371.     ) const;
  372.  
  373.     enum CallStates {
  374.       CallState_Null                  = 0,
  375.       CallState_CallInitiated         = 1,
  376.       CallState_OverlapSending        = 2,
  377.       CallState_OutgoingCallProceeding= 3,
  378.       CallState_CallDelivered         = 4,
  379.       CallState_CallPresent           = 6,
  380.       CallState_CallReceived          = 7,
  381.       CallState_ConnectRequest        = 8,
  382.       CallState_IncomingCallProceeding= 9,
  383.       CallState_Active                = 10,
  384.       CallState_DisconnectRequest     = 11,
  385.       CallState_DisconnectIndication  = 12,
  386.       CallState_SuspendRequest        = 15,
  387.       CallState_ResumeRequest         = 17,
  388.       CallState_ReleaseRequest        = 19,
  389.       CallState_OverlapReceiving      = 25,
  390.       CallState_ErrorInIE             = 0x100
  391.     };
  392.     void SetCallState(
  393.       CallStates value,
  394.       unsigned standard = 0  // 0 = ITU-T standardized coding
  395.     );
  396.     CallStates GetCallState(
  397.       unsigned * standard = NULL  // 0 = ITU-T standardized coding
  398.     ) const;
  399.  
  400.     enum SignalInfo {
  401.       SignalDialToneOn,
  402.       SignalRingBackToneOn,
  403.       SignalInterceptToneOn,
  404.       SignalNetworkCongestionToneOn,
  405.       SignalBusyToneOn,
  406.       SignalConfirmToneOn,
  407.       SignalAnswerToneOn,
  408.       SignalCallWaitingTone,
  409.       SignalOffhookWarningTone,
  410.       SignalPreemptionToneOn,
  411.       SignalTonesOff = 0x3f,
  412.       SignalAlertingPattern0 = 0x40,
  413.       SignalAlertingPattern1,
  414.       SignalAlertingPattern2,
  415.       SignalAlertingPattern3,
  416.       SignalAlertingPattern4,
  417.       SignalAlertingPattern5,
  418.       SignalAlertingPattern6,
  419.       SignalAlertingPattern7,
  420.       SignalAlertingOff = 0x4f,
  421.       SignalErrorInIE = 0x100
  422.     };
  423.     void SetSignalInfo(SignalInfo value);
  424.     SignalInfo GetSignalInfo() const;
  425.  
  426.     void SetKeypad(const PString & digits);
  427.     PString GetKeypad() const;
  428.  
  429.     enum ProgressIndication {
  430.        ProgressNotEndToEndISDN      = 1,      // Call is not end-to-end ISDN; 
  431.                                               // further call progress information may be available in-band  
  432.        ProgressDestinationNonISDN   = 2,      // Destination address is non ISDN  
  433.        ProgressOriginNotISDN        = 3,      // Origination address is non ISDN  
  434.        ProgressReturnedToISDN       = 4,      // Call has returned to the ISDN 
  435.        ProgressServiceChange        = 5,      // Interworking has occurred and has 
  436.                                               // resulted in a telecommunication service change
  437.        ProgressInbandInformationAvailable = 8 // In-band information or an appropriate pattern is now available.   
  438.     };
  439.  
  440.     void SetProgressIndicator(
  441.       unsigned description,
  442.       unsigned codingStandard = 0,
  443.       unsigned location = 0
  444.     );
  445.     BOOL GetProgressIndicator(
  446.       unsigned & description,
  447.       unsigned * codingStandard = NULL,
  448.       unsigned * location = NULL
  449.     ) const;
  450.  
  451.     void SetDisplayName(const PString & name);
  452.     PString GetDisplayName() const;
  453.  
  454.     enum NumberingPlanCodes {
  455.       UnknownPlan          = 0x00,
  456.       ISDNPlan             = 0x01,
  457.       DataPlan             = 0x03,
  458.       TelexPlan            = 0x04,
  459.       NationalStandardPlan = 0x08,
  460.       PrivatePlan          = 0x09,
  461.       ReservedPlan         = 0x0f
  462.     };
  463.  
  464.     enum TypeOfNumberCodes {
  465.       UnknownType          = 0x00,
  466.       InternationalType    = 0x01,
  467.       NationalType         = 0x02,
  468.       NetworkSpecificType  = 0x03,
  469.       SubscriberType       = 0x04,
  470.       AbbreviatedType      = 0x06,
  471.       ReservedType         = 0x07
  472.     };
  473.  
  474.     void SetCallingPartyNumber(
  475.       const PString & number, // Number string
  476.       unsigned plan = 1,      // 1 = ISDN/Telephony numbering system
  477.       unsigned type = 0,      // 0 = Unknown number type
  478.       int presentation = -1,  // 0 = presentation allowed, -1 = no octet3a
  479.       int screening = -1      //  0 = user provided, not screened
  480.     );
  481.     BOOL GetCallingPartyNumber(
  482.       PString & number,               // Number string
  483.       unsigned * plan = NULL,         // ISDN/Telephony numbering system
  484.       unsigned * type = NULL,         // Number type
  485.       unsigned * presentation = NULL, // Presentation indicator
  486.       unsigned * screening = NULL,    // Screening indicator
  487.       unsigned defPresentation = 0,   // Default value if octet3a not present
  488.       unsigned defScreening = 0       // Default value if octet3a not present
  489.     ) const;
  490.  
  491.     void SetCalledPartyNumber(
  492.       const PString & number, // Number string
  493.       unsigned plan = 1,      // 1 = ISDN/Telephony numbering system
  494.       unsigned type = 0       // 0 = Unknown number type
  495.     );
  496.     BOOL GetCalledPartyNumber(
  497.       PString & number,       // Number string
  498.       unsigned * plan = NULL, // ISDN/Telephony numbering system
  499.       unsigned * type = NULL  // Number type
  500.     ) const;
  501.  
  502.     void SetRedirectingNumber(
  503.       const PString & number, // Number string
  504.       unsigned plan = 1,      // 1 = ISDN/Telephony numbering system
  505.       unsigned type = 0,      // 0 = Unknown number type
  506.       int presentation = -1,  // 0 = presentation allowed, -1 = no octet3a
  507.       int screening = -1,     // 0 = user provided, not screened
  508.       int reason = -1         // 0 = Unknown reason , -1 = no octet 3b
  509.     );
  510.     BOOL GetRedirectingNumber(
  511.       PString & number,               // Number string
  512.       unsigned * plan = NULL,         // ISDN/Telephony numbering system
  513.       unsigned * type = NULL,         // Number type
  514.       unsigned * presentation = NULL, // Presentation indicator
  515.       unsigned * screening = NULL,    // Screening indicator
  516.       unsigned * reason = NULL,       // Reason for redirection
  517.       unsigned defPresentation = 0,   // Default value if octet3a not present
  518.       unsigned defScreening = 0,      // Default value if octet3a not present
  519.       unsigned defReason =0           // Default value if octet 3b not present
  520.     ) const;
  521.  
  522.     void SetConnectedNumber(
  523.       const PString & number, // Number string
  524.       unsigned plan = 1,      // 1 = ISDN/Telephony numbering system
  525.       unsigned type = 0,      // 0 = Unknown number type
  526.       int presentation = -1,  // 0 = presentation allowed, -1 = no octet3a
  527.       int screening = -1,     // 0 = user provided, not screened
  528.       int reason = -1         // 0 = Unknown reason , -1 = no octet 3b
  529.     );
  530.     BOOL GetConnectedNumber(
  531.       PString & number,               // Number string
  532.       unsigned * plan = NULL,         // ISDN/Telephony numbering system
  533.       unsigned * type = NULL,         // Number type
  534.       unsigned * presentation = NULL, // Presentation indicator
  535.       unsigned * screening = NULL,    // Screening indicator
  536.       unsigned * reason = NULL,       // Reason for redirection
  537.       unsigned defPresentation = 0,   // Default value if octet3a not present
  538.       unsigned defScreening = 0,      // Default value if octet3a not present
  539.       unsigned defReason =0           // Default value if octet 3b not present
  540.     ) const;
  541.  
  542.     /**Set the limitations to ChannelIdentification.
  543.         - the interface identifier cannot be specified
  544.         - channel in PRI can only be indicated by number and cannot be indicated by map
  545.         - one and only one channel can be indicated
  546.         - the coding standard is always ITU Q.931
  547.       */
  548.     void SetChannelIdentification(
  549.       unsigned interfaceType = 0,        //  0 = basic,     1 = other (e.g. primary)
  550.       unsigned preferredOrExclusive = 0, //  0 = preferred, 1 = exclusive
  551.       int      channelNumber = 1         // -1 = any,       0 = none/D, 1 = channel 1/B1, etc. 1-15,17-31
  552.     );
  553.  
  554.     /**Get the limitations to ChannelIdentification.
  555.       */
  556.     BOOL GetChannelIdentification(
  557.       unsigned * interfaceType = NULL,        // Interface type
  558.       unsigned * preferredOrExclusive = NULL, // Channel negotiation preference
  559.       int      * channelNumber = NULL         // Channel number
  560.     ) const;
  561.  
  562.   protected:
  563.     unsigned callReference;
  564.     BOOL fromDestination;
  565.     unsigned protocolDiscriminator;
  566.     MsgTypes messageType;
  567.  
  568.     PDICTIONARY(InternalInformationElements, POrdinalKey, PBYTEArray);
  569.     InternalInformationElements informationElements;
  570. };
  571.  
  572.  
  573. #endif // __OPAL_Q931_H
  574.  
  575.  
  576. /////////////////////////////////////////////////////////////////////////////
  577.