Module: wine Branch: master Commit: 1928c7c4c0fd2f390a10a2219f8eee0e0dd7621f URL: http://source.winehq.org/git/wine.git/?a=commit;h=1928c7c4c0fd2f390a10a2219f...
Author: Hans Leidekker hans@it.vu.nl Date: Mon Jan 22 11:05:49 2007 +0100
snmpapi: Implement SnmpUtilAsnAny{Cpy,Free}.
---
dlls/snmpapi/main.c | 187 +++++++++++++++++++++++++++------------------ dlls/snmpapi/snmpapi.spec | 4 +- 2 files changed, 115 insertions(+), 76 deletions(-)
diff --git a/dlls/snmpapi/main.c b/dlls/snmpapi/main.c index 16d9b30..163477b 100644 --- a/dlls/snmpapi/main.c +++ b/dlls/snmpapi/main.c @@ -1,5 +1,5 @@ /* - * 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(SnmpVarBin
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(SnmpVarB { 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; }
/*********************************************************************** diff --git a/dlls/snmpapi/snmpapi.spec b/dlls/snmpapi/snmpapi.spec index e6a8084..006c8b3 100644 --- a/dlls/snmpapi/snmpapi.spec +++ b/dlls/snmpapi/snmpapi.spec @@ -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)