[11/11] windowscodecs: Implement GetMetadataFormat. Resend.

Dmitry Timoshkov dmitry at baikal.ru
Wed Jun 13 04:31:55 CDT 2012


---
 dlls/windowscodecs/metadatahandler.c   |   11 ++++++++---
 dlls/windowscodecs/tests/metadata.c    |   31 +++++++++++++++++++++++++------
 dlls/windowscodecs/wincodecs_private.h |    1 +
 3 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/dlls/windowscodecs/metadatahandler.c b/dlls/windowscodecs/metadatahandler.c
index a65de1b..3a83dad 100644
--- a/dlls/windowscodecs/metadatahandler.c
+++ b/dlls/windowscodecs/metadatahandler.c
@@ -136,10 +136,13 @@ static ULONG WINAPI MetadataHandler_Release(IWICMetadataWriter *iface)
 static HRESULT WINAPI MetadataHandler_GetMetadataFormat(IWICMetadataWriter *iface,
     GUID *pguidMetadataFormat)
 {
+    MetadataHandler *This = impl_from_IWICMetadataWriter(iface);
+
     if (!pguidMetadataFormat) return E_INVALIDARG;
 
-    FIXME("(%p,%s): stub\n", iface, debugstr_guid(pguidMetadataFormat));
-    return E_NOTIMPL;
+    *pguidMetadataFormat = *This->vtable->metadata_format;
+    TRACE("%p,%s\n", iface, debugstr_guid(pguidMetadataFormat));
+    return S_OK;
 }
 
 static HRESULT WINAPI MetadataHandler_GetMetadataHandlerInfo(IWICMetadataWriter *iface,
@@ -333,7 +336,7 @@ static HRESULT MetadataReader_Create(const MetadataHandlerVtbl *vtable, IUnknown
     MetadataHandler *This;
     HRESULT hr;
 
-    TRACE("%s\n", debugstr_guid(vtable->clsid));
+    TRACE("%s, %s\n", debugstr_guid(vtable->clsid), debugstr_guid(vtable->metadata_format));
 
     *ppv = NULL;
 
@@ -593,6 +596,7 @@ static HRESULT LoadUnknownMetadata(IStream *input, const GUID *preferred_vendor,
 static const MetadataHandlerVtbl UnknownMetadataReader_Vtbl = {
     0,
     &CLSID_WICUnknownMetadataReader,
+    &GUID_MetadataFormatUnknown,
     LoadUnknownMetadata
 };
 
@@ -983,6 +987,7 @@ static HRESULT LoadIfdMetadata(IStream *input, const GUID *preferred_vendor,
 static const MetadataHandlerVtbl IfdMetadataReader_Vtbl = {
     0,
     &CLSID_WICIfdMetadataReader,
+    &GUID_MetadataFormatIfd,
     LoadIfdMetadata
 };
 
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c
index 65174d0..d07aa7b 100644
--- a/dlls/windowscodecs/tests/metadata.c
+++ b/dlls/windowscodecs/tests/metadata.c
@@ -218,14 +218,23 @@ static void test_metadata_unknown(void)
     IWICMetadataBlockReader *blockreader;
     PROPVARIANT schema, id, value;
     ULONG items_returned;
+    GUID format;
 
     hr = CoCreateInstance(&CLSID_WICUnknownMetadataReader, NULL, CLSCTX_INPROC_SERVER,
         &IID_IWICMetadataReader, (void**)&reader);
     ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr);
     if (FAILED(hr)) return;
 
+    hr = IWICMetadataReader_GetMetadataFormat(reader, &format);
+    ok(hr == S_OK, "GetMetadataFormat error %#x\n", hr);
+    ok(IsEqualGUID(&format, &GUID_MetadataFormatUnknown), "unexpected format %s\n", debugstr_guid(&format));
+
     load_stream((IUnknown*)reader, metadata_unknown, sizeof(metadata_unknown));
 
+    hr = IWICMetadataReader_GetMetadataFormat(reader, &format);
+    ok(hr == S_OK, "GetMetadataFormat error %#x\n", hr);
+    ok(IsEqualGUID(&format, &GUID_MetadataFormatUnknown), "unexpected format %s\n", debugstr_guid(&format));
+
     hr = IWICMetadataReader_GetEnumerator(reader, &enumerator);
     ok(hr == S_OK, "GetEnumerator failed, hr=%x\n", hr);
 
@@ -291,8 +300,16 @@ static void test_metadata_tEXt(void)
     ok(hr == S_OK, "GetCount failed, hr=%x\n", hr);
     ok(count == 0, "unexpected count %i\n", count);
 
+    hr = IWICMetadataReader_GetMetadataFormat(reader, &format);
+    ok(hr == S_OK, "GetMetadataFormat error %#x\n", hr);
+    ok(IsEqualGUID(&format, &GUID_MetadataFormatChunktEXt), "unexpected format %s\n", debugstr_guid(&format));
+
     load_stream((IUnknown*)reader, metadata_tEXt, sizeof(metadata_tEXt));
 
+    hr = IWICMetadataReader_GetMetadataFormat(reader, &format);
+    ok(hr == S_OK, "GetMetadataFormat error %#x\n", hr);
+    ok(IsEqualGUID(&format, &GUID_MetadataFormatChunktEXt), "unexpected format %s\n", debugstr_guid(&format));
+
     hr = IWICMetadataReader_GetCount(reader, &count);
     ok(hr == S_OK, "GetCount failed, hr=%x\n", hr);
     ok(count == 1, "unexpected count %i\n", count);
@@ -444,8 +461,16 @@ static void test_metadata_IFD(void)
     ok(hr == S_OK, "GetCount error %#x\n", hr);
     ok(count == 0, "unexpected count %u\n", count);
 
+    hr = IWICMetadataReader_GetMetadataFormat(reader, &format);
+    ok(hr == S_OK, "GetMetadataFormat error %#x\n", hr);
+    ok(IsEqualGUID(&format, &GUID_MetadataFormatIfd), "unexpected format %s\n", debugstr_guid(&format));
+
     load_stream((IUnknown*)reader, (const char *)&IFD_data, sizeof(IFD_data));
 
+    hr = IWICMetadataReader_GetMetadataFormat(reader, &format);
+    ok(hr == S_OK, "GetMetadataFormat error %#x\n", hr);
+    ok(IsEqualGUID(&format, &GUID_MetadataFormatIfd), "unexpected format %s\n", debugstr_guid(&format));
+
     hr = IWICMetadataReader_GetCount(reader, &count);
     ok(hr == S_OK, "GetCount error %#x\n", hr);
     ok(count == sizeof(td)/sizeof(td[0]), "unexpected count %u\n", count);
@@ -528,12 +553,6 @@ static void test_metadata_IFD(void)
 
     IWICEnumMetadataItem_Release(enumerator);
 
-    hr = IWICMetadataReader_GetMetadataFormat(reader, &format);
-todo_wine
-    ok(hr == S_OK, "GetMetadataFormat error %#x\n", hr);
-todo_wine
-    ok(IsEqualGUID(&format, &GUID_MetadataFormatIfd), "unexpected format %s\n", debugstr_guid(&format));
-
     hr = IWICMetadataReader_GetMetadataFormat(reader, NULL);
     ok(hr == E_INVALIDARG, "GetMetadataFormat should fail\n");
 
diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h
index 92fa7ef..2e78899 100644
--- a/dlls/windowscodecs/wincodecs_private.h
+++ b/dlls/windowscodecs/wincodecs_private.h
@@ -76,6 +76,7 @@ typedef struct _MetadataHandlerVtbl
 {
     int is_writer;
     const CLSID *clsid;
+    const GUID *metadata_format;
     HRESULT (*fnLoad)(IStream *stream, const GUID *preferred_vendor,
         DWORD persist_options, MetadataItem **items, DWORD *item_count);
     HRESULT (*fnSave)(IStream *stream, DWORD persist_options,
-- 
1.7.10.1




More information about the wine-patches mailing list