Module: wine Branch: master Commit: a9cc6f0218594d72fdd7406f7c72345feb7cb8e5 URL: https://gitlab.winehq.org/wine/wine/-/commit/a9cc6f0218594d72fdd7406f7c72345...
Author: Dmitry Timoshkov dmitry@baikal.ru Date: Sun Mar 27 16:28:33 2016 +0800
oleaut32: Implement OleLoadPictureFile.
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru
---
dlls/oleaut32/olepicture.c | 36 ++++++++++++++++++++------- dlls/oleaut32/tests/olepicture.c | 53 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 9 deletions(-)
diff --git a/dlls/oleaut32/olepicture.c b/dlls/oleaut32/olepicture.c index 33d2a12f88b..36de9c355f3 100644 --- a/dlls/oleaut32/olepicture.c +++ b/dlls/oleaut32/olepicture.c @@ -2297,15 +2297,6 @@ HRESULT WINAPI OleLoadPictureEx( LPSTREAM lpstream, LONG lSize, BOOL fRunmode, return hr; }
-/*********************************************************************** - * OleLoadPictureFile (OLEAUT32.422) - */ -HRESULT WINAPI OleLoadPictureFile(VARIANT file, LPDISPATCH *picture) -{ - FIXME("(%s %p): stub\n", wine_dbgstr_variant(&file), picture); - return E_NOTIMPL; -} - static HRESULT create_stream(const WCHAR *filename, IStream **stream) { HANDLE hFile; @@ -2345,6 +2336,33 @@ static HRESULT create_stream(const WCHAR *filename, IStream **stream) return hr; }
+/*********************************************************************** + * OleLoadPictureFile (OLEAUT32.422) + */ +HRESULT WINAPI OleLoadPictureFile(VARIANT filename, IDispatch **picture) +{ + IStream *stream; + HRESULT hr; + + TRACE("(%s,%p)\n", wine_dbgstr_variant(&filename), picture); + + if (V_VT(&filename) != VT_BSTR) + return CTL_E_FILENOTFOUND; + + hr = create_stream(V_BSTR(&filename), &stream); + if (hr != S_OK) + { + if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) + return CTL_E_FILENOTFOUND; + + return CTL_E_PATHFILEACCESSERROR; + } + + hr = OleLoadPicture(stream, 0, FALSE, &IID_IDispatch, (void **)picture); + IStream_Release(stream); + return hr; +} + /*********************************************************************** * OleSavePictureFile (OLEAUT32.423) */ diff --git a/dlls/oleaut32/tests/olepicture.c b/dlls/oleaut32/tests/olepicture.c index 210fea4d4c1..c6ab4ed0a19 100644 --- a/dlls/oleaut32/tests/olepicture.c +++ b/dlls/oleaut32/tests/olepicture.c @@ -948,6 +948,7 @@ static void test_OleLoadPicturePath(void) HANDLE file; DWORD size; WCHAR *ptr; + VARIANT var;
const struct { @@ -1014,6 +1015,14 @@ static void test_OleLoadPicturePath(void) if (pic) IPicture_Release(pic);
+ VariantInit(&var); + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(temp_fileW + 8); + hres = OleLoadPictureFile(var, (IDispatch **)&pic); + ok(hres == S_OK, "OleLoadPictureFile error %#lx\n", hres); + IPicture_Release(pic); + VariantClear(&var); + /* Try a DOS path with tacked on "file:". */ hres = OleLoadPicturePath(temp_fileW, NULL, 0, 0, &IID_IPicture, (void **)&pic); ok(hres == S_OK || @@ -1022,6 +1031,13 @@ static void test_OleLoadPicturePath(void) if (pic) IPicture_Release(pic);
+ VariantInit(&var); + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(temp_fileW); + hres = OleLoadPictureFile(var, (IDispatch **)&pic); + ok(hres == CTL_E_PATHFILEACCESSERROR, "wrong error %#lx\n", hres); + VariantClear(&var); + DeleteFileA(temp_file);
/* Try with a nonexistent file. */ @@ -1031,12 +1047,26 @@ static void test_OleLoadPicturePath(void) broken(hres == E_FAIL), /*Win2k */ "Expected OleLoadPicturePath to return INET_E_RESOURCE_NOT_FOUND, got 0x%08lx\n", hres);
+ VariantInit(&var); + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(temp_fileW + 8); + hres = OleLoadPictureFile(var, (IDispatch **)&pic); + ok(hres == CTL_E_FILENOTFOUND, "wrong error %#lx\n", hres); + VariantClear(&var); + hres = OleLoadPicturePath(temp_fileW, NULL, 0, 0, &IID_IPicture, (void **)&pic); ok(hres == INET_E_RESOURCE_NOT_FOUND || /* XP+ */ broken(hres == E_UNEXPECTED) || /* NT4 */ broken(hres == E_FAIL), /* Win2k */ "Expected OleLoadPicturePath to return INET_E_RESOURCE_NOT_FOUND, got 0x%08lx\n", hres);
+ VariantInit(&var); + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(temp_fileW); + hres = OleLoadPictureFile(var, (IDispatch **)&pic); + ok(hres == CTL_E_PATHFILEACCESSERROR, "wrong error %#lx\n", hres); + VariantClear(&var); + file = CreateFileA(temp_file, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(file, bmpimage, sizeof(bmpimage), &size, NULL); @@ -1058,6 +1088,13 @@ static void test_OleLoadPicturePath(void) if (pic) IPicture_Release(pic);
+ VariantInit(&var); + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(temp_fileW); + hres = OleLoadPictureFile(var, (IDispatch **)&pic); + ok(hres == CTL_E_PATHFILEACCESSERROR, "wrong error %#lx\n", hres); + VariantClear(&var); + DeleteFileA(temp_file);
/* Try with a nonexistent file. */ @@ -1066,6 +1103,22 @@ static void test_OleLoadPicturePath(void) broken(hres == E_UNEXPECTED) || /* NT4 */ broken(hres == E_FAIL), /* Win2k */ "Expected OleLoadPicturePath to return INET_E_RESOURCE_NOT_FOUND, got 0x%08lx\n", hres); + + VariantInit(&var); + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(temp_fileW); + hres = OleLoadPictureFile(var, (IDispatch **)&pic); + ok(hres == CTL_E_PATHFILEACCESSERROR, "wrong error %#lx\n", hres); + VariantClear(&var); + + VariantInit(&var); + V_VT(&var) = VT_INT; + V_INT(&var) = 762; + hres = OleLoadPictureFile(var, (IDispatch **)&pic); + ok(hres == CTL_E_FILENOTFOUND, "wrong error %#lx\n", hres); + + if (0) /* crashes under Windows */ + hres = OleLoadPictureFile(var, NULL); }
static void test_himetric(void)