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