Module: wine Branch: master Commit: 7b373edb81306fa82385fde5501df69166d3d406 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7b373edb81306fa82385fde550...
Author: Nikolay Sivov nsivov@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(); }