windows-nt/Source/XPSP1/NT/termsrv/remdsk/rds/t120/h/tptif.h

447 lines
15 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*
* tptif.h
*
* Copyright (c) 1993 - 1995 by DataBeam Corporation, Lexington, KY
*
* Abstract:
* This is the interface file for the TransportInterface class.
* This class provides a seamless interface to the TCP transport stack.
*
* The public interface of this class includes a member function for each
* of the API routines that a user application would need to call. The
* only API routines not directly accessible are those used for
* initialization and cleanup (which are automatically executed in the
* constructor and destructor, respectively). When a user application
* needs to call one of the available API routines, it merely calls the
* equivalent member function within the proper instance of this class.
* The API routine will then be invoked using the same parameters.
*
* The destructor calls the cleanup routine within the DLL for which it is
* responsible.
*
* The management plane functions include support for initialization and
* setup, as well as functions allowing MCS to poll the transport
* interfaces for activity.
*
* Caveats:
* None.
*
* Author:
* James P. Galvin, Jr.
*/
#ifndef _TRANSPORTINTERFACE_
#define _TRANSPORTINTERFACE_
#include "tprtsec.h"
/*
* This typedef defines the errors that can be returned from calls that are
* specific to TransportInterface classes. Note that the public member
* functions that map to transport stack calls do not return an error of this
* type. Rather, they return an error as defined by the transport API (TRAPI).
*/
typedef enum
{
TRANSPORT_INTERFACE_NO_ERROR,
TRANSPORT_INTERFACE_INITIALIZATION_FAILED,
TRANSPORT_INTERFACE_ALLOCATION_FAILED,
TRANSPORT_INTERFACE_NO_SUCH_CONNECTION,
TRANSPORT_INTERFACE_CONNECTION_ALREADY_EXISTS
} TransportInterfaceError;
typedef TransportInterfaceError * PTransportInterfaceError;
class CTransportConnList2 : public CList2
{
DEFINE_CLIST2(CTransportConnList2, PConnection, UINT)
void AppendEx(PConnection p, TransportConnection XprtConn)
{
UINT nKey = PACK_XPRTCONN(XprtConn);
Append(nKey, p);
}
PConnection FindEx(TransportConnection XprtConn)
{
UINT nKey = PACK_XPRTCONN(XprtConn);
return Find(nKey);
}
PConnection RemoveEx(TransportConnection XprtConn)
{
UINT nKey = PACK_XPRTCONN(XprtConn);
return Remove(nKey);
}
};
/*
* These are the owner callback messages that a transport interface object
* can send. They correspond directly to the messages that will be received
* from the various transport stacks.
*/
#define CONNECT_CONFIRM 0
#define DISCONNECT_INDICATION 1
#define DATA_INDICATION 2
#define STATUS_INDICATION 3
#define BUFFER_EMPTY_INDICATION 4
#define WAIT_UPDATE_INDICATION 5
/*
* This is simply a forward reference for the class defined below. It is used
* in the definition of the owner callback structure defined in this section.
*/
class TransportInterface;
typedef TransportInterface * PTransportInterface;
/*
* Owner Callback: CONNECT_CONFIRM
* Parameter1: Unused
* Parameter2: TransportConnection transport_connection
*
* Usage:
* This owner callback is sent when a connect confirm is received from
* the transport layer. This is to inform the recipient that a transport
* connection is now available for use. Connect confirm will occur
* on outbound connections. They represent a new transport connection
* that has resulted from this system calling a remote one. As such,
* there should always be a registered owner of the transport connection
* (registration is a side-effect of the call to ConnectRequest).
*
* So the connect confirm will be routed to the object that is the
* registered owner of the transport connection. That object may now
* utilize the connection to transfer data.
*/
/*
* Owner Callback: DISCONNECT_INDICATION
* Parameter1: Unused
* Parameter2: TransportConnection transport_connection
*
* Usage:
* This owner callback is sent when a disconnect indication is received
* from the transport layer. This is to inform the recipient that a
* transport connection is no longer available for use. If an object
* has explicitly registered itself as the owner of a transport connection,
* then it will receive the disconnect indication. If there has been no
* such registration, then the disconnect indication will be sent to the
* default owner callback.
*
* Once a disconnect indication has been issued for a given transport
* connection, that connection can no longer be used for anything.
*/
/*
* Owner Callback: DATA_INDICATION
* Parameter1: PDataIndicationInfo data_indication_info
* Parameter2: TransportConnection transport_connection
*
* Usage:
* This owner callback is sent when a data indication is received from
* the transport layer. The transport data structure contains the address
* and length of the user data field that is associated with the data
* indication. If an object in the system has explicitly registered
* ownership of the transport connection that carried the data (either
* through ConnectRequest or RegisterTransportConnection), then this
* callback will be sent to that object. If no object has registered
* this transport connection, then the data will be sent to the default
* owner.
*/
/*
* Owner Callback: STATUS_INDICATION
* Parameter1: PTransportStatus transport_status
* Parameter2: Unused
*
* Usage:
* This owner callback is just a pass-through of the status indication
* that comes from the transport layer. It contains a pointer to a
* transport status structure that contains status information that
* originated from the stack represented by this object. This is always
* passed to the default owner object.
*/
/*
* Owner Callback: BUFFER_EMPTY_INDICATION
* Parameter1: Unused
* Parameter2: TransportConnection transport_connection
*
* Usage:
* This owner callback is a pass-through of the buffer empty indication
* that comes from the transport layer. It is sent to the object that
* has registered ownership of the specified transport connection. This
* indication tells that object that the transport layer can now accept
* more data.
*/
class Connection;
typedef Connection *PConnection;
/*
* This is the class definition for the TransportInterface class. Remember,
* this class contains pure virtual functions which makes it an abstract base
* class. It cannot be instantiated, but rather, exists to be inherited from.
* These derived classes will implement the behavior that is specific to a
* particular transport stack (or possibly just the interface to a particular
* transport stack).
*/
class TransportInterface
{
public:
TransportInterface (
HANDLE transport_transmit_event,
PTransportInterfaceError
transport_interface_error);
~TransportInterface ();
TransportInterfaceError RegisterTransportConnection (
TransportConnection transport_connection,
PConnection owner_object,
BOOL bNoNagle);
#ifdef NM_RESET_DEVICE
TransportError ResetDevice (
PChar device_identifier);
#endif // NM_RESET_DEVICE
TransportError ConnectRequest (
TransportAddress transport_address,
BOOL fSecure,
BOOL bNoNagle,
PConnection owner_object,
PTransportConnection
transport_connection);
void DisconnectRequest (
TransportConnection transport_connection);
void DataRequestReady () {
SetEvent (Transport_Transmit_Event);
};
void ReceiveBufferAvailable ();
BOOL GetSecurity( TransportConnection transport_connection );
PSecurityInterface pSecurityInterface;
TransportInterfaceError CreateConnectionCallback (
TransportConnection transport_connection,
PConnection owner_object);
void ConnectIndication (
TransportConnection transport_connection);
void ConnectConfirm (
TransportConnection transport_connection);
void DisconnectIndication (
TransportConnection transport_connection,
ULONG ulReason);
TransportError DataIndication (
PTransportData transport_data);
void BufferEmptyIndication (
TransportConnection transport_connection);
private:
CTransportConnList2 m_TrnsprtConnCallbackList2;
HANDLE Transport_Transmit_Event;
};
/*
* TransportInterface (
* PTransportInterfaceError transport_interface_error)
*
* Functional Description:
* The constructor initializes the TCP transport code.
*
* The constructor also includes parameters specifying the default
* callback. This callback is used to inform the controller whenever an
* unexpected inbound connection is detected. This gives the controller
* the opportunity to assign responsibility for the new connection to some
* other object in the system.
*
* If anything goes wrong in the constructor, the return value (whose
* address is passed as a constructor parameter) will be set to one of the
* failure codes. If this happens, it is expected that whoever invoked the
* constructor (probably the controller), will immediately delete the
* object without using it. Failure to do this WILL result in unexpected
* behavior.
*
* Formal Parameters:
* default_owner_object (i)
* This is the address of the object that will handle all transport
* events for unregistered transport connections. This includes
* connect indication, dicsonnect indication, and data indication.
* This object will also receive all state and message indications.
* default_owner_message_base (i)
* This is the base value to be used for all owner callback messages.
* transport_interface_error (o)
* This is where the return code will be stored so that the creator of
* this object can make sure that everything is okay before using the
* new object. If this value is set to anything but success, the
* object should be destroyed immediately, without being used.
*
* Return Value:
* Note: the return value is handled as a constructor parameter.
* TRANSPORT_INTERFACE_NO_ERROR
* Everything worked, and the object is ready for use.
* TRANSPORT_INTERFACE_INITIALIZATION_FAILED
* The initialization of the transport interface object failed. It is
* therefore necessary to destroy the object without attempting to
* use it.
*
* Side Effects:
* A DLL will be loaded into memory, for later use.
*
* Caveats:
*/
/*
* ~TransportInterface ()
*
* Functional Description:
* The destructor frees up all resources used by the base class. This
* is primarily associated with the callback list (which is maintained by
* this class).
*
* Formal Parameters:
* Destructors have no parameters.
*
* Return Value:
* Destructors have no return value.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* TransportInterfaceError RegisterTransportConnection (
* TransportConnection transport_connection,
* PConnection owner_object,
* BOOL bNoNagle)
*
* Functional Description:
* When an inbound connection is detected, an entry is created in the
* callback list for it using the default owner callback information (that
* was specified in the constructor). This means that all events detected
* for the new transport connection will be sent to the default owner
* object until another object explicitly registers itself as the owner
* of the transport connection. That is what this routine is used for.
*
* Once an object has registered itself as the owner of a transport
* connection, it will receive all events related to that connection.
*
* Formal Parameters:
* transport_connection (i)
* This is the transport connection for which the callback information
* is to be associated.
* owner_object (i)
* This is the address of the Connection object that is to receive all transport
* layer events for the specified transport connection.
* bNoNagle (i)
* Should the connection stop using the Nagle algorithm?
*
* Return Value:
* TRANSPORT_INTERFACE_NO_ERROR
* The operation completed successfully.
* TRANSPORT_INTERFACE_NO_SUCH_CONNECTION
* This indicates that the named transport connection does not exist.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* TransportError ConnectRequest (
* TransportAddress transport_address,
* BOOL bNoNagle,
* PConnection owner_object,
* PTransportConnection transport_connection)
*
* Functional Description:
* This operation is invoked when the user application wishes to establish
* an outbound connection. Assuming that everything is successful, the
* owner callback information that is passed in to this operation is saved
* for later use. All events for this transport connection will be routed
* to the specified owner rather than the default owner.
*
* Formal Parameters:
* transport_address (i)
* This is the transport address to be passed to the transport stack
* during the connection creation process. The format of this address
* string will vary by transport stack, and cannot be specified here.
* bNoNagle (i)
* Do we need to disable the Nagle algorithm?
* owner_object (i)
* This is the address of the object that is to receive all transport
* layer events for the new transport connection.
* transport_connection (o)
* This is the address of the variable that is to receive the transport
* connection handle that is associated with this connection. Note
* that this handle is assigned before the connection is actually
* established, to allow the application to abort a connection in
* progress.
*
* Return Value:
* TRANSPORT_NO_ERROR
* The operation completed successfully.
* TRANSPORT_NOT_INITIALIZED
* The transport stack is not initialized.
*
* Side Effects:
* An outbound connection establishment process is begun in the background.
*
* Caveats:
* None.
*/
/*
* TransportError DisconnectRequest (
* TransportConnection transport_connection)
*
* Functional Description:
* This operation is used to break an existing transport connection. If
* the operation is successful, the transport connection will be removed
* from the callback list.
*
* Formal Parameters:
* transport_connection (i)
* This is the transport connection that is to be broken.
*
* Return Value:
* TRANSPORT_NO_ERROR
* The operation completed successfully.
* TRANSPORT_NOT_INITIALIZED
* The transport stack is not initialized.
* TRANSPORT_NO_SUCH_CONNECTION
* This indicates that the specified transport connection does not
* exist.
*
* Side Effects:
* A transport connection is severed.
*
* Caveats:
* None.
*/
/*
* TransportError PollReceiver ()
*
* Functional Description:
* This operation is used to check a transport stack for incoming data (or
* other events, such as connect and disconnect indications). In a single
* threaded environment, this call could also be used to provide a
* time-slice for the processing of inbound data, as well as other events
* (such as the creation of new connections).
*
* Formal Parameters:
* None.
*
* Return Value:
* TRANSPORT_NO_ERROR
* The operation completed successfully.
*
* Side Effects:
* This can result in callbacks from the transport layer back into this
* object.
*
* Caveats:
* None.
*/
#endif