windows-nt/Source/XPSP1/NT/enduser/netmeeting/av/callcont/h245pdu.c
2020-09-26 16:20:57 +08:00

259 lines
6.5 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******************************************************************************
*
* File: h245send.c
*
* INTEL Corporation Proprietary Information
* Copyright (c) 1994, 1995, 1996 Intel Corporation.
*
* This listing is supplied under the terms of a license agreement
* with INTEL Corporation and may not be used, copied, nor disclosed
* except in accordance with the terms of that agreement.
*
*****************************************************************************/
/******************************************************************************
*
* $Workfile: h245asn.c $
* $Revision: 1.4 $
* $Modtime: 17 Jan 1997 14:31:20 $
* $Log: S:\sturgeon\src\h245\src\vcs\h245asn.c_v $
*
* Rev 1.2 28 May 1996 14:25:22 EHOWARDX
* Tel Aviv update.
*
* Rev 1.1 21 May 1996 13:39:28 EHOWARDX
* Added LOGGING switch to log PDUs to the file H245.OUT.
* Add /D "LOGGING" to project options to enable this feature.
*
* Rev 1.0 09 May 1996 21:06:20 EHOWARDX
* Initial revision.
*
* Rev 1.5.1.2 09 May 1996 19:34:44 EHOWARDX
* Redesigned locking logic.
* Simplified link API.
*
* Rev 1.5.1.0 23 Apr 1996 14:42:44 EHOWARDX
* Added check for ASN.1 initialized.
*
* Rev 1.5 13 Mar 1996 11:33:06 DABROWN1
* Enable logging for ring0
*
* Rev 1.4 07 Mar 1996 23:20:14 dabrown1
*
* Modifications required for ring0/ring3 compatiblity
*
* Rev 1.3 06 Mar 1996 13:13:52 DABROWN1
*
* added #define _DLL for SPOX build
*
* Rev 1.2 23 Feb 1996 13:54:42 DABROWN1
*
* added tracing functions
*
* Rev 1.1 21 Feb 1996 16:52:08 DABROWN1
*
* Removed call to h245_asn1free, now uses generic MemFree
*
* Rev 1.0 09 Feb 1996 17:35:20 cjutzi
* Initial revision.
*
*****************************************************************************/
#ifndef STRICT
#define STRICT
#endif
/***********************/
/* SYSTEM INCLUDES */
/***********************/
#include <stdlib.h>
#include <stddef.h>
#include <limits.h>
#include "precomp.h"
/***********************/
/* H245 INCLUDES */
/***********************/
#ifdef _IA_SPOX_
# define _DLL
#endif //_IA_SPOX_
#include "h245asn1.h"
#include "h245sys.x"
#include "sendrcv.x"
#include "h245com.h"
/***********************/
/* ASN1 INCLUDES */
/***********************/
/***********************/
/* S/R GLOBALS */
/***********************/
#ifdef _IA_SPOX_
# define MAKELONG(a, b) ((LONG)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16))
# define HWND void*
# undef _DLL
#endif //_IA_SPOX
#define ASN1_FLAGS 0
int initializeASN1(ASN1_CODER_INFO *pWorld)
{
int nResult;
nResult = H245_InitWorld(pWorld);
return (MAKELONG(nResult, 0));
}
int terminateASN1(ASN1_CODER_INFO *pWorld)
{
H245_TermWorld(pWorld);
H245TRACE(0, 10, "Unloading ASN.1 libraries", 0);
return 0;
}
// THE FOLLOWING IS ADDED FOR TELES ASN.1 INTEGRATION
int H245_InitModule(void)
{
H245ASN_Module_Startup();
return (H245ASN_Module != NULL) ? ASN1_SUCCESS : ASN1_ERR_MEMORY;
}
int H245_TermModule(void)
{
H245ASN_Module_Cleanup();
return ASN1_SUCCESS;
}
int H245_InitWorld(ASN1_CODER_INFO *pWorld)
{
int rc;
ZeroMemory(pWorld, sizeof(*pWorld));
if (H245ASN_Module == NULL)
{
return ASN1_ERR_BADARGS;
}
rc = ASN1_CreateEncoder(
H245ASN_Module, // ptr to mdule
&(pWorld->pEncInfo), // ptr to encoder info
NULL, // buffer ptr
0, // buffer size
NULL); // parent ptr
if (rc == ASN1_SUCCESS)
{
ASSERT(pWorld->pEncInfo != NULL);
rc = ASN1_CreateDecoder(
H245ASN_Module, // ptr to mdule
&(pWorld->pDecInfo), // ptr to decoder info
NULL, // buffer ptr
0, // buffer size
NULL); // parent ptr
ASSERT(pWorld->pDecInfo != NULL);
}
if (rc != ASN1_SUCCESS)
{
H245_TermWorld(pWorld);
}
return rc;
}
int H245_TermWorld(ASN1_CODER_INFO *pWorld)
{
if (H245ASN_Module == NULL)
{
return ASN1_ERR_BADARGS;
}
ASN1_CloseEncoder(pWorld->pEncInfo);
ASN1_CloseDecoder(pWorld->pDecInfo);
ZeroMemory(pWorld, sizeof(*pWorld));
return ASN1_SUCCESS;
}
int H245_Encode(ASN1_CODER_INFO *pWorld, void *pStruct, int nPDU, ASN1_BUF *pBuf)
{
int rc;
ASN1encoding_t pEncInfo = pWorld->pEncInfo;
BOOL fBufferSupplied = (pBuf->value != NULL) && (pBuf->length != 0);
DWORD dwFlags = fBufferSupplied ? ASN1ENCODE_SETBUFFER : ASN1ENCODE_ALLOCATEBUFFER;
// clean up out parameters
if (! fBufferSupplied)
{
pBuf->length = 0;
pBuf->value = NULL;
}
rc = ASN1_Encode(
pEncInfo, // ptr to encoder info
pStruct, // pdu data structure
nPDU, // pdu id
dwFlags, // flags
pBuf->value, // buffer
pBuf->length); // buffer size if provided
if (ASN1_SUCCEEDED(rc))
{
if (fBufferSupplied)
{
ASSERT(pBuf->value == pEncInfo->buf);
ASSERT(pBuf->length >= pEncInfo->len);
}
else
{
pBuf->value = pEncInfo->buf; // buffer to encode into
}
pBuf->length = pEncInfo->len; // len of encoded data in buffer
}
else
{
ASSERT(FALSE);
}
return rc;
}
int H245_Decode(ASN1_CODER_INFO *pWorld, void **ppStruct, int nPDU, ASN1_BUF *pBuf)
{
ASN1decoding_t pDecInfo = pWorld->pDecInfo;
BYTE *pEncoded = pBuf->value;
ULONG cbEncodedSize = pBuf->length;
int rc = ASN1_Decode(
pDecInfo, // ptr to encoder info
ppStruct, // pdu data structure
nPDU, // pdu id
ASN1DECODE_SETBUFFER, // flags
pEncoded, // do not provide buffer
cbEncodedSize); // buffer size if provided
if (ASN1_SUCCEEDED(rc))
{
ASSERT(pDecInfo->pos > pDecInfo->buf);
pBuf->length -= (ULONG)(pDecInfo->pos - pDecInfo->buf);
pBuf->value = pDecInfo->pos;
}
else
{
ASSERT(FALSE);
*ppStruct = NULL;
}
return rc;
}