diff options
Diffstat (limited to 'addons/ooh323c/src/context.c')
-rw-r--r-- | addons/ooh323c/src/context.c | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/addons/ooh323c/src/context.c b/addons/ooh323c/src/context.c new file mode 100644 index 000000000..d243f88a0 --- /dev/null +++ b/addons/ooh323c/src/context.c @@ -0,0 +1,140 @@ +/* + * 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); +} |