354 lines
9.3 KiB
C++
354 lines
9.3 KiB
C++
#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;
|
|
}
|
|
|