From: Dmitry Timoshkov Subject: [3/7] windowscodecs: Implement IWICMetadataQueryReader::GetLocation. Message-Id: <20170622113856.893ff520.dmitry@baikal.ru> Date: Thu, 22 Jun 2017 11:38:56 +0800 Signed-off-by: Dmitry Timoshkov --- 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 d24db259c3..01ef089215 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 bf634949b4..e1bcc89a8b 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 b7998be551..acc262e860 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 29df42e474..0b7eb6c7c3 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 c98a6a7e28..e8325c74bd 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 b39bcac2d9..b613409712 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 a8af0d6437..2249c13843 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 */ -- 2.13.1