dpnet: Implement IDirectPlay8Address Duplicate

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Sun Sep 28 23:25:41 CDT 2014


Hi,

Changelog:
       dpnet: Implement IDirectPlay8Address Duplicate


Best Regards
   Alistair Leslie-Hughes
-------------- next part --------------
>From 95d7bc45cb238518c0f5cb7e8d05055e6f9fb2fc Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date: Tue, 13 May 2014 12:57:47 +1000
Subject: [PATCH] Implement IDirectPlay8Address Duplicate
To: wine-patches <wine-patches at winehq.org>

---
 dlls/dpnet/address.c       | 33 ++++++++++++++++++++++++++++++---
 dlls/dpnet/dpnet_private.h |  1 +
 dlls/dpnet/tests/address.c | 39 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 70 insertions(+), 3 deletions(-)

diff --git a/dlls/dpnet/address.c b/dlls/dpnet/address.c
index 2cea1ea..7df7ad6 100644
--- a/dlls/dpnet/address.c
+++ b/dlls/dpnet/address.c
@@ -179,9 +179,35 @@ static HRESULT WINAPI IDirectPlay8AddressImpl_BuildFromURLA(IDirectPlay8Address
 static HRESULT WINAPI IDirectPlay8AddressImpl_Duplicate(IDirectPlay8Address *iface,
         IDirectPlay8Address **ppdpaNewAddress)
 {
-  IDirectPlay8AddressImpl *This = impl_from_IDirectPlay8Address(iface);
-  TRACE("(%p, %p): stub\n", This, ppdpaNewAddress);
-  return DPN_OK; 
+    IDirectPlay8AddressImpl *This = impl_from_IDirectPlay8Address(iface);
+    IDirectPlay8Address *dup;
+    HRESULT hr;
+
+    TRACE("(%p, %p)\n", This, ppdpaNewAddress);
+
+    if(!ppdpaNewAddress)
+        return E_POINTER;
+
+    hr = DPNET_CreateDirectPlay8Address(NULL, NULL, &IID_IDirectPlay8Address, (LPVOID*)&dup);
+    if(hr == S_OK)
+    {
+        IDirectPlay8AddressImpl *DupThis = impl_from_IDirectPlay8Address(dup);
+        struct component *entry;
+
+        DupThis->SP_guid = This->SP_guid;
+        DupThis->init    = This->init;
+
+        LIST_FOR_EACH_ENTRY(entry, &This->components, struct component, entry)
+        {
+            hr = IDirectPlay8Address_AddComponent(dup, entry->name, &entry->data, entry->size, entry->type);
+            if(hr != S_OK)
+                ERR("Failed to copy component: %s - 0x%08x\n", debugstr_w(entry->name), hr);
+        }
+
+        *ppdpaNewAddress = dup;
+    }
+
+    return hr;
 }
 
 static HRESULT WINAPI IDirectPlay8AddressImpl_SetEqual(IDirectPlay8Address *iface,
@@ -338,6 +364,7 @@ static HRESULT WINAPI IDirectPlay8AddressImpl_AddComponent(IDirectPlay8Address *
         list_add_tail(&This->components, &entry->entry);
     }
 
+    entry->size = dwDataSize;
     switch (dwDataType)
     {
         case DPNA_DATATYPE_DWORD:
diff --git a/dlls/dpnet/dpnet_private.h b/dlls/dpnet/dpnet_private.h
index d6f572b..4b1e468 100644
--- a/dlls/dpnet/dpnet_private.h
+++ b/dlls/dpnet/dpnet_private.h
@@ -70,6 +70,7 @@ struct component
 
     WCHAR *name;
     DWORD type;
+    DWORD size;
 
     union
     {
diff --git a/dlls/dpnet/tests/address.c b/dlls/dpnet/tests/address.c
index 4d825bb..430f46c 100644
--- a/dlls/dpnet/tests/address.c
+++ b/dlls/dpnet/tests/address.c
@@ -214,6 +214,44 @@ static void address_setsp(void)
     }
 }
 
+static void address_duplicate(void)
+{
+    HRESULT hr;
+    IDirectPlay8Address *localaddr = NULL;
+    IDirectPlay8Address *duplicate = NULL;
+    DWORD components, dupcomps;
+    GUID  guid = IID_Random;
+
+    hr = CoCreateInstance( &CLSID_DirectPlay8Address, NULL, CLSCTX_ALL, &IID_IDirectPlay8Address, (LPVOID*)&localaddr);
+    ok(hr == S_OK, "Failed to create IDirectPlay8Address object\n");
+    if(SUCCEEDED(hr))
+    {
+        hr = IDirectPlay8Address_SetSP(localaddr, &CLSID_DP8SP_TCPIP);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+
+        hr = IDirectPlay8Address_GetNumComponents(localaddr, &components);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+        ok(components == 1, "components=%d\n", components);
+
+        hr = IDirectPlay8Address_Duplicate(localaddr, &duplicate);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+        if(SUCCEEDED(hr))
+        {
+            hr = IDirectPlay8Address_GetSP(duplicate, &guid);
+            ok(hr == S_OK, "got 0x%08x\n", hr);
+            ok(IsEqualGUID(&guid, &CLSID_DP8SP_TCPIP), "wrong guid\n");
+
+            hr = IDirectPlay8Address_GetNumComponents(duplicate, &dupcomps);
+            ok(hr == S_OK, "got 0x%08x\n", hr);
+            ok(components == dupcomps, "expected %d got %d\n", components, dupcomps);
+
+            IDirectPlay8Address_Release(duplicate);
+        }
+
+        IDirectPlay8Address_Release(localaddr);
+    }
+}
+
 START_TEST(address)
 {
     HRESULT hr;
@@ -226,6 +264,7 @@ START_TEST(address)
     create_directplay_address();
     address_addcomponents();
     address_setsp();
+    address_duplicate();
 
     CoUninitialize();
 }
-- 
1.9.1



More information about the wine-patches mailing list