From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/metadatahandler.c | 68 ++++++++++++++++++++++++++++ dlls/windowscodecs/tests/metadata.c | 13 ------ 2 files changed, 68 insertions(+), 13 deletions(-)
diff --git a/dlls/windowscodecs/metadatahandler.c b/dlls/windowscodecs/metadatahandler.c index 0bc5c381757..28d52a91dd6 100644 --- a/dlls/windowscodecs/metadatahandler.c +++ b/dlls/windowscodecs/metadatahandler.c @@ -37,6 +37,7 @@ typedef struct MetadataHandler { IWICMetadataWriter IWICMetadataWriter_iface; LONG ref; IWICPersistStream IWICPersistStream_iface; + IWICStreamProvider IWICStreamProvider_iface; const MetadataHandlerVtbl *vtable; MetadataItem *items; DWORD item_count; @@ -53,6 +54,11 @@ static inline MetadataHandler *impl_from_IWICPersistStream(IWICPersistStream *if return CONTAINING_RECORD(iface, MetadataHandler, IWICPersistStream_iface); }
+static inline MetadataHandler *impl_from_IWICStreamProvider(IWICStreamProvider *iface) +{ + return CONTAINING_RECORD(iface, MetadataHandler, IWICStreamProvider_iface); +} + static void MetadataHandler_FreeItems(MetadataHandler *This) { DWORD i; @@ -90,6 +96,10 @@ static HRESULT WINAPI MetadataHandler_QueryInterface(IWICMetadataWriter *iface, { *ppv = &This->IWICPersistStream_iface; } + else if (IsEqualIID(&IID_IWICStreamProvider, iid)) + { + *ppv = &This->IWICStreamProvider_iface; + } else { *ppv = NULL; @@ -391,6 +401,63 @@ static const IWICPersistStreamVtbl MetadataHandler_PersistStream_Vtbl = { MetadataHandler_SaveEx };
+static HRESULT WINAPI metadatahandler_stream_provider_QueryInterface(IWICStreamProvider *iface, REFIID iid, void **ppv) +{ + MetadataHandler *handler = impl_from_IWICStreamProvider(iface); + return IWICMetadataWriter_QueryInterface(&handler->IWICMetadataWriter_iface, iid, ppv); +} + +static ULONG WINAPI metadatahandler_stream_provider_AddRef(IWICStreamProvider *iface) +{ + MetadataHandler *handler = impl_from_IWICStreamProvider(iface); + return IWICMetadataWriter_AddRef(&handler->IWICMetadataWriter_iface); +} + +static ULONG WINAPI metadatahandler_stream_provider_Release(IWICStreamProvider *iface) +{ + MetadataHandler *handler = impl_from_IWICStreamProvider(iface); + return IWICMetadataWriter_Release(&handler->IWICMetadataWriter_iface); +} + +static HRESULT WINAPI metadatahandler_stream_provider_GetStream(IWICStreamProvider *iface, IStream **stream) +{ + FIXME("%p, %p stub\n", iface, stream); + + return E_NOTIMPL; +} + +static HRESULT WINAPI metadatahandler_stream_provider_GetPersistOptions(IWICStreamProvider *iface, DWORD *options) +{ + FIXME("%p, %p stub\n", iface, options); + + return E_NOTIMPL; +} + +static HRESULT WINAPI metadatahandler_stream_provider_GetPreferredVendorGUID(IWICStreamProvider *iface, GUID *guid) +{ + FIXME("%p, %p stub\n", iface, guid); + + return E_NOTIMPL; +} + +static HRESULT WINAPI metadatahandler_stream_provider_RefreshStream(IWICStreamProvider *iface) +{ + FIXME("%p stub\n", iface); + + return E_NOTIMPL; +} + +static const IWICStreamProviderVtbl MetadataHandler_StreamProvider_Vtbl = +{ + metadatahandler_stream_provider_QueryInterface, + metadatahandler_stream_provider_AddRef, + metadatahandler_stream_provider_Release, + metadatahandler_stream_provider_GetStream, + metadatahandler_stream_provider_GetPersistOptions, + metadatahandler_stream_provider_GetPreferredVendorGUID, + metadatahandler_stream_provider_RefreshStream, +}; + HRESULT MetadataReader_Create(const MetadataHandlerVtbl *vtable, REFIID iid, void** ppv) { MetadataHandler *This; @@ -405,6 +472,7 @@ HRESULT MetadataReader_Create(const MetadataHandlerVtbl *vtable, REFIID iid, voi
This->IWICMetadataWriter_iface.lpVtbl = &MetadataHandler_Vtbl; This->IWICPersistStream_iface.lpVtbl = &MetadataHandler_PersistStream_Vtbl; + This->IWICStreamProvider_iface.lpVtbl = &MetadataHandler_StreamProvider_Vtbl; This->ref = 1; This->vtable = vtable; This->items = NULL; diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 392e86beebd..b78ef9aa872 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -423,7 +423,6 @@ static void test_metadata_unknown(void) check_interface(reader, &IID_IPersist, TRUE); check_interface(reader, &IID_IPersistStream, TRUE); check_interface(reader, &IID_IWICPersistStream, TRUE); - todo_wine check_interface(reader, &IID_IWICStreamProvider, TRUE); check_interface(reader, &IID_IWICMetadataBlockReader, FALSE);
@@ -517,7 +516,6 @@ static void test_metadata_tEXt(void) check_interface(reader, &IID_IPersist, TRUE); check_interface(reader, &IID_IPersistStream, TRUE); check_interface(reader, &IID_IWICPersistStream, TRUE); - todo_wine check_interface(reader, &IID_IWICStreamProvider, TRUE);
hr = IWICMetadataReader_GetCount(reader, NULL); @@ -658,7 +656,6 @@ static void test_metadata_gAMA(void) check_interface(reader, &IID_IPersist, TRUE); check_interface(reader, &IID_IPersistStream, TRUE); check_interface(reader, &IID_IWICPersistStream, TRUE); - todo_wine check_interface(reader, &IID_IWICStreamProvider, TRUE);
load_stream((IUnknown*)reader, metadata_gAMA, sizeof(metadata_gAMA), WICPersistOptionDefault); @@ -739,7 +736,6 @@ static void test_metadata_cHRM(void) check_interface(reader, &IID_IPersist, TRUE); check_interface(reader, &IID_IPersistStream, TRUE); check_interface(reader, &IID_IWICPersistStream, TRUE); - todo_wine check_interface(reader, &IID_IWICStreamProvider, TRUE);
load_stream((IUnknown*)reader, metadata_cHRM, sizeof(metadata_cHRM), WICPersistOptionDefault); @@ -810,7 +806,6 @@ static void test_metadata_hIST(void) check_interface(reader, &IID_IPersist, TRUE); check_interface(reader, &IID_IPersistStream, TRUE); check_interface(reader, &IID_IWICPersistStream, TRUE); - todo_wine check_interface(reader, &IID_IWICStreamProvider, TRUE);
load_stream((IUnknown*)reader, metadata_hIST, sizeof(metadata_hIST), WICPersistOptionDefault); @@ -883,7 +878,6 @@ static void test_metadata_tIME(void) check_interface(reader, &IID_IPersist, TRUE); check_interface(reader, &IID_IPersistStream, TRUE); check_interface(reader, &IID_IWICPersistStream, TRUE); - todo_wine check_interface(reader, &IID_IWICStreamProvider, TRUE);
load_stream((IUnknown*)reader, metadata_tIME, sizeof(metadata_tIME), WICPersistOptionDefault); @@ -1081,7 +1075,6 @@ static void test_metadata_IFD(void) check_interface(reader, &IID_IPersist, TRUE); check_interface(reader, &IID_IPersistStream, TRUE); check_interface(reader, &IID_IWICPersistStream, TRUE); - todo_wine check_interface(reader, &IID_IWICStreamProvider, TRUE); check_interface(reader, &IID_IWICMetadataBlockReader, FALSE);
@@ -1296,7 +1289,6 @@ static void test_create_reader(void) check_interface(reader, &IID_IPersist, TRUE); check_interface(reader, &IID_IPersistStream, TRUE); check_interface(reader, &IID_IWICPersistStream, TRUE); - todo_wine check_interface(reader, &IID_IWICStreamProvider, TRUE);
if (SUCCEEDED(hr)) @@ -2112,7 +2104,6 @@ static void test_metadata_LSD(void) check_interface(reader, &IID_IPersist, TRUE); check_interface(reader, &IID_IPersistStream, TRUE); check_interface(reader, &IID_IWICPersistStream, TRUE); - todo_wine check_interface(reader, &IID_IWICStreamProvider, TRUE);
stream = create_stream(LSD_data, sizeof(LSD_data)); @@ -2208,7 +2199,6 @@ static void test_metadata_IMD(void) check_interface(reader, &IID_IPersist, TRUE); check_interface(reader, &IID_IPersistStream, TRUE); check_interface(reader, &IID_IWICPersistStream, TRUE); - todo_wine check_interface(reader, &IID_IWICStreamProvider, TRUE);
stream = create_stream(IMD_data, sizeof(IMD_data)); @@ -2301,7 +2291,6 @@ static void test_metadata_GCE(void) check_interface(reader, &IID_IPersist, TRUE); check_interface(reader, &IID_IPersistStream, TRUE); check_interface(reader, &IID_IWICPersistStream, TRUE); - todo_wine check_interface(reader, &IID_IWICStreamProvider, TRUE);
stream = create_stream(GCE_data, sizeof(GCE_data)); @@ -2396,7 +2385,6 @@ static void test_metadata_APE(void) check_interface(reader, &IID_IPersist, TRUE); check_interface(reader, &IID_IPersistStream, TRUE); check_interface(reader, &IID_IWICPersistStream, TRUE); - todo_wine check_interface(reader, &IID_IWICStreamProvider, TRUE);
stream = create_stream(APE_data, sizeof(APE_data)); @@ -2498,7 +2486,6 @@ static void test_metadata_GIF_comment(void) check_interface(reader, &IID_IPersist, TRUE); check_interface(reader, &IID_IPersistStream, TRUE); check_interface(reader, &IID_IWICPersistStream, TRUE); - todo_wine check_interface(reader, &IID_IWICStreamProvider, TRUE);
stream = create_stream(GIF_comment_data, sizeof(GIF_comment_data));