implement OleLoadPictureFile(Ex) and add tests to make sure it works the same as on windows
Jeremy Drake
wine at jdrake.com
Thu Nov 13 01:33:53 CST 2008
---
dlls/oleaut32/oleaut32.spec | 4 +-
dlls/oleaut32/olepicture.c | 74 +++++++++++++++++++++++++++++++++++++
dlls/oleaut32/tests/olepicture.c | 76 ++++++++++++++++++++++++++++++++++++++
3 files changed, 152 insertions(+), 2 deletions(-)
diff --git a/dlls/oleaut32/oleaut32.spec b/dlls/oleaut32/oleaut32.spec
index 7b764ef..b6c21a4 100644
--- a/dlls/oleaut32/oleaut32.spec
+++ b/dlls/oleaut32/oleaut32.spec
@@ -378,7 +378,7 @@
398 stub UserMSG_free_inst
399 stub UserMSG_free_local
401 stdcall OleLoadPictureEx(ptr long long long long long long ptr)
-402 stub OleLoadPictureFileEx
+402 stdcall OleLoadPictureFileEx(ptr long long long ptr)
411 stdcall SafeArrayCreateVector(long long long)
412 stdcall SafeArrayCopyData(ptr ptr)
413 stdcall VectorFromBstr(ptr ptr)
@@ -390,7 +390,7 @@
419 stdcall OleCreatePictureIndirect(ptr ptr long ptr)
420 stdcall OleCreateFontIndirect(ptr ptr ptr)
421 stdcall OleTranslateColor(long long long)
-422 stub OleLoadPictureFile
+422 stdcall OleLoadPictureFile(ptr ptr)
423 stub OleSavePictureFile
424 stdcall OleLoadPicturePath(wstr ptr long long ptr ptr)
425 stdcall VarUI4FromI8(double ptr)
diff --git a/dlls/oleaut32/olepicture.c b/dlls/oleaut32/olepicture.c
index 498ee53..0dcf585 100644
--- a/dlls/oleaut32/olepicture.c
+++ b/dlls/oleaut32/olepicture.c
@@ -2695,6 +2695,80 @@ HRESULT WINAPI OleLoadPictureEx( LPSTREAM lpstream, LONG lSize, BOOL fRunmode,
}
/***********************************************************************
+ * OleLoadPictureFileEx (OLEAUT32.402)
+ */
+HRESULT WINAPI OleLoadPictureFileEx( VARIANT varFilename, DWORD xSizeDesired, DWORD ySizeDesired, DWORD dwFlags, IDispatch **ppdispPicture )
+{
+ HANDLE hFile;
+ DWORD dwFileSize;
+ HGLOBAL hGlobal = NULL;
+ DWORD dwBytesRead = 0;
+ IStream *stream;
+ BOOL bRead;
+ VARIANT varPath;
+ HRESULT hRes;
+
+/* TODO: debug trace?
+ TRACE("(%s,%p,%d,%08x,%s,%p): stub\n",
+ debugstr_w(szURLorPath), punkCaller, dwReserved, clrReserved,
+ debugstr_guid(riid), ppvRet);
+*/
+ if (!ppdispPicture) return E_POINTER;
+ VariantInit(&varPath);
+ hRes = VariantChangeType(&varPath, &varFilename, 0, VT_BSTR);
+ if (FAILED(hRes)) return hRes;
+
+ hFile = CreateFileW(V_BSTR(&varFilename), GENERIC_READ, 0, NULL, OPEN_EXISTING,
+ 0, NULL);
+ VariantClear(&varPath);
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ DWORD err = GetLastError();
+ if (err == ERROR_FILE_NOT_FOUND)
+ return CTL_E_FILENOTFOUND;
+ return E_UNEXPECTED;
+ }
+
+ dwFileSize = GetFileSize(hFile, NULL);
+ if (dwFileSize != INVALID_FILE_SIZE )
+ {
+ hGlobal = GlobalAlloc(GMEM_FIXED,dwFileSize);
+ if ( hGlobal)
+ {
+ bRead = ReadFile(hFile, hGlobal, dwFileSize, &dwBytesRead, NULL);
+ if (!bRead)
+ {
+ GlobalFree(hGlobal);
+ hGlobal = 0;
+ }
+ }
+ }
+ CloseHandle(hFile);
+
+ if (!hGlobal)
+ return E_UNEXPECTED;
+
+ hRes = CreateStreamOnHGlobal(hGlobal, TRUE, &stream);
+ if (FAILED(hRes))
+ {
+ GlobalFree(hGlobal);
+ return hRes;
+ }
+
+ hRes = OleLoadPictureEx(stream, 0, TRUE, &IID_IDispatch, xSizeDesired, ySizeDesired, dwFlags, (LPVOID*)ppdispPicture);
+ IStream_Release(stream);
+ return hRes;
+}
+
+/***********************************************************************
+ * OleLoadPictureFile (OLEAUT32.422)
+ */
+HRESULT WINAPI OleLoadPictureFile( VARIANT varFilename, IDispatch **ppdispPicture )
+{
+ return OleLoadPictureFileEx(varFilename, LP_DEFAULT, LP_DEFAULT, LP_DEFAULT, ppdispPicture);
+}
+
+/***********************************************************************
* OleLoadPicturePath (OLEAUT32.424)
*/
HRESULT WINAPI OleLoadPicturePath( LPOLESTR szURLorPath, LPUNKNOWN punkCaller,
diff --git a/dlls/oleaut32/tests/olepicture.c b/dlls/oleaut32/tests/olepicture.c
index 3f44696..d90db51 100644
--- a/dlls/oleaut32/tests/olepicture.c
+++ b/dlls/oleaut32/tests/olepicture.c
@@ -52,6 +52,8 @@
static HMODULE hOleaut32;
static HRESULT (WINAPI *pOleLoadPicture)(LPSTREAM,LONG,BOOL,REFIID,LPVOID*);
+static HRESULT (WINAPI *pOleLoadPictureFile)(VARIANT,LPDISPATCH*);
+static HRESULT (WINAPI *pOleLoadPictureFileEx)(VARIANT,DWORD,DWORD,DWORD,LPDISPATCH*);
static HRESULT (WINAPI *pOleCreatePictureIndirect)(PICTDESC*,REFIID,BOOL,LPVOID*);
#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr)
@@ -489,6 +491,77 @@ static void test_OleCreatePictureIndirect(void)
IPicture_Release(pict);
}
+static void test_OleLoadPictureFile(void)
+{
+ IPicture *pict;
+ IDispatch *disp;
+ HRESULT hr;
+ WCHAR filename[MAX_PATH];
+ VARIANT varFilename;
+ HANDLE file;
+ DWORD written;
+ short type;
+
+ if(!pOleLoadPictureFile || !pOleLoadPictureFileEx)
+ {
+ skip("Skipping OleLoadPictureFile tests\n");
+ return;
+ }
+
+ GetTempFileNameW((LPCWSTR)L".", (LPCWSTR)L"gif", 0, filename);
+ file = CreateFileW(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
+ ok(file != INVALID_HANDLE_VALUE, "file creation failed\n");
+ if (file == INVALID_HANDLE_VALUE) return;
+ WriteFile(file, gif4pixel, sizeof(gif4pixel), &written, NULL);
+ ok(written == sizeof(gif4pixel), "short write\n");
+ CloseHandle(file);
+
+
+ VariantInit(&varFilename);
+ V_VT(&varFilename) = VT_BSTR;
+ V_BSTR(&varFilename) = SysAllocString(filename);
+ ok(V_BSTR(&varFilename) != NULL, "string allocation failed");
+
+ hr = pOleLoadPictureFileEx(varFilename, 2, 2, LP_DEFAULT, &disp);
+ ok(hr == S_OK, "hr %08x\n", hr);
+ ok(disp != NULL, "null dispatch ptr\n");
+
+ hr = IDispatch_QueryInterface(disp, &IID_IPicture, (LPVOID*)&pict);
+ ok(hr == S_OK, "hr %08x\n", hr);
+ ok(pict != NULL, "null pict ptr\n");
+
+ hr = IPicture_get_Type(pict, &type);
+ ok(hr == S_OK, "hr %08x\n", hr);
+ ok(type == PICTYPE_BITMAP, "type %d\n", type);
+
+ IPicture_Release(pict);
+ IDispatch_Release(disp);
+
+ hr = pOleLoadPictureFile(varFilename, &disp);
+ ok(hr == S_OK, "hr %08x\n", hr);
+ ok(disp != NULL, "null dispatch ptr\n");
+
+ hr = IDispatch_QueryInterface(disp, &IID_IPicture, (LPVOID*)&pict);
+ ok(hr == S_OK, "hr %08x\n", hr);
+ ok(pict != NULL, "null pict ptr\n");
+
+ hr = IPicture_get_Type(pict, &type);
+ ok(hr == S_OK, "hr %08x\n", hr);
+ ok(type == PICTYPE_BITMAP, "type %d\n", type);
+
+ IPicture_Release(pict);
+ IDispatch_Release(disp);
+
+ DeleteFileW(filename);
+
+ disp = NULL;
+ hr = pOleLoadPictureFile(varFilename, &disp);
+ ok(hr == CTL_E_FILENOTFOUND, "hr %08x\n", hr);
+ ok(disp == NULL, "dispatch ptr not null\n");
+
+ VariantClear(&varFilename);
+}
+
static void test_apm()
{
OLE_HANDLE handle;
@@ -592,6 +665,8 @@ START_TEST(olepicture)
{
hOleaut32 = GetModuleHandleA("oleaut32.dll");
pOleLoadPicture = (void*)GetProcAddress(hOleaut32, "OleLoadPicture");
+ pOleLoadPictureFile = (void*)GetProcAddress(hOleaut32, "OleLoadPictureFile");
+ pOleLoadPictureFileEx = (void*)GetProcAddress(hOleaut32, "OleLoadPictureFileEx");
pOleCreatePictureIndirect = (void*)GetProcAddress(hOleaut32, "OleCreatePictureIndirect");
if (!pOleLoadPicture)
{
@@ -614,6 +689,7 @@ START_TEST(olepicture)
test_Invoke();
test_OleCreatePictureIndirect();
+ test_OleLoadPictureFile();
}
--
1.5.6.4
--
Taxes, n.:
Of life's two certainties, the only one for which you can get
an extension.
More information about the wine-patches
mailing list