From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/clsfactory.c | 1 + dlls/windowscodecs/metadatahandler.c | 23 +++++++++++++++++-- dlls/windowscodecs/regsvr.c | 9 ++++++++ dlls/windowscodecs/tests/metadata.c | 2 -- dlls/windowscodecs/wincodecs_private.h | 1 + dlls/windowscodecs/windowscodecs_wincodec.idl | 7 ++++++ 6 files changed, 39 insertions(+), 4 deletions(-)
diff --git a/dlls/windowscodecs/clsfactory.c b/dlls/windowscodecs/clsfactory.c index db1f3c6ad8b..5e8912db26a 100644 --- a/dlls/windowscodecs/clsfactory.c +++ b/dlls/windowscodecs/clsfactory.c @@ -64,6 +64,7 @@ static const classinfo wic_classes[] = { {&CLSID_WICUnknownMetadataReader, UnknownMetadataReader_CreateInstance}, {&CLSID_WICUnknownMetadataWriter, UnknownMetadataWriter_CreateInstance}, {&CLSID_WICIfdMetadataReader, IfdMetadataReader_CreateInstance}, + {&CLSID_WICIfdMetadataWriter, IfdMetadataWriter_CreateInstance}, {&CLSID_WICGpsMetadataReader, GpsMetadataReader_CreateInstance}, {&CLSID_WICGpsMetadataWriter, GpsMetadataWriter_CreateInstance}, {&CLSID_WICExifMetadataReader, ExifMetadataReader_CreateInstance}, diff --git a/dlls/windowscodecs/metadatahandler.c b/dlls/windowscodecs/metadatahandler.c index 3337c41f7bd..469fdf9b8ca 100644 --- a/dlls/windowscodecs/metadatahandler.c +++ b/dlls/windowscodecs/metadatahandler.c @@ -1285,13 +1285,20 @@ static HRESULT load_ifd_metadata_internal(IStream *input, const GUID *vendor, return S_OK; }
-static HRESULT LoadIfdMetadata(IStream *input, const GUID *vendor, +static HRESULT LoadIfdMetadataReader(IStream *input, const GUID *vendor, DWORD options, MetadataItem **items, DWORD *item_count) { TRACE("%p, %#lx.\n", input, options); return load_ifd_metadata_internal(input, vendor, options, true, false, items, item_count); }
+static HRESULT LoadIfdMetadataWriter(IStream *input, const GUID *vendor, + DWORD options, MetadataItem **items, DWORD *item_count) +{ + TRACE("%p, %#lx.\n", input, options); + return load_ifd_metadata_internal(input, vendor, options, true, true, items, item_count); +} + static HRESULT LoadExifMetadataReader(IStream *input, const GUID *vendor, DWORD options, MetadataItem **items, DWORD *item_count) { @@ -1411,7 +1418,7 @@ static HRESULT LoadApp1Metadata(IStream *input, const GUID *vendor, DWORD option static const MetadataHandlerVtbl IfdMetadataReader_Vtbl = { 0, &CLSID_WICIfdMetadataReader, - LoadIfdMetadata + LoadIfdMetadataReader };
HRESULT IfdMetadataReader_CreateInstance(REFIID iid, void **ppv) @@ -1419,6 +1426,18 @@ HRESULT IfdMetadataReader_CreateInstance(REFIID iid, void **ppv) return MetadataReader_Create(&IfdMetadataReader_Vtbl, iid, ppv); }
+static const MetadataHandlerVtbl IfdMetadataWriter_Vtbl = +{ + .is_writer = true, + &CLSID_WICIfdMetadataWriter, + LoadIfdMetadataWriter +}; + +HRESULT IfdMetadataWriter_CreateInstance(REFIID iid, void **ppv) +{ + return MetadataReader_Create(&IfdMetadataWriter_Vtbl, iid, ppv); +} + static const MetadataHandlerVtbl GpsMetadataReader_Vtbl = { 0, diff --git a/dlls/windowscodecs/regsvr.c b/dlls/windowscodecs/regsvr.c index 8a3fe252a8e..79e8073aabe 100644 --- a/dlls/windowscodecs/regsvr.c +++ b/dlls/windowscodecs/regsvr.c @@ -2110,6 +2110,15 @@ static struct regsvr_metadatawriter const metadatawriters_list[] = &GUID_VendorMicrosoft, &GUID_MetadataFormatExif, }, + { + &CLSID_WICIfdMetadataWriter, + "The Wine Project", + "Ifd Metadata Writer", + "1.0.0.0", + "1.0.0.0", + &GUID_VendorMicrosoft, + &GUID_MetadataFormatIfd, + }, { NULL } /* list terminator */ };
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 26dc8d05141..1ff564d2e80 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -1464,9 +1464,7 @@ static void test_metadata_Ifd(void)
hr = CoCreateInstance(&CLSID_WICIfdMetadataWriter, 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); diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h index 0299a292cb9..f23ec9a85ee 100644 --- a/dlls/windowscodecs/wincodecs_private.h +++ b/dlls/windowscodecs/wincodecs_private.h @@ -220,6 +220,7 @@ extern HRESULT MetadataReader_Create(const MetadataHandlerVtbl *vtable, REFIID i 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 IfdMetadataWriter_CreateInstance(REFIID iid, void **ppv); extern HRESULT GpsMetadataReader_CreateInstance(REFIID iid, void **ppv); extern HRESULT GpsMetadataWriter_CreateInstance(REFIID iid, void **ppv); extern HRESULT ExifMetadataReader_CreateInstance(REFIID iid, void **ppv); diff --git a/dlls/windowscodecs/windowscodecs_wincodec.idl b/dlls/windowscodecs/windowscodecs_wincodec.idl index a0ecfd54b65..438a39fd2be 100644 --- a/dlls/windowscodecs/windowscodecs_wincodec.idl +++ b/dlls/windowscodecs/windowscodecs_wincodec.idl @@ -167,6 +167,13 @@ coclass WICUnknownMetadataWriter { interface IWICMetadataWriter; } ] coclass WICIfdMetadataReader { interface IWICMetadataReader; }
+[ + helpstring("WIC Ifd Metadata Writer"), + threading(both), + uuid(b1ebfc28-c9bd-47a2-8d33-b948769777a7) +] +coclass WICIfdMetadataWriter { interface IWICMetadataWriter; } + [ helpstring("WIC Gps Metadata Reader"), threading(both),