ole32: StgOpenStorage on non-existent file should create it (with test).
This commit is contained in:
parent
b19c98481a
commit
63f88b3d57
@ -5946,7 +5946,7 @@ HRESULT WINAPI StgOpenStorage(
|
|||||||
DWORD shareMode;
|
DWORD shareMode;
|
||||||
DWORD accessMode;
|
DWORD accessMode;
|
||||||
WCHAR fullname[MAX_PATH];
|
WCHAR fullname[MAX_PATH];
|
||||||
DWORD length;
|
BOOL newFile;
|
||||||
|
|
||||||
TRACE("(%s, %p, %lx, %p, %ld, %p)\n",
|
TRACE("(%s, %p, %lx, %p, %ld, %p)\n",
|
||||||
debugstr_w(pwcsName), pstgPriority, grfMode,
|
debugstr_w(pwcsName), pstgPriority, grfMode,
|
||||||
@ -6036,6 +6036,16 @@ HRESULT WINAPI StgOpenStorage(
|
|||||||
*/
|
*/
|
||||||
*ppstgOpen = 0;
|
*ppstgOpen = 0;
|
||||||
|
|
||||||
|
if ((accessMode & GENERIC_WRITE) && /* try to create a file if no yet exists */
|
||||||
|
((hFile = CreateFileW( pwcsName, accessMode, shareMode, NULL, CREATE_NEW,
|
||||||
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, 0))
|
||||||
|
!= INVALID_HANDLE_VALUE))
|
||||||
|
{
|
||||||
|
newFile = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newFile = FALSE;
|
||||||
hFile = CreateFileW( pwcsName,
|
hFile = CreateFileW( pwcsName,
|
||||||
accessMode,
|
accessMode,
|
||||||
shareMode,
|
shareMode,
|
||||||
@ -6043,6 +6053,7 @@ HRESULT WINAPI StgOpenStorage(
|
|||||||
OPEN_EXISTING,
|
OPEN_EXISTING,
|
||||||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
|
||||||
0);
|
0);
|
||||||
|
}
|
||||||
|
|
||||||
if (hFile==INVALID_HANDLE_VALUE)
|
if (hFile==INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
@ -6080,8 +6091,7 @@ HRESULT WINAPI StgOpenStorage(
|
|||||||
* Refuse to open the file if it's too small to be a structured storage file
|
* Refuse to open the file if it's too small to be a structured storage file
|
||||||
* FIXME: verify the file when reading instead of here
|
* FIXME: verify the file when reading instead of here
|
||||||
*/
|
*/
|
||||||
length = GetFileSize(hFile, NULL);
|
if (!newFile && GetFileSize(hFile, NULL) < 0x100)
|
||||||
if (length < 0x100)
|
|
||||||
{
|
{
|
||||||
CloseHandle(hFile);
|
CloseHandle(hFile);
|
||||||
hr = STG_E_FILEALREADYEXISTS;
|
hr = STG_E_FILEALREADYEXISTS;
|
||||||
@ -6099,7 +6109,7 @@ HRESULT WINAPI StgOpenStorage(
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if the file's length was zero, initialize the storage */
|
/* if we created new file, initialize the storage */
|
||||||
hr = StorageImpl_Construct(
|
hr = StorageImpl_Construct(
|
||||||
newStorage,
|
newStorage,
|
||||||
hFile,
|
hFile,
|
||||||
@ -6107,7 +6117,7 @@ HRESULT WINAPI StgOpenStorage(
|
|||||||
NULL,
|
NULL,
|
||||||
grfMode,
|
grfMode,
|
||||||
TRUE,
|
TRUE,
|
||||||
FALSE );
|
newFile );
|
||||||
|
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
|
@ -349,6 +349,18 @@ static BOOL is_zero_length(LPCWSTR filename)
|
|||||||
return len == 0;
|
return len == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL is_existing_file(LPCWSTR filename)
|
||||||
|
{
|
||||||
|
HANDLE file;
|
||||||
|
|
||||||
|
file = CreateFileW(filename, GENERIC_READ, 0, NULL,
|
||||||
|
OPEN_EXISTING, 0, NULL);
|
||||||
|
if (file==INVALID_HANDLE_VALUE)
|
||||||
|
return FALSE;
|
||||||
|
CloseHandle(file);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void test_open_storage(void)
|
static void test_open_storage(void)
|
||||||
{
|
{
|
||||||
static const WCHAR szPrefix[] = { 's','t','g',0 };
|
static const WCHAR szPrefix[] = { 's','t','g',0 };
|
||||||
@ -376,6 +388,14 @@ static void test_open_storage(void)
|
|||||||
|
|
||||||
DeleteFileW(filename);
|
DeleteFileW(filename);
|
||||||
|
|
||||||
|
/* try opening a non-existant file - it should create it */
|
||||||
|
stgm = STGM_DIRECT | STGM_SHARE_EXCLUSIVE | STGM_READWRITE;
|
||||||
|
r = StgOpenStorage( filename, NULL, stgm, NULL, 0, &stg);
|
||||||
|
ok(r==S_OK, "StgOpenStorage failed: 0x%08lx\n", r);
|
||||||
|
if (r==S_OK) IStorage_Release(stg);
|
||||||
|
ok(is_existing_file(filename), "StgOpenStorage didn't create a file\n");
|
||||||
|
DeleteFileW(filename);
|
||||||
|
|
||||||
/* create the file */
|
/* create the file */
|
||||||
r = StgCreateDocfile( filename, STGM_CREATE | STGM_SHARE_EXCLUSIVE | STGM_READWRITE |STGM_TRANSACTED, 0, &stg);
|
r = StgCreateDocfile( filename, STGM_CREATE | STGM_SHARE_EXCLUSIVE | STGM_READWRITE |STGM_TRANSACTED, 0, &stg);
|
||||||
ok(r==S_OK, "StgCreateDocfile failed\n");
|
ok(r==S_OK, "StgCreateDocfile failed\n");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user