From: Alistair Leslie-Hughes Subject: dpnet: Implement IDirectPlay8Address GetComponentByIndex (try 7) Message-Id: Date: Mon, 23 Feb 2015 18:41:24 +1100 Hi, Fix test error. Changelog: dpnet: Implement IDirectPlay8Address GetComponentByIndex Best Regards Alistair Leslie-Hughes From 654d7a0c7658d4aecd38eea4bf20bce61903ad37 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Thu, 27 Nov 2014 15:57:44 +1100 Subject: [PATCH 14/14] Implement IDirectPlay8Address GetComponentByIndex --- dlls/dpnet/address.c | 108 +++++++++++++++++++++++++++++++++++++++------ dlls/dpnet/dpnet_private.h | 3 +- dlls/dpnet/tests/address.c | 17 ++++--- 3 files changed, 106 insertions(+), 22 deletions(-) diff --git a/dlls/dpnet/address.c b/dlls/dpnet/address.c index 2062bc4..f1f0910 100644 --- a/dlls/dpnet/address.c +++ b/dlls/dpnet/address.c @@ -44,6 +44,11 @@ static inline void *heap_alloc(size_t len) return HeapAlloc(GetProcessHeap(), 0, len); } +static inline void *heap_realloc(void *mem, size_t len) +{ + return HeapReAlloc( GetProcessHeap(), 0, mem, len); +} + static inline BOOL heap_free(void *mem) { return HeapFree(GetProcessHeap(), 0, mem); @@ -74,6 +79,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 = heap_alloc( sizeof(struct component *) * This->comp_count+1 ); + else + This->components = heap_realloc(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 +128,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: @@ -129,11 +148,14 @@ static ULONG WINAPI IDirectPlay8AddressImpl_Release(IDirectPlay8Address *iface) break; } - HeapFree(GetProcessHeap(), 0, entry); + heap_free(entry->name); + heap_free(entry); } - HeapFree(GetProcessHeap(), 0, This); + heap_free(This->components); + heap_free(This); } + return ref; } @@ -193,12 +215,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 +333,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 +343,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 +397,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 +448,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)); @@ -402,10 +472,19 @@ static HRESULT WINAPI IDirectPlay8AddressImpl_AddComponent(IDirectPlay8Address * { /* Create a new one */ entry = heap_alloc(sizeof(struct component)); + if(!entry) + return E_OUTOFMEMORY; + entry->name = heap_strdupW(pwszName); + if(!entry->name) + { + heap_free(entry); + return E_OUTOFMEMORY; + } + entry->type = dwDataType; - list_add_tail(&This->components, &entry->entry); + add_component(This, entry); } switch (dwDataType) @@ -425,6 +504,9 @@ static HRESULT WINAPI IDirectPlay8AddressImpl_AddComponent(IDirectPlay8Address * TRACE("(%p, %u): GUID Type -> %s\n", lpvData, dwDataSize, debugstr_guid(lpvData)); break; case DPNA_DATATYPE_STRING: + if(dwDataSize != ((strlenW((WCHAR*)lpvData)+1) * sizeof(WCHAR))) + return DPNERR_INVALIDPARAM; + heap_free(entry->data.string); entry->data.string = heap_strdupW((WCHAR*)lpvData); @@ -514,8 +596,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..c7cdd3f 100644 --- a/dlls/dpnet/tests/address.c +++ b/dlls/dpnet/tests/address.c @@ -96,6 +96,9 @@ static void address_addcomponents(void) hr = IDirectPlay8Address_AddComponent(localaddr, DPNA_KEY_HOSTNAME, &localhost, sizeof(localhost), DPNA_DATATYPE_STRING); ok(hr == S_OK, "got 0x%08x\n", hr); + hr = IDirectPlay8Address_AddComponent(localaddr, DPNA_KEY_HOSTNAME, &localhost, sizeof(localhost)+1, DPNA_DATATYPE_STRING); + ok(hr == DPNERR_INVALIDPARAM, "got 0x%08x\n", hr); + hr = IDirectPlay8Address_AddComponent(localaddr, DPNA_KEY_PORT, &port, sizeof(DWORD)+2, DPNA_DATATYPE_DWORD); ok(hr == DPNERR_INVALIDPARAM, "got 0x%08x\n", hr); @@ -143,13 +146,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 +164,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 +229,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); -- 2.1.4