dect
/
asterisk
Archived
13
0
Fork 0
This repository has been archived on 2022-02-17. You can view files and clone it, but cannot push or open issues or pull requests.
asterisk/addons/ooh323c/src/context.c

141 lines
3.5 KiB
C

/*
* Copyright (C) 1997-2005 by Objective Systems, Inc.
*
* This software is furnished under an open source license and may be
* used and copied only in accordance with the terms of this license.
* The text of the license may generally be found in the root
* directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
* Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
#include "ooasn1.h"
#include <stdlib.h>
int initContext (OOCTXT* pctxt)
{
memset (pctxt, 0, sizeof(OOCTXT));
memHeapCreate (&pctxt->pTypeMemHeap);
pctxt->pMsgMemHeap = pctxt->pTypeMemHeap;
memHeapAddRef (&pctxt->pMsgMemHeap);
return ASN_OK;
}
int initContextBuffer
(OOCTXT* pctxt, const ASN1OCTET* bufaddr, ASN1UINT bufsiz)
{
if (bufaddr == 0) {
/* dynamic buffer */
if (bufsiz == 0) bufsiz = ASN_K_ENCBUFSIZ;
pctxt->buffer.data = (ASN1OCTET*)
memHeapAlloc (&pctxt->pMsgMemHeap, bufsiz);
if (!pctxt->buffer.data) return ASN_E_NOMEM;
pctxt->buffer.size = bufsiz;
pctxt->buffer.dynamic = TRUE;
}
else {
/* static buffer */
pctxt->buffer.data = (ASN1OCTET*) bufaddr;
pctxt->buffer.size = bufsiz;
pctxt->buffer.dynamic = FALSE;
}
pctxt->buffer.byteIndex = 0;
pctxt->buffer.bitOffset = 8;
return ASN_OK;
}
int initSubContext (OOCTXT* pctxt, OOCTXT* psrc)
{
int stat = ASN_OK;
memset (pctxt, 0, sizeof(OOCTXT));
pctxt->pTypeMemHeap = psrc->pTypeMemHeap;
memHeapAddRef (&pctxt->pTypeMemHeap);
pctxt->pMsgMemHeap = psrc->pMsgMemHeap;
memHeapAddRef (&pctxt->pMsgMemHeap);
pctxt->flags = psrc->flags;
pctxt->buffer.dynamic = TRUE;
pctxt->buffer.byteIndex = 0;
pctxt->buffer.bitOffset = 8;
return stat;
}
void freeContext (OOCTXT* pctxt)
{
ASN1BOOL saveBuf = (pctxt->flags & ASN1SAVEBUF) != 0;
if (pctxt->buffer.dynamic && pctxt->buffer.data) {
if (saveBuf) {
memHeapMarkSaved (&pctxt->pMsgMemHeap, pctxt->buffer.data, TRUE);
}
else {
memHeapFreePtr (&pctxt->pMsgMemHeap, pctxt->buffer.data);
}
}
errFreeParms (&pctxt->errInfo);
memHeapRelease (&pctxt->pTypeMemHeap);
memHeapRelease (&pctxt->pMsgMemHeap);
}
void copyContext (OOCTXT* pdest, OOCTXT* psrc)
{
memcpy (&pdest->buffer, &psrc->buffer, sizeof(ASN1BUFFER));
pdest->flags = psrc->flags;
}
void setCtxtFlag (OOCTXT* pctxt, ASN1USINT mask)
{
pctxt->flags |= mask;
}
void clearCtxtFlag (OOCTXT* pctxt, ASN1USINT mask)
{
pctxt->flags &= ~mask;
}
int setPERBufferUsingCtxt (OOCTXT* pTarget, OOCTXT* pSource)
{
int stat = initContextBuffer
(pTarget, pSource->buffer.data, pSource->buffer.size);
if (ASN_OK == stat) {
pTarget->buffer.byteIndex = pSource->buffer.byteIndex;
pTarget->buffer.bitOffset = pSource->buffer.bitOffset;
}
return stat;
}
int setPERBuffer (OOCTXT* pctxt,
ASN1OCTET* bufaddr, ASN1UINT bufsiz, ASN1BOOL aligned)
{
int stat = initContextBuffer (pctxt, bufaddr, bufsiz);
if(stat != ASN_OK) return stat;
return ASN_OK;
}
OOCTXT* newContext ()
{
OOCTXT* pctxt = (OOCTXT*) ASN1CRTMALLOC0 (sizeof(OOCTXT));
if (pctxt) {
if (initContext(pctxt) != ASN_OK) {
ASN1CRTFREE0 (pctxt);
pctxt = 0;
}
pctxt->flags |= ASN1DYNCTXT;
}
return (pctxt);
}