From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/clsfactory.c | 1 + dlls/windowscodecs/metadatahandler.c | 32 +++++++++++++++---- 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, 44 insertions(+), 8 deletions(-)
diff --git a/dlls/windowscodecs/clsfactory.c b/dlls/windowscodecs/clsfactory.c index 6835778ea1e..f654cb61723 100644 --- a/dlls/windowscodecs/clsfactory.c +++ b/dlls/windowscodecs/clsfactory.c @@ -65,6 +65,7 @@ static const classinfo wic_classes[] = { {&CLSID_WICUnknownMetadataWriter, UnknownMetadataWriter_CreateInstance}, {&CLSID_WICIfdMetadataReader, IfdMetadataReader_CreateInstance}, {&CLSID_WICGpsMetadataReader, GpsMetadataReader_CreateInstance}, + {&CLSID_WICGpsMetadataWriter, GpsMetadataWriter_CreateInstance}, {&CLSID_WICExifMetadataReader, ExifMetadataReader_CreateInstance}, {&CLSID_WICApp1MetadataReader, App1MetadataReader_CreateInstance}, {&CLSID_WICPngChrmMetadataReader, PngChrmReader_CreateInstance}, diff --git a/dlls/windowscodecs/metadatahandler.c b/dlls/windowscodecs/metadatahandler.c index a7f238dec8e..51f408a6500 100644 --- a/dlls/windowscodecs/metadatahandler.c +++ b/dlls/windowscodecs/metadatahandler.c @@ -1189,7 +1189,7 @@ static HRESULT load_IFD_entry(IStream *input, const GUID *vendor, DWORD options, }
static HRESULT load_ifd_metadata_internal(IStream *input, const GUID *vendor, - DWORD persist_options, BOOL resolve_pointer_tags, MetadataItem **items, DWORD *item_count) + DWORD persist_options, bool resolve_pointer_tags, bool writer, MetadataItem **items, DWORD *item_count) { HRESULT hr; MetadataItem *result; @@ -1289,7 +1289,7 @@ static HRESULT LoadIfdMetadata(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, items, item_count); + return load_ifd_metadata_internal(input, vendor, options, true, false, items, item_count); }
static HRESULT LoadExifMetadata(IStream *input, const GUID *vendor, @@ -1297,15 +1297,23 @@ static HRESULT LoadExifMetadata(IStream *input, const GUID *vendor, { TRACE("%p, %#lx.\n", input, options);
- return load_ifd_metadata_internal(input, vendor, options, FALSE, items, item_count); + return load_ifd_metadata_internal(input, vendor, options, false, false, items, item_count); }
-static HRESULT LoadGpsMetadata(IStream *input, const GUID *vendor, +static HRESULT LoadGpsMetadataReader(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, items, item_count); + return load_ifd_metadata_internal(input, vendor, options, false, false, items, item_count); +} + +static HRESULT LoadGpsMetadataWriter(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 LoadApp1Metadata(IStream *input, const GUID *vendor, DWORD options, MetadataItem **items, DWORD *item_count) @@ -1407,7 +1415,7 @@ static const MetadataHandlerVtbl GpsMetadataReader_Vtbl = { 0, &CLSID_WICGpsMetadataReader, - LoadGpsMetadata + LoadGpsMetadataReader };
HRESULT GpsMetadataReader_CreateInstance(REFIID iid, void **ppv) @@ -1415,6 +1423,18 @@ HRESULT GpsMetadataReader_CreateInstance(REFIID iid, void **ppv) return MetadataReader_Create(&GpsMetadataReader_Vtbl, iid, ppv); }
+static const MetadataHandlerVtbl GpsMetadataWriter_Vtbl = +{ + .is_writer = true, + &CLSID_WICGpsMetadataWriter, + LoadGpsMetadataWriter +}; + +HRESULT GpsMetadataWriter_CreateInstance(REFIID iid, void **ppv) +{ + return MetadataReader_Create(&GpsMetadataWriter_Vtbl, iid, ppv); +} + static const MetadataHandlerVtbl ExifMetadataReader_Vtbl = { 0, diff --git a/dlls/windowscodecs/regsvr.c b/dlls/windowscodecs/regsvr.c index 6028fe2ec14..ed6563a6efa 100644 --- a/dlls/windowscodecs/regsvr.c +++ b/dlls/windowscodecs/regsvr.c @@ -2093,6 +2093,15 @@ static struct regsvr_metadatawriter const metadatawriters_list[] = &GUID_VendorMicrosoft, &GUID_MetadataFormatUnknown, }, + { + &CLSID_WICGpsMetadataWriter, + "The Wine Project", + "Gps Metadata Writer", + "1.0.0.0", + "1.0.0.0", + &GUID_VendorMicrosoft, + &GUID_MetadataFormatGps, + }, { NULL } /* list terminator */ };
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 60ae0e33410..a765d844e71 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -1573,9 +1573,7 @@ static void test_metadata_Gps(void)
hr = CoCreateInstance(&CLSID_WICGpsMetadataWriter, 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 71930abd4c8..7a6f24bc91e 100644 --- a/dlls/windowscodecs/wincodecs_private.h +++ b/dlls/windowscodecs/wincodecs_private.h @@ -221,6 +221,7 @@ 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 GpsMetadataWriter_CreateInstance(REFIID iid, void **ppv); extern HRESULT ExifMetadataReader_CreateInstance(REFIID iid, void **ppv); extern HRESULT App1MetadataReader_CreateInstance(REFIID iid, void **ppv); extern HRESULT PngChrmReader_CreateInstance(REFIID iid, void** ppv); diff --git a/dlls/windowscodecs/windowscodecs_wincodec.idl b/dlls/windowscodecs/windowscodecs_wincodec.idl index 1c9955557b6..65fdad252ed 100644 --- a/dlls/windowscodecs/windowscodecs_wincodec.idl +++ b/dlls/windowscodecs/windowscodecs_wincodec.idl @@ -174,6 +174,13 @@ coclass WICIfdMetadataReader { interface IWICMetadataReader; } ] coclass WICGpsMetadataReader { interface IWICMetadataReader; }
+[ + helpstring("WIC Gps Metadata Writer"), + threading(both), + uuid(cb8c13e4-62b5-4c96-a48b-6ba6ace39c76) +] +coclass WICGpsMetadataWriter { interface IWICMetadataWriter; } + [ helpstring("WIC Exif Metadata Reader"), threading(both),