windows-nt/Source/XPSP1/NT/enduser/netmeeting/t120/mst120/cnpcoder.cpp

199 lines
5.6 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include "precomp.h"
DEBUG_FILEZONE(ZONE_T120_MSMCSTCP);
/*
* cnpcoder.cpp
*
* Copyright (c) 1999 by Microsoft Corporation
*
* Abstract:
* This is the implementation file for the CCNPCoder class. This class
* is responsible for encoding and decoding CNP (T.123 annex B) PDU's using ASN.1
* encoding rules via the ASN.1 toolkit. This class is also capable
* of determining the size of both the encoded and decoded PDU's.
*
* Static Variables:
*
* Caveats:
* Only one instance of this class should be in existance at any one time
* due to the static variable.
*
* Author:
* Xin Liu
*/
/*
* External Interfaces
*/
#include <string.h>
#include "cnpcoder.h"
/*
* This is a global variable that has a pointer to the one CNP coder
*/
CCNPCoder *g_CNPCoder = NULL;
/*
* CCNPCoder ()
*
* Public
*
* Functional Description:
* This is the constructor for the CCNPCoder class. It initializes
* the ASN.1 encoder/decoder and sets the encoding rules to the
* Packed-Aligned variant.
*/
CCNPCoder::CCNPCoder ()
:m_pEncInfo(NULL),
m_pDecInfo(NULL)
{
}
BOOL CCNPCoder::Init ( void )
{
BOOL fRet = FALSE;
CNPPDU_Module_Startup();
if (CNPPDU_Module != NULL)
{
if (ASN1_CreateEncoder(
CNPPDU_Module, // ptr to mdule
&m_pEncInfo, // ptr to encoder info
NULL, // buffer ptr
0, // buffer size
NULL) // parent ptr
== ASN1_SUCCESS)
{
ASSERT(m_pEncInfo != NULL);
fRet = (ASN1_CreateDecoder(CNPPDU_Module, // ptr to mdule
&m_pDecInfo, // ptr to decoder info
NULL, // buffer ptr
0, // buffer size
NULL) // parent ptr
== ASN1_SUCCESS);
ASSERT(fRet && m_pDecInfo != NULL);
}
}
ASSERT(fRet);
return fRet;
}
/*
* ~CCNPCoder ()
*
* Public Functional Description:
* This is a virtual destructor. It is used to clean up after ASN.1.
*/
CCNPCoder::~CCNPCoder ()
{
if (CNPPDU_Module != NULL)
{
ASN1_CloseEncoder(m_pEncInfo);
ASN1_CloseDecoder(m_pDecInfo);
CNPPDU_Module_Cleanup();
}
}
/*
* Encode ()
*
* Public Functional Description:
* This function encodes CNP Protocol Data Units (PDU's) into ASN.1
* compliant byte streams using the ASN.1 toolkit.
* The coder allocates the buffer space for the encoded data.
*/
BOOL CCNPCoder::Encode(LPVOID pdu_structure,
int pdu_type,
UINT nEncodingRule_not_used,
LPBYTE *encoding_buffer,
UINT *encoding_buffer_length)
{
BOOL fRet = FALSE;
int return_value;
return_value = ASN1_Encode(m_pEncInfo, // ptr to encoder info
pdu_structure, // pdu data structure
pdu_type, // pdu id
ASN1ENCODE_ALLOCATEBUFFER, // flags
NULL, // do not provide buffer
0); // buffer size if provided
if (ASN1_FAILED(return_value))
{
ERROR_OUT(("CCNPCoder::Encode: ASN1_Encode failed, err=%d .",
return_value));
ASSERT(FALSE);
fRet = FALSE;
goto MyExit;
}
ASSERT(return_value == ASN1_SUCCESS);
fRet = TRUE;
// len of encoded data in buffer
*encoding_buffer_length = m_pEncInfo->len;
// buffer to encode into
*encoding_buffer = m_pEncInfo->buf;
MyExit:
return fRet;
}
/*
* Decode ()
*
* Public Functional Description:
* This function decodes ASN.1 compliant byte streams into the
* appropriate CNP PDU structures using the ASN.1 toolkit.
*/
BOOL CCNPCoder::Decode(LPBYTE encoded_buffer,
UINT encoded_buffer_length,
int pdu_type,
UINT nEncodingRule_not_used,
LPVOID *pdecoding_buffer,
UINT *pdecoding_buffer_length)
{
BOOL fRet = FALSE;
int return_value;
ASN1optionparam_s OptParam;
return_value = ASN1_Decode(m_pDecInfo, // ptr to decoder info
pdecoding_buffer, // destination buffer
pdu_type, // pdu type
ASN1DECODE_SETBUFFER, // flags
encoded_buffer, // source buffer
encoded_buffer_length); // source buffer size
if (ASN1_FAILED(return_value))
{
ERROR_OUT(("CNPCoder::Decode: ASN1_Decode failed, err=%d", return_value));
ASSERT(FALSE);
goto MyExit;
}
OptParam.eOption = ASN1OPT_GET_DECODED_BUFFER_SIZE;
return_value = ASN1_GetDecoderOption(m_pDecInfo, &OptParam);
if (ASN1_FAILED(return_value))
{
ERROR_OUT(("CCNPCoder::Decode: ASN1_GetDecoderOption failed, err=%d", return_value));
ASSERT(FALSE);
goto MyExit;
}
*pdecoding_buffer_length = OptParam.cbRequiredDecodedBufSize;
ASSERT(return_value == ASN1_SUCCESS);
ASSERT(*pdecoding_buffer_length > 0);
fRet = TRUE;
MyExit:
return fRet;
}
void CCNPCoder::FreeEncoded (PUChar encoded_buffer)
{
ASN1_FreeEncoded(m_pEncInfo, encoded_buffer);
}
void CCNPCoder::FreeDecoded (int pdu_type, LPVOID decoded_buffer)
{
ASN1_FreeDecoded(m_pDecInfo, decoded_buffer, pdu_type);
}