|
|
/******************************************************************************
* * 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; }
|