Hans Leidekker : snmpapi: Implement SnmpUtilAsnAny{Cpy,Free}.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jan 22 07:05:32 CST 2007
Module: wine
Branch: master
Commit: 1928c7c4c0fd2f390a10a2219f8eee0e0dd7621f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1928c7c4c0fd2f390a10a2219f8eee0e0dd7621f
Author: Hans Leidekker <hans at 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)
More information about the wine-cvs
mailing list