2 * Copyright 2011 Vincent Povirk for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
28 #include "wincodecsdk.h"
29 #include "wine/test.h"
31 #define expect_blob(propvar, data, length) do { \
32 ok((propvar).vt == VT_BLOB, "unexpected vt: %i\n", (propvar).vt); \
33 if ((propvar).vt == VT_BLOB) { \
34 ok(U(propvar).blob.cbSize == (length), "expected size %u, got %u\n", (ULONG)(length), U(propvar).blob.cbSize); \
35 if (U(propvar).blob.cbSize == (length)) { \
36 ok(!memcmp(U(propvar).blob.pBlobData, (data), (length)), "unexpected data\n"); \
41 static const char metadata_unknown[] = "lalala";
43 static const char metadata_tEXt[] = {
44 0,0,0,14, /* chunk length */
45 't','E','X','t', /* chunk type */
46 'w','i','n','e','t','e','s','t',0, /* keyword */
47 'v','a','l','u','e', /* text */
48 0x3f,0x64,0x19,0xf3 /* chunk CRC */
51 static const char *debugstr_guid(REFIID riid)
58 sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
59 riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
60 riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
61 riid->Data4[5], riid->Data4[6], riid->Data4[7]);
66 static IStream *create_stream(const char *data, int data_size)
73 hdata = GlobalAlloc(GMEM_MOVEABLE, data_size);
74 ok(hdata != 0, "GlobalAlloc failed\n");
75 if (!hdata) return NULL;
77 locked_data = GlobalLock(hdata);
78 memcpy(locked_data, data, data_size);
81 hr = CreateStreamOnHGlobal(hdata, TRUE, &stream);
82 ok(hr == S_OK, "CreateStreamOnHGlobal failed, hr=%x\n", hr);
87 static void load_stream(IUnknown *reader, const char *data, int data_size)
90 IWICPersistStream *persist;
93 stream = create_stream(data, data_size);
97 hr = IUnknown_QueryInterface(reader, &IID_IWICPersistStream, (void**)&persist);
98 ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr);
102 hr = IWICPersistStream_LoadEx(persist, stream, NULL, WICPersistOptionsDefault);
103 ok(hr == S_OK, "LoadEx failed, hr=%x\n", hr);
105 IWICPersistStream_Release(persist);
108 IStream_Release(stream);
111 static void test_metadata_unknown(void)
114 IWICMetadataReader *reader;
115 IWICEnumMetadataItem *enumerator;
116 PROPVARIANT schema, id, value;
117 ULONG items_returned;
119 hr = CoCreateInstance(&CLSID_WICUnknownMetadataReader, NULL, CLSCTX_INPROC_SERVER,
120 &IID_IWICMetadataReader, (void**)&reader);
121 ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr);
122 if (FAILED(hr)) return;
124 load_stream((IUnknown*)reader, metadata_unknown, sizeof(metadata_unknown));
126 hr = IWICMetadataReader_GetEnumerator(reader, &enumerator);
127 ok(hr == S_OK, "GetEnumerator failed, hr=%x\n", hr);
131 PropVariantInit(&schema);
132 PropVariantInit(&id);
133 PropVariantInit(&value);
135 hr = IWICEnumMetadataItem_Next(enumerator, 1, &schema, &id, &value, &items_returned);
136 ok(hr == S_OK, "Next failed, hr=%x\n", hr);
137 ok(items_returned == 1, "unexpected item count %i\n", items_returned);
139 if (hr == S_OK && items_returned == 1)
141 ok(schema.vt == VT_EMPTY, "unexpected vt: %i\n", schema.vt);
142 ok(id.vt == VT_EMPTY, "unexpected vt: %i\n", id.vt);
143 expect_blob(value, metadata_unknown, sizeof(metadata_unknown));
145 PropVariantClear(&schema);
146 PropVariantClear(&id);
147 PropVariantClear(&value);
150 hr = IWICEnumMetadataItem_Next(enumerator, 1, &schema, &id, &value, &items_returned);
151 ok(hr == S_FALSE, "Next failed, hr=%x\n", hr);
152 ok(items_returned == 0, "unexpected item count %i\n", items_returned);
154 IWICEnumMetadataItem_Release(enumerator);
157 IWICMetadataReader_Release(reader);
160 static void test_metadata_tEXt(void)
163 IWICMetadataReader *reader;
164 IWICEnumMetadataItem *enumerator;
165 PROPVARIANT schema, id, value;
166 ULONG items_returned, count;
169 PropVariantInit(&schema);
170 PropVariantInit(&id);
171 PropVariantInit(&value);
173 hr = CoCreateInstance(&CLSID_WICPngTextMetadataReader, NULL, CLSCTX_INPROC_SERVER,
174 &IID_IWICMetadataReader, (void**)&reader);
175 todo_wine ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr);
176 if (FAILED(hr)) return;
178 hr = IWICMetadataReader_GetCount(reader, NULL);
179 ok(hr == E_INVALIDARG, "GetCount failed, hr=%x\n", hr);
181 hr = IWICMetadataReader_GetCount(reader, &count);
182 ok(hr == S_OK, "GetCount failed, hr=%x\n", hr);
183 ok(count == 0, "unexpected count %i\n", count);
185 load_stream((IUnknown*)reader, metadata_tEXt, sizeof(metadata_tEXt));
187 hr = IWICMetadataReader_GetCount(reader, &count);
188 ok(hr == S_OK, "GetCount failed, hr=%x\n", hr);
189 ok(count == 1, "unexpected count %i\n", count);
191 hr = IWICMetadataReader_GetEnumerator(reader, NULL);
192 ok(hr == E_INVALIDARG, "GetEnumerator failed, hr=%x\n", hr);
194 hr = IWICMetadataReader_GetEnumerator(reader, &enumerator);
195 ok(hr == S_OK, "GetEnumerator failed, hr=%x\n", hr);
199 hr = IWICEnumMetadataItem_Next(enumerator, 1, &schema, &id, &value, &items_returned);
200 ok(hr == S_OK, "Next failed, hr=%x\n", hr);
201 ok(items_returned == 1, "unexpected item count %i\n", items_returned);
203 if (hr == S_OK && items_returned == 1)
205 ok(schema.vt == VT_EMPTY, "unexpected vt: %i\n", schema.vt);
206 ok(id.vt == VT_LPSTR, "unexpected vt: %i\n", id.vt);
207 ok(!strcmp(U(id).pszVal, "winetest"), "unexpected id: %s\n", U(id).pszVal);
208 ok(value.vt == VT_LPSTR, "unexpected vt: %i\n", id.vt);
209 ok(!strcmp(U(value).pszVal, "value"), "unexpected value: %s\n", U(id).pszVal);
211 PropVariantClear(&schema);
212 PropVariantClear(&id);
213 PropVariantClear(&value);
216 hr = IWICEnumMetadataItem_Next(enumerator, 1, &schema, &id, &value, &items_returned);
217 ok(hr == S_FALSE, "Next failed, hr=%x\n", hr);
218 ok(items_returned == 0, "unexpected item count %i\n", items_returned);
220 IWICEnumMetadataItem_Release(enumerator);
223 hr = IWICMetadataReader_GetMetadataFormat(reader, &format);
224 ok(hr == S_OK, "GetMetadataFormat failed, hr=%x\n", hr);
225 ok(IsEqualGUID(&format, &GUID_MetadataFormatChunktEXt), "unexpected format %s\n", debugstr_guid(&format));
227 hr = IWICMetadataReader_GetMetadataFormat(reader, NULL);
228 ok(hr == E_INVALIDARG, "GetMetadataFormat failed, hr=%x\n", hr);
231 U(id).pszVal = CoTaskMemAlloc(strlen("winetest") + 1);
232 strcpy(U(id).pszVal, "winetest");
234 hr = IWICMetadataReader_GetValue(reader, NULL, &id, NULL);
235 ok(hr == S_OK, "GetValue failed, hr=%x\n", hr);
237 hr = IWICMetadataReader_GetValue(reader, &schema, NULL, &value);
238 ok(hr == E_INVALIDARG, "GetValue failed, hr=%x\n", hr);
240 hr = IWICMetadataReader_GetValue(reader, &schema, &id, &value);
241 ok(hr == S_OK, "GetValue failed, hr=%x\n", hr);
242 ok(value.vt == VT_LPSTR, "unexpected vt: %i\n", id.vt);
243 ok(!strcmp(U(value).pszVal, "value"), "unexpected value: %s\n", U(id).pszVal);
244 PropVariantClear(&value);
246 strcpy(U(id).pszVal, "test");
248 hr = IWICMetadataReader_GetValue(reader, &schema, &id, &value);
249 ok(hr == WINCODEC_ERR_PROPERTYNOTFOUND, "GetValue failed, hr=%x\n", hr);
251 PropVariantClear(&id);
253 hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, NULL, NULL);
254 ok(hr == S_OK, "GetValueByIndex failed, hr=%x\n", hr);
256 hr = IWICMetadataReader_GetValueByIndex(reader, 0, &schema, NULL, NULL);
257 ok(hr == S_OK, "GetValueByIndex failed, hr=%x\n", hr);
258 ok(schema.vt == VT_EMPTY, "unexpected vt: %i\n", schema.vt);
260 hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, &id, NULL);
261 ok(hr == S_OK, "GetValueByIndex failed, hr=%x\n", hr);
262 ok(id.vt == VT_LPSTR, "unexpected vt: %i\n", id.vt);
263 ok(!strcmp(U(id).pszVal, "winetest"), "unexpected id: %s\n", U(id).pszVal);
264 PropVariantClear(&id);
266 hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, NULL, &value);
267 ok(hr == S_OK, "GetValueByIndex failed, hr=%x\n", hr);
268 ok(value.vt == VT_LPSTR, "unexpected vt: %i\n", id.vt);
269 ok(!strcmp(U(value).pszVal, "value"), "unexpected value: %s\n", U(id).pszVal);
270 PropVariantClear(&value);
272 hr = IWICMetadataReader_GetValueByIndex(reader, 1, NULL, NULL, NULL);
273 ok(hr == E_INVALIDARG, "GetValueByIndex failed, hr=%x\n", hr);
275 IWICMetadataReader_Release(reader);
278 static void test_create_reader(void)
281 IWICComponentFactory *factory;
283 IWICMetadataReader *reader;
287 hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
288 &IID_IWICComponentFactory, (void**)&factory);
289 todo_wine ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr);
290 if (FAILED(hr)) return;
292 stream = create_stream(metadata_tEXt, sizeof(metadata_tEXt));
294 hr = IWICComponentFactory_CreateMetadataReaderFromContainer(factory,
295 &GUID_ContainerFormatPng, NULL, WICPersistOptionsDefault,
297 ok(hr == S_OK, "CreateMetadataReaderFromContainer failed, hr=%x\n", hr);
301 hr = IWICMetadataReader_GetCount(reader, &count);
302 ok(hr == S_OK, "GetCount failed, hr=%x\n", hr);
303 ok(count == 1, "unexpected count %i\n", count);
305 hr = IWICMetadataReader_GetMetadataFormat(reader, &format);
306 ok(hr == S_OK, "GetMetadataFormat failed, hr=%x\n", hr);
307 ok(IsEqualGUID(&format, &GUID_MetadataFormatChunktEXt), "unexpected format %s\n", debugstr_guid(&format));
309 IWICMetadataReader_Release(reader);
312 hr = IWICComponentFactory_CreateMetadataReaderFromContainer(factory,
313 &GUID_ContainerFormatWmp, NULL, WICPersistOptionsDefault,
315 ok(hr == S_OK, "CreateMetadataReaderFromContainer failed, hr=%x\n", hr);
319 hr = IWICMetadataReader_GetCount(reader, &count);
320 ok(hr == S_OK, "GetCount failed, hr=%x\n", hr);
321 ok(count == 1, "unexpected count %i\n", count);
323 hr = IWICMetadataReader_GetMetadataFormat(reader, &format);
324 ok(hr == S_OK, "GetMetadataFormat failed, hr=%x\n", hr);
325 ok(IsEqualGUID(&format, &GUID_MetadataFormatUnknown), "unexpected format %s\n", debugstr_guid(&format));
327 IWICMetadataReader_Release(reader);
330 IStream_Release(stream);
332 IWICComponentFactory_Release(factory);
337 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
339 test_metadata_unknown();
340 test_metadata_tEXt();
341 test_create_reader();