Piotr Caban : shell32: Added SHPropStgCreate implementation.

Alexandre Julliard julliard at winehq.org
Tue Nov 16 12:45:46 CST 2010


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Nov 16 14:58:03 2010 +0100

shell32: Added SHPropStgCreate implementation.

---

 dlls/shell32/shellole.c |   44 ++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/dlls/shell32/shellole.c b/dlls/shell32/shellole.c
index 1161ff4..0949647 100644
--- a/dlls/shell32/shellole.c
+++ b/dlls/shell32/shellole.c
@@ -26,6 +26,7 @@
 #include <string.h>
 
 #define COBJMACROS
+#define NONAMELESSUNION
 
 #include "windef.h"
 #include "winbase.h"
@@ -665,8 +666,47 @@ HRESULT WINAPI SHPropStgCreate(IPropertySetStorage *psstg, REFFMTID fmtid,
         const CLSID *pclsid, DWORD grfFlags, DWORD grfMode,
         DWORD dwDisposition, IPropertyStorage **ppstg, UINT *puCodePage)
 {
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    PROPSPEC prop;
+    PROPVARIANT ret;
+    HRESULT hres;
+
+    TRACE("%p %s %s %x %x %x %p %p\n", psstg, debugstr_guid(fmtid), debugstr_guid(pclsid),
+            grfFlags, grfMode, dwDisposition, ppstg, puCodePage);
+
+    hres = IPropertySetStorage_Open(psstg, fmtid, grfMode, ppstg);
+
+    switch(dwDisposition) {
+    case CREATE_ALWAYS:
+        if(SUCCEEDED(hres)) {
+            IPropertyStorage_Release(*ppstg);
+            hres = IPropertySetStorage_Delete(psstg, fmtid);
+            if(FAILED(hres))
+                return hres;
+            hres = E_FAIL;
+        }
+
+    case OPEN_ALWAYS:
+    case CREATE_NEW:
+        if(FAILED(hres))
+            hres = IPropertySetStorage_Create(psstg, fmtid, pclsid,
+                    grfFlags, grfMode, ppstg);
+
+    case OPEN_EXISTING:
+        if(FAILED(hres))
+            return hres;
+
+        if(puCodePage) {
+            prop.ulKind = PRSPEC_PROPID;
+            prop.u.propid = PID_CODEPAGE;
+            hres = IPropertyStorage_ReadMultiple(*ppstg, 1, &prop, &ret);
+            if(FAILED(hres) || ret.vt!=VT_I2)
+                *puCodePage = 0;
+            else
+                *puCodePage = ret.u.iVal;
+        }
+    }
+
+    return S_OK;
 }
 
 /*************************************************************************




More information about the wine-cvs mailing list