Nikolay Sivov : ole32: Implement GetConvertStg().

Alexandre Julliard julliard at winehq.org
Fri Jul 13 14:11:18 CDT 2012


Module: wine
Branch: master
Commit: 7b373edb81306fa82385fde5501df69166d3d406
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7b373edb81306fa82385fde5501df69166d3d406

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Jul 13 11:56:26 2012 +0400

ole32: Implement GetConvertStg().

---

 dlls/ole32/storage32.c       |   36 +++++++++++++++++++++++++++++++++---
 dlls/ole32/tests/storage32.c |   29 +++++++++++++++++++++++++++++
 2 files changed, 62 insertions(+), 3 deletions(-)

diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c
index 95850d1..47341f7 100644
--- a/dlls/ole32/storage32.c
+++ b/dlls/ole32/storage32.c
@@ -9400,12 +9400,42 @@ HRESULT WINAPI OleConvertIStorageToOLESTREAM (
     return hRes;
 }
 
+enum stream_1ole_flags {
+    OleStream_LinkedObject = 0x00000001,
+    OleStream_Convert      = 0x00000100
+};
+
 /***********************************************************************
  *		GetConvertStg (OLE32.@)
  */
-HRESULT WINAPI GetConvertStg(IStorage *stg) {
-    FIXME("unimplemented stub!\n");
-    return E_FAIL;
+HRESULT WINAPI GetConvertStg(IStorage *stg)
+{
+    static const WCHAR stream_1oleW[] = {1,'O','l','e',0};
+    static const DWORD version_magic = 0x02000001;
+    DWORD header[2];
+    IStream *stream;
+    HRESULT hr;
+    ULONG len;
+
+    TRACE("%p\n", stg);
+
+    if (!stg) return E_INVALIDARG;
+
+    hr = IStorage_OpenStream(stg, stream_1oleW, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream);
+    if (FAILED(hr)) return hr;
+
+    len = 0;
+    hr = IStream_Read(stream, header, sizeof(header), &len);
+    IStream_Release(stream);
+    if (FAILED(hr)) return hr;
+
+    if (header[0] != version_magic)
+    {
+        ERR("got wrong version magic for \1Ole stream, 0x%08x\n", header[0]);
+        return E_FAIL;
+    }
+
+    return header[1] & OleStream_Convert ? S_OK : S_FALSE;
 }
 
 /******************************************************************************
diff --git a/dlls/ole32/tests/storage32.c b/dlls/ole32/tests/storage32.c
index bc0cc25..86b8d8e 100644
--- a/dlls/ole32/tests/storage32.c
+++ b/dlls/ole32/tests/storage32.c
@@ -2995,6 +2995,34 @@ static void test_hglobal_storage_creation(void)
     ILockBytes_Release(ilb);
 }
 
+static void test_convert(void)
+{
+    static const WCHAR filename[] = {'s','t','o','r','a','g','e','.','s','t','g',0};
+    IStorage *stg;
+    HRESULT hr;
+
+    hr = GetConvertStg(NULL);
+    ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+    hr = StgCreateDocfile( filename, STGM_CREATE | STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, &stg);
+    ok(hr == S_OK, "StgCreateDocfile failed\n");
+    hr = GetConvertStg(stg);
+    ok(hr == STG_E_FILENOTFOUND, "got 0x%08x\n", hr);
+    hr = SetConvertStg(stg, TRUE);
+todo_wine {
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    hr = GetConvertStg(stg);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    hr = SetConvertStg(stg, FALSE);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    hr = GetConvertStg(stg);
+    ok(hr == S_FALSE, "got 0x%08x\n", hr);
+}
+    IStorage_Release(stg);
+
+    DeleteFileW(filename);
+}
+
 START_TEST(storage32)
 {
     CHAR temp[MAX_PATH];
@@ -3038,4 +3066,5 @@ START_TEST(storage32)
     test_copyto_locking();
     test_copyto_recursive();
     test_hglobal_storage_creation();
+    test_convert();
 }




More information about the wine-cvs mailing list