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