ole32: StgOpenStorage on non-existent file should create it (with test).

This commit is contained in:
Andrey Turkin 2006-09-22 06:40:49 +04:00 committed by Alexandre Julliard
parent b19c98481a
commit 63f88b3d57
2 changed files with 49 additions and 19 deletions

View File

@ -5935,18 +5935,18 @@ HRESULT WINAPI StgOpenStorageEx(const WCHAR* pwcsName, DWORD grfMode, DWORD stgf
HRESULT WINAPI StgOpenStorage(
const OLECHAR *pwcsName,
IStorage *pstgPriority,
DWORD grfMode,
SNB snbExclude,
DWORD reserved,
IStorage **ppstgOpen)
DWORD grfMode,
SNB snbExclude,
DWORD reserved,
IStorage **ppstgOpen)
{
StorageImpl* newStorage = 0;
StorageImpl* newStorage = 0;
HRESULT hr = S_OK;
HANDLE hFile = 0;
HANDLE hFile = 0;
DWORD shareMode;
DWORD accessMode;
WCHAR fullname[MAX_PATH];
DWORD length;
BOOL newFile;
TRACE("(%s, %p, %lx, %p, %ld, %p)\n",
debugstr_w(pwcsName), pstgPriority, grfMode,
@ -6036,13 +6036,24 @@ HRESULT WINAPI StgOpenStorage(
*/
*ppstgOpen = 0;
hFile = CreateFileW( pwcsName,
accessMode,
shareMode,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
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,
accessMode,
shareMode,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
0);
}
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
* FIXME: verify the file when reading instead of here
*/
length = GetFileSize(hFile, NULL);
if (length < 0x100)
if (!newFile && GetFileSize(hFile, NULL) < 0x100)
{
CloseHandle(hFile);
hr = STG_E_FILEALREADYEXISTS;
@ -6099,15 +6109,15 @@ HRESULT WINAPI StgOpenStorage(
goto end;
}
/* if the file's length was zero, initialize the storage */
/* if we created new file, initialize the storage */
hr = StorageImpl_Construct(
newStorage,
hFile,
pwcsName,
pwcsName,
NULL,
grfMode,
TRUE,
FALSE );
newFile );
if (FAILED(hr))
{

View File

@ -349,6 +349,18 @@ static BOOL is_zero_length(LPCWSTR filename)
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 const WCHAR szPrefix[] = { 's','t','g',0 };
@ -376,6 +388,14 @@ static void test_open_storage(void)
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 */
r = StgCreateDocfile( filename, STGM_CREATE | STGM_SHARE_EXCLUSIVE | STGM_READWRITE |STGM_TRANSACTED, 0, &stg);
ok(r==S_OK, "StgCreateDocfile failed\n");