ole32: Use access mask from bind context in file moniker's BindToStorage().
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
01fdc50fa2
commit
a0bb938224
|
@ -583,41 +583,37 @@ FileMonikerImpl_BindToObject(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft
|
||||||
*/
|
*/
|
||||||
static HRESULT WINAPI
|
static HRESULT WINAPI
|
||||||
FileMonikerImpl_BindToStorage(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft,
|
FileMonikerImpl_BindToStorage(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft,
|
||||||
REFIID riid, VOID** ppvObject)
|
REFIID riid, void **object)
|
||||||
{
|
{
|
||||||
LPOLESTR filePath=0;
|
FileMonikerImpl *moniker = impl_from_IMoniker(iface);
|
||||||
IStorage *pstg=0;
|
BIND_OPTS bind_opts;
|
||||||
HRESULT res;
|
HRESULT hr;
|
||||||
|
|
||||||
TRACE("(%p,%p,%p,%s,%p)\n",iface,pbc,pmkToLeft,debugstr_guid(riid),ppvObject);
|
TRACE("(%p,%p,%p,%s,%p)\n", iface, pbc, pmkToLeft, debugstr_guid(riid), object);
|
||||||
|
|
||||||
if (pmkToLeft==NULL){
|
if (!pbc)
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
if (IsEqualIID(&IID_IStorage, riid)){
|
bind_opts.cbStruct = sizeof(bind_opts);
|
||||||
|
hr = IBindCtx_GetBindOptions(pbc, &bind_opts);
|
||||||
|
if (FAILED(hr))
|
||||||
|
return hr;
|
||||||
|
|
||||||
/* get the file name */
|
if (!pmkToLeft)
|
||||||
IMoniker_GetDisplayName(iface,pbc,pmkToLeft,&filePath);
|
{
|
||||||
|
if (IsEqualIID(&IID_IStorage, riid))
|
||||||
res=StgOpenStorage(filePath,NULL,STGM_READWRITE|STGM_SHARE_DENY_WRITE,NULL,0,&pstg);
|
{
|
||||||
|
return StgOpenStorage(moniker->filePathName, NULL, bind_opts.grfMode, NULL, 0, (IStorage **)object);
|
||||||
if (SUCCEEDED(res))
|
|
||||||
*ppvObject=pstg;
|
|
||||||
|
|
||||||
CoTaskMemFree(filePath);
|
|
||||||
}
|
}
|
||||||
|
else if ((IsEqualIID(&IID_IStream, riid)) || (IsEqualIID(&IID_ILockBytes, riid)))
|
||||||
|
return E_FAIL;
|
||||||
else
|
else
|
||||||
if ( (IsEqualIID(&IID_IStream, riid)) || (IsEqualIID(&IID_ILockBytes, riid)) )
|
return E_NOINTERFACE;
|
||||||
return E_FAIL;
|
|
||||||
else
|
|
||||||
return E_NOINTERFACE;
|
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
|
|
||||||
FIXME("(%p,%p,%p,%s,%p)\n",iface,pbc,pmkToLeft,debugstr_guid(riid),ppvObject);
|
FIXME("(%p,%p,%p,%s,%p)\n", iface, pbc, pmkToLeft, debugstr_guid(riid), object);
|
||||||
|
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
|
|
@ -1980,7 +1980,13 @@ static void test_file_monikers(void)
|
||||||
*/
|
*/
|
||||||
{0x20ac, 0x2020, 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109, 0x10a, 0x10b, 0x10c, 0},
|
{0x20ac, 0x2020, 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109, 0x10a, 0x10b, 0x10c, 0},
|
||||||
};
|
};
|
||||||
|
WCHAR filename[MAX_PATH], path[MAX_PATH];
|
||||||
|
BIND_OPTS bind_opts;
|
||||||
|
IMoniker *moniker;
|
||||||
|
IStorage *storage;
|
||||||
|
IBindCtx *bindctx;
|
||||||
|
STATSTG statstg;
|
||||||
|
HRESULT hr;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
trace("ACP is %u\n", GetACP());
|
trace("ACP is %u\n", GetACP());
|
||||||
|
@ -2004,6 +2010,53 @@ static void test_file_monikers(void)
|
||||||
test_file_moniker(wszFile[i]);
|
test_file_moniker(wszFile[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* BindToStorage() */
|
||||||
|
GetTempPathW(MAX_PATH, path);
|
||||||
|
GetTempFileNameW(path, L"stg", 1, filename);
|
||||||
|
|
||||||
|
hr = StgCreateStorageEx(filename, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, STGFMT_STORAGE,
|
||||||
|
0, NULL, NULL, &IID_IStorage, (void **)&storage);
|
||||||
|
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
|
||||||
|
IStorage_Release(storage);
|
||||||
|
|
||||||
|
hr = CreateFileMoniker(filename, &moniker);
|
||||||
|
ok(hr == S_OK, "Failed to create a moniker, hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = IMoniker_BindToStorage(moniker, NULL, NULL, &IID_IStorage, (void **)&storage);
|
||||||
|
ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = CreateBindCtx(0, &bindctx);
|
||||||
|
ok(hr == S_OK, "Failed to create bind context, hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = IMoniker_BindToStorage(moniker, bindctx, NULL, &IID_IStorage, (void **)&storage);
|
||||||
|
ok(hr == STG_E_INVALIDFLAG, "Unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
bind_opts.cbStruct = sizeof(bind_opts);
|
||||||
|
bind_opts.grfMode = STGM_READWRITE | STGM_SHARE_DENY_WRITE;
|
||||||
|
hr = IBindCtx_SetBindOptions(bindctx, &bind_opts);
|
||||||
|
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = IMoniker_BindToStorage(moniker, bindctx, NULL, &IID_IStorage, (void **)&storage);
|
||||||
|
ok(hr == STG_E_INVALIDFLAG, "Unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
bind_opts.grfMode = STGM_READ | STGM_SHARE_DENY_WRITE;
|
||||||
|
hr = IBindCtx_SetBindOptions(bindctx, &bind_opts);
|
||||||
|
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = IMoniker_BindToStorage(moniker, bindctx, NULL, &IID_IStorage, (void **)&storage);
|
||||||
|
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
memset(&statstg, 0, sizeof(statstg));
|
||||||
|
hr = IStorage_Stat(storage, &statstg, STATFLAG_NONAME);
|
||||||
|
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
|
||||||
|
ok(statstg.grfMode == (STGM_READ | STGM_SHARE_DENY_WRITE), "Unexpected mode %#x.\n", statstg.grfMode);
|
||||||
|
|
||||||
|
IStorage_Release(storage);
|
||||||
|
IBindCtx_Release(bindctx);
|
||||||
|
IMoniker_Release(moniker);
|
||||||
|
|
||||||
|
DeleteFileW(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_item_moniker(void)
|
static void test_item_moniker(void)
|
||||||
|
|
Loading…
Reference in New Issue