Nikolay Sivov : ole32: Implement SetConvertStg().

Alexandre Julliard julliard at winehq.org
Mon Jul 16 14:14:28 CDT 2012


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sat Jul 14 22:39:15 2012 +0400

ole32: Implement SetConvertStg().

---

 dlls/ole32/ole2stubs.c       |    9 -----
 dlls/ole32/storage32.c       |   78 +++++++++++++++++++++++++++++++++++++++---
 dlls/ole32/tests/storage32.c |    5 ++-
 3 files changed, 76 insertions(+), 16 deletions(-)

diff --git a/dlls/ole32/ole2stubs.c b/dlls/ole32/ole2stubs.c
index 6988dfe..5a90e2d 100644
--- a/dlls/ole32/ole2stubs.c
+++ b/dlls/ole32/ole2stubs.c
@@ -44,15 +44,6 @@ HRESULT WINAPI  OleCreateLinkToFile(LPCOLESTR lpszFileName, REFIID riid,
 }
 
 /******************************************************************************
- *              SetConvertStg        [OLE32.@]
- */
-HRESULT WINAPI SetConvertStg(LPSTORAGE pStg, BOOL fConvert)
-{
-  FIXME("(%p,%x), stub!\n", pStg, fConvert);
-  return E_NOTIMPL;
-}
-
-/******************************************************************************
  *              OleCreateLink        [OLE32.@]
  */
 HRESULT WINAPI OleCreateLink(LPMONIKER pmkLinkSrc, REFIID riid, DWORD renderopt, LPFORMATETC lpFormatEtc,
diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c
index c04675d..a1c925f 100644
--- a/dlls/ole32/storage32.c
+++ b/dlls/ole32/storage32.c
@@ -9383,7 +9383,7 @@ HRESULT WINAPI OleConvertIStorageToOLESTREAM (
 
 enum stream_1ole_flags {
     OleStream_LinkedObject = 0x00000001,
-    OleStream_Convert      = 0x00000100
+    OleStream_Convert      = 0x00000004
 };
 
 /***********************************************************************
@@ -9396,7 +9396,6 @@ HRESULT WINAPI GetConvertStg(IStorage *stg)
     DWORD header[2];
     IStream *stream;
     HRESULT hr;
-    ULONG len;
 
     TRACE("%p\n", stg);
 
@@ -9405,20 +9404,89 @@ HRESULT WINAPI GetConvertStg(IStorage *stg)
     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);
+    hr = IStream_Read(stream, header, sizeof(header), NULL);
     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]);
+        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;
 }
 
+/***********************************************************************
+ *		SetConvertStg (OLE32.@)
+ */
+HRESULT WINAPI SetConvertStg(IStorage *storage, BOOL convert)
+{
+    static const WCHAR stream_1oleW[] = {1,'O','l','e',0};
+    static const DWORD version_magic = 0x02000001;
+    DWORD flags = convert ? OleStream_Convert : 0;
+    IStream *stream;
+    HRESULT hr;
+
+    TRACE("(%p, %d)\n", storage, convert);
+
+    hr = IStorage_CreateStream(storage, stream_1oleW, STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stream);
+    if (hr == S_OK)
+    {
+        struct empty_1ole_stream {
+            DWORD version_magic;
+            DWORD flags;
+            BYTE  padding[12];
+        };
+        struct empty_1ole_stream stream_data;
+
+        stream_data.version_magic = version_magic;
+        stream_data.flags = flags;
+        memset(stream_data.padding, 0, sizeof(stream_data.padding));
+
+        hr = IStream_Write(stream, &stream_data, sizeof(stream_data), NULL);
+        IStream_Release(stream);
+    }
+    else if (hr == STG_E_FILEALREADYEXISTS)
+    {
+        DWORD header[2];
+
+        hr = IStorage_OpenStream(storage, stream_1oleW, NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, &stream);
+        if (FAILED(hr)) return hr;
+
+        hr = IStream_Read(stream, header, sizeof(header), NULL);
+        if (FAILED(hr))
+        {
+            IStream_Release(stream);
+            return hr;
+        }
+
+        /* update flag if differs */
+        if ((header[1] ^ flags) & OleStream_Convert)
+        {
+            LARGE_INTEGER pos;
+
+            if (header[1] & OleStream_Convert)
+                flags = header[1] & ~OleStream_Convert;
+            else
+                flags = header[1] |  OleStream_Convert;
+
+            pos.QuadPart = sizeof(DWORD);
+            hr = IStream_Seek(stream, pos, STREAM_SEEK_SET, NULL);
+            if (FAILED(hr))
+            {
+                IStream_Release(stream);
+                return hr;
+            }
+
+            hr = IStream_Write(stream, &flags, sizeof(flags), NULL);
+        }
+        IStream_Release(stream);
+    }
+
+    return hr;
+}
+
 /******************************************************************************
  * StgIsStorageFile [OLE32.@]
  * Verify if the file contains a storage object
diff --git a/dlls/ole32/tests/storage32.c b/dlls/ole32/tests/storage32.c
index 86b8d8e..c79b5d1 100644
--- a/dlls/ole32/tests/storage32.c
+++ b/dlls/ole32/tests/storage32.c
@@ -3009,7 +3009,8 @@ static void test_convert(void)
     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 = SetConvertStg(stg, TRUE);
     ok(hr == S_OK, "got 0x%08x\n", hr);
     hr = GetConvertStg(stg);
     ok(hr == S_OK, "got 0x%08x\n", hr);
@@ -3017,7 +3018,7 @@ todo_wine {
     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);




More information about the wine-cvs mailing list