Module: wine Branch: master Commit: bfaae9bf7da649033d2ff948910d9130c92faf5c URL: http://source.winehq.org/git/wine.git/?a=commit;h=bfaae9bf7da649033d2ff94891...
Author: Piotr Caban piotr@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; }
/*************************************************************************