{
StorageImpl* newStorage = 0;
HANDLE hFile = INVALID_HANDLE_VALUE;
- HRESULT hr = S_OK;
+ HRESULT hr = STG_E_INVALIDFLAG;
DWORD shareMode;
DWORD accessMode;
DWORD creationMode;
* Validate the STGM flags
*/
if ( FAILED( validateSTGM(grfMode) ))
- return STG_E_INVALIDFLAG;
+ goto end;
/* StgCreateDocFile always opens for write */
switch(STGM_ACCESS_MODE(grfMode))
case STGM_READWRITE:
break;
default:
- return STG_E_INVALIDFLAG;
+ goto end;
}
/* can't share write */
case STGM_SHARE_DENY_WRITE:
break;
default:
- return STG_E_INVALIDFLAG;
+ goto end;
}
- /* need to create in transacted mode */
- if( STGM_CREATE_MODE(grfMode) == STGM_CREATE &&
- !(grfMode&STGM_TRANSACTED) )
- return STG_E_INVALIDFLAG;
-
- /*
- * Write only access only works in create mode.
- * I guess we need read access to read in the old file if there is one.
- */
- if( STGM_ACCESS_MODE(grfMode) == STGM_WRITE &&
- STGM_SHARE_MODE(grfMode) == STGM_SHARE_DENY_WRITE &&
- STGM_CREATE_MODE(grfMode) != STGM_CREATE )
- return STG_E_INVALIDFLAG;
+ /* shared reading requires transacted mode */
+ if( STGM_SHARE_MODE(grfMode) == STGM_SHARE_DENY_WRITE &&
+ !(grfMode&STGM_TRANSACTED) )
+ goto end;
/*
* Generate a unique name.
static const WCHAR prefix[] = { 'S', 'T', 'O', 0 };
if (STGM_SHARE_MODE(grfMode) == STGM_SHARE_EXCLUSIVE)
- return STG_E_INVALIDFLAG;
+ goto end;
memset(tempPath, 0, sizeof(tempPath));
memset(tempFileName, 0, sizeof(tempFileName));
if (GetTempFileNameW(tempPath, prefix, 0, tempFileName) != 0)
pwcsName = tempFileName;
else
- return STG_E_INSUFFICIENTMEMORY;
+ {
+ hr = STG_E_INSUFFICIENTMEMORY;
+ goto end;
+ }
creationMode = TRUNCATE_EXISTING;
}
if (hFile == INVALID_HANDLE_VALUE)
{
if(GetLastError() == ERROR_FILE_EXISTS)
- return STG_E_FILEALREADYEXISTS;
- return E_FAIL;
+ hr = STG_E_FILEALREADYEXISTS;
+ else
+ hr = E_FAIL;
+ goto end;
}
/*
newStorage = HeapAlloc(GetProcessHeap(), 0, sizeof(StorageImpl));
if (newStorage == 0)
- return STG_E_INSUFFICIENTMEMORY;
+ {
+ hr = STG_E_INSUFFICIENTMEMORY;
+ goto end;
+ }
hr = StorageImpl_Construct(
newStorage,
if (FAILED(hr))
{
HeapFree(GetProcessHeap(), 0, newStorage);
- return hr;
+ goto end;
}
/*
(IStorage*)newStorage,
(REFIID)&IID_IStorage,
(void**)ppstgOpen);
+end:
+ TRACE("<-- %p r = %08lx\n", *ppstgOpen, hr);
return hr;
}
case STGM_READ:
return GENERIC_READ;
case STGM_WRITE:
- return GENERIC_WRITE;
case STGM_READWRITE:
return GENERIC_READ | GENERIC_WRITE;
}
STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stm );
if( FAILED ( r ) )
{
- ERR("Failed to open stream\n");
+ WARN("Failed to open stream r = %08lx\n", r);
return r;
}
ok(r==STG_E_FILEALREADYEXISTS, "StgCreateDocfile wrong error\n");
r = StgCreateDocfile( filename, STGM_SHARE_EXCLUSIVE | STGM_WRITE, 0, &stg);
ok(r==STG_E_FILEALREADYEXISTS, "StgCreateDocfile wrong error\n");
- /*ok(DeleteFileW(filename), "failed to delete file\n"); */
+ r = StgCreateDocfile( filename, STGM_CREATE | STGM_SHARE_DENY_WRITE | STGM_READWRITE, 0, &stg);
+ ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile succeeded\n");
r = StgCreateDocfile( filename, STGM_CREATE | STGM_SHARE_EXCLUSIVE | STGM_READWRITE |STGM_TRANSACTED, 0, &stg);
ok(r==S_OK, "StgCreateDocfile failed\n");
r = IStorage_Release(stg);
ok(DeleteFileW(filename), "failed to delete file\n");
-
/* test the way excel uses StgCreateDocFile */
r = StgCreateDocfile( filename, STGM_TRANSACTED|STGM_CREATE|STGM_SHARE_DENY_WRITE|STGM_READWRITE, 0, &stg);
ok(r==S_OK, "StgCreateDocfile the excel way failed\n");
ok(DeleteFileW(filename), "failed to delete file\n");
}
+ r = StgCreateDocfile( filename, STGM_TRANSACTED|STGM_CREATE|STGM_SHARE_DENY_WRITE|STGM_WRITE, 0, &stg);
+ ok(r==S_OK, "StgCreateDocfile the excel way failed\n");
+ if(r == S_OK)
+ {
+ r = IStorage_Release(stg);
+ ok(r == 0, "storage not released\n");
+ ok(DeleteFileW(filename), "failed to delete file\n");
+ }
+
+ r = StgCreateDocfile( filename, STGM_CREATE | STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, &stg);
+ ok(r==S_OK, "StgCreateDocfile the powerpoint way failed\n");
+ if(r == S_OK)
+ {
+ r = IStorage_Release(stg);
+ ok(r == 0, "storage not released\n");
+ ok(DeleteFileW(filename), "failed to delete file\n");
+ }
+
/* test the way msi uses StgCreateDocfile */
r = StgCreateDocfile( filename, STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, &stg);
ok(r==S_OK, "StgCreateDocFile failed\n");
ok(r == STG_E_FILENOTFOUND, "open failed\n");
if(r == S_OK)
IPropertyStorage_Release(ps);
- printf("r = %08lx\n",r);
r = IPropertySetStorage_Release( propset );
ok(r == 1, "ref count wrong\n");