From: Mohamad Al-Jaf mohamadaljaf@gmail.com
--- dlls/wintypes/buffer.c | 49 ++++++++++++++++++++++++++++++++++ dlls/wintypes/tests/wintypes.c | 12 +++++++++ 2 files changed, 61 insertions(+)
diff --git a/dlls/wintypes/buffer.c b/dlls/wintypes/buffer.c index 6129e096035..4e3fdebb151 100644 --- a/dlls/wintypes/buffer.c +++ b/dlls/wintypes/buffer.c @@ -18,6 +18,8 @@ */
#include "private.h" +#include "initguid.h" +#include "robuffer.h"
WINE_DEFAULT_DEBUG_CHANNEL(wintypes);
@@ -117,6 +119,7 @@ static const struct IActivationFactoryVtbl factory_vtbl = struct buffer { IBuffer IBuffer_iface; + IBufferByteAccess IBufferByteAccess_iface; LONG ref;
UINT32 capacity; @@ -147,6 +150,13 @@ static HRESULT WINAPI buffer_QueryInterface( IBuffer *iface, REFIID iid, void ** return S_OK; }
+ if (IsEqualGUID( iid, &IID_IBufferByteAccess )) + { + *out = &impl->IBufferByteAccess_iface; + IInspectable_AddRef( *out ); + return S_OK; + } + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); *out = NULL; return E_NOINTERFACE; @@ -236,6 +246,44 @@ static const struct IBufferVtbl buffer_vtbl = buffer_put_Length, };
+static inline struct buffer *impl_from_IBufferByteAccess( IBufferByteAccess *iface ) +{ + return CONTAINING_RECORD( iface, struct buffer, IBufferByteAccess_iface ); +} + +static HRESULT WINAPI buffer_byte_access_QueryInterface( IBufferByteAccess *iface, REFIID iid, void **out ) +{ + struct buffer *impl = impl_from_IBufferByteAccess( iface ); + return IBuffer_QueryInterface( &impl->IBuffer_iface, iid, out ); +} + +static ULONG WINAPI buffer_byte_access_AddRef( IBufferByteAccess *iface ) +{ + struct buffer *impl = impl_from_IBufferByteAccess( iface ); + return IBuffer_AddRef( &impl->IBuffer_iface ); +} + +static ULONG WINAPI buffer_byte_access_Release( IBufferByteAccess *iface ) +{ + struct buffer *impl = impl_from_IBufferByteAccess( iface ); + return IBuffer_Release( &impl->IBuffer_iface ); +} + +static HRESULT WINAPI buffer_byte_access_Buffer( IBufferByteAccess *iface, byte **value ) +{ + FIXME( "iface %p, value %p stub!\n", iface, value ); + return E_NOTIMPL; +} + +static const struct IBufferByteAccessVtbl buffer_byte_access_vtbl = +{ + buffer_byte_access_QueryInterface, + buffer_byte_access_AddRef, + buffer_byte_access_Release, + /* IBufferByteAccess methods */ + buffer_byte_access_Buffer, +}; + DEFINE_IINSPECTABLE( buffer_factory_statics, IBufferFactory, struct buffer_factory_statics, IActivationFactory_iface )
static HRESULT WINAPI buffer_factory_statics_Create( IBufferFactory *iface, UINT32 capacity, IBuffer **value ) @@ -249,6 +297,7 @@ static HRESULT WINAPI buffer_factory_statics_Create( IBufferFactory *iface, UINT if (!(impl = malloc( offsetof( struct buffer, data[capacity] ) ))) return E_OUTOFMEMORY;
impl->IBuffer_iface.lpVtbl = &buffer_vtbl; + impl->IBufferByteAccess_iface.lpVtbl = &buffer_byte_access_vtbl; impl->ref = 1; impl->capacity = capacity; impl->length = 0; diff --git a/dlls/wintypes/tests/wintypes.c b/dlls/wintypes/tests/wintypes.c index 91d69f410e2..a77d86cd465 100644 --- a/dlls/wintypes/tests/wintypes.c +++ b/dlls/wintypes/tests/wintypes.c @@ -35,6 +35,8 @@ #define WIDL_using_Windows_Storage_Streams #include "windows.storage.streams.h"
+#include "robuffer.h" + #include "wine/test.h"
static BOOL is_wow64; @@ -137,6 +139,7 @@ static void test_interfaces(void) static void test_IBufferStatics(void) { static const WCHAR *class_name = L"Windows.Storage.Streams.Buffer"; + IBufferByteAccess *buffer_byte_access = NULL; IBufferFactory *buffer_factory = NULL; IActivationFactory *factory = NULL; UINT32 capacity, length; @@ -163,6 +166,7 @@ static void test_IBufferStatics(void) check_interface(factory, &IID_IUnknown, TRUE); check_interface(factory, &IID_IInspectable, TRUE); check_interface(factory, &IID_IAgileObject, TRUE); + check_interface(factory, &IID_IBufferByteAccess, FALSE);
hr = IActivationFactory_QueryInterface(factory, &IID_IBufferFactory, (void **)&buffer_factory); ok(hr == S_OK, "QueryInterface IID_IBufferFactory failed, hr %#lx.\n", hr); @@ -203,6 +207,14 @@ static void test_IBufferStatics(void) hr = IBuffer_put_Length(buffer, 1); ok(hr == E_INVALIDARG, "IBuffer_put_Length failed, hr %#lx.\n", hr);
+ hr = IBuffer_QueryInterface(buffer, &IID_IBufferByteAccess, (void **)&buffer_byte_access); + ok(hr == S_OK, "QueryInterface IID_IBufferByteAccess failed, hr %#lx.\n", hr); + + check_interface(buffer_byte_access, &IID_IInspectable, TRUE); + check_interface(buffer_byte_access, &IID_IAgileObject, TRUE); + check_interface(buffer_byte_access, &IID_IBuffer, TRUE); + + IBufferByteAccess_Release(buffer_byte_access); IBuffer_Release(buffer);
buffer = (void *)0xdeadbeef;