From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/clsfactory.c | 1 + dlls/windowscodecs/metadatahandler.c | 24 +++++++++++++++++-- dlls/windowscodecs/regsvr.c | 9 +++++++ dlls/windowscodecs/tests/metadata.c | 3 --- dlls/windowscodecs/wincodecs_private.h | 1 + dlls/windowscodecs/windowscodecs_wincodec.idl | 7 ++++++ 6 files changed, 40 insertions(+), 5 deletions(-)
diff --git a/dlls/windowscodecs/clsfactory.c b/dlls/windowscodecs/clsfactory.c index f654cb61723..db1f3c6ad8b 100644 --- a/dlls/windowscodecs/clsfactory.c +++ b/dlls/windowscodecs/clsfactory.c @@ -67,6 +67,7 @@ static const classinfo wic_classes[] = { {&CLSID_WICGpsMetadataReader, GpsMetadataReader_CreateInstance}, {&CLSID_WICGpsMetadataWriter, GpsMetadataWriter_CreateInstance}, {&CLSID_WICExifMetadataReader, ExifMetadataReader_CreateInstance}, + {&CLSID_WICExifMetadataWriter, ExifMetadataWriter_CreateInstance}, {&CLSID_WICApp1MetadataReader, App1MetadataReader_CreateInstance}, {&CLSID_WICPngChrmMetadataReader, PngChrmReader_CreateInstance}, {&CLSID_WICPngGamaMetadataReader, PngGamaReader_CreateInstance}, diff --git a/dlls/windowscodecs/metadatahandler.c b/dlls/windowscodecs/metadatahandler.c index 51f408a6500..3337c41f7bd 100644 --- a/dlls/windowscodecs/metadatahandler.c +++ b/dlls/windowscodecs/metadatahandler.c @@ -1292,7 +1292,7 @@ static HRESULT LoadIfdMetadata(IStream *input, const GUID *vendor, return load_ifd_metadata_internal(input, vendor, options, true, false, items, item_count); }
-static HRESULT LoadExifMetadata(IStream *input, const GUID *vendor, +static HRESULT LoadExifMetadataReader(IStream *input, const GUID *vendor, DWORD options, MetadataItem **items, DWORD *item_count) { TRACE("%p, %#lx.\n", input, options); @@ -1300,6 +1300,14 @@ static HRESULT LoadExifMetadata(IStream *input, const GUID *vendor, return load_ifd_metadata_internal(input, vendor, options, false, false, items, item_count); }
+static HRESULT LoadExifMetadataWriter(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, false, true, items, item_count); +} + static HRESULT LoadGpsMetadataReader(IStream *input, const GUID *vendor, DWORD options, MetadataItem **items, DWORD *item_count) { @@ -1439,7 +1447,7 @@ static const MetadataHandlerVtbl ExifMetadataReader_Vtbl = { 0, &CLSID_WICExifMetadataReader, - LoadExifMetadata + LoadExifMetadataReader };
HRESULT ExifMetadataReader_CreateInstance(REFIID iid, void **ppv) @@ -1447,6 +1455,18 @@ HRESULT ExifMetadataReader_CreateInstance(REFIID iid, void **ppv) return MetadataReader_Create(&ExifMetadataReader_Vtbl, iid, ppv); }
+static const MetadataHandlerVtbl ExifMetadataWriter_Vtbl = +{ + .is_writer = true, + &CLSID_WICExifMetadataWriter, + LoadExifMetadataWriter +}; + +HRESULT ExifMetadataWriter_CreateInstance(REFIID iid, void **ppv) +{ + return MetadataReader_Create(&ExifMetadataWriter_Vtbl, iid, ppv); +} + static const MetadataHandlerVtbl App1MetadataReader_Vtbl = { 0, diff --git a/dlls/windowscodecs/regsvr.c b/dlls/windowscodecs/regsvr.c index ed6563a6efa..621bf28c1fe 100644 --- a/dlls/windowscodecs/regsvr.c +++ b/dlls/windowscodecs/regsvr.c @@ -2102,6 +2102,15 @@ static struct regsvr_metadatawriter const metadatawriters_list[] = &GUID_VendorMicrosoft, &GUID_MetadataFormatGps, }, + { + &CLSID_WICExifMetadataWriter, + "The Wine Project", + "Exif Metadata Writer", + "1.0.0.0", + "1.0.0.0", + &GUID_VendorMicrosoft, + &GUID_MetadataFormatExif, + }, { NULL } /* list terminator */ };
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index a765d844e71..26dc8d05141 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -1518,16 +1518,13 @@ static void test_metadata_Exif(void)
hr = CoCreateInstance(&CLSID_WICExifMetadataWriter, 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); check_interface(writer, &IID_IPersist, TRUE); check_interface(writer, &IID_IPersistStream, TRUE); check_interface(writer, &IID_IWICPersistStream, TRUE); - todo_wine check_interface(writer, &IID_IWICStreamProvider, TRUE);
load_stream(writer, (const char *)&IFD_data, sizeof(IFD_data), 0); diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h index 7a6f24bc91e..0299a292cb9 100644 --- a/dlls/windowscodecs/wincodecs_private.h +++ b/dlls/windowscodecs/wincodecs_private.h @@ -223,6 +223,7 @@ extern HRESULT IfdMetadataReader_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); +extern HRESULT ExifMetadataWriter_CreateInstance(REFIID iid, void **ppv); extern HRESULT App1MetadataReader_CreateInstance(REFIID iid, void **ppv); extern HRESULT PngChrmReader_CreateInstance(REFIID iid, void** ppv); extern HRESULT PngGamaReader_CreateInstance(REFIID iid, void** ppv); diff --git a/dlls/windowscodecs/windowscodecs_wincodec.idl b/dlls/windowscodecs/windowscodecs_wincodec.idl index 65fdad252ed..a0ecfd54b65 100644 --- a/dlls/windowscodecs/windowscodecs_wincodec.idl +++ b/dlls/windowscodecs/windowscodecs_wincodec.idl @@ -188,6 +188,13 @@ coclass WICGpsMetadataWriter { interface IWICMetadataWriter; } ] coclass WICExifMetadataReader { interface IWICMetadataReader; }
+[ + helpstring("WIC Exif Metadata Writer"), + threading(both), + uuid(c9a14cda-c339-460b-9078-d4debcfabe91) +] +coclass WICExifMetadataWriter { interface IWICMetadataWriter; } + [ helpstring("WIC App1 Metadata Reader"), threading(both),