Author: cmihail Date: Fri Sep 30 09:38:43 2011 New Revision: 53903
URL: http://svn.reactos.org/svn/reactos?rev=53903&view=rev Log: [SHELL32] - Implement SHPropStgCreate, SHPropStgReadMultiple, SHPropStgWriteMultiple based on wine - This should fix the shellole tests
Modified: trunk/reactos/dll/win32/shell32/shellole.cpp
Modified: trunk/reactos/dll/win32/shell32/shellole.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shellole.... ============================================================================== --- trunk/reactos/dll/win32/shell32/shellole.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/shellole.cpp [iso-8859-1] Fri Sep 30 09:38:43 2011 @@ -20,6 +20,7 @@ */
#include <precomp.h> +#include <PropIdl.h>
WINE_DEFAULT_DEBUG_CHANNEL(shell);
@@ -588,7 +589,49 @@ const CLSID *pclsid, DWORD grfFlags, DWORD grfMode, DWORD dwDisposition, IPropertyStorage **ppstg, UINT *puCodePage) { - 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 = psstg->Open(fmtid, grfMode, ppstg); + + switch (dwDisposition) + { + case CREATE_ALWAYS: + if (SUCCEEDED(hres)) + { + reinterpret_cast<IPropertyStorage*>(*ppstg)->Release(); + hres = psstg->Delete(fmtid); + if(FAILED(hres)) + return hres; + hres = E_FAIL; + } + + case OPEN_ALWAYS: + case CREATE_NEW: + if (FAILED(hres)) + hres = psstg->Create(fmtid, pclsid, grfFlags, grfMode, ppstg); + + case OPEN_EXISTING: + if (FAILED(hres)) + return hres; + + if (puCodePage) + { + prop.ulKind = PRSPEC_PROPID; + prop.propid = PID_CODEPAGE; + hres = reinterpret_cast<IPropertyStorage*>(*ppstg)->ReadMultiple(1, &prop, &ret); + if (FAILED(hres) || ret.vt!=VT_I2) + *puCodePage = 0; + else + *puCodePage = ret.iVal; + } + } + + return S_OK; }
/************************************************************************* @@ -597,7 +640,36 @@ EXTERN_C HRESULT WINAPI SHPropStgReadMultiple(IPropertyStorage *pps, UINT uCodePage, ULONG cpspec, const PROPSPEC *rgpspec, PROPVARIANT *rgvar) { - return E_NOTIMPL; + STATPROPSETSTG stat; + HRESULT hres; + + FIXME("%p %u %u %p %p\n", pps, uCodePage, cpspec, rgpspec, rgvar); + + memset(rgvar, 0, cpspec*sizeof(PROPVARIANT)); + hres = pps->ReadMultiple(cpspec, rgpspec, rgvar); + if (FAILED(hres)) + return hres; + + if (!uCodePage) + { + PROPSPEC prop; + PROPVARIANT ret; + + prop.ulKind = PRSPEC_PROPID; + prop.propid = PID_CODEPAGE; + hres = pps->ReadMultiple(1, &prop, &ret); + if(FAILED(hres) || ret.vt!=VT_I2) + return S_OK; + + uCodePage = ret.iVal; + } + + hres = pps->Stat(&stat); + if (FAILED(hres)) + return S_OK; + + /* TODO: do something with codepage and stat */ + return S_OK; }
/************************************************************************* @@ -606,5 +678,38 @@ EXTERN_C HRESULT WINAPI SHPropStgWriteMultiple(IPropertyStorage *pps, UINT *uCodePage, ULONG cpspec, const PROPSPEC *rgpspec, PROPVARIANT *rgvar, PROPID propidNameFirst) { - return E_NOTIMPL; -} + STATPROPSETSTG stat; + UINT codepage; + HRESULT hres; + + FIXME("%p %p %u %p %p %d\n", pps, uCodePage, cpspec, rgpspec, rgvar, propidNameFirst); + + hres = pps->Stat(&stat); + if (FAILED(hres)) + return hres; + + if (uCodePage && *uCodePage) + codepage = *uCodePage; + else + { + PROPSPEC prop; + PROPVARIANT ret; + + prop.ulKind = PRSPEC_PROPID; + prop.propid = PID_CODEPAGE; + hres = pps->ReadMultiple(1, &prop, &ret); + if (FAILED(hres)) + return hres; + if (ret.vt!=VT_I2 || !ret.iVal) + return E_FAIL; + + codepage = ret.iVal; + if (uCodePage) + *uCodePage = codepage; + } + + /* TODO: do something with codepage and stat */ + + hres = pps->WriteMultiple(cpspec, rgpspec, rgvar, propidNameFirst); + return hres; +}