ole32: Try to open 1Ole stream before trying to create it in SetConvertStg function.
This commit is contained in:
parent
f83d24d4f7
commit
046d7c6d42
|
@ -9510,51 +9510,52 @@ HRESULT WINAPI GetConvertStg(IStorage *stg)
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI SetConvertStg(IStorage *storage, BOOL convert)
|
HRESULT WINAPI SetConvertStg(IStorage *storage, BOOL convert)
|
||||||
{
|
{
|
||||||
|
static const WCHAR stream_1oleW[] = {1,'O','l','e',0};
|
||||||
DWORD flags = convert ? OleStream_Convert : 0;
|
DWORD flags = convert ? OleStream_Convert : 0;
|
||||||
|
IStream *stream;
|
||||||
|
DWORD header[2];
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
TRACE("(%p, %d)\n", storage, convert);
|
TRACE("(%p, %d)\n", storage, convert);
|
||||||
|
|
||||||
hr = STORAGE_CreateOleStream(storage, flags);
|
hr = IStorage_OpenStream(storage, stream_1oleW, NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, &stream);
|
||||||
if (hr == STG_E_FILEALREADYEXISTS)
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
static const WCHAR stream_1oleW[] = {1,'O','l','e',0};
|
if (hr != STG_E_FILENOTFOUND)
|
||||||
IStream *stream;
|
return hr;
|
||||||
DWORD header[2];
|
|
||||||
|
|
||||||
hr = IStorage_OpenStream(storage, stream_1oleW, NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, &stream);
|
return STORAGE_CreateOleStream(storage, flags);
|
||||||
if (FAILED(hr)) return hr;
|
}
|
||||||
|
|
||||||
hr = IStream_Read(stream, header, sizeof(header), NULL);
|
hr = IStream_Read(stream, header, sizeof(header), NULL);
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
IStream_Release(stream);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* update flag if differs */
|
||||||
|
if ((header[1] ^ flags) & OleStream_Convert)
|
||||||
|
{
|
||||||
|
LARGE_INTEGER pos = {{0}};
|
||||||
|
|
||||||
|
if (header[1] & OleStream_Convert)
|
||||||
|
flags = header[1] & ~OleStream_Convert;
|
||||||
|
else
|
||||||
|
flags = header[1] | OleStream_Convert;
|
||||||
|
|
||||||
|
pos.QuadPart = sizeof(DWORD);
|
||||||
|
hr = IStream_Seek(stream, pos, STREAM_SEEK_SET, NULL);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
IStream_Release(stream);
|
IStream_Release(stream);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* update flag if differs */
|
hr = IStream_Write(stream, &flags, sizeof(flags), NULL);
|
||||||
if ((header[1] ^ flags) & OleStream_Convert)
|
|
||||||
{
|
|
||||||
LARGE_INTEGER pos;
|
|
||||||
|
|
||||||
if (header[1] & OleStream_Convert)
|
|
||||||
flags = header[1] & ~OleStream_Convert;
|
|
||||||
else
|
|
||||||
flags = header[1] | OleStream_Convert;
|
|
||||||
|
|
||||||
pos.QuadPart = sizeof(DWORD);
|
|
||||||
hr = IStream_Seek(stream, pos, STREAM_SEEK_SET, NULL);
|
|
||||||
if (FAILED(hr))
|
|
||||||
{
|
|
||||||
IStream_Release(stream);
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr = IStream_Write(stream, &flags, sizeof(flags), NULL);
|
|
||||||
}
|
|
||||||
IStream_Release(stream);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IStream_Release(stream);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue