From: Alistair Leslie-Hughes Subject: dpnet: Implement IDirectPlay8Address GetComponentByIndex (try 5) Message-Id: Date: Fri, 23 Jan 2015 18:10:55 +1100 Hi, Loops variables now use DWORD. Use assignment of memcpy. Since only a few components will be used, may 5 I have left the increment of 1. From the MSDN documentation, there is only a handful of official values but that doesn't programs from adding random ones. Changelog: dpnet: Implement IDirectPlay8Address GetComponentByIndex Best Regards Alistair Leslie-Hughes From 781a4137e9ce0ab44c80c115b95f530d24b2b3ca Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Thu, 27 Nov 2014 15:57:44 +1100 Subject: [PATCH 16/16] Implement IDirectPlay8Address GetComponentByIndex --- dlls/dpnet/address.c | 86 +++++++++++++++++++++++++++++++++++++++------- dlls/dpnet/dpnet_private.h | 3 +- dlls/dpnet/tests/address.c | 14 ++++---- 3 files changed, 83 insertions(+), 20 deletions(-) diff --git a/dlls/dpnet/address.c b/dlls/dpnet/address.c index 2062bc4..4d36dd0 100644 --- a/dlls/dpnet/address.c +++ b/dlls/dpnet/address.c @@ -74,6 +74,17 @@ static char *heap_strdupA( const char *str ) return ret; } +static void add_component(IDirectPlay8AddressImpl *This, struct component *item) +{ + if(!This->comp_count) + This->components = HeapAlloc( GetProcessHeap(), 0, sizeof(struct component *) * This->comp_count+1 ); + else + This->components = HeapReAlloc( GetProcessHeap(), 0, This->components, sizeof(struct component *) * This->comp_count+1 ); + + This->components[This->comp_count] = item; + This->comp_count++; +} + static inline IDirectPlay8AddressImpl *impl_from_IDirectPlay8Address(IDirectPlay8Address *iface) { return CONTAINING_RECORD(iface, IDirectPlay8AddressImpl, IDirectPlay8Address_iface); @@ -112,10 +123,13 @@ static ULONG WINAPI IDirectPlay8AddressImpl_Release(IDirectPlay8Address *iface) if (!ref) { - struct component *entry, *entry2; + DWORD i; + struct component *entry; - LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &This->components, struct component, entry) + for(i=0; i < This->comp_count; i++) { + entry = This->components[i]; + switch(entry->type) { case DPNA_DATATYPE_STRING: @@ -132,6 +146,8 @@ static ULONG WINAPI IDirectPlay8AddressImpl_Release(IDirectPlay8Address *iface) HeapFree(GetProcessHeap(), 0, entry); } + HeapFree(GetProcessHeap(), 0, This->components); + HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -193,12 +209,15 @@ static HRESULT WINAPI IDirectPlay8AddressImpl_Duplicate(IDirectPlay8Address *ifa { IDirectPlay8AddressImpl *DupThis = impl_from_IDirectPlay8Address(dup); struct component *entry; + DWORD i; DupThis->SP_guid = This->SP_guid; DupThis->init = This->init; - LIST_FOR_EACH_ENTRY(entry, &This->components, struct component, entry) + for(i=0; i < This->comp_count; i++) { + entry = This->components[i]; + 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); @@ -308,7 +327,7 @@ static HRESULT WINAPI IDirectPlay8AddressImpl_GetNumComponents(IDirectPlay8Addre if(!pdwNumComponents) return DPNERR_INVALIDPOINTER; - *pdwNumComponents = list_count(&This->components); + *pdwNumComponents = This->comp_count; return DPN_OK; } @@ -318,14 +337,17 @@ static HRESULT WINAPI IDirectPlay8AddressImpl_GetComponentByName(IDirectPlay8Add { IDirectPlay8AddressImpl *This = impl_from_IDirectPlay8Address(iface); struct component *entry; + DWORD i; TRACE("(%p)->(%p %p %p %p)\n", This, pwszName, pvBuffer, pdwBufferSize, pdwDataType); if(!pwszName || !pdwBufferSize || !pdwDataType || (!pvBuffer && pdwBufferSize)) return E_POINTER; - LIST_FOR_EACH_ENTRY(entry, &This->components, struct component, entry) + for(i=0; i < This->comp_count; i++) { + entry = This->components[i]; + if (lstrcmpW(pwszName, entry->name) == 0) { TRACE("Found %s\n", debugstr_w(pwszName)); @@ -369,9 +391,48 @@ 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; + + TRACE("(%p)->(%p %p %p %p)\n", This, pwszName, pvBuffer, pdwBufferSize, pdwDataType); + + if(!pdwNameLen || !pdwBufferSize) + return E_POINTER; + + if(dwComponentID > This->comp_count) + return DPNERR_DOESNOTEXIST; + + entry = This->components[dwComponentID]; + + if(*pdwBufferSize < entry->size) + { + *pdwBufferSize = entry->size; + return DPNERR_BUFFERTOOSMALL; + } + + *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, @@ -381,14 +442,17 @@ static HRESULT WINAPI IDirectPlay8AddressImpl_AddComponent(IDirectPlay8Address * IDirectPlay8AddressImpl *This = impl_from_IDirectPlay8Address(iface); struct component *entry; BOOL found = FALSE; + DWORD i; TRACE("(%p, %s, %p, %u, %x): stub\n", This, debugstr_w(pwszName), lpvData, dwDataSize, dwDataType); if (NULL == lpvData) return DPNERR_INVALIDPOINTER; - LIST_FOR_EACH_ENTRY(entry, &This->components, struct component, entry) + for(i=0; i < This->comp_count; i++) { + entry = This->components[i]; + if (lstrcmpW(pwszName, entry->name) == 0) { TRACE("Found %s\n", debugstr_w(pwszName)); @@ -405,7 +469,7 @@ static HRESULT WINAPI IDirectPlay8AddressImpl_AddComponent(IDirectPlay8Address * entry->name = heap_strdupW(pwszName); entry->type = dwDataType; - list_add_tail(&This->components, &entry->entry); + add_component(This, entry); } switch (dwDataType) @@ -514,8 +578,6 @@ HRESULT DPNET_CreateDirectPlay8Address(IClassFactory *iface, IUnknown *pUnkOuter client->IDirectPlay8Address_iface.lpVtbl = &DirectPlay8Address_Vtbl; client->ref = 1; - list_init(&client->components); - ret = IDirectPlay8AddressImpl_QueryInterface(&client->IDirectPlay8Address_iface, riid, ppobj); IDirectPlay8AddressImpl_Release(&client->IDirectPlay8Address_iface); diff --git a/dlls/dpnet/dpnet_private.h b/dlls/dpnet/dpnet_private.h index d79123d..104dc29 100644 --- a/dlls/dpnet/dpnet_private.h +++ b/dlls/dpnet/dpnet_private.h @@ -94,7 +94,8 @@ struct IDirectPlay8AddressImpl GUID SP_guid; BOOL init; - struct list components; + struct component **components; + DWORD comp_count; }; /***************************************************************************** diff --git a/dlls/dpnet/tests/address.c b/dlls/dpnet/tests/address.c index bad4fa4..4a3755c 100644 --- a/dlls/dpnet/tests/address.c +++ b/dlls/dpnet/tests/address.c @@ -143,13 +143,13 @@ 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, 100, NULL, NULL, NULL, &bufflen, &type); - todo_wine ok(hr == E_POINTER, "got 0x%08x\n", hr); + ok(hr == E_POINTER, "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 == E_POINTER, "got 0x%08x\n", hr); trace("GetNumComponents=%d\n", components); for(i=0; i < components; i++) @@ -161,7 +161,7 @@ static void address_addcomponents(void) 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); @@ -226,14 +226,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); -- 1.9.1