Module: wine Branch: master Commit: c94bf3cf277969ed61170234b9d48ea7e86645d3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c94bf3cf277969ed61170234b9...
Author: Dmitry Timoshkov dmitry@baikal.ru Date: Thu Jun 22 11:38:56 2017 +0800
windowscodecs: Implement IWICMetadataQueryReader::GetLocation.
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru Signed-off-by: Vincent Povirk vincent@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/windowscodecs/gifformat.c | 2 +- dlls/windowscodecs/imgfactory.c | 2 +- dlls/windowscodecs/jpegformat.c | 2 +- dlls/windowscodecs/metadataquery.c | 35 +++++++++++++++++++++++++++------- dlls/windowscodecs/pngformat.c | 2 +- dlls/windowscodecs/tiffformat.c | 2 +- dlls/windowscodecs/wincodecs_private.h | 15 ++++++++++++--- 7 files changed, 45 insertions(+), 15 deletions(-)
diff --git a/dlls/windowscodecs/gifformat.c b/dlls/windowscodecs/gifformat.c index d24db25..01ef089 100644 --- a/dlls/windowscodecs/gifformat.c +++ b/dlls/windowscodecs/gifformat.c @@ -821,7 +821,7 @@ static HRESULT WINAPI GifFrameDecode_GetMetadataQueryReader(IWICBitmapFrameDecod if (!ppIMetadataQueryReader) return E_INVALIDARG;
- return MetadataQueryReader_CreateInstance(&This->IWICMetadataBlockReader_iface, ppIMetadataQueryReader); + return MetadataQueryReader_CreateInstance(&This->IWICMetadataBlockReader_iface, NULL, ppIMetadataQueryReader); }
static HRESULT WINAPI GifFrameDecode_GetColorContexts(IWICBitmapFrameDecode *iface, diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c index bf63494..e1bcc89 100644 --- a/dlls/windowscodecs/imgfactory.c +++ b/dlls/windowscodecs/imgfactory.c @@ -1101,7 +1101,7 @@ static HRESULT WINAPI ComponentFactory_CreateQueryReaderFromBlockReader(IWICComp if (!block_reader || !query_reader) return E_INVALIDARG;
- return MetadataQueryReader_CreateInstance(block_reader, query_reader); + return MetadataQueryReader_CreateInstance(block_reader, NULL, query_reader); }
static HRESULT WINAPI ComponentFactory_CreateQueryWriterFromBlockWriter(IWICComponentFactory *iface, diff --git a/dlls/windowscodecs/jpegformat.c b/dlls/windowscodecs/jpegformat.c index b7998be..acc262e 100644 --- a/dlls/windowscodecs/jpegformat.c +++ b/dlls/windowscodecs/jpegformat.c @@ -695,7 +695,7 @@ static HRESULT WINAPI JpegDecoder_Frame_GetMetadataQueryReader(IWICBitmapFrameDe if (!ppIMetadataQueryReader) return E_INVALIDARG;
- return MetadataQueryReader_CreateInstance(&This->IWICMetadataBlockReader_iface, ppIMetadataQueryReader); + return MetadataQueryReader_CreateInstance(&This->IWICMetadataBlockReader_iface, NULL, ppIMetadataQueryReader); }
static HRESULT WINAPI JpegDecoder_Frame_GetColorContexts(IWICBitmapFrameDecode *iface, diff --git a/dlls/windowscodecs/metadataquery.c b/dlls/windowscodecs/metadataquery.c index 29df42e..0b7eb6c 100644 --- a/dlls/windowscodecs/metadataquery.c +++ b/dlls/windowscodecs/metadataquery.c @@ -35,10 +35,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
typedef struct { IWICMetadataQueryReader IWICMetadataQueryReader_iface; - LONG ref; - IWICMetadataBlockReader *block; + WCHAR *root; } QueryReader;
static inline QueryReader *impl_from_IWICMetadataQueryReader(IWICMetadataQueryReader *iface) @@ -84,6 +83,7 @@ static ULONG WINAPI mqr_Release(IWICMetadataQueryReader *iface) if (!ref) { IWICMetadataBlockReader_Release(This->block); + HeapFree(GetProcessHeap(), 0, This->root); HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -98,12 +98,31 @@ static HRESULT WINAPI mqr_GetContainerFormat(IWICMetadataQueryReader *iface, GUI return IWICMetadataBlockReader_GetContainerFormat(This->block, format); }
-static HRESULT WINAPI mqr_GetLocation(IWICMetadataQueryReader *iface, - UINT cchMaxLength, WCHAR *wzNamespace, UINT *pcchActualLength) +static HRESULT WINAPI mqr_GetLocation(IWICMetadataQueryReader *iface, UINT len, WCHAR *location, UINT *ret_len) { + static const WCHAR rootW[] = { '/',0 }; QueryReader *This = impl_from_IWICMetadataQueryReader(iface); - FIXME("(%p,%u,%p,%p)\n", This, cchMaxLength, wzNamespace, pcchActualLength); - return E_NOTIMPL; + const WCHAR *root; + UINT actual_len; + + TRACE("(%p,%u,%p,%p)\n", This, len, location, ret_len); + + if (!ret_len) return E_INVALIDARG; + + root = This->root ? This->root : rootW; + actual_len = lstrlenW(root) + 1; + + if (location) + { + if (len < actual_len) + return WINCODEC_ERR_INSUFFICIENTBUFFER; + + memcpy(location, root, actual_len * sizeof(WCHAR)); + } + + *ret_len = actual_len; + + return S_OK; }
static HRESULT WINAPI mqr_GetMetadataByName(IWICMetadataQueryReader *iface, @@ -132,7 +151,7 @@ static IWICMetadataQueryReaderVtbl mqr_vtbl = { mqr_GetEnumerator };
-HRESULT MetadataQueryReader_CreateInstance(IWICMetadataBlockReader *mbr, IWICMetadataQueryReader **out) +HRESULT MetadataQueryReader_CreateInstance(IWICMetadataBlockReader *mbr, const WCHAR *root, IWICMetadataQueryReader **out) { QueryReader *obj;
@@ -146,6 +165,8 @@ HRESULT MetadataQueryReader_CreateInstance(IWICMetadataBlockReader *mbr, IWICMet IWICMetadataBlockReader_AddRef(mbr); obj->block = mbr;
+ obj->root = root ? heap_strdupW(root) : NULL; + *out = &obj->IWICMetadataQueryReader_iface;
return S_OK; diff --git a/dlls/windowscodecs/pngformat.c b/dlls/windowscodecs/pngformat.c index c98a6a7..e8325c7 100644 --- a/dlls/windowscodecs/pngformat.c +++ b/dlls/windowscodecs/pngformat.c @@ -1105,7 +1105,7 @@ static HRESULT WINAPI PngDecoder_Frame_GetMetadataQueryReader(IWICBitmapFrameDec if (!ppIMetadataQueryReader) return E_INVALIDARG;
- return MetadataQueryReader_CreateInstance(&This->IWICMetadataBlockReader_iface, ppIMetadataQueryReader); + return MetadataQueryReader_CreateInstance(&This->IWICMetadataBlockReader_iface, NULL, ppIMetadataQueryReader); }
static HRESULT WINAPI PngDecoder_Frame_GetColorContexts(IWICBitmapFrameDecode *iface, diff --git a/dlls/windowscodecs/tiffformat.c b/dlls/windowscodecs/tiffformat.c index b39bcac..b613409 100644 --- a/dlls/windowscodecs/tiffformat.c +++ b/dlls/windowscodecs/tiffformat.c @@ -1172,7 +1172,7 @@ static HRESULT WINAPI TiffFrameDecode_GetMetadataQueryReader(IWICBitmapFrameDeco if (!ppIMetadataQueryReader) return E_INVALIDARG;
- return MetadataQueryReader_CreateInstance(&This->IWICMetadataBlockReader_iface, ppIMetadataQueryReader); + return MetadataQueryReader_CreateInstance(&This->IWICMetadataBlockReader_iface, NULL, ppIMetadataQueryReader); }
static HRESULT WINAPI TiffFrameDecode_GetColorContexts(IWICBitmapFrameDecode *iface, diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h index a8af0d6..2249c13 100644 --- a/dlls/windowscodecs/wincodecs_private.h +++ b/dlls/windowscodecs/wincodecs_private.h @@ -21,6 +21,7 @@
#include "wincodec.h" #include "wincodecsdk.h" +#include "wine/unicode.h"
DEFINE_GUID(CLSID_WineTgaDecoder, 0xb11fc79a,0x67cc,0x43e6,0xa9,0xce,0xe3,0xd5,0x49,0x45,0xd3,0x04);
@@ -162,9 +163,17 @@ extern HRESULT IMDReader_CreateInstance(REFIID iid, void **ppv) DECLSPEC_HIDDEN; extern HRESULT GCEReader_CreateInstance(REFIID iid, void **ppv) DECLSPEC_HIDDEN; extern HRESULT APEReader_CreateInstance(REFIID iid, void **ppv) DECLSPEC_HIDDEN; extern HRESULT GifCommentReader_CreateInstance(REFIID iid, void **ppv) DECLSPEC_HIDDEN; - -extern HRESULT MetadataQueryReader_CreateInstance(IWICMetadataBlockReader *mbr, IWICMetadataQueryReader **out) DECLSPEC_HIDDEN; - +extern HRESULT MetadataQueryReader_CreateInstance(IWICMetadataBlockReader *, const WCHAR *, IWICMetadataQueryReader **) DECLSPEC_HIDDEN; extern HRESULT stream_initialize_from_filehandle(IWICStream *iface, HANDLE hfile) DECLSPEC_HIDDEN;
+static inline WCHAR *heap_strdupW(const WCHAR *src) +{ + WCHAR *dst; + SIZE_T len; + if (!src) return NULL; + len = (strlenW(src) + 1) * sizeof(WCHAR); + if ((dst = HeapAlloc(GetProcessHeap(), 0, len))) memcpy(dst, src, len); + return dst; +} + #endif /* WINCODECS_PRIVATE_H */