Commit 1928c7c4 authored by Hans Leidekker's avatar Hans Leidekker Committed by Alexandre Julliard

snmpapi: Implement SnmpUtilAsnAny{Cpy,Free}.

parent 71a2f4d1
/*
* Stub implementation of SNMPAPI.DLL
* Implementation of SNMPAPI.DLL
*
* Copyright 2002 Patrik Stridvall
* Copyright 2007 Hans Leidekker
......@@ -31,6 +31,85 @@
WINE_DEFAULT_DEBUG_CHANNEL(snmpapi);
static INT asn_any_copy(AsnAny *dst, AsnAny *src)
{
memset(dst, 0, sizeof(AsnAny));
switch (src->asnType)
{
case ASN_INTEGER32: dst->asnValue.number = src->asnValue.number; break;
case ASN_UNSIGNED32: dst->asnValue.unsigned32 = src->asnValue.unsigned32; break;
case ASN_COUNTER64: dst->asnValue.counter64 = src->asnValue.counter64; break;
case ASN_COUNTER32: dst->asnValue.counter = src->asnValue.counter; break;
case ASN_GAUGE32: dst->asnValue.gauge = src->asnValue.gauge; break;
case ASN_TIMETICKS: dst->asnValue.ticks = src->asnValue.ticks; break;
case ASN_OCTETSTRING:
case ASN_BITS:
case ASN_SEQUENCE:
case ASN_IPADDRESS:
case ASN_OPAQUE:
{
BYTE *stream;
UINT length = src->asnValue.string.length;
if (!(stream = HeapAlloc(GetProcessHeap(), 0, length))) return SNMPAPI_ERROR;
dst->asnValue.string.stream = stream;
dst->asnValue.string.length = length;
dst->asnValue.string.dynamic = TRUE;
break;
}
case ASN_OBJECTIDENTIFIER:
{
UINT *ids, i, size = src->asnValue.object.idLength * sizeof(UINT);
if (!(ids = HeapAlloc(GetProcessHeap(), 0, size))) return SNMPAPI_ERROR;
dst->asnValue.object.ids = ids;
dst->asnValue.object.idLength = src->asnValue.object.idLength;
for (i = 0; i < dst->asnValue.object.idLength; i++)
dst->asnValue.object.ids[i] = src->asnValue.object.ids[i];
break;
}
default:
{
WARN("unknown ASN type: %d\n", src->asnType);
return SNMPAPI_ERROR;
}
}
dst->asnType = src->asnType;
return SNMPAPI_NOERROR;
}
static void asn_any_free(AsnAny *any)
{
switch (any->asnType)
{
case ASN_OCTETSTRING:
case ASN_BITS:
case ASN_SEQUENCE:
case ASN_IPADDRESS:
case ASN_OPAQUE:
{
if (any->asnValue.string.dynamic)
{
HeapFree(GetProcessHeap(), 0, any->asnValue.string.stream);
any->asnValue.string.stream = NULL;
}
break;
}
case ASN_OBJECTIDENTIFIER:
{
HeapFree(GetProcessHeap(), 0, any->asnValue.object.ids);
any->asnValue.object.ids = NULL;
break;
}
default: break;
}
any->asnType = ASN_NULL;
}
/***********************************************************************
* DllMain for SNMPAPI
*/
......@@ -82,6 +161,24 @@ void WINAPI SnmpUtilMemFree(LPVOID mem)
}
/***********************************************************************
* SnmpUtilAsnAnyCpy (SNMPAPI.@)
*/
INT WINAPI SnmpUtilAsnAnyCpy(AsnAny *dst, AsnAny *src)
{
TRACE("(%p, %p)\n", dst, src);
return asn_any_copy(dst, src);
}
/***********************************************************************
* SnmpUtilAsnAnyFree (SNMPAPI.@)
*/
void WINAPI SnmpUtilAsnAnyFree(AsnAny *any)
{
TRACE("(%p)\n", any);
asn_any_free(any);
}
/***********************************************************************
* SnmpUtilOidCpy (SNMPAPI.@)
*/
INT WINAPI SnmpUtilOidCpy(AsnObjectIdentifier *dst, AsnObjectIdentifier *src)
......@@ -126,67 +223,25 @@ INT WINAPI SnmpUtilVarBindCpy(SnmpVarBind *dst, SnmpVarBind *src)
TRACE("(%p, %p)\n", dst, src);
if (!(dst = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SnmpVarBind))))
return SNMPAPI_ERROR;
size = src->name.idLength * sizeof(UINT);
if (!(dst->name.ids = HeapAlloc(GetProcessHeap(), 0, size))) goto error;
for (i = 0; i < src->name.idLength; i++) dst->name.ids[i] = src->name.ids[i];
dst->name.idLength = src->name.idLength;
dst->value.asnType = src->value.asnType;
switch (dst->value.asnType)
if (!dst) return SNMPAPI_ERROR;
if (!src)
{
case ASN_INTEGER32: dst->value.asnValue.number = src->value.asnValue.number; break;
case ASN_UNSIGNED32: dst->value.asnValue.unsigned32 = src->value.asnValue.unsigned32; break;
case ASN_COUNTER64: dst->value.asnValue.counter64 = src->value.asnValue.counter64; break;
case ASN_COUNTER32: dst->value.asnValue.counter = src->value.asnValue.counter; break;
case ASN_GAUGE32: dst->value.asnValue.gauge = src->value.asnValue.gauge; break;
case ASN_TIMETICKS: dst->value.asnValue.ticks = src->value.asnValue.ticks; break;
case ASN_OCTETSTRING:
case ASN_BITS:
case ASN_SEQUENCE:
case ASN_IPADDRESS:
case ASN_OPAQUE:
{
BYTE *stream;
UINT length = src->value.asnValue.string.length;
if (!(stream = HeapAlloc(GetProcessHeap(), 0, length)))
goto error;
dst->value.asnValue.string.stream = stream;
dst->value.asnValue.string.length = length;
dst->value.asnValue.string.dynamic = TRUE;
break;
dst->value.asnType = ASN_NULL;
return SNMPAPI_NOERROR;
}
case ASN_OBJECTIDENTIFIER:
{
UINT *ids, size = src->name.idLength * sizeof(UINT);
if (!(ids = HeapAlloc(GetProcessHeap(), 0, size)))
goto error;
size = src->name.idLength * sizeof(UINT);
if (!(dst->name.ids = HeapAlloc(GetProcessHeap(), 0, size))) return SNMPAPI_ERROR;
dst->value.asnValue.object.ids = ids;
dst->value.asnValue.object.idLength = src->value.asnValue.object.idLength;
for (i = 0; i < src->name.idLength; i++) dst->name.ids[i] = src->name.ids[i];
dst->name.idLength = src->name.idLength;
for (i = 0; i < dst->value.asnValue.object.idLength; i++)
dst->value.asnValue.object.ids[i] = src->value.asnValue.object.ids[i];
break;
}
default:
if (!asn_any_copy(&dst->value, &src->value))
{
WARN("unknown ASN type: %d\n", src->value.asnType);
break;
}
HeapFree(GetProcessHeap(), 0, dst->name.ids);
return SNMPAPI_ERROR;
}
return SNMPAPI_NOERROR;
error:
HeapFree(GetProcessHeap(), 0, dst->name.ids);
HeapFree(GetProcessHeap(), 0, dst);
return SNMPAPI_ERROR;
}
/***********************************************************************
......@@ -196,28 +251,12 @@ void WINAPI SnmpUtilVarBindFree(SnmpVarBind *vb)
{
TRACE("(%p)\n", vb);
switch (vb->value.asnType)
{
case ASN_OCTETSTRING:
case ASN_BITS:
case ASN_SEQUENCE:
case ASN_IPADDRESS:
case ASN_OPAQUE:
{
if (vb->value.asnValue.string.dynamic)
HeapFree(GetProcessHeap(), 0, vb->value.asnValue.string.stream);
break;
}
case ASN_OBJECTIDENTIFIER:
{
HeapFree(GetProcessHeap(), 0, vb->value.asnValue.object.ids);
break;
}
default: break;
}
if (!vb) return;
asn_any_free(&vb->value);
HeapFree(GetProcessHeap(), 0, vb->name.ids);
HeapFree(GetProcessHeap(), 0, vb);
vb->name.idLength = 0;
vb->name.ids = NULL;
}
/***********************************************************************
......
......@@ -18,8 +18,8 @@
@ stub SnmpSvcSetLogLevel
@ stub SnmpSvcSetLogType
@ stub SnmpUtilAnsiToUnicode
@ stub SnmpUtilAsnAnyCpy
@ stub SnmpUtilAsnAnyFree
@ stdcall SnmpUtilAsnAnyCpy(ptr ptr)
@ stdcall SnmpUtilAsnAnyFree(ptr)
@ stub SnmpUtilDbgPrint
@ stub SnmpUtilIdsToA
@ stdcall SnmpUtilMemAlloc(long)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment