windows-nt/Source/XPSP1/NT/termsrv/remdsk/rds/t120/common/appenrol.cpp

354 lines
9.3 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
#include "precomp.h"
#include "fsdiag.h"
DEBUG_FILEZONE(ZONE_T120_UTILITY);
/*
* appenrol.cpp
*
* Copyright (c) 1994 by DataBeam Corporation, Lexington, KY
*
* Abstract:
* This is the implementation file for the class
* ApplicationEnrollRequestData.
*
* Caveats:
* None.
*
* Author:
* jbo
*/
#include "appenrol.h"
/*
* ApplicationEnrollRequestData ()
*
* Public Function Description:
* This constructor is used to create a ApplicationEnrollRequestData object
* from an ApplicationEnrollRequestMessage in preparation for serializing
* the application enroll request data.
*/
ApplicationEnrollRequestData::ApplicationEnrollRequestData(
PApplicationEnrollRequestMessage enroll_request_message,
PGCCError pRetCode)
{
GCCError rc = GCC_NO_ERROR;
Session_Key_Data = NULL;
Non_Collapsing_Caps_Data = NULL;
Application_Capability_Data = NULL;
/*
* Save the message structure in an instance variable. This will save all
* structure elements except the session key and the lists of non-collapsing
* and application capabilities.
*/
Enroll_Request_Message = *enroll_request_message;
/*
* Create a CSessKeyContainer object to be used to handle the session key
* contained in the enroll request message.
*/
if (Enroll_Request_Message.session_key != NULL)
{
DBG_SAVE_FILE_LINE
Session_Key_Data = new CSessKeyContainer(
Enroll_Request_Message.session_key,
&rc);
if ((Session_Key_Data != NULL) && (rc == GCC_NO_ERROR))
{
if (Enroll_Request_Message.number_of_non_collapsed_caps != 0)
{
/*
* Create a CNonCollAppCap object to hold the non-
* collapsing capabilities.
*/
DBG_SAVE_FILE_LINE
Non_Collapsing_Caps_Data = new CNonCollAppCap(
(ULONG) Enroll_Request_Message.number_of_non_collapsed_caps,
Enroll_Request_Message.non_collapsed_caps_list,
&rc);
if (Non_Collapsing_Caps_Data == NULL)
{
rc = GCC_ALLOCATION_FAILURE;
}
else if (rc != GCC_NO_ERROR)
{
Non_Collapsing_Caps_Data->Release();
Non_Collapsing_Caps_Data = NULL;
}
}
else
{
Non_Collapsing_Caps_Data = NULL;
}
if ((rc == GCC_NO_ERROR) &&
(Enroll_Request_Message.number_of_collapsed_caps != 0))
{
/*
* Create an CAppCap object to hold the
* application capabilities.
*/
DBG_SAVE_FILE_LINE
Application_Capability_Data = new CAppCap(
(ULONG) Enroll_Request_Message.number_of_collapsed_caps,
Enroll_Request_Message.collapsed_caps_list,
&rc);
if (Application_Capability_Data == NULL)
{
rc = GCC_ALLOCATION_FAILURE;
}
else if (rc != GCC_NO_ERROR)
{
Application_Capability_Data->Release();
Application_Capability_Data = NULL;
}
}
else
{
Application_Capability_Data = NULL;
}
}
else if (Session_Key_Data == NULL)
{
rc = GCC_ALLOCATION_FAILURE;
}
else
{
Session_Key_Data->Release();
Session_Key_Data = NULL;
}
}
else
{
Session_Key_Data = NULL;
Application_Capability_Data = NULL;
Non_Collapsing_Caps_Data = NULL;
/*
** Note that if no session key is present there is no need to pass
** any capability information.
*/
Enroll_Request_Message.number_of_non_collapsed_caps = 0;
Enroll_Request_Message.non_collapsed_caps_list = NULL;
Enroll_Request_Message.number_of_collapsed_caps = 0;
Enroll_Request_Message.collapsed_caps_list = NULL;
}
*pRetCode = rc;
}
/*
* ApplicationEnrollRequestData ()
*
* Public Function Description:
* This constructor is used to create a ApplicationEnrollRequestData object
* from an ApplicationEnrollRequestMessage and the memory holding the
* enroll request's serialized data in preparation for deserializing
* the application enroll request data.
*/
ApplicationEnrollRequestData::ApplicationEnrollRequestData(
PApplicationEnrollRequestMessage enroll_request_message)
{
Session_Key_Data = NULL;
Non_Collapsing_Caps_Data = NULL;
Application_Capability_Data = NULL;
/*
* Save the message structure in an instance variable. This will save all
* structure elements but not the data associated with the session key and
* the lists of non-collapsing and application capabilities.
*/
Enroll_Request_Message = *enroll_request_message;
}
/*
* ~ApplicationEnrollRequestData ()
*
* Public Function Description
* The ApplicationEnrollRequestData destructor.
*
*/
ApplicationEnrollRequestData::~ApplicationEnrollRequestData()
{
/*
* Delete any internal data objects which may exist.
*/
if (NULL != Session_Key_Data)
{
Session_Key_Data->Release();
}
if (NULL != Non_Collapsing_Caps_Data)
{
Non_Collapsing_Caps_Data->Release();
}
if (NULL != Application_Capability_Data)
{
Application_Capability_Data->Release();
}
}
/*
* GetDataSize ()
*
* Public Function Description
* This routine is used to determine the amount of memory necessary to
* hold all of the data associated with an ApplicationEnrollRequestMessage
* that is not held within the message strucuture.
*/
ULONG ApplicationEnrollRequestData::GetDataSize(void)
{
ULONG data_size = 0;
/*
* The first data referenced by the enroll request message is the data for
* the session key. Use the internal CSessKeyContainer object to determine
* the length of the data referenced by the session key. Also add the size
* of the actual session key structure.
*/
if (Session_Key_Data != NULL)
{
data_size += Session_Key_Data->LockSessionKeyData();
data_size += ROUNDTOBOUNDARY (sizeof(GCCSessionKey));
}
/*
* Now determine the length of the list of non-collapsing capabilities and
* the length of the list of application capabilities. This is done using
* the internal CNonCollAppCap and CAppCap objects.
*/
if (Non_Collapsing_Caps_Data != NULL)
{
data_size += Non_Collapsing_Caps_Data->LockCapabilityData();
}
if (Application_Capability_Data != NULL)
{
data_size += Application_Capability_Data->LockCapabilityData();
}
return (data_size);
}
/*
* Serialize ()
*
* Public Function Description
* This routine is used to prepare an ApplicationEnrollRequest message
* for passing through shared memory. The message structure is filled in
* and the data referenced by the structure written into the memory
* provided.
*/
ULONG ApplicationEnrollRequestData::Serialize(
PApplicationEnrollRequestMessage enroll_request_message,
LPSTR memory)
{
ULONG data_length;
ULONG total_data_length = 0;
USHORT app_capability_data_length;
/*
* Copy the internal message structure into the output structure. This will
* copy all structure elements except the session key and the lists of
* non-collapsing and application capabilities.
*/
*enroll_request_message = Enroll_Request_Message;
if (Session_Key_Data != NULL)
{
/*
* Set the pointer to the session key structure.
*/
enroll_request_message->session_key = (PGCCSessionKey)memory;
/*
* Move the memory pointer past the session key structure.
*/
memory += ROUNDTOBOUNDARY(sizeof(GCCSessionKey));
/*
* Retrieve the session key data from the internal CSessKeyContainer
* object. It will serialize the necessary data into memory and return
* the amount of data written.
*/
data_length = Session_Key_Data->GetGCCSessionKeyData (
enroll_request_message->session_key, memory);
total_data_length = data_length + ROUNDTOBOUNDARY(sizeof(GCCSessionKey));
/*
* Move the memory pointer past the session key data.
*/
memory += data_length;
Session_Key_Data->UnLockSessionKeyData();
}
else
{
enroll_request_message->session_key = NULL;
}
/*
* Retrieve the non-collapsing capabilities data from the internal
* CNonCollAppCap object. It will serialize the necessary data
* into memory and return the amount of memory written.
*/
if (Non_Collapsing_Caps_Data != NULL)
{
data_length = Non_Collapsing_Caps_Data->GetGCCNonCollapsingCapsList (
&enroll_request_message->non_collapsed_caps_list,
memory);
total_data_length += data_length;
/*
* Move the memory pointer past the non-collapsing capabilities and the
* associated data.
*/
memory += data_length;
Non_Collapsing_Caps_Data->UnLockCapabilityData();
}
else
{
enroll_request_message->non_collapsed_caps_list = NULL;
}
if (Application_Capability_Data != NULL)
{
/*
* Retrieve the application capabilities from the internal
* CAppCap object. It will serialize the necessary data
* into memory and return the amount of memory written.
*/
total_data_length += Application_Capability_Data->
GetGCCApplicationCapabilityList(
&app_capability_data_length,
&enroll_request_message->collapsed_caps_list,
memory);
Application_Capability_Data->UnLockCapabilityData();
}
diagprint1("AppEnrollReqData: Serialized %ld bytes", total_data_length);
return (total_data_length);
}
/*
* Deserialize ()
*
* Public Function Description
* This routine is used to retrieve an ApplicationEnrollRequest message
* after it has been passed through shared memory.
*/
void ApplicationEnrollRequestData::Deserialize(
PApplicationEnrollRequestMessage enroll_request_message)
{
/*
* The internal structure contains the enroll request data with the pointers
* addressing the correct locations in memory so just copy the structure
* into the output parameter.
*/
*enroll_request_message = Enroll_Request_Message;
}