Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
-- v2: windowscodecs: Fix a typo in metadata readers registration helper. windowscodecs/metadata: Add a stub for WICIfdMetadataWriter. windowscodecs/metadata: Add a stub for WICExifMetadataWriter. windowscodecs/metadata: Add a stub for WICGpsMetadataWriter. windowscodecs/metadata: Add a stub for WICUnknownMetadataWriter. windowscodecs/metadata: Add registration information for the "Unknown" writer. windowscodecs: Add a stub for IWICMetadataWriterInfo. windowscodecs: Move an hkey handle to the component info base structure. windowscodecs: Move component info registry key cleanup to a common failure path.
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/info.c | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-)
diff --git a/dlls/windowscodecs/info.c b/dlls/windowscodecs/info.c index 67704365c06..2fda5f638bc 100644 --- a/dlls/windowscodecs/info.c +++ b/dlls/windowscodecs/info.c @@ -658,10 +658,7 @@ static HRESULT BitmapDecoderInfo_Constructor(HKEY classkey, REFCLSID clsid, Comp
This = calloc(1, sizeof(BitmapDecoderInfo)); if (!This) - { - RegCloseKey(classkey); return E_OUTOFMEMORY; - }
This->base.IWICComponentInfo_iface.lpVtbl = (const IWICComponentInfoVtbl*)&BitmapDecoderInfo_Vtbl; This->base.ref = 1; @@ -951,10 +948,7 @@ static HRESULT BitmapEncoderInfo_Constructor(HKEY classkey, REFCLSID clsid, Comp
This = malloc(sizeof(BitmapEncoderInfo)); if (!This) - { - RegCloseKey(classkey); return E_OUTOFMEMORY; - }
This->base.IWICComponentInfo_iface.lpVtbl = (const IWICComponentInfoVtbl*)&BitmapEncoderInfo_Vtbl; This->base.ref = 1; @@ -1164,10 +1158,7 @@ static HRESULT FormatConverterInfo_Constructor(HKEY classkey, REFCLSID clsid, Co
This = malloc(sizeof(FormatConverterInfo)); if (!This) - { - RegCloseKey(classkey); return E_OUTOFMEMORY; - }
This->base.IWICComponentInfo_iface.lpVtbl = (const IWICComponentInfoVtbl*)&FormatConverterInfo_Vtbl; This->base.ref = 1; @@ -1452,10 +1443,7 @@ static HRESULT PixelFormatInfo_Constructor(HKEY classkey, REFCLSID clsid, Compon
This = malloc(sizeof(PixelFormatInfo)); if (!This) - { - RegCloseKey(classkey); return E_OUTOFMEMORY; - }
This->base.IWICComponentInfo_iface.lpVtbl = (const IWICComponentInfoVtbl*)&PixelFormatInfo_Vtbl; This->base.ref = 1; @@ -1975,10 +1963,7 @@ static HRESULT MetadataReaderInfo_Constructor(HKEY classkey, REFCLSID clsid, Com
This = calloc(1, sizeof(*This)); if (!This) - { - RegCloseKey(classkey); return E_OUTOFMEMORY; - }
This->base.IWICComponentInfo_iface.lpVtbl = (const IWICComponentInfoVtbl*)&MetadataReaderInfo_Vtbl; This->base.ref = 1; @@ -2086,7 +2071,11 @@ HRESULT CreateComponentInfo(REFCLSID clsid, IWICComponentInfo **ppIInfo) { res = RegOpenKeyExW(clsidkey, guidstring, 0, KEY_READ, &classkey); if (res == ERROR_SUCCESS) - hr = category->constructor(classkey, clsid, &info); + { + /* Key handle ownership is transferred to the object. */ + if (FAILED(hr = category->constructor(classkey, clsid, &info))) + RegCloseKey(classkey); + } else hr = HRESULT_FROM_WIN32(res); }
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/info.c | 163 ++++++++++++++++++-------------------- 1 file changed, 79 insertions(+), 84 deletions(-)
diff --git a/dlls/windowscodecs/info.c b/dlls/windowscodecs/info.c index 2fda5f638bc..dee67a60803 100644 --- a/dlls/windowscodecs/info.c +++ b/dlls/windowscodecs/info.c @@ -38,10 +38,25 @@ typedef struct { IWICComponentInfo IWICComponentInfo_iface; LONG ref; CLSID clsid; + HKEY classkey; struct wine_rb_entry entry; } ComponentInfo;
-static HRESULT ComponentInfo_GetStringValue(HKEY classkey, LPCWSTR value, +static void component_info_init(ComponentInfo *object, HKEY classkey, + REFGUID clsid, const IWICComponentInfoVtbl *vtbl) +{ + object->IWICComponentInfo_iface.lpVtbl = vtbl; + object->ref = 1; + object->classkey = classkey; + object->clsid = *clsid; +} + +static void component_info_cleanup(ComponentInfo *info) +{ + RegCloseKey(info->classkey); +} + +static HRESULT ComponentInfo_GetStringValue(ComponentInfo *info, LPCWSTR value, UINT buffer_size, WCHAR *buffer, UINT *actual_size) { LONG ret; @@ -50,7 +65,7 @@ static HRESULT ComponentInfo_GetStringValue(HKEY classkey, LPCWSTR value, if (!actual_size) return E_INVALIDARG;
- ret = RegQueryValueExW(classkey, value, 0, NULL, (void *)buffer, &cbdata); + ret = RegQueryValueExW(info->classkey, value, 0, NULL, (void *)buffer, &cbdata);
if (ret == ERROR_FILE_NOT_FOUND) { @@ -71,7 +86,7 @@ static HRESULT ComponentInfo_GetStringValue(HKEY classkey, LPCWSTR value, return HRESULT_FROM_WIN32(ret); }
-static HRESULT ComponentInfo_GetGUIDValue(HKEY classkey, LPCWSTR value, +static HRESULT ComponentInfo_GetGUIDValue(ComponentInfo *info, LPCWSTR value, GUID *result) { LONG ret; @@ -82,7 +97,7 @@ static HRESULT ComponentInfo_GetGUIDValue(HKEY classkey, LPCWSTR value, if (!result) return E_INVALIDARG;
- ret = RegGetValueW(classkey, NULL, value, RRF_RT_REG_SZ|RRF_NOEXPAND, NULL, + ret = RegGetValueW(info->classkey, NULL, value, RRF_RT_REG_SZ|RRF_NOEXPAND, NULL, guid_string, &cbdata);
if (ret != ERROR_SUCCESS) @@ -99,7 +114,7 @@ static HRESULT ComponentInfo_GetGUIDValue(HKEY classkey, LPCWSTR value, return hr; }
-static HRESULT ComponentInfo_GetUINTValue(HKEY classkey, LPCWSTR value, +static HRESULT ComponentInfo_GetUINTValue(ComponentInfo *info, LPCWSTR value, void *result) { LONG ret; @@ -108,7 +123,7 @@ static HRESULT ComponentInfo_GetUINTValue(HKEY classkey, LPCWSTR value, if (!result) return E_INVALIDARG;
- ret = RegGetValueW(classkey, NULL, value, RRF_RT_DWORD, NULL, + ret = RegGetValueW(info->classkey, NULL, value, RRF_RT_DWORD, NULL, result, &cbdata);
if (ret == ERROR_FILE_NOT_FOUND) @@ -120,7 +135,7 @@ static HRESULT ComponentInfo_GetUINTValue(HKEY classkey, LPCWSTR value, return HRESULT_FROM_WIN32(ret); }
-static HRESULT ComponentInfo_GetGuidList(HKEY classkey, LPCWSTR subkeyname, +static HRESULT ComponentInfo_GetGuidList(ComponentInfo *info, LPCWSTR subkeyname, UINT buffersize, GUID *buffer, UINT *actual_size) { LONG ret; @@ -133,7 +148,7 @@ static HRESULT ComponentInfo_GetGuidList(HKEY classkey, LPCWSTR subkeyname, if (!actual_size) return E_INVALIDARG;
- ret = RegOpenKeyExW(classkey, subkeyname, 0, KEY_READ, &subkey); + ret = RegOpenKeyExW(info->classkey, subkeyname, 0, KEY_READ, &subkey); if (ret == ERROR_FILE_NOT_FOUND) { *actual_size = 0; @@ -189,7 +204,6 @@ static HRESULT ComponentInfo_GetGuidList(HKEY classkey, LPCWSTR subkeyname,
typedef struct { ComponentInfo base; - HKEY classkey; WICBitmapPattern *patterns; UINT pattern_count; UINT patterns_size; @@ -244,7 +258,7 @@ static ULONG WINAPI BitmapDecoderInfo_Release(IWICBitmapDecoderInfo *iface)
if (ref == 0) { - RegCloseKey(This->classkey); + component_info_cleanup(&This->base); free(This->patterns); free(This); } @@ -286,7 +300,7 @@ static HRESULT WINAPI BitmapDecoderInfo_GetAuthor(IWICBitmapDecoderInfo *iface,
TRACE("(%p,%u,%p,%p)\n", iface, cchAuthor, wzAuthor, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"Author", cchAuthor, wzAuthor, pcchActual); + return ComponentInfo_GetStringValue(&This->base, L"Author", cchAuthor, wzAuthor, pcchActual); }
static HRESULT WINAPI BitmapDecoderInfo_GetVendorGUID(IWICBitmapDecoderInfo *iface, GUID *pguidVendor) @@ -295,7 +309,7 @@ static HRESULT WINAPI BitmapDecoderInfo_GetVendorGUID(IWICBitmapDecoderInfo *ifa
TRACE("(%p,%p)\n", iface, pguidVendor);
- return ComponentInfo_GetGUIDValue(This->classkey, L"Vendor", pguidVendor); + return ComponentInfo_GetGUIDValue(&This->base, L"Vendor", pguidVendor); }
static HRESULT WINAPI BitmapDecoderInfo_GetVersion(IWICBitmapDecoderInfo *iface, UINT cchVersion, @@ -305,7 +319,7 @@ static HRESULT WINAPI BitmapDecoderInfo_GetVersion(IWICBitmapDecoderInfo *iface,
TRACE("(%p,%u,%p,%p)\n", iface, cchVersion, wzVersion, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"Version", + return ComponentInfo_GetStringValue(&This->base, L"Version", cchVersion, wzVersion, pcchActual); }
@@ -316,7 +330,7 @@ static HRESULT WINAPI BitmapDecoderInfo_GetSpecVersion(IWICBitmapDecoderInfo *if
TRACE("(%p,%u,%p,%p)\n", iface, cchSpecVersion, wzSpecVersion, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"SpecVersion", + return ComponentInfo_GetStringValue(&This->base, L"SpecVersion", cchSpecVersion, wzSpecVersion, pcchActual); }
@@ -327,7 +341,7 @@ static HRESULT WINAPI BitmapDecoderInfo_GetFriendlyName(IWICBitmapDecoderInfo *i
TRACE("(%p,%u,%p,%p)\n", iface, cchFriendlyName, wzFriendlyName, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"FriendlyName", + return ComponentInfo_GetStringValue(&This->base, L"FriendlyName", cchFriendlyName, wzFriendlyName, pcchActual); }
@@ -336,7 +350,7 @@ static HRESULT WINAPI BitmapDecoderInfo_GetContainerFormat(IWICBitmapDecoderInfo { BitmapDecoderInfo *This = impl_from_IWICBitmapDecoderInfo(iface); TRACE("(%p,%p)\n", iface, pguidContainerFormat); - return ComponentInfo_GetGUIDValue(This->classkey, L"ContainerFormat", pguidContainerFormat); + return ComponentInfo_GetGUIDValue(&This->base, L"ContainerFormat", pguidContainerFormat); }
static HRESULT WINAPI BitmapDecoderInfo_GetPixelFormats(IWICBitmapDecoderInfo *iface, @@ -344,7 +358,7 @@ static HRESULT WINAPI BitmapDecoderInfo_GetPixelFormats(IWICBitmapDecoderInfo *i { BitmapDecoderInfo *This = impl_from_IWICBitmapDecoderInfo(iface); TRACE("(%p,%u,%p,%p)\n", iface, cFormats, pguidPixelFormats, pcActual); - return ComponentInfo_GetGuidList(This->classkey, L"Formats", cFormats, pguidPixelFormats, pcActual); + return ComponentInfo_GetGuidList(&This->base, L"Formats", cFormats, pguidPixelFormats, pcActual); }
static HRESULT WINAPI BitmapDecoderInfo_GetColorManagementVersion(IWICBitmapDecoderInfo *iface, @@ -375,7 +389,7 @@ static HRESULT WINAPI BitmapDecoderInfo_GetMimeTypes(IWICBitmapDecoderInfo *ifac
TRACE("(%p,%u,%p,%p)\n", iface, cchMimeTypes, wzMimeTypes, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"MimeTypes", + return ComponentInfo_GetStringValue(&This->base, L"MimeTypes", cchMimeTypes, wzMimeTypes, pcchActual); }
@@ -386,7 +400,7 @@ static HRESULT WINAPI BitmapDecoderInfo_GetFileExtensions(IWICBitmapDecoderInfo
TRACE("(%p,%u,%p,%p)\n", iface, cchFileExtensions, wzFileExtensions, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"FileExtensions", + return ComponentInfo_GetStringValue(&This->base, L"FileExtensions", cchFileExtensions, wzFileExtensions, pcchActual); }
@@ -560,7 +574,7 @@ static void read_bitmap_patterns(BitmapDecoderInfo *info) BYTE *patterns_ptr; DWORD length, valuesize;
- res = RegOpenKeyExW(info->classkey, L"Patterns", 0, KEY_READ, &patternskey); + res = RegOpenKeyExW(info->base.classkey, L"Patterns", 0, KEY_READ, &patternskey); if (res != ERROR_SUCCESS) return;
res = RegQueryInfoKeyW(patternskey, NULL, NULL, NULL, &pattern_count, NULL, NULL, NULL, NULL, NULL, NULL, NULL); @@ -660,10 +674,7 @@ static HRESULT BitmapDecoderInfo_Constructor(HKEY classkey, REFCLSID clsid, Comp if (!This) return E_OUTOFMEMORY;
- This->base.IWICComponentInfo_iface.lpVtbl = (const IWICComponentInfoVtbl*)&BitmapDecoderInfo_Vtbl; - This->base.ref = 1; - This->classkey = classkey; - This->base.clsid = *clsid; + component_info_init(&This->base, classkey, clsid, (const IWICComponentInfoVtbl *)&BitmapDecoderInfo_Vtbl);
read_bitmap_patterns(This);
@@ -673,7 +684,6 @@ static HRESULT BitmapDecoderInfo_Constructor(HKEY classkey, REFCLSID clsid, Comp
typedef struct { ComponentInfo base; - HKEY classkey; } BitmapEncoderInfo;
static inline BitmapEncoderInfo *impl_from_IWICBitmapEncoderInfo(IWICBitmapEncoderInfo *iface) @@ -725,7 +735,7 @@ static ULONG WINAPI BitmapEncoderInfo_Release(IWICBitmapEncoderInfo *iface)
if (ref == 0) { - RegCloseKey(This->classkey); + component_info_cleanup(&This->base); free(This); }
@@ -766,7 +776,7 @@ static HRESULT WINAPI BitmapEncoderInfo_GetAuthor(IWICBitmapEncoderInfo *iface,
TRACE("(%p,%u,%p,%p)\n", iface, cchAuthor, wzAuthor, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"Author", cchAuthor, wzAuthor, pcchActual); + return ComponentInfo_GetStringValue(&This->base, L"Author", cchAuthor, wzAuthor, pcchActual); }
static HRESULT WINAPI BitmapEncoderInfo_GetVendorGUID(IWICBitmapEncoderInfo *iface, GUID *pguidVendor) @@ -775,7 +785,7 @@ static HRESULT WINAPI BitmapEncoderInfo_GetVendorGUID(IWICBitmapEncoderInfo *ifa
TRACE("(%p,%p)\n", iface, pguidVendor);
- return ComponentInfo_GetGUIDValue(This->classkey, L"Vendor", pguidVendor); + return ComponentInfo_GetGUIDValue(&This->base, L"Vendor", pguidVendor); }
static HRESULT WINAPI BitmapEncoderInfo_GetVersion(IWICBitmapEncoderInfo *iface, UINT cchVersion, @@ -785,7 +795,7 @@ static HRESULT WINAPI BitmapEncoderInfo_GetVersion(IWICBitmapEncoderInfo *iface,
TRACE("(%p,%u,%p,%p)\n", iface, cchVersion, wzVersion, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"Version", + return ComponentInfo_GetStringValue(&This->base, L"Version", cchVersion, wzVersion, pcchActual); }
@@ -796,7 +806,7 @@ static HRESULT WINAPI BitmapEncoderInfo_GetSpecVersion(IWICBitmapEncoderInfo *if
TRACE("(%p,%u,%p,%p)\n", iface, cchSpecVersion, wzSpecVersion, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"SpecVersion", + return ComponentInfo_GetStringValue(&This->base, L"SpecVersion", cchSpecVersion, wzSpecVersion, pcchActual); }
@@ -807,7 +817,7 @@ static HRESULT WINAPI BitmapEncoderInfo_GetFriendlyName(IWICBitmapEncoderInfo *i
TRACE("(%p,%u,%p,%p)\n", iface, cchFriendlyName, wzFriendlyName, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"FriendlyName", + return ComponentInfo_GetStringValue(&This->base, L"FriendlyName", cchFriendlyName, wzFriendlyName, pcchActual); }
@@ -816,7 +826,7 @@ static HRESULT WINAPI BitmapEncoderInfo_GetContainerFormat(IWICBitmapEncoderInfo { BitmapEncoderInfo *This = impl_from_IWICBitmapEncoderInfo(iface); TRACE("(%p,%p)\n", iface, pguidContainerFormat); - return ComponentInfo_GetGUIDValue(This->classkey, L"ContainerFormat", pguidContainerFormat); + return ComponentInfo_GetGUIDValue(&This->base, L"ContainerFormat", pguidContainerFormat); }
static HRESULT WINAPI BitmapEncoderInfo_GetPixelFormats(IWICBitmapEncoderInfo *iface, @@ -824,7 +834,7 @@ static HRESULT WINAPI BitmapEncoderInfo_GetPixelFormats(IWICBitmapEncoderInfo *i { BitmapEncoderInfo *This = impl_from_IWICBitmapEncoderInfo(iface); TRACE("(%p,%u,%p,%p)\n", iface, cFormats, pguidPixelFormats, pcActual); - return ComponentInfo_GetGuidList(This->classkey, L"Formats", cFormats, pguidPixelFormats, pcActual); + return ComponentInfo_GetGuidList(&This->base, L"Formats", cFormats, pguidPixelFormats, pcActual); }
static HRESULT WINAPI BitmapEncoderInfo_GetColorManagementVersion(IWICBitmapEncoderInfo *iface, @@ -855,7 +865,7 @@ static HRESULT WINAPI BitmapEncoderInfo_GetMimeTypes(IWICBitmapEncoderInfo *ifac
TRACE("(%p,%u,%p,%p)\n", iface, cchMimeTypes, wzMimeTypes, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"MimeTypes", + return ComponentInfo_GetStringValue(&This->base, L"MimeTypes", cchMimeTypes, wzMimeTypes, pcchActual); }
@@ -866,7 +876,7 @@ static HRESULT WINAPI BitmapEncoderInfo_GetFileExtensions(IWICBitmapEncoderInfo
TRACE("(%p,%u,%p,%p)\n", iface, cchFileExtensions, wzFileExtensions, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"FileExtensions", + return ComponentInfo_GetStringValue(&This->base, L"FileExtensions", cchFileExtensions, wzFileExtensions, pcchActual); }
@@ -950,10 +960,7 @@ static HRESULT BitmapEncoderInfo_Constructor(HKEY classkey, REFCLSID clsid, Comp if (!This) return E_OUTOFMEMORY;
- This->base.IWICComponentInfo_iface.lpVtbl = (const IWICComponentInfoVtbl*)&BitmapEncoderInfo_Vtbl; - This->base.ref = 1; - This->classkey = classkey; - This->base.clsid = *clsid; + component_info_init(&This->base, classkey, clsid, (const IWICComponentInfoVtbl *)&BitmapEncoderInfo_Vtbl);
*ret = &This->base; return S_OK; @@ -961,7 +968,6 @@ static HRESULT BitmapEncoderInfo_Constructor(HKEY classkey, REFCLSID clsid, Comp
typedef struct { ComponentInfo base; - HKEY classkey; } FormatConverterInfo;
static inline FormatConverterInfo *impl_from_IWICFormatConverterInfo(IWICFormatConverterInfo *iface) @@ -1012,7 +1018,7 @@ static ULONG WINAPI FormatConverterInfo_Release(IWICFormatConverterInfo *iface)
if (ref == 0) { - RegCloseKey(This->classkey); + component_info_cleanup(&This->base); free(This); }
@@ -1053,7 +1059,7 @@ static HRESULT WINAPI FormatConverterInfo_GetAuthor(IWICFormatConverterInfo *ifa
TRACE("(%p,%u,%p,%p)\n", iface, cchAuthor, wzAuthor, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"Author", cchAuthor, wzAuthor, pcchActual); + return ComponentInfo_GetStringValue(&This->base, L"Author", cchAuthor, wzAuthor, pcchActual); }
static HRESULT WINAPI FormatConverterInfo_GetVendorGUID(IWICFormatConverterInfo *iface, GUID *pguidVendor) @@ -1062,7 +1068,7 @@ static HRESULT WINAPI FormatConverterInfo_GetVendorGUID(IWICFormatConverterInfo
TRACE("(%p,%p)\n", iface, pguidVendor);
- return ComponentInfo_GetGUIDValue(This->classkey, L"Vendor", pguidVendor); + return ComponentInfo_GetGUIDValue(&This->base, L"Vendor", pguidVendor); }
static HRESULT WINAPI FormatConverterInfo_GetVersion(IWICFormatConverterInfo *iface, UINT cchVersion, @@ -1072,7 +1078,7 @@ static HRESULT WINAPI FormatConverterInfo_GetVersion(IWICFormatConverterInfo *if
TRACE("(%p,%u,%p,%p)\n", iface, cchVersion, wzVersion, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"Version", + return ComponentInfo_GetStringValue(&This->base, L"Version", cchVersion, wzVersion, pcchActual); }
@@ -1083,7 +1089,7 @@ static HRESULT WINAPI FormatConverterInfo_GetSpecVersion(IWICFormatConverterInfo
TRACE("(%p,%u,%p,%p)\n", iface, cchSpecVersion, wzSpecVersion, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"SpecVersion", + return ComponentInfo_GetStringValue(&This->base, L"SpecVersion", cchSpecVersion, wzSpecVersion, pcchActual); }
@@ -1094,7 +1100,7 @@ static HRESULT WINAPI FormatConverterInfo_GetFriendlyName(IWICFormatConverterInf
TRACE("(%p,%u,%p,%p)\n", iface, cchFriendlyName, wzFriendlyName, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"FriendlyName", + return ComponentInfo_GetStringValue(&This->base, L"FriendlyName", cchFriendlyName, wzFriendlyName, pcchActual); }
@@ -1125,7 +1131,7 @@ static BOOL ConverterSupportsFormat(IWICFormatConverterInfo *iface, const WCHAR /* Avoid testing using IWICFormatConverter_GetPixelFormats because that would be O(n). A registry test should do better. */
- res = RegOpenKeyExW(This->classkey, L"PixelFormats", 0, KEY_READ, &formats_key); + res = RegOpenKeyExW(This->base.classkey, L"PixelFormats", 0, KEY_READ, &formats_key); if (res != ERROR_SUCCESS) return FALSE;
res = RegOpenKeyExW(formats_key, formatguid, 0, KEY_READ, &guid_key); @@ -1160,10 +1166,7 @@ static HRESULT FormatConverterInfo_Constructor(HKEY classkey, REFCLSID clsid, Co if (!This) return E_OUTOFMEMORY;
- This->base.IWICComponentInfo_iface.lpVtbl = (const IWICComponentInfoVtbl*)&FormatConverterInfo_Vtbl; - This->base.ref = 1; - This->classkey = classkey; - This->base.clsid = *clsid; + component_info_init(&This->base, classkey, clsid, (const IWICComponentInfoVtbl *)&FormatConverterInfo_Vtbl);
*ret = &This->base; return S_OK; @@ -1171,7 +1174,6 @@ static HRESULT FormatConverterInfo_Constructor(HKEY classkey, REFCLSID clsid, Co
typedef struct { ComponentInfo base; - HKEY classkey; } PixelFormatInfo;
static inline PixelFormatInfo *impl_from_IWICPixelFormatInfo2(IWICPixelFormatInfo2 *iface) @@ -1223,7 +1225,7 @@ static ULONG WINAPI PixelFormatInfo_Release(IWICPixelFormatInfo2 *iface)
if (ref == 0) { - RegCloseKey(This->classkey); + component_info_cleanup(&This->base); free(This); }
@@ -1271,7 +1273,7 @@ static HRESULT WINAPI PixelFormatInfo_GetAuthor(IWICPixelFormatInfo2 *iface, UIN
TRACE("(%p,%u,%p,%p)\n", iface, cchAuthor, wzAuthor, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"Author", cchAuthor, wzAuthor, pcchActual); + return ComponentInfo_GetStringValue(&This->base, L"Author", cchAuthor, wzAuthor, pcchActual); }
static HRESULT WINAPI PixelFormatInfo_GetVendorGUID(IWICPixelFormatInfo2 *iface, GUID *pguidVendor) @@ -1280,7 +1282,7 @@ static HRESULT WINAPI PixelFormatInfo_GetVendorGUID(IWICPixelFormatInfo2 *iface,
TRACE("(%p,%p)\n", iface, pguidVendor);
- return ComponentInfo_GetGUIDValue(This->classkey, L"Vendor", pguidVendor); + return ComponentInfo_GetGUIDValue(&This->base, L"Vendor", pguidVendor); }
static HRESULT WINAPI PixelFormatInfo_GetVersion(IWICPixelFormatInfo2 *iface, UINT cchVersion, @@ -1290,7 +1292,7 @@ static HRESULT WINAPI PixelFormatInfo_GetVersion(IWICPixelFormatInfo2 *iface, UI
TRACE("(%p,%u,%p,%p)\n", iface, cchVersion, wzVersion, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"Version", + return ComponentInfo_GetStringValue(&This->base, L"Version", cchVersion, wzVersion, pcchActual); }
@@ -1301,7 +1303,7 @@ static HRESULT WINAPI PixelFormatInfo_GetSpecVersion(IWICPixelFormatInfo2 *iface
TRACE("(%p,%u,%p,%p)\n", iface, cchSpecVersion, wzSpecVersion, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"SpecVersion", + return ComponentInfo_GetStringValue(&This->base, L"SpecVersion", cchSpecVersion, wzSpecVersion, pcchActual); }
@@ -1312,7 +1314,7 @@ static HRESULT WINAPI PixelFormatInfo_GetFriendlyName(IWICPixelFormatInfo2 *ifac
TRACE("(%p,%u,%p,%p)\n", iface, cchFriendlyName, wzFriendlyName, pcchActual);
- return ComponentInfo_GetStringValue(This->classkey, L"FriendlyName", + return ComponentInfo_GetStringValue(&This->base, L"FriendlyName", cchFriendlyName, wzFriendlyName, pcchActual); }
@@ -1343,7 +1345,7 @@ static HRESULT WINAPI PixelFormatInfo_GetBitsPerPixel(IWICPixelFormatInfo2 *ifac
TRACE("(%p,%p)\n", iface, puiBitsPerPixel);
- return ComponentInfo_GetUINTValue(This->classkey, L"BitLength", puiBitsPerPixel); + return ComponentInfo_GetUINTValue(&This->base, L"BitLength", puiBitsPerPixel); }
static HRESULT WINAPI PixelFormatInfo_GetChannelCount(IWICPixelFormatInfo2 *iface, @@ -1353,7 +1355,7 @@ static HRESULT WINAPI PixelFormatInfo_GetChannelCount(IWICPixelFormatInfo2 *ifac
TRACE("(%p,%p)\n", iface, puiChannelCount);
- return ComponentInfo_GetUINTValue(This->classkey, L"ChannelCount", puiChannelCount); + return ComponentInfo_GetUINTValue(&This->base, L"ChannelCount", puiChannelCount); }
static HRESULT WINAPI PixelFormatInfo_GetChannelMask(IWICPixelFormatInfo2 *iface, @@ -1382,7 +1384,7 @@ static HRESULT WINAPI PixelFormatInfo_GetChannelMask(IWICPixelFormatInfo2 *iface
cbData = cbMaskBuffer;
- ret = RegGetValueW(This->classkey, L"ChannelMasks", valuename, RRF_RT_REG_BINARY, NULL, pbMaskBuffer, &cbData); + ret = RegGetValueW(This->base.classkey, L"ChannelMasks", valuename, RRF_RT_REG_BINARY, NULL, pbMaskBuffer, &cbData);
if (ret == ERROR_SUCCESS || ret == ERROR_MORE_DATA) *pcbActual = cbData; @@ -1403,7 +1405,7 @@ static HRESULT WINAPI PixelFormatInfo_SupportsTransparency(IWICPixelFormatInfo2
TRACE("(%p,%p)\n", iface, pfSupportsTransparency);
- return ComponentInfo_GetUINTValue(This->classkey, L"SupportsTransparency", pfSupportsTransparency); + return ComponentInfo_GetUINTValue(&This->base, L"SupportsTransparency", pfSupportsTransparency); }
static HRESULT WINAPI PixelFormatInfo_GetNumericRepresentation(IWICPixelFormatInfo2 *iface, @@ -1413,7 +1415,7 @@ static HRESULT WINAPI PixelFormatInfo_GetNumericRepresentation(IWICPixelFormatIn
TRACE("(%p,%p)\n", iface, pNumericRepresentation);
- return ComponentInfo_GetUINTValue(This->classkey, L"NumericRepresentation", pNumericRepresentation); + return ComponentInfo_GetUINTValue(&This->base, L"NumericRepresentation", pNumericRepresentation); }
static const IWICPixelFormatInfo2Vtbl PixelFormatInfo_Vtbl = { @@ -1445,10 +1447,7 @@ static HRESULT PixelFormatInfo_Constructor(HKEY classkey, REFCLSID clsid, Compon if (!This) return E_OUTOFMEMORY;
- This->base.IWICComponentInfo_iface.lpVtbl = (const IWICComponentInfoVtbl*)&PixelFormatInfo_Vtbl; - This->base.ref = 1; - This->classkey = classkey; - This->base.clsid = *clsid; + component_info_init(&This->base, classkey, clsid, (const IWICComponentInfoVtbl *)&PixelFormatInfo_Vtbl);
*ret = &This->base; return S_OK; @@ -1464,7 +1463,6 @@ struct metadata_container typedef struct { ComponentInfo base; - HKEY classkey; GUID *container_formats; struct metadata_container *containers; UINT container_count; @@ -1531,7 +1529,7 @@ static ULONG WINAPI MetadataReaderInfo_Release(IWICMetadataReaderInfo *iface) if (!ref) { unsigned i; - RegCloseKey(This->classkey); + component_info_cleanup(&This->base); for (i = 0; i < This->container_count; i++) free(This->containers[i].patterns); free(This->containers); @@ -1577,7 +1575,7 @@ static HRESULT WINAPI MetadataReaderInfo_GetAuthor(IWICMetadataReaderInfo *iface
TRACE("(%p,%u,%p,%p)\n", iface, length, author, actual_length);
- return ComponentInfo_GetStringValue(This->classkey, L"Author", length, author, actual_length); + return ComponentInfo_GetStringValue(&This->base, L"Author", length, author, actual_length); }
static HRESULT WINAPI MetadataReaderInfo_GetVendorGUID(IWICMetadataReaderInfo *iface, @@ -1587,7 +1585,7 @@ static HRESULT WINAPI MetadataReaderInfo_GetVendorGUID(IWICMetadataReaderInfo *i
TRACE("(%p,%p)\n", iface, vendor);
- return ComponentInfo_GetGUIDValue(This->classkey, L"Vendor", vendor); + return ComponentInfo_GetGUIDValue(&This->base, L"Vendor", vendor); }
static HRESULT WINAPI MetadataReaderInfo_GetVersion(IWICMetadataReaderInfo *iface, @@ -1597,7 +1595,7 @@ static HRESULT WINAPI MetadataReaderInfo_GetVersion(IWICMetadataReaderInfo *ifac
TRACE("(%p,%u,%p,%p)\n", iface, length, version, actual_length);
- return ComponentInfo_GetStringValue(This->classkey, L"Version", length, version, actual_length); + return ComponentInfo_GetStringValue(&This->base, L"Version", length, version, actual_length); }
static HRESULT WINAPI MetadataReaderInfo_GetSpecVersion(IWICMetadataReaderInfo *iface, @@ -1607,7 +1605,7 @@ static HRESULT WINAPI MetadataReaderInfo_GetSpecVersion(IWICMetadataReaderInfo *
TRACE("(%p,%u,%p,%p)\n", iface, length, version, actual_length);
- return ComponentInfo_GetStringValue(This->classkey, L"SpecVersion", + return ComponentInfo_GetStringValue(&This->base, L"SpecVersion", length, version, actual_length); }
@@ -1618,7 +1616,7 @@ static HRESULT WINAPI MetadataReaderInfo_GetFriendlyName(IWICMetadataReaderInfo
TRACE("(%p,%u,%p,%p)\n", iface, length, name, actual_length);
- return ComponentInfo_GetStringValue(This->classkey, L"FriendlyName", + return ComponentInfo_GetStringValue(&This->base, L"FriendlyName", length, name, actual_length); }
@@ -1627,7 +1625,7 @@ static HRESULT WINAPI MetadataReaderInfo_GetMetadataFormat(IWICMetadataReaderInf { MetadataReaderInfo *This = impl_from_IWICMetadataReaderInfo(iface); TRACE("(%p,%p)\n", iface, format); - return ComponentInfo_GetGUIDValue(This->classkey, L"MetadataFormat", format); + return ComponentInfo_GetGUIDValue(&This->base, L"MetadataFormat", format); }
static HRESULT WINAPI MetadataReaderInfo_GetContainerFormats(IWICMetadataReaderInfo *iface, @@ -1669,7 +1667,7 @@ static HRESULT WINAPI MetadataReaderInfo_DoesRequireFullStream(IWICMetadataReade { MetadataReaderInfo *This = impl_from_IWICMetadataReaderInfo(iface); TRACE("(%p,%p)\n", iface, param); - return ComponentInfo_GetUINTValue(This->classkey, L"RequiresFullStream", param); + return ComponentInfo_GetUINTValue(&This->base, L"RequiresFullStream", param); }
static HRESULT WINAPI MetadataReaderInfo_DoesSupportPadding(IWICMetadataReaderInfo *iface, @@ -1677,7 +1675,7 @@ static HRESULT WINAPI MetadataReaderInfo_DoesSupportPadding(IWICMetadataReaderIn { MetadataReaderInfo *This = impl_from_IWICMetadataReaderInfo(iface); TRACE("(%p,%p)\n", iface, param); - return ComponentInfo_GetUINTValue(This->classkey, L"SupportsPadding", param); + return ComponentInfo_GetUINTValue(&This->base, L"SupportsPadding", param); }
static HRESULT WINAPI MetadataReaderInfo_DoesRequireFixedSize(IWICMetadataReaderInfo *iface, @@ -1823,7 +1821,7 @@ static void read_metadata_patterns(MetadataReaderInfo *info, GUID *container_gui BYTE *patterns_ptr; DWORD length, valuesize;
- res = RegOpenKeyExW(info->classkey, L"Containers", 0, KEY_READ, &containers_key); + res = RegOpenKeyExW(info->base.classkey, L"Containers", 0, KEY_READ, &containers_key); if (res != ERROR_SUCCESS) return;
StringFromGUID2(container_guid, guidkeyname, 39); @@ -1926,13 +1924,13 @@ static BOOL read_metadata_info(MetadataReaderInfo *info) GUID *formats; HRESULT hr;
- hr = ComponentInfo_GetGuidList(info->classkey, L"Containers", 0, NULL, &format_count); + hr = ComponentInfo_GetGuidList(&info->base, L"Containers", 0, NULL, &format_count); if (FAILED(hr)) return TRUE;
formats = calloc(format_count, sizeof(*formats)); if (!formats) return FALSE;
- hr = ComponentInfo_GetGuidList(info->classkey, L"Containers", format_count, formats, + hr = ComponentInfo_GetGuidList(&info->base, L"Containers", format_count, formats, &format_count); if (FAILED(hr)) { @@ -1965,10 +1963,7 @@ static HRESULT MetadataReaderInfo_Constructor(HKEY classkey, REFCLSID clsid, Com if (!This) return E_OUTOFMEMORY;
- This->base.IWICComponentInfo_iface.lpVtbl = (const IWICComponentInfoVtbl*)&MetadataReaderInfo_Vtbl; - This->base.ref = 1; - This->classkey = classkey; - This->base.clsid = *clsid; + component_info_init(&This->base, classkey, clsid, (const IWICComponentInfoVtbl *)&MetadataReaderInfo_Vtbl);
if (!read_metadata_info(This)) {
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/info.c | 248 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+)
diff --git a/dlls/windowscodecs/info.c b/dlls/windowscodecs/info.c index dee67a60803..e210b5d81d9 100644 --- a/dlls/windowscodecs/info.c +++ b/dlls/windowscodecs/info.c @@ -1975,6 +1975,253 @@ static HRESULT MetadataReaderInfo_Constructor(HKEY classkey, REFCLSID clsid, Com return S_OK; }
+struct metadata_writer_info +{ + ComponentInfo base; +}; + +static inline struct metadata_writer_info *impl_from_IWICMetadataWriterInfo(IWICMetadataWriterInfo *iface) +{ + return CONTAINING_RECORD(iface, struct metadata_writer_info, base.IWICComponentInfo_iface); +} + +static HRESULT WINAPI metadata_writer_info_QueryInterface(IWICMetadataWriterInfo *iface, REFIID riid, void **ppv) +{ + struct metadata_writer_info *info = impl_from_IWICMetadataWriterInfo(iface); + + TRACE("(%p,%s,%p)\n", iface, debugstr_guid(riid), ppv); + + if (!ppv) return E_INVALIDARG; + + if (IsEqualIID(&IID_IUnknown, riid) || + IsEqualIID(&IID_IWICComponentInfo, riid) || + IsEqualIID(&IID_IWICMetadataHandlerInfo, riid) || + IsEqualIID(&IID_IWICMetadataWriterInfo, riid)) + { + *ppv = &info->base.IWICComponentInfo_iface; + } + else + { + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown *)*ppv); + return S_OK; +} + +static ULONG WINAPI metadata_writer_info_AddRef(IWICMetadataWriterInfo *iface) +{ + struct metadata_writer_info *info = impl_from_IWICMetadataWriterInfo(iface); + ULONG ref = InterlockedIncrement(&info->base.ref); + + TRACE("(%p) refcount=%lu\n", iface, ref); + return ref; +} + +static ULONG WINAPI metadata_writer_info_Release(IWICMetadataWriterInfo *iface) +{ + struct metadata_writer_info *info = impl_from_IWICMetadataWriterInfo(iface); + ULONG ref = InterlockedDecrement(&info->base.ref); + + TRACE("(%p) refcount=%lu\n", iface, ref); + + if (!ref) + { + component_info_cleanup(&info->base); + free(info); + } + return ref; +} + +static HRESULT WINAPI metadata_writer_info_GetComponentType(IWICMetadataWriterInfo *iface, WICComponentType *type) +{ + TRACE("(%p,%p)\n", iface, type); + + if (!type) + return E_INVALIDARG; + + *type = WICMetadataWriter; + return S_OK; +} + +static HRESULT WINAPI metadata_writer_info_GetCLSID(IWICMetadataWriterInfo *iface, CLSID *clsid) +{ + struct metadata_writer_info *info = impl_from_IWICMetadataWriterInfo(iface); + + TRACE("(%p,%p)\n", iface, clsid); + + if (!clsid) + return E_INVALIDARG; + + *clsid = info->base.clsid; + return S_OK; +} + +static HRESULT WINAPI metadata_writer_info_GetSigningStatus(IWICMetadataWriterInfo *iface, DWORD *status) +{ + FIXME("(%p,%p): stub\n", iface, status); + return E_NOTIMPL; +} + +static HRESULT WINAPI metadata_writer_info_GetAuthor(IWICMetadataWriterInfo *iface, + UINT length, WCHAR *author, UINT *actual_length) +{ + struct metadata_writer_info *info = impl_from_IWICMetadataWriterInfo(iface); + + TRACE("(%p,%u,%p,%p)\n", iface, length, author, actual_length); + + return ComponentInfo_GetStringValue(&info->base, L"Author", length, author, actual_length); +} + +static HRESULT WINAPI metadata_writer_info_GetVendorGUID(IWICMetadataWriterInfo *iface, GUID *vendor) +{ + struct metadata_writer_info *info = impl_from_IWICMetadataWriterInfo(iface); + + TRACE("(%p,%p)\n", iface, vendor); + + return ComponentInfo_GetGUIDValue(&info->base, L"Vendor", vendor); +} + +static HRESULT WINAPI metadata_writer_info_GetVersion(IWICMetadataWriterInfo *iface, UINT length, + WCHAR *version, UINT *actual_length) +{ + struct metadata_writer_info *info = impl_from_IWICMetadataWriterInfo(iface); + + TRACE("(%p,%u,%p,%p)\n", iface, length, version, actual_length); + + return ComponentInfo_GetStringValue(&info->base, L"Version", length, version, actual_length); +} + +static HRESULT WINAPI metadata_writer_info_GetSpecVersion(IWICMetadataWriterInfo *iface, + UINT length, WCHAR *version, UINT *actual_length) +{ + struct metadata_writer_info *info = impl_from_IWICMetadataWriterInfo(iface); + + TRACE("(%p,%u,%p,%p)\n", iface, length, version, actual_length); + + return ComponentInfo_GetStringValue(&info->base, L"SpecVersion", length, version, actual_length); +} + +static HRESULT WINAPI metadata_writer_info_GetFriendlyName(IWICMetadataWriterInfo *iface, + UINT length, WCHAR *name, UINT *actual_length) +{ + struct metadata_writer_info *info = impl_from_IWICMetadataWriterInfo(iface); + + TRACE("(%p,%u,%p,%p)\n", iface, length, name, actual_length); + + return ComponentInfo_GetStringValue(&info->base, L"FriendlyName", length, name, actual_length); +} + +static HRESULT WINAPI metadata_writer_info_GetMetadataFormat(IWICMetadataWriterInfo *iface, GUID *format) +{ + struct metadata_writer_info *info = impl_from_IWICMetadataWriterInfo(iface); + + TRACE("(%p,%p)\n", iface, format); + + return ComponentInfo_GetGUIDValue(&info->base, L"MetadataFormat", format); +} + +static HRESULT WINAPI metadata_writer_info_GetContainerFormats(IWICMetadataWriterInfo *iface, + UINT length, GUID *formats, UINT *actual_length) +{ + FIXME("(%p,%u,%p,%p): stub\n", iface, length, formats, actual_length); + + return E_NOTIMPL; +} + +static HRESULT WINAPI metadata_writer_info_GetDeviceManufacturer(IWICMetadataWriterInfo *iface, + UINT length, WCHAR *manufacturer, UINT *actual_length) +{ + FIXME("(%p,%u,%p,%p): stub\n", iface, length, manufacturer, actual_length); + return E_NOTIMPL; +} + +static HRESULT WINAPI metadata_writer_info_GetDeviceModels(IWICMetadataWriterInfo *iface, + UINT length, WCHAR *models, UINT *actual_length) +{ + FIXME("(%p,%u,%p,%p): stub\n", iface, length, models, actual_length); + return E_NOTIMPL; +} + +static HRESULT WINAPI metadata_writer_info_DoesRequireFullStream(IWICMetadataWriterInfo *iface, BOOL *param) +{ + struct metadata_writer_info *info = impl_from_IWICMetadataWriterInfo(iface); + + TRACE("(%p,%p)\n", iface, param); + + return ComponentInfo_GetUINTValue(&info->base, L"RequiresFullStream", param); +} + +static HRESULT WINAPI metadata_writer_info_DoesSupportPadding(IWICMetadataWriterInfo *iface, BOOL *param) +{ + struct metadata_writer_info *info = impl_from_IWICMetadataWriterInfo(iface); + + TRACE("(%p,%p)\n", iface, param); + + return ComponentInfo_GetUINTValue(&info->base, L"SupportsPadding", param); +} + +static HRESULT WINAPI metadata_writer_info_DoesRequireFixedSize(IWICMetadataWriterInfo *iface, BOOL *param) +{ + FIXME("(%p,%p): stub\n", iface, param); + return E_NOTIMPL; +} + +static HRESULT WINAPI metadata_writer_info_GetHeader(IWICMetadataWriterInfo *iface, REFGUID container_format, + UINT size, WICMetadataHeader *header, UINT *actual_size) +{ + FIXME("(%p,%s,%u,%p,%p): stub\n", iface, debugstr_guid(container_format), size, header, actual_size); + + return E_NOTIMPL; +} + +static HRESULT WINAPI metadata_writer_info_CreateInstance(IWICMetadataWriterInfo *iface, IWICMetadataWriter **writer) +{ + struct metadata_writer_info *info = impl_from_IWICMetadataWriterInfo(iface); + + TRACE("(%p,%p)\n", iface, writer); + + return create_instance(&info->base.clsid, &IID_IWICMetadataWriter, (void **)writer); +} + +static const IWICMetadataWriterInfoVtbl metadata_writer_info_vtbl = +{ + metadata_writer_info_QueryInterface, + metadata_writer_info_AddRef, + metadata_writer_info_Release, + metadata_writer_info_GetComponentType, + metadata_writer_info_GetCLSID, + metadata_writer_info_GetSigningStatus, + metadata_writer_info_GetAuthor, + metadata_writer_info_GetVendorGUID, + metadata_writer_info_GetVersion, + metadata_writer_info_GetSpecVersion, + metadata_writer_info_GetFriendlyName, + metadata_writer_info_GetMetadataFormat, + metadata_writer_info_GetContainerFormats, + metadata_writer_info_GetDeviceManufacturer, + metadata_writer_info_GetDeviceModels, + metadata_writer_info_DoesRequireFullStream, + metadata_writer_info_DoesSupportPadding, + metadata_writer_info_DoesRequireFixedSize, + metadata_writer_info_GetHeader, + metadata_writer_info_CreateInstance, +}; + +static HRESULT MetadataWriterInfo_Constructor(HKEY classkey, REFCLSID clsid, ComponentInfo **info) +{ + struct metadata_writer_info *obj; + + if (!(obj = calloc(1, sizeof(*obj)))) + return E_OUTOFMEMORY; + + component_info_init(&obj->base, classkey, clsid, (const IWICComponentInfoVtbl *)&metadata_writer_info_vtbl); + + *info = &obj->base; + return S_OK; +} + struct category { WICComponentType type; const GUID *catid; @@ -1987,6 +2234,7 @@ static const struct category categories[] = { {WICPixelFormatConverter, &CATID_WICFormatConverters, FormatConverterInfo_Constructor}, {WICPixelFormat, &CATID_WICPixelFormats, PixelFormatInfo_Constructor}, {WICMetadataReader, &CATID_WICMetadataReader, MetadataReaderInfo_Constructor}, + {WICMetadataWriter, &CATID_WICMetadataWriter, MetadataWriterInfo_Constructor}, {0} };
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/regsvr.c | 199 ++++++++++++++++++ dlls/windowscodecs/windowscodecs_wincodec.idl | 7 + 2 files changed, 206 insertions(+)
diff --git a/dlls/windowscodecs/regsvr.c b/dlls/windowscodecs/regsvr.c index f9ba2b083eb..17a8fa17ca0 100644 --- a/dlls/windowscodecs/regsvr.c +++ b/dlls/windowscodecs/regsvr.c @@ -127,6 +127,23 @@ struct regsvr_metadatareader static HRESULT register_metadatareaders(struct regsvr_metadatareader const *list); static HRESULT unregister_metadatareaders(struct regsvr_metadatareader const *list);
+struct regsvr_metadatawriter +{ + CLSID const *clsid; /* NULL for end of list */ + LPCSTR author; + LPCSTR friendlyname; + LPCSTR version; + LPCSTR specversion; + GUID const *vendor; + GUID const *metadata_format; + DWORD requires_fullstream; + DWORD supports_padding; + DWORD requires_fixedsize; +}; + +static HRESULT register_metadatawriters(struct regsvr_metadatawriter const *list); +static HRESULT unregister_metadatawriters(struct regsvr_metadatawriter const *list); + struct regsvr_pixelformat { CLSID const *clsid; /* NULL for end of list */ @@ -936,6 +953,170 @@ error_return: return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; }
+static HRESULT register_metadatawriters(struct regsvr_metadatawriter const *list) +{ + LONG res = ERROR_SUCCESS; + HKEY coclass_key; + WCHAR buf[39]; + HKEY readers_key; + HKEY instance_key; + + res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL); + if (res == ERROR_SUCCESS) + { + StringFromGUID2(&CATID_WICMetadataWriter, buf, 39); + res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0, KEY_READ | KEY_WRITE, NULL, &readers_key, NULL); + if (res == ERROR_SUCCESS) + { + res = RegCreateKeyExW(readers_key, instance_keyname, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &instance_key, NULL); + if (res != ERROR_SUCCESS) goto error_close_coclass_key; + } + if (res != ERROR_SUCCESS) + RegCloseKey(coclass_key); + } + if (res != ERROR_SUCCESS) goto error_return; + + for (; res == ERROR_SUCCESS && list->clsid; ++list) + { + HKEY clsid_key; + HKEY instance_clsid_key; + + StringFromGUID2(list->clsid, buf, 39); + res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL); + if (res != ERROR_SUCCESS) goto error_close_coclass_key; + + StringFromGUID2(list->clsid, buf, 39); + res = RegCreateKeyExW(instance_key, buf, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &instance_clsid_key, NULL); + if (res == ERROR_SUCCESS) + { + res = RegSetValueExW(instance_clsid_key, clsid_valuename, 0, REG_SZ, + (const BYTE*)buf, 78); + RegCloseKey(instance_clsid_key); + } + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + + if (list->author) + { + res = RegSetValueExA(clsid_key, author_valuename, 0, REG_SZ, + (const BYTE *)list->author, strlen(list->author) + 1); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + if (list->friendlyname) + { + res = RegSetValueExA(clsid_key, friendlyname_valuename, 0, REG_SZ, + (const BYTE *)list->friendlyname, strlen(list->friendlyname) + 1); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + if (list->vendor) + { + StringFromGUID2(list->vendor, buf, 39); + res = RegSetValueExW(clsid_key, vendor_valuename, 0, REG_SZ, (const BYTE *)buf, 78); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + if (list->metadata_format) + { + StringFromGUID2(list->metadata_format, buf, 39); + res = RegSetValueExW(clsid_key, metadataformat_valuename, 0, REG_SZ, + (const BYTE *)buf, 78); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + if (list->version) + { + res = RegSetValueExA(clsid_key, version_valuename, 0, REG_SZ, + (const BYTE *)list->version, strlen(list->version) + 1); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + if (list->specversion) + { + res = RegSetValueExA(clsid_key, specversion_valuename, 0, REG_SZ, + (const BYTE *)list->specversion, strlen(list->specversion) + 1); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + res = RegSetValueExA(clsid_key, requiresfullstream_valuename, 0, REG_DWORD, + (const BYTE*)&list->requires_fullstream, 4); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + + res = RegSetValueExA(clsid_key, supportspadding_valuename, 0, REG_DWORD, + (const BYTE*)&list->supports_padding, 4); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + + if (list->requires_fixedsize) + { + res = RegSetValueExA(clsid_key, requiresfixedsize_valuename, 0, REG_DWORD, + (const BYTE *)&list->requires_fixedsize, 4); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + error_close_clsid_key: + RegCloseKey(clsid_key); + } + +error_close_coclass_key: + RegCloseKey(instance_key); + RegCloseKey(readers_key); + RegCloseKey(coclass_key); +error_return: + return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; +} + +static HRESULT unregister_metadatawriters(struct regsvr_metadatawriter const *list) +{ + LONG res = ERROR_SUCCESS; + HKEY coclass_key; + WCHAR buf[39]; + HKEY readers_key; + HKEY instance_key; + + res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, KEY_READ | KEY_WRITE, &coclass_key); + if (res == ERROR_FILE_NOT_FOUND) return S_OK; + + if (res == ERROR_SUCCESS) + { + StringFromGUID2(&CATID_WICMetadataWriter, buf, 39); + res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &readers_key, NULL); + if (res == ERROR_SUCCESS) + { + res = RegCreateKeyExW(readers_key, instance_keyname, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &instance_key, NULL); + if (res != ERROR_SUCCESS) goto error_close_coclass_key; + } + if (res != ERROR_SUCCESS) + RegCloseKey(coclass_key); + } + if (res != ERROR_SUCCESS) goto error_return; + + for (; res == ERROR_SUCCESS && list->clsid; ++list) + { + StringFromGUID2(list->clsid, buf, 39); + + res = RegDeleteTreeW(coclass_key, buf); + if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; + if (res != ERROR_SUCCESS) goto error_close_coclass_key; + + res = RegDeleteTreeW(instance_key, buf); + if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; + if (res != ERROR_SUCCESS) goto error_close_coclass_key; + } + +error_close_coclass_key: + RegCloseKey(instance_key); + RegCloseKey(readers_key); + RegCloseKey(coclass_key); +error_return: + return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; +} + /*********************************************************************** * register_pixelformats */ @@ -1902,6 +2083,20 @@ static struct regsvr_metadatareader const metadatareader_list[] = { { NULL } /* list terminator */ };
+static struct regsvr_metadatawriter const metadatawriters_list[] = +{ + { + &CLSID_WICUnknownMetadataWriter, + "The Wine Project", + "Unknown Metadata Writer", + "1.0.0.0", + "1.0.0.0", + &GUID_VendorMicrosoft, + &GUID_MetadataFormatUnknown, + }, + { NULL } /* list terminator */ +}; + static BYTE const channel_mask_1bit[] = { 0x01 }; static BYTE const channel_mask_2bit[] = { 0x03 }; static BYTE const channel_mask_4bit[] = { 0x0f }; @@ -2394,6 +2589,8 @@ HRESULT WINAPI DllRegisterServer(void) hr = register_converters(converter_list); if (SUCCEEDED(hr)) hr = register_metadatareaders(metadatareader_list); + if (SUCCEEDED(hr)) + hr = register_metadatawriters(metadatawriters_list); if (SUCCEEDED(hr)) hr = register_pixelformats(pixelformat_list); return hr; @@ -2416,6 +2613,8 @@ HRESULT WINAPI DllUnregisterServer(void) hr = unregister_converters(converter_list); if (SUCCEEDED(hr)) hr = unregister_metadatareaders(metadatareader_list); + if (SUCCEEDED(hr)) + hr = unregister_metadatawriters(metadatawriters_list); if (SUCCEEDED(hr)) hr = unregister_pixelformats(pixelformat_list); return hr; diff --git a/dlls/windowscodecs/windowscodecs_wincodec.idl b/dlls/windowscodecs/windowscodecs_wincodec.idl index 122f6d0e007..1c9955557b6 100644 --- a/dlls/windowscodecs/windowscodecs_wincodec.idl +++ b/dlls/windowscodecs/windowscodecs_wincodec.idl @@ -153,6 +153,13 @@ coclass WineTgaDecoder { interface IWICBitmapDecoder; } ] coclass WICUnknownMetadataReader { interface IWICMetadataReader; }
+[ + helpstring("WIC Unknown Metadata Writer"), + threading(both), + uuid(a09cca86-27ba-4f39-9053-121fa4dc08fc) +] +coclass WICUnknownMetadataWriter { interface IWICMetadataWriter; } + [ helpstring("WIC Ifd Metadata Reader"), threading(both),
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/clsfactory.c | 1 + dlls/windowscodecs/metadatahandler.c | 20 ++++++++++++++++---- dlls/windowscodecs/tests/metadata.c | 22 +++++++++++++++++++--- dlls/windowscodecs/wincodecs_private.h | 5 ++++- 4 files changed, 40 insertions(+), 8 deletions(-)
diff --git a/dlls/windowscodecs/clsfactory.c b/dlls/windowscodecs/clsfactory.c index 90309314d6d..6835778ea1e 100644 --- a/dlls/windowscodecs/clsfactory.c +++ b/dlls/windowscodecs/clsfactory.c @@ -62,6 +62,7 @@ static const classinfo wic_classes[] = { {&CLSID_WICDefaultFormatConverter, FormatConverter_CreateInstance}, {&CLSID_WineTgaDecoder, TgaDecoder_CreateInstance}, {&CLSID_WICUnknownMetadataReader, UnknownMetadataReader_CreateInstance}, + {&CLSID_WICUnknownMetadataWriter, UnknownMetadataWriter_CreateInstance}, {&CLSID_WICIfdMetadataReader, IfdMetadataReader_CreateInstance}, {&CLSID_WICGpsMetadataReader, GpsMetadataReader_CreateInstance}, {&CLSID_WICExifMetadataReader, ExifMetadataReader_CreateInstance}, diff --git a/dlls/windowscodecs/metadatahandler.c b/dlls/windowscodecs/metadatahandler.c index 1969d6288ba..a7f238dec8e 100644 --- a/dlls/windowscodecs/metadatahandler.c +++ b/dlls/windowscodecs/metadatahandler.c @@ -770,10 +770,10 @@ static HRESULT LoadUnknownMetadata(IStream *input, const GUID *preferred_vendor, return S_OK; }
-static const MetadataHandlerVtbl UnknownMetadataReader_Vtbl = { - 0, - &CLSID_WICUnknownMetadataReader, - LoadUnknownMetadata +static const MetadataHandlerVtbl UnknownMetadataReader_Vtbl = +{ + .clsid = &CLSID_WICUnknownMetadataReader, + .fnLoad = LoadUnknownMetadata };
HRESULT UnknownMetadataReader_CreateInstance(REFIID iid, void** ppv) @@ -781,6 +781,18 @@ HRESULT UnknownMetadataReader_CreateInstance(REFIID iid, void** ppv) return MetadataReader_Create(&UnknownMetadataReader_Vtbl, iid, ppv); }
+static const MetadataHandlerVtbl UnknownMetadataWriter_Vtbl = +{ + .is_writer = true, + .clsid = &CLSID_WICUnknownMetadataWriter, + .fnLoad = LoadUnknownMetadata +}; + +HRESULT UnknownMetadataWriter_CreateInstance(REFIID iid, void** ppv) +{ + return MetadataReader_Create(&UnknownMetadataWriter_Vtbl, iid, ppv); +} + #define SWAP_USHORT(x) do { if (!native_byte_order) (x) = RtlUshortByteSwap(x); } while(0) #define SWAP_ULONG(x) do { if (!native_byte_order) (x) = RtlUlongByteSwap(x); } while(0) #define SWAP_ULONGLONG(x) do { if (!native_byte_order) (x) = RtlUlonglongByteSwap(x); } while(0) diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index b458dede3c8..60ae0e33410 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -380,7 +380,6 @@ static void load_stream(void *iface_ptr, const char *data, int data_size, DWORD { stream2 = (void *)0xdeadbeef; hr = IWICStreamProvider_GetStream(stream_provider, &stream2); - todo_wine ok(hr == WINCODEC_ERR_STREAMNOTAVAILABLE, "Unexpected hr %#lx.\n", hr); ok(stream2 == (void *)0xdeadbeef, "Unexpected stream pointer.\n"); } @@ -658,9 +657,7 @@ static void test_metadata_unknown(void)
hr = CoCreateInstance(&CLSID_WICUnknownMetadataWriter, 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); @@ -670,6 +667,25 @@ static void test_metadata_unknown(void) check_interface(writer, &IID_IWICStreamProvider, TRUE);
load_stream(writer, metadata_unknown, sizeof(metadata_unknown), 0); + + hr = IWICMetadataWriter_GetCount(writer, &count); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(count == 1, "Unexpected count %u.\n", count); + hr = IWICMetadataWriter_GetValueByIndex(writer, 0, NULL, NULL, &value); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + compare_blob(&value, metadata_unknown, sizeof(metadata_unknown)); + PropVariantClear(&value); + + load_stream(writer, metadata_unknown, sizeof(metadata_unknown), 0); + + hr = IWICMetadataWriter_GetCount(writer, &count); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(count == 1, "Unexpected count %u.\n", count); + hr = IWICMetadataWriter_GetValueByIndex(writer, 0, NULL, NULL, &value); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + compare_blob(&value, metadata_unknown, sizeof(metadata_unknown)); + PropVariantClear(&value); + load_stream(writer, metadata_unknown, sizeof(metadata_unknown), WICPersistOptionNoCacheStream);
IWICMetadataWriter_Release(writer); diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h index e714163b660..71930abd4c8 100644 --- a/dlls/windowscodecs/wincodecs_private.h +++ b/dlls/windowscodecs/wincodecs_private.h @@ -19,6 +19,8 @@ #ifndef WINCODECS_PRIVATE_H #define WINCODECS_PRIVATE_H
+#include <stdbool.h> + #include "wincodec.h" #include "wincodecsdk.h"
@@ -203,7 +205,7 @@ typedef struct _MetadataItem
typedef struct _MetadataHandlerVtbl { - int is_writer; + bool is_writer; const CLSID *clsid; HRESULT (*fnLoad)(IStream *stream, const GUID *preferred_vendor, DWORD persist_options, MetadataItem **items, DWORD *item_count); @@ -216,6 +218,7 @@ typedef struct _MetadataHandlerVtbl extern HRESULT MetadataReader_Create(const MetadataHandlerVtbl *vtable, REFIID iid, void** ppv);
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 ExifMetadataReader_CreateInstance(REFIID iid, void **ppv);
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 17a8fa17ca0..334781a69b8 100644 --- a/dlls/windowscodecs/regsvr.c +++ b/dlls/windowscodecs/regsvr.c @@ -2094,6 +2094,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),
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 334781a69b8..e372ca0ce64 100644 --- a/dlls/windowscodecs/regsvr.c +++ b/dlls/windowscodecs/regsvr.c @@ -2103,6 +2103,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),
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/clsfactory.c | 1 + dlls/windowscodecs/metadatahandler.c | 23 +++++++++++++++++-- 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, 39 insertions(+), 4 deletions(-)
diff --git a/dlls/windowscodecs/clsfactory.c b/dlls/windowscodecs/clsfactory.c index db1f3c6ad8b..5e8912db26a 100644 --- a/dlls/windowscodecs/clsfactory.c +++ b/dlls/windowscodecs/clsfactory.c @@ -64,6 +64,7 @@ static const classinfo wic_classes[] = { {&CLSID_WICUnknownMetadataReader, UnknownMetadataReader_CreateInstance}, {&CLSID_WICUnknownMetadataWriter, UnknownMetadataWriter_CreateInstance}, {&CLSID_WICIfdMetadataReader, IfdMetadataReader_CreateInstance}, + {&CLSID_WICIfdMetadataWriter, IfdMetadataWriter_CreateInstance}, {&CLSID_WICGpsMetadataReader, GpsMetadataReader_CreateInstance}, {&CLSID_WICGpsMetadataWriter, GpsMetadataWriter_CreateInstance}, {&CLSID_WICExifMetadataReader, ExifMetadataReader_CreateInstance}, diff --git a/dlls/windowscodecs/metadatahandler.c b/dlls/windowscodecs/metadatahandler.c index 3337c41f7bd..469fdf9b8ca 100644 --- a/dlls/windowscodecs/metadatahandler.c +++ b/dlls/windowscodecs/metadatahandler.c @@ -1285,13 +1285,20 @@ static HRESULT load_ifd_metadata_internal(IStream *input, const GUID *vendor, return S_OK; }
-static HRESULT LoadIfdMetadata(IStream *input, const GUID *vendor, +static HRESULT LoadIfdMetadataReader(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, false, items, item_count); }
+static HRESULT LoadIfdMetadataWriter(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, true, items, item_count); +} + static HRESULT LoadExifMetadataReader(IStream *input, const GUID *vendor, DWORD options, MetadataItem **items, DWORD *item_count) { @@ -1411,7 +1418,7 @@ static HRESULT LoadApp1Metadata(IStream *input, const GUID *vendor, DWORD option static const MetadataHandlerVtbl IfdMetadataReader_Vtbl = { 0, &CLSID_WICIfdMetadataReader, - LoadIfdMetadata + LoadIfdMetadataReader };
HRESULT IfdMetadataReader_CreateInstance(REFIID iid, void **ppv) @@ -1419,6 +1426,18 @@ HRESULT IfdMetadataReader_CreateInstance(REFIID iid, void **ppv) return MetadataReader_Create(&IfdMetadataReader_Vtbl, iid, ppv); }
+static const MetadataHandlerVtbl IfdMetadataWriter_Vtbl = +{ + .is_writer = true, + &CLSID_WICIfdMetadataWriter, + LoadIfdMetadataWriter +}; + +HRESULT IfdMetadataWriter_CreateInstance(REFIID iid, void **ppv) +{ + return MetadataReader_Create(&IfdMetadataWriter_Vtbl, iid, ppv); +} + static const MetadataHandlerVtbl GpsMetadataReader_Vtbl = { 0, diff --git a/dlls/windowscodecs/regsvr.c b/dlls/windowscodecs/regsvr.c index e372ca0ce64..87010aa655a 100644 --- a/dlls/windowscodecs/regsvr.c +++ b/dlls/windowscodecs/regsvr.c @@ -2112,6 +2112,15 @@ static struct regsvr_metadatawriter const metadatawriters_list[] = &GUID_VendorMicrosoft, &GUID_MetadataFormatExif, }, + { + &CLSID_WICIfdMetadataWriter, + "The Wine Project", + "Ifd Metadata Writer", + "1.0.0.0", + "1.0.0.0", + &GUID_VendorMicrosoft, + &GUID_MetadataFormatIfd, + }, { NULL } /* list terminator */ };
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 26dc8d05141..1ff564d2e80 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -1464,9 +1464,7 @@ static void test_metadata_Ifd(void)
hr = CoCreateInstance(&CLSID_WICIfdMetadataWriter, 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 0299a292cb9..f23ec9a85ee 100644 --- a/dlls/windowscodecs/wincodecs_private.h +++ b/dlls/windowscodecs/wincodecs_private.h @@ -220,6 +220,7 @@ extern HRESULT MetadataReader_Create(const MetadataHandlerVtbl *vtable, REFIID i 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 IfdMetadataWriter_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); diff --git a/dlls/windowscodecs/windowscodecs_wincodec.idl b/dlls/windowscodecs/windowscodecs_wincodec.idl index a0ecfd54b65..438a39fd2be 100644 --- a/dlls/windowscodecs/windowscodecs_wincodec.idl +++ b/dlls/windowscodecs/windowscodecs_wincodec.idl @@ -167,6 +167,13 @@ coclass WICUnknownMetadataWriter { interface IWICMetadataWriter; } ] coclass WICIfdMetadataReader { interface IWICMetadataReader; }
+[ + helpstring("WIC Ifd Metadata Writer"), + threading(both), + uuid(b1ebfc28-c9bd-47a2-8d33-b948769777a7) +] +coclass WICIfdMetadataWriter { interface IWICMetadataWriter; } + [ helpstring("WIC Gps Metadata Reader"), threading(both),
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/regsvr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/windowscodecs/regsvr.c b/dlls/windowscodecs/regsvr.c index 87010aa655a..ee79d39c422 100644 --- a/dlls/windowscodecs/regsvr.c +++ b/dlls/windowscodecs/regsvr.c @@ -828,8 +828,8 @@ static HRESULT register_metadatareaders(struct regsvr_metadatareader const *list
if (list->specversion) { res = RegSetValueExA(clsid_key, specversion_valuename, 0, REG_SZ, - (const BYTE*)list->version, - strlen(list->version) + 1); + (const BYTE*)list->specversion, + strlen(list->specversion) + 1); if (res != ERROR_SUCCESS) goto error_close_clsid_key; }
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=151227
Your paranoid android.
=== debian11b (64 bit WoW report) ===
mf: mf.c:6785: Test failed: Unexpected hr 0.
user32: input.c:4306: Test succeeded inside todo block: button_down_hwnd_todo 1: got MSG_TEST_WIN hwnd 0000000001D300DC, msg WM_LBUTTONDOWN, wparam 0x1, lparam 0x320032
Esme Povirk (@madewokherd) commented about dlls/windowscodecs/regsvr.c:
if (res != ERROR_SUCCESS)
RegCloseKey(coclass_key);
- }
- if (res != ERROR_SUCCESS) goto error_return;
- for (; res == ERROR_SUCCESS && list->clsid; ++list)
- {
HKEY clsid_key;
HKEY instance_clsid_key;
StringFromGUID2(list->clsid, buf, 39);
res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL);
if (res != ERROR_SUCCESS) goto error_close_coclass_key;
StringFromGUID2(list->clsid, buf, 39);
I don't think we need to convert this twice?