From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/gifformat.c | 59 ++++++++++++++++++++++------- dlls/windowscodecs/tests/metadata.c | 11 ++---- 2 files changed, 49 insertions(+), 21 deletions(-)
diff --git a/dlls/windowscodecs/gifformat.c b/dlls/windowscodecs/gifformat.c index d3d8678e9f8..22be9e7deda 100644 --- a/dlls/windowscodecs/gifformat.c +++ b/dlls/windowscodecs/gifformat.c @@ -420,6 +420,26 @@ HRESULT APEReader_CreateInstance(REFIID iid, void **ppv) return MetadataReader_Create(&APEReader_Vtbl, iid, ppv); }
+static HRESULT create_gifcomment_item(char *data, MetadataItem **item) +{ + HRESULT hr; + + if (!(*item = calloc(1, sizeof(**item)))) + return E_OUTOFMEMORY; + + hr = init_propvar_from_string(L"TextEntry", &(*item)->id); + if (FAILED(hr)) + { + free(*item); + return hr; + } + + (*item)->value.vt = VT_LPSTR; + (*item)->value.pszVal = data; + + return S_OK; +} + static HRESULT load_GifComment_metadata(MetadataHandler *handler, IStream *stream, const GUID *vendor, DWORD options) { #include "pshpack1.h" @@ -477,22 +497,12 @@ static HRESULT load_GifComment_metadata(MetadataHandler *handler, IStream *strea
data[data_size] = 0;
- result = calloc(1, sizeof(MetadataItem)); - if (!result) + if (FAILED(hr = create_gifcomment_item(data, &result))) { CoTaskMemFree(data); - return E_OUTOFMEMORY; + return hr; }
- PropVariantInit(&result->schema); - PropVariantInit(&result->id); - PropVariantInit(&result->value); - - result->id.vt = VT_LPWSTR; - SHStrDupW(L"TextEntry", &result->id.pwszVal); - result->value.vt = VT_LPSTR; - result->value.pszVal = data; - MetadataHandler_FreeItems(handler); handler->items = result; handler->item_count = 1; @@ -500,10 +510,33 @@ static HRESULT load_GifComment_metadata(MetadataHandler *handler, IStream *strea return S_OK; }
+static HRESULT CreateGifCommentHandler(MetadataHandler *handler) +{ + MetadataItem *item; + char *data; + HRESULT hr; + + if (!(data = CoTaskMemAlloc(1))) + return E_OUTOFMEMORY; + *data = 0; + + if (FAILED(hr = create_gifcomment_item(data, &item))) + { + CoTaskMemFree(data); + return hr; + } + + handler->items = item; + handler->item_count = 1; + + return S_OK; +} + static const MetadataHandlerVtbl GifCommentReader_Vtbl = { 0, &CLSID_WICGifCommentMetadataReader, - load_GifComment_metadata + load_GifComment_metadata, + CreateGifCommentHandler, };
HRESULT GifCommentReader_CreateInstance(REFIID iid, void **ppv) diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 478cbfaa2b3..a7fb30bc8d3 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -3971,7 +3971,6 @@ static void test_metadata_GIF_comment(void)
hr = IWICMetadataReader_GetCount(reader, &count); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(count == 1, "Unexpected count %u.\n", count);
for (i = 0; i < count; ++i) @@ -3993,14 +3992,10 @@ static void test_metadata_GIF_comment(void) id.pwszVal = (WCHAR *)L"TextEntry";
hr = IWICMetadataReader_GetValue(reader, NULL, &id, &value); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) - { - ok(value.vt == VT_LPSTR, "Unexpected vt %i.\n", value.vt); - ok(!strcmp(value.pszVal, ""), "Unexpected value: %s\n", value.pszVal); - PropVariantClear(&value); - } + ok(value.vt == VT_LPSTR, "Unexpected vt %i.\n", value.vt); + ok(!strcmp(value.pszVal, ""), "Unexpected value: %s\n", value.pszVal); + PropVariantClear(&value);
stream = create_stream(GIF_comment_data, sizeof(GIF_comment_data));