From: Vibhav Pant vibhavp@gmail.com
--- dlls/bluetoothapis/sdp.c | 50 ++++++++++++++++++++++++++++++++-- dlls/bluetoothapis/tests/sdp.c | 16 +++++------ 2 files changed, 55 insertions(+), 11 deletions(-)
diff --git a/dlls/bluetoothapis/sdp.c b/dlls/bluetoothapis/sdp.c index f6b0fd61bee..3780099af6d 100644 --- a/dlls/bluetoothapis/sdp.c +++ b/dlls/bluetoothapis/sdp.c @@ -270,7 +270,53 @@ DWORD WINAPI BluetoothSdpGetContainerElementData( BYTE *stream, ULONG stream_siz HBLUETOOTH_CONTAINER_ELEMENT *handle, SDP_ELEMENT_DATA *data ) { - FIXME( "(%p, %lu, %p, %p) stub!\n", stream, stream_size, handle, data ); - return ERROR_CALL_NOT_IMPLEMENTED; + BYTE *cursor; + DWORD result; + SIZE_T read = 0; + + TRACE( "(%p, %lu, %p, %p)\n", stream, stream_size, handle, data ); + + if (stream == NULL || stream_size < sizeof( BYTE ) || handle == NULL || data == NULL) + return ERROR_INVALID_PARAMETER; + + cursor = (BYTE *)(*handle); + + if (cursor == NULL) + { + BYTE header, type, size_desc; + UINT32 elems_size = 0; + SIZE_T read = 0; + + header = *stream; + type = data_elem_type( header ); + size_desc = data_elem_size_desc( header ); + + if (type != SDP_TYPE_SEQUENCE && type != SDP_TYPE_ALTERNATIVE) + return ERROR_INVALID_PARAMETER; + if (!(size_desc >= SDP_SIZE_DESC_NEXT_UINT8 && size_desc <= SDP_SIZE_DESC_NEXT_UINT32)) + return ERROR_INVALID_PARAMETER; + + stream++; + if (!sdp_elem_read_var_size( stream, stream_size, &read, size_desc, &elems_size )) + return ERROR_INVALID_PARAMETER; + + stream += read; + stream_size -= read; + } + else + { + if (cursor < stream) return ERROR_INVALID_PARAMETER; + if (cursor == (stream + stream_size)) return ERROR_NO_MORE_ITEMS; + + stream = cursor; + stream_size = stream_size - (ptrdiff_t)(cursor - stream); + } + result = sdp_read_element_data( stream, stream_size, data, &read ); + if (result != ERROR_SUCCESS) return result; + + stream += read; + TRACE( "handle=%p\n", stream ); + *handle = stream; + return ERROR_SUCCESS; }
diff --git a/dlls/bluetoothapis/tests/sdp.c b/dlls/bluetoothapis/tests/sdp.c index dd2017f367f..f5cd7e86ad2 100644 --- a/dlls/bluetoothapis/tests/sdp.c +++ b/dlls/bluetoothapis/tests/sdp.c @@ -489,20 +489,18 @@ static void test_BluetoothSdpGetContainerElementData( void ) &handle, &container_elem ); if (ret == ERROR_NO_MORE_ITEMS) { - todo_wine ok( n == test_cases[i].container_size, "Expected %d elements, got %d.\n", - (int)test_cases[i].container_size, (int)n ); + ok( n == test_cases[i].container_size, "Expected %d elements, got %d.\n", + (int)test_cases[i].container_size, (int)n ); winetest_pop_context(); break; } - todo_wine ok( ret == ERROR_SUCCESS, - "BluetoothSdpGetContainerElementData failed: %ld.\n", ret ); + ok( ret == ERROR_SUCCESS, "BluetoothSdpGetContainerElementData failed: %ld.\n", ret ); if (ret == ERROR_SUCCESS) { - todo_wine ok( !memcmp( &test_cases[i].sequence[n], &container_elem, - sizeof( container_elem ) ), - "Expected %s, got %s.\n", - debugstr_SDP_ELEMENT_DATA( &test_cases[i].sequence[n] ), - debugstr_SDP_ELEMENT_DATA( &container_elem ) ); + ok( !memcmp( &test_cases[i].sequence[n], &container_elem, + sizeof( container_elem ) ), + "Expected %s, got %s.\n", debugstr_SDP_ELEMENT_DATA( &test_cases[i].sequence[n] ), + debugstr_SDP_ELEMENT_DATA( &container_elem ) ); } n++; winetest_pop_context();