WindowsXP-SP1/termsrv/remdsk/rds/h/gcc.h
2020-09-30 16:53:49 +02:00

773 lines
24 KiB
C

/*
* gcc.h
*
* Copyright (c) 1994, 1995 by DataBeam Corporation, Lexington, KY
*
* Abstract:
* This is the interface file for the GCC DLL. This file defines all
* macros, types, and functions needed to use the GCC DLL, allowing GCC
* services to be accessed from user applications.
*
* An application requests services from GCC by making direct
* calls into the DLL (this includes T.124 requests and responses). GCC
* sends information back to the application through a callback (this
* includes T.124 indications and confirms). The callback for the node
* controller is specified in the call GCCInitialize, and the callback
* for a particular application service access point is specified in the
* call GCCRegisterSAP.
*
* During initialization, GCC allocates a timer in order to give itself
* a heartbeat. If zero is passed in here the owner application (the node
* controller) must take the responsibility to call GCCHeartbeat. Almost
* all work is done by GCC during these clocks ticks. It is during these
* clock ticks that GCC checks with MCS to see if there is any work to be
* done. It is also during these clock ticks that callbacks are made to
* the user applications. GCC will NEVER invoke a user callback during a
* user request (allowing the user applications to not worry about
* re-entrancy). Since timer events are processed during the message
* loop, the developer should be aware that long periods of time away
* from the message loop will result in GCC "freezing" up.
*
* Note that this is a "C" language interface in order to prevent any "C++"
* naming conflicts between different compiler manufacturers. Therefore,
* if this file is included in a module that is being compiled with a "C++"
* compiler, it is necessary to use the following syntax:
*
* extern "C"
* {
* #include "gcc.h"
* }
*
* This disables C++ name mangling on the API entry points defined within
* this file.
*
* Author:
* blp
*
* Caveats:
* none
*/
#ifndef __GCC_H__
#define __GCC_H__
#include "t120type.h"
/************************************************************************
* *
* Generally Used Typedefs *
* *
*************************************************************************/
#define NM_T120_VERSION_3 (MAKELONG(0, 3)) // NM 3.0
typedef struct tagOSTR
{
ULONG length;
LPBYTE value;
}
OSTR, *LPOSTR;
/*
** Typedef for a GCC hex string. This typedef is used throughout GCC for
** storing variable length wide character strings with embedded NULLs.
*/
typedef struct
{
UINT hex_string_length;
USHORT * hex_string;
}
T120HexString, GCCHexString, *PGCCHexString;
/*
** Typedef for a GCC long string. This typedef is used in GCC for
** storing variable length strings of longs with embedded NULLs.
*/
typedef struct tagT120LongString
{
ULONG long_string_length;
ULONG * long_string;
}
T120LongString, GCCLongString, *PGCCLongString;
/*
* TransportAddress is passed in with the ConnectRequest() call.
* This address is always a pointer to an ascii string.
* The TransportAddress represents a remote location. It is the TCP
* address of the remote machine.
*
*/
typedef LPSTR TransportAddress, *PTransportAddress;
/*
** Typedef for a GCC Character string. This typedef is used throughout GCC for
** storing variable length, NULL terminated, single byte character strings.
*/
// lonchanc: we should simply use char.
typedef BYTE GCCCharacter, *GCCCharacterString, **PGCCCharacterString;
/*
** Typedef for a GCC Numeric string. This typedef is used throughout GCC for
** storing variable length, NULL terminated, single byte character strings.
** A single character in this string is constrained to numeric values
** ranging from "0" to "9".
*/
typedef LPSTR GCCNumericString, *PGCCNumericString;
/*
** Typdef for GCC version which is used when registering the node controller
** or an application.
*/
typedef struct
{
USHORT major_version;
USHORT minor_version;
}
GCCVersion, *PGCCVersion;
/*
** Macros for values of Booleans passed through the GCC API.
*/
#define CONFERENCE_IS_LOCKED TRUE
#define CONFERENCE_IS_NOT_LOCKED FALSE
#define CONFERENCE_IS_LISTED TRUE
#define CONFERENCE_IS_NOT_LISTED FALSE
#define CONFERENCE_IS_CONDUCTIBLE TRUE
#define CONFERENCE_IS_NOT_CONDUCTIBLE FALSE
#define PERMISSION_IS_GRANTED TRUE
#define PERMISSION_IS_NOT_GRANTED FALSE
#define TIME_IS_CONFERENCE_WIDE TRUE
#define TIME_IS_NOT_CONFERENCE_WIDE FALSE
#define APPLICATION_IS_ENROLLED_ACTIVELY TRUE
#define APPLICATION_IS_NOT_ENROLLED_ACTIVELY FALSE
#define APPLICATION_IS_CONDUCTING TRUE
#define APPLICATION_IS_NOT_CONDUCTING_CAPABLE FALSE
#define APPLICATION_IS_ENROLLED TRUE
#define APPLICATION_IS_NOT_ENROLLED FALSE
#define DELIVERY_IS_ENABLED TRUE
#define DELIVERY_IS_NOT_ENABLED FALSE
/*
** The following enum structure typedefs are used to define the GCC Object Key.
** The GCC Object Key is used throughout GCC for things like the Application
** keys and Capability IDs.
*/
typedef AppletKeyType GCCObjectKeyType, *PGCCObjectKeyType;;
#define GCC_OBJECT_KEY APPLET_OBJECT_KEY
#define GCC_H221_NONSTANDARD_KEY APPLET_H221_NONSTD_KEY
typedef struct tagT120ObjectKey
{
GCCObjectKeyType key_type;
GCCLongString object_id;
OSTR h221_non_standard_id;
}
T120ObjectKey, GCCObjectKey, *PGCCObjectKey;
/*
** GCCNonStandardParameter
** This structure is used within the NetworkAddress typedef and
** the NetworkService typedef defined below.
*/
typedef struct
{
GCCObjectKey object_key;
OSTR parameter_data;
}
GCCNonStandardParameter, *PGCCNonStandardParameter;
/*
** GCCConferenceName
** This structure defines the conference name. In a create request, the
** conference name can include an optional unicode string but it must
** always include the simple numeric string. In a join request, either
** one can be specified.
*/
typedef struct
{
GCCNumericString numeric_string;
LPWSTR text_string; /* optional */
}
GCCConferenceName, GCCConfName, *PGCCConferenceName, *PGCCConfName;
/*
** MCSChannelType
** Should this be defined in MCATMCS? It is used in a couple of places
** below and is explicitly defined in the T.124 specification.
*/
typedef AppletChannelType MCSChannelType, *PMCSChannelType;
#define MCS_STATIC_CHANNEL APPLET_STATIC_CHANNEL
#define MCS_DYNAMIC_MULTICAST_CHANNEL APPLET_DYNAMIC_MULTICAST_CHANNEL
#define MCS_DYNAMIC_PRIVATE_CHANNEL APPLET_DYNAMIC_PRIVATE_CHANNEL
#define MCS_DYNAMIC_USER_ID_CHANNEL APPLET_DYNAMIC_USER_ID_CHANNEL
#define MCS_NO_CHANNEL_TYPE_SPECIFIED APPLET_NO_CHANNEL_TYPE_SPECIFIED
/*
** GCCUserData
** This structure defines a user data element which is used throughout GCC.
*/
typedef struct
{
GCCObjectKey key;
LPOSTR octet_string; /* optional */
}
GCCUserData, *PGCCUserData;
/************************************************************************
* *
* Node Controller Related Typedefs *
* *
*************************************************************************/
/*
** GCCTerminationMethod
** The termination method is used by GCC to determine
** what action to take when all participants of a conference have
** disconnected. The conference can either be manually terminated
** by the node controller or it can terminate itself automatically when
** all the participants have left the conference.
*/
typedef enum
{
GCC_AUTOMATIC_TERMINATION_METHOD = 0,
GCC_MANUAL_TERMINATION_METHOD = 1
}
GCCTerminationMethod, *PGCCTerminationMethod;
/*
** GCCNodeType
** GCC specified node types. These node types dictate node controller
** behavior under certain conditions. See T.124 specification for
** proper assignment based on the needs of the Node Controller.
*/
typedef enum
{
GCC_TERMINAL = 0,
GCC_MULTIPORT_TERMINAL = 1,
GCC_MCU = 2
}
GCCNodeType, *PGCCNodeType;
/*
** GCCNodeProperties
** GCC specified node properties. See T.124 specification for proper
** assignment by the Node Controller.
*/
typedef enum
{
GCC_PERIPHERAL_DEVICE = 0,
GCC_MANAGEMENT_DEVICE = 1,
GCC_PERIPHERAL_AND_MANAGEMENT_DEVICE = 2,
GCC_NEITHER_PERIPHERAL_NOR_MANAGEMENT = 3
}
GCCNodeProperties, *PGCCNodeProperties;
/*
** GCCPassword
** This is the unique password specified by the convenor of the
** conference that is used by the node controller to insure conference
** security. This is also a unicode string.
*/
typedef struct
{
GCCNumericString numeric_string;
LPWSTR text_string; /* optional */
}
GCCPassword, *PGCCPassword;
/*
** GCCChallengeResponseItem
** This structure defines what a challenge response should look like.
** Note that either a password string or response data should be passed
** but not both.
*/
typedef struct
{
GCCPassword * password_string;
USHORT number_of_response_data_members;
GCCUserData ** response_data_list;
}
GCCChallengeResponseItem, *PGCCChallengeResponseItem;
typedef enum
{
GCC_IN_THE_CLEAR_ALGORITHM = 0,
GCC_NON_STANDARD_ALGORITHM = 1
}
GCCPasswordAlgorithmType, *PGCCPasswordAlgorithmType;
typedef struct
{
GCCPasswordAlgorithmType password_algorithm_type;
GCCNonStandardParameter * non_standard_algorithm; /* optional */
}
GCCChallengeResponseAlgorithm, *PGCCChallengeResponseAlgorithm;
typedef struct
{
GCCChallengeResponseAlgorithm response_algorithm;
USHORT number_of_challenge_data_members;
GCCUserData ** challenge_data_list;
}
GCCChallengeItem, *PGCCChallengeItem;
typedef struct
{
GCCResponseTag challenge_tag;
USHORT number_of_challenge_items;
GCCChallengeItem ** challenge_item_list;
}
GCCChallengeRequest, *PGCCChallengeRequest;
typedef struct
{
GCCResponseTag challenge_tag;
GCCChallengeResponseAlgorithm response_algorithm;
GCCChallengeResponseItem response_item;
}
GCCChallengeResponse, *PGCCChallengeResponse;
typedef enum
{
GCC_PASSWORD_IN_THE_CLEAR = 0,
GCC_PASSWORD_CHALLENGE = 1
}
GCCPasswordChallengeType, *PGCCPasswordChallengeType;
typedef struct
{
GCCPasswordChallengeType password_challenge_type;
union
{
GCCPassword password_in_the_clear;
struct
{
GCCChallengeRequest * challenge_request; /* optional */
GCCChallengeResponse * challenge_response; /* optional */
} challenge_request_response;
} u;
}
GCCChallengeRequestResponse, *PGCCChallengeRequestResponse;
/*
** GCCAsymmetryType
** Used in queries to determine if the calling and called node are known
** by both Node Controllers involved with the connection.
*/
typedef enum
{
GCC_ASYMMETRY_CALLER = 1,
GCC_ASYMMETRY_CALLED = 2,
GCC_ASYMMETRY_UNKNOWN = 3
}
GCCAsymmetryType, *PGCCAsymmetryType;
/*
** GCCAsymmetryIndicator
** Defines how the Node Controller sees itself when making a Query
** request or response. The random number portion of this structure is
** only used if the asymmetry_type is specified to be
** GCC_ASYMMETRY_UNKNOWN.
*/
typedef struct
{
GCCAsymmetryType asymmetry_type;
unsigned long random_number; /* optional */
}
GCCAsymmetryIndicator, *PGCCAsymmetryIndicator;
/*
** GCCNetworkAddress
** The following block of structures defines the Network Address as defined
** by T.124. Most of these structures were taken almost verbatim from the
** ASN.1 interface file. Since I'm not really sure what most of this stuff
** is for I really didn't know how to simplify it.
*/
typedef struct
{
BOOL speech;
BOOL voice_band;
BOOL digital_56k;
BOOL digital_64k;
BOOL digital_128k;
BOOL digital_192k;
BOOL digital_256k;
BOOL digital_320k;
BOOL digital_384k;
BOOL digital_512k;
BOOL digital_768k;
BOOL digital_1152k;
BOOL digital_1472k;
BOOL digital_1536k;
BOOL digital_1920k;
BOOL packet_mode;
BOOL frame_mode;
BOOL atm;
}
GCCTransferModes, *PGCCTransferModes;
#define MAXIMUM_DIAL_STRING_LENGTH 17
typedef char GCCDialingString[MAXIMUM_DIAL_STRING_LENGTH];
typedef struct
{
USHORT length;
USHORT * value;
}
GCCExtraDialingString, *PGCCExtraDialingString;
typedef struct
{
BOOL telephony3kHz;
BOOL telephony7kHz;
BOOL videotelephony;
BOOL videoconference;
BOOL audiographic;
BOOL audiovisual;
BOOL multimedia;
}
GCCHighLayerCompatibility, *PGCCHighLayerCompatibility;
typedef struct
{
GCCTransferModes transfer_modes;
GCCDialingString international_number;
GCCCharacterString sub_address_string; /* optional */
GCCExtraDialingString * extra_dialing_string; /* optional */
GCCHighLayerCompatibility * high_layer_compatibility; /* optional */
}
GCCAggregatedChannelAddress, *PGCCAggregatedChannelAddress;
#define MAXIMUM_NSAP_ADDRESS_SIZE 20
typedef struct
{
struct
{
UINT length;
BYTE value[MAXIMUM_NSAP_ADDRESS_SIZE];
} nsap_address;
LPOSTR transport_selector; /* optional */
}
GCCTransportConnectionAddress, *PGCCTransportConnectionAddress;
typedef enum
{
GCC_AGGREGATED_CHANNEL_ADDRESS = 1,
GCC_TRANSPORT_CONNECTION_ADDRESS = 2,
GCC_NONSTANDARD_NETWORK_ADDRESS = 3
}
GCCNetworkAddressType, *PGCCNetworkAddressType;
typedef struct
{
GCCNetworkAddressType network_address_type;
union
{
GCCAggregatedChannelAddress aggregated_channel_address;
GCCTransportConnectionAddress transport_connection_address;
GCCNonStandardParameter non_standard_network_address;
} u;
}
GCCNetworkAddress, *PGCCNetworkAddress;
/*
** GCCNodeRecord
** This structure defines a single conference roster record. See the
** T.124 specification for parameter definitions.
*/
typedef struct
{
UserID node_id;
UserID superior_node_id;
GCCNodeType node_type;
GCCNodeProperties node_properties;
LPWSTR node_name; /* optional */
USHORT number_of_participants;
LPWSTR * participant_name_list; /* optional */
LPWSTR site_information; /* optional */
UINT number_of_network_addresses;
GCCNetworkAddress ** network_address_list; /* optional */
LPOSTR alternative_node_id; /* optional */
USHORT number_of_user_data_members;
GCCUserData ** user_data_list; /* optional */
}
GCCNodeRecord, *PGCCNodeRecord;
/*
** GCCConferenceRoster
** This structure hold a complete conference roster. See the
** T.124 specification for parameter definitions.
*/
typedef struct
{
USHORT instance_number;
BOOL nodes_were_added;
BOOL nodes_were_removed;
USHORT number_of_records;
GCCNodeRecord ** node_record_list;
}
GCCConferenceRoster, *PGCCConferenceRoster, GCCConfRoster, *PGCCConfRoster;
/*
** GCCConferenceDescriptor
** Definition for the conference descriptor returned in a
** conference query confirm. This holds information about the
** conferences that exists at the queried node.
*/
typedef struct
{
GCCConferenceName conference_name;
GCCNumericString conference_name_modifier; /* optional */
LPWSTR conference_descriptor; /* optional */
BOOL conference_is_locked;
BOOL password_in_the_clear_required;
UINT number_of_network_addresses;
GCCNetworkAddress ** network_address_list; /* optional */
}
GCCConferenceDescriptor, *PGCCConferenceDescriptor, GCCConfDescriptor, *PGCCConfDescriptor;
/*
** ConferencePrivileges
** This structure defines the list of privileges that can be assigned to
** a particular conference.
*/
typedef struct
{
BOOL terminate_is_allowed;
BOOL eject_user_is_allowed;
BOOL add_is_allowed;
BOOL lock_unlock_is_allowed;
BOOL transfer_is_allowed;
}
GCCConferencePrivileges, *PGCCConferencePrivileges, GCCConfPrivileges, *PGCCConfPrivileges;
/************************************************************************
* *
* User Application Related Typedefs *
* *
*************************************************************************/
/*
** GCCSessionKey
** This is a unique identifier for an application that is
** using GCC. See the T.124 for the specifics on what an application
** key should look like. A session id of zero indicates that it is
** not being used.
*/
typedef struct tagT120SessionKey
{
GCCObjectKey application_protocol_key;
GCCSessionID session_id;
}
T120SessionKey, GCCSessionKey, *PGCCSessionKey;
/*
** CapabilityType
** T.124 supports three different rules when collapsing the capabilities
** list. "Logical" keeps a count of the Application Protocol Entities
** (APEs) that have that capability, "Unsigned Minimum" collapses to the
** minimum value and "Unsigned Maximum" collapses to the maximum value.
*/
typedef AppletCapabilityType GCCCapabilityType, GCCCapType, *PGCCCapabilityType, *PGCCCapType;
#define GCC_UNKNOWN_CAP_TYPE APPLET_UNKNOWN_CAP_TYPE
#define GCC_LOGICAL_CAPABILITY APPLET_LOGICAL_CAPABILITY
#define GCC_UNSIGNED_MINIMUM_CAPABILITY APPLET_UNSIGNED_MINIMUM_CAPABILITY
#define GCC_UNSIGNED_MAXIMUM_CAPABILITY APPLET_UNSIGNED_MAXIMUM_CAPABILITY
typedef AppletCapIDType T120CapabilityIDType, T120CapIDType, GCCCapabilityIDType, GCCCapIDType, *PGCCCapabilityIDType, *PGCCCapIDType;
#define GCC_STANDARD_CAPABILITY APPLET_STANDARD_CAPABILITY
#define GCC_NON_STANDARD_CAPABILITY APPLET_NONSTD_CAPABILITY
/*
** CapabilityID
** T.124 supports both standard and non-standard capabilities. This
** structure is used to differentiate between the two.
*/
typedef struct tagT120CapID
{
GCCCapabilityIDType capability_id_type;
GCCObjectKey non_standard_capability;
ULONG standard_capability;
}
T120CapID, GCCCapabilityID, GCCCapID, *PGCCCapabilityID, *PGCCCapID;
/*
** CapabilityClass
** This structure defines the class of capability and holds the associated
** value. Note that Logical is not necessary. Information associated with
** logical is stored in number_of_entities in the GCCApplicationCapability
** structure.
*/
typedef AppletCapabilityClass T120CapClass, GCCCapabilityClass, GCCCapClass, *PGCCCapabilityClass, *PGCCCapClass;
/*
** GCCApplicationCapability
** This structure holds all the data associated with a single T.124
** defined application capability.
*/
typedef struct tagT120AppCap
{
GCCCapabilityID capability_id;
GCCCapabilityClass capability_class;
ULONG number_of_entities;
}
T120AppCap, GCCApplicationCapability, GCCAppCap, *PGCCApplicationCapability, *PGCCAppCap;
/*
** GCCNonCollapsingCapability
*/
typedef struct tagT120NonCollCap
{
GCCCapabilityID capability_id;
LPOSTR application_data; /* optional */
}
T120NonCollCap, GCCNonCollapsingCapability, GCCNonCollCap, *PGCCNonCollapsingCapability, *PGCCNonCollCap;
/*
** GCCApplicationRecord
** This structure holds all the data associated with a single T.124
** application record. See the T.124 specification for what parameters
** are optional.
*/
typedef struct tagT120AppRecord
{
GCCNodeID node_id;
GCCEntityID entity_id;
BOOL is_enrolled_actively;
BOOL is_conducting_capable;
MCSChannelType startup_channel_type;
UserID application_user_id; /* optional */
ULONG number_of_non_collapsed_caps;
GCCNonCollapsingCapability
** non_collapsed_caps_list; /* optional */
}
T120AppRecord, GCCApplicationRecord, GCCAppRecord, *PGCCApplicationRecord, *PGCCAppRecord;
/*
** GCCApplicationRoster
** This structure holds all the data associated with a single T.124
** application roster. This includes the collapsed capabilites and
** the complete list of application records associated with an Application
** Protocol Entity (APE).
*/
typedef struct tagT120AppRoster
{
GCCSessionKey session_key;
BOOL application_roster_was_changed;
ULONG instance_number;
BOOL nodes_were_added;
BOOL nodes_were_removed;
BOOL capabilities_were_changed;
ULONG number_of_records;
GCCApplicationRecord ** application_record_list;
ULONG number_of_capabilities;
GCCApplicationCapability ** capabilities_list; /* optional */
}
T120AppRoster, GCCApplicationRoster, GCCAppRoster, *PGCCApplicationRoster, *PGCCAppRoster;
/*
** GCCRegistryKey
** This key is used to identify a specific resource used
** by an application. This may be a particular channel or token needed
** for control purposes.
*/
typedef struct tagT120RegistryKey
{
GCCSessionKey session_key;
OSTR resource_id; /* Max length is 64 */
}
T120RegistryKey, GCCRegistryKey, *PGCCRegistryKey;
/*
** RegistryItemType
** This enum is used to specify what type of registry item is contained
** at the specified slot in the registry.
*/
typedef AppletRegistryItemType GCCRegistryItemType, *PGCCRegistryItemType;
#define GCC_REGISTRY_CHANNEL_ID APPLET_REGISTRY_CHANNEL_ID
#define GCC_REGISTRY_TOKEN_ID APPLET_REGISTRY_TOKEN_ID
#define GCC_REGISTRY_PARAMETER APPLET_REGISTRY_PARAMETER
#define GCC_REGISTRY_NONE APPLET_REGISTRY_NONE
/*
** GCCRegistryItem
** This structure is used to hold a single registry item. Note that the
** union supports all three registry types supported by GCC.
*/
typedef struct
{
GCCRegistryItemType item_type;
// the following three fields were in a union
ChannelID channel_id;
TokenID token_id;
OSTR parameter; /* Max length is 64 */
}
T120RegistryItem, GCCRegistryItem, *PGCCRegistryItem;
/*
** GCCRegistryEntryOwner
**
*/
typedef struct
{
BOOL entry_is_owned;
GCCNodeID owner_node_id;
GCCEntityID owner_entity_id;
}
T120RegistryEntryOwner, GCCRegistryEntryOwner, *PGCCRegistryEntryOwner;
/*
** GCCModificationRights
** This enum is used when specifing what kind of rights a node has to
** alter the contents of a registry "parameter".
*/
typedef AppletModificationRights GCCModificationRights, *PGCCModificationRights;
#define GCC_OWNER_RIGHTS APPLET_OWNER_RIGHTS
#define GCC_SESSION_RIGHTS APPLET_SESSION_RIGHTS
#define GCC_PUBLIC_RIGHTS APPLET_PUBLIC_RIGHTS
#define GCC_NO_MODIFICATION_RIGHTS_SPECIFIED APPLET_NO_MODIFICATION_RIGHTS_SPECIFIED
/*
** GCCAppProtocolEntity
** This structure is used to identify a protocol entity at a remote node
** when invoke is used.
*/
typedef struct tagT120APE
{
GCCSessionKey session_key;
MCSChannelType startup_channel_type;
BOOL must_be_invoked;
ULONG number_of_expected_capabilities;
GCCApplicationCapability ** expected_capabilities_list;
}
T120APE, GCCAppProtocolEntity, GCCApe, *PGCCAppProtocolEntity, *PGCCApe;
/*
** GCCMessageType
** This section defines the messages that can be sent to the application
** through the callback facility. These messages correspond to the
** indications and confirms that are defined within T.124.
*/
typedef T120MessageType GCCMessageType, *PGCCMessageType;
#endif // __GCC_H__