Alistair Leslie-Hughes : dpnet: Implement IDirectPlay8Address GetComponentByIndex.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jun 9 08:25:53 CDT 2015
Module: wine
Branch: master
Commit: 4f15cc4d1a41e81bcb146908fc04b4f6dd9ffa11
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4f15cc4d1a41e81bcb146908fc04b4f6dd9ffa11
Author: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date: Thu Nov 27 15:57:44 2014 +1100
dpnet: Implement IDirectPlay8Address GetComponentByIndex.
---
dlls/dpnet/address.c | 66 +++++++++++++++++++++++++++++++++++++++++++---
dlls/dpnet/tests/address.c | 37 ++++++++++++++++++++------
2 files changed, 92 insertions(+), 11 deletions(-)
diff --git a/dlls/dpnet/address.c b/dlls/dpnet/address.c
index 7e10136..7a33f8a 100644
--- a/dlls/dpnet/address.c
+++ b/dlls/dpnet/address.c
@@ -405,9 +405,69 @@ static HRESULT WINAPI IDirectPlay8AddressImpl_GetComponentByIndex(IDirectPlay8Ad
const DWORD dwComponentID, WCHAR *pwszName, DWORD *pdwNameLen, void *pvBuffer,
DWORD *pdwBufferSize, DWORD *pdwDataType)
{
- IDirectPlay8AddressImpl *This = impl_from_IDirectPlay8Address(iface);
- TRACE("(%p): stub\n", This);
- return DPN_OK;
+ IDirectPlay8AddressImpl *This = impl_from_IDirectPlay8Address(iface);
+ struct component *entry;
+ int namesize;
+
+ TRACE("(%p)->(%u %p %p %p %p %p)\n", This, dwComponentID, pwszName, pdwNameLen, pvBuffer, pdwBufferSize, pdwDataType);
+
+ if(!pdwNameLen || !pdwBufferSize || !pdwDataType)
+ {
+ WARN("Invalid buffer (%p, %p, %p)\n", pdwNameLen, pdwBufferSize, pdwDataType);
+ return DPNERR_INVALIDPOINTER;
+ }
+
+ if(dwComponentID > This->comp_count)
+ {
+ WARN("dwComponentID out of range\n");
+ return DPNERR_DOESNOTEXIST;
+ }
+
+ entry = This->components[dwComponentID];
+
+ namesize = strlenW(entry->name);
+ if(*pdwBufferSize < entry->size || *pdwNameLen < namesize)
+ {
+ WARN("Buffer too small\n");
+
+ *pdwNameLen = namesize + 1;
+ *pdwBufferSize = entry->size;
+ *pdwDataType = entry->type;
+ return DPNERR_BUFFERTOOSMALL;
+ }
+
+ if(!pwszName || !pvBuffer)
+ {
+ WARN("Invalid buffer (%p, %p)\n", pwszName, pvBuffer);
+ return DPNERR_INVALIDPOINTER;
+ }
+
+ lstrcpyW(pwszName, entry->name);
+
+ *pdwNameLen = namesize + 1;
+ *pdwBufferSize = entry->size;
+ *pdwDataType = entry->type;
+
+ switch (entry->type)
+ {
+ case DPNA_DATATYPE_DWORD:
+ *(DWORD*)pvBuffer = entry->data.value;
+ break;
+ case DPNA_DATATYPE_GUID:
+ *(GUID*)pvBuffer = entry->data.guid;
+ break;
+ case DPNA_DATATYPE_STRING:
+ memcpy(pvBuffer, entry->data.string, entry->size);
+ break;
+ case DPNA_DATATYPE_STRING_ANSI:
+ memcpy(pvBuffer, entry->data.ansi, entry->size);
+ break;
+ case DPNA_DATATYPE_BINARY:
+ memcpy(pvBuffer, entry->data.binary, entry->size);
+ break;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI IDirectPlay8AddressImpl_AddComponent(IDirectPlay8Address *iface,
diff --git a/dlls/dpnet/tests/address.c b/dlls/dpnet/tests/address.c
index 077f99e..ee589f5 100644
--- a/dlls/dpnet/tests/address.c
+++ b/dlls/dpnet/tests/address.c
@@ -87,6 +87,7 @@ static void address_addcomponents(void)
DWORD bufflen = 0;
DWORD port = 8888;
WCHAR buffer[256];
+ WCHAR *name = NULL;
/* We can add any Component to the Address interface not just the predefined ones. */
hr = IDirectPlay8Address_AddComponent(localaddr, UNKNOWN, &IID_Random, sizeof(GUID), DPNA_DATATYPE_GUID);
@@ -175,25 +176,45 @@ static void address_addcomponents(void)
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IDirectPlay8Address_GetComponentByIndex(localaddr, 100, NULL, &namelen, NULL, &bufflen, &type);
- todo_wine ok(hr == DPNERR_DOESNOTEXIST, "got 0x%08x\n", hr);
+ ok(hr == DPNERR_DOESNOTEXIST, "got 0x%08x\n", hr);
+
+ hr = IDirectPlay8Address_GetComponentByIndex(localaddr, 1, NULL, &namelen, NULL, &bufflen, NULL);
+ ok(hr == DPNERR_INVALIDPOINTER, "got 0x%08x\n", hr);
+
+ bufflen = 100;
+ namelen = 0;
+ hr = IDirectPlay8Address_GetComponentByIndex(localaddr, 1, name, &namelen, buffer, &bufflen, &type);
+ ok(hr == DPNERR_BUFFERTOOSMALL, "got 0x%08x\n", hr);
+
+ namelen = 100;
+ hr = IDirectPlay8Address_GetComponentByIndex(localaddr, 1, NULL, &namelen, NULL, &bufflen, &type);
+ ok(hr == DPNERR_INVALIDPOINTER, "got 0x%08x\n", hr);
hr = IDirectPlay8Address_GetComponentByIndex(localaddr, 100, NULL, NULL, NULL, &bufflen, &type);
- todo_wine ok(hr == E_POINTER, "got 0x%08x\n", hr);
+ ok(hr == DPNERR_INVALIDPOINTER, "got 0x%08x\n", hr);
hr = IDirectPlay8Address_GetComponentByIndex(localaddr, 100, NULL, &namelen, NULL, NULL, &type);
- todo_wine ok(hr == E_POINTER, "got 0x%08x\n", hr);
+ ok(hr == DPNERR_INVALIDPOINTER, "got 0x%08x\n", hr);
+
+ bufflen = 0;
+ namelen = 0;
+ type = 0;
+ hr = IDirectPlay8Address_GetComponentByIndex(localaddr, 0, NULL, &namelen, NULL, &bufflen, &type);
+ ok(hr == DPNERR_BUFFERTOOSMALL, "got 0x%08x\n", hr);
+ ok(namelen == 8, "namelen expected 8 got %d\n", namelen);
+ ok(bufflen == 16, "bufflen expected 16 got %d\n", bufflen);
+ ok(type == DPNA_DATATYPE_GUID, "type expected DPNA_DATATYPE_GUID got %d\n", type);
trace("GetNumComponents=%d\n", components);
for(i=0; i < components; i++)
{
- WCHAR *name;
void *buffer;
bufflen = 0;
namelen = 0;
hr = IDirectPlay8Address_GetComponentByIndex(localaddr, i, NULL, &namelen, NULL, &bufflen, &type);
- todo_wine ok(hr == DPNERR_BUFFERTOOSMALL, "got 0x%08x\n", hr);
+ ok(hr == DPNERR_BUFFERTOOSMALL, "got 0x%08x\n", hr);
name = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, namelen * sizeof(WCHAR));
buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bufflen);
@@ -258,14 +279,14 @@ static void address_setsp(void)
ok(components == 1, "components=%d\n", components);
hr = IDirectPlay8Address_GetComponentByIndex(localaddr, 0, NULL, &namelen, NULL, &bufflen, &type);
- todo_wine ok(hr == DPNERR_BUFFERTOOSMALL, "got 0x%08x\n", hr);
+ ok(hr == DPNERR_BUFFERTOOSMALL, "got 0x%08x\n", hr);
name = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, namelen * sizeof(WCHAR));
hr = IDirectPlay8Address_GetComponentByIndex(localaddr, 0, name, &namelen, (void*)&guid, &bufflen, &type);
ok(hr == S_OK, "got 0x%08x\n", hr);
- todo_wine ok(type == DPNA_DATATYPE_GUID, "wrong datatype: %d\n", type);
- todo_wine ok(IsEqualGUID(&guid, &CLSID_DP8SP_TCPIP), "wrong guid\n");
+ ok(type == DPNA_DATATYPE_GUID, "wrong datatype: %d\n", type);
+ ok(IsEqualGUID(&guid, &CLSID_DP8SP_TCPIP), "wrong guid\n");
HeapFree(GetProcessHeap(), 0, name);
More information about the wine-cvs
mailing list