From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/clsfactory.c | 1 + dlls/windowscodecs/metadatahandler.c | 20 ++++++++++++++++---- dlls/windowscodecs/tests/metadata.c | 22 +++++++++++++++++++--- dlls/windowscodecs/wincodecs_private.h | 5 ++++- 4 files changed, 40 insertions(+), 8 deletions(-)
diff --git a/dlls/windowscodecs/clsfactory.c b/dlls/windowscodecs/clsfactory.c index 90309314d6d..6835778ea1e 100644 --- a/dlls/windowscodecs/clsfactory.c +++ b/dlls/windowscodecs/clsfactory.c @@ -62,6 +62,7 @@ static const classinfo wic_classes[] = { {&CLSID_WICDefaultFormatConverter, FormatConverter_CreateInstance}, {&CLSID_WineTgaDecoder, TgaDecoder_CreateInstance}, {&CLSID_WICUnknownMetadataReader, UnknownMetadataReader_CreateInstance}, + {&CLSID_WICUnknownMetadataWriter, UnknownMetadataWriter_CreateInstance}, {&CLSID_WICIfdMetadataReader, IfdMetadataReader_CreateInstance}, {&CLSID_WICGpsMetadataReader, GpsMetadataReader_CreateInstance}, {&CLSID_WICExifMetadataReader, ExifMetadataReader_CreateInstance}, diff --git a/dlls/windowscodecs/metadatahandler.c b/dlls/windowscodecs/metadatahandler.c index 1969d6288ba..a7f238dec8e 100644 --- a/dlls/windowscodecs/metadatahandler.c +++ b/dlls/windowscodecs/metadatahandler.c @@ -770,10 +770,10 @@ static HRESULT LoadUnknownMetadata(IStream *input, const GUID *preferred_vendor, return S_OK; }
-static const MetadataHandlerVtbl UnknownMetadataReader_Vtbl = { - 0, - &CLSID_WICUnknownMetadataReader, - LoadUnknownMetadata +static const MetadataHandlerVtbl UnknownMetadataReader_Vtbl = +{ + .clsid = &CLSID_WICUnknownMetadataReader, + .fnLoad = LoadUnknownMetadata };
HRESULT UnknownMetadataReader_CreateInstance(REFIID iid, void** ppv) @@ -781,6 +781,18 @@ HRESULT UnknownMetadataReader_CreateInstance(REFIID iid, void** ppv) return MetadataReader_Create(&UnknownMetadataReader_Vtbl, iid, ppv); }
+static const MetadataHandlerVtbl UnknownMetadataWriter_Vtbl = +{ + .is_writer = true, + .clsid = &CLSID_WICUnknownMetadataWriter, + .fnLoad = LoadUnknownMetadata +}; + +HRESULT UnknownMetadataWriter_CreateInstance(REFIID iid, void** ppv) +{ + return MetadataReader_Create(&UnknownMetadataWriter_Vtbl, iid, ppv); +} + #define SWAP_USHORT(x) do { if (!native_byte_order) (x) = RtlUshortByteSwap(x); } while(0) #define SWAP_ULONG(x) do { if (!native_byte_order) (x) = RtlUlongByteSwap(x); } while(0) #define SWAP_ULONGLONG(x) do { if (!native_byte_order) (x) = RtlUlonglongByteSwap(x); } while(0) diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index b458dede3c8..60ae0e33410 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -380,7 +380,6 @@ static void load_stream(void *iface_ptr, const char *data, int data_size, DWORD { stream2 = (void *)0xdeadbeef; hr = IWICStreamProvider_GetStream(stream_provider, &stream2); - todo_wine ok(hr == WINCODEC_ERR_STREAMNOTAVAILABLE, "Unexpected hr %#lx.\n", hr); ok(stream2 == (void *)0xdeadbeef, "Unexpected stream pointer.\n"); } @@ -658,9 +657,7 @@ static void test_metadata_unknown(void)
hr = CoCreateInstance(&CLSID_WICUnknownMetadataWriter, NULL, CLSCTX_INPROC_SERVER, &IID_IWICMetadataWriter, (void **)&writer); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (FAILED(hr)) return;
check_interface(writer, &IID_IWICMetadataWriter, TRUE); check_interface(writer, &IID_IWICMetadataReader, TRUE); @@ -670,6 +667,25 @@ static void test_metadata_unknown(void) check_interface(writer, &IID_IWICStreamProvider, TRUE);
load_stream(writer, metadata_unknown, sizeof(metadata_unknown), 0); + + hr = IWICMetadataWriter_GetCount(writer, &count); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(count == 1, "Unexpected count %u.\n", count); + hr = IWICMetadataWriter_GetValueByIndex(writer, 0, NULL, NULL, &value); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + compare_blob(&value, metadata_unknown, sizeof(metadata_unknown)); + PropVariantClear(&value); + + load_stream(writer, metadata_unknown, sizeof(metadata_unknown), 0); + + hr = IWICMetadataWriter_GetCount(writer, &count); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(count == 1, "Unexpected count %u.\n", count); + hr = IWICMetadataWriter_GetValueByIndex(writer, 0, NULL, NULL, &value); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + compare_blob(&value, metadata_unknown, sizeof(metadata_unknown)); + PropVariantClear(&value); + load_stream(writer, metadata_unknown, sizeof(metadata_unknown), WICPersistOptionNoCacheStream);
IWICMetadataWriter_Release(writer); diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h index e714163b660..71930abd4c8 100644 --- a/dlls/windowscodecs/wincodecs_private.h +++ b/dlls/windowscodecs/wincodecs_private.h @@ -19,6 +19,8 @@ #ifndef WINCODECS_PRIVATE_H #define WINCODECS_PRIVATE_H
+#include <stdbool.h> + #include "wincodec.h" #include "wincodecsdk.h"
@@ -203,7 +205,7 @@ typedef struct _MetadataItem
typedef struct _MetadataHandlerVtbl { - int is_writer; + bool is_writer; const CLSID *clsid; HRESULT (*fnLoad)(IStream *stream, const GUID *preferred_vendor, DWORD persist_options, MetadataItem **items, DWORD *item_count); @@ -216,6 +218,7 @@ typedef struct _MetadataHandlerVtbl extern HRESULT MetadataReader_Create(const MetadataHandlerVtbl *vtable, REFIID iid, void** ppv);
extern HRESULT UnknownMetadataReader_CreateInstance(REFIID iid, void** ppv); +extern HRESULT UnknownMetadataWriter_CreateInstance(REFIID iid, void** ppv); extern HRESULT IfdMetadataReader_CreateInstance(REFIID iid, void **ppv); extern HRESULT GpsMetadataReader_CreateInstance(REFIID iid, void **ppv); extern HRESULT ExifMetadataReader_CreateInstance(REFIID iid, void **ppv);