ole32: Allocate the StorageImpl in StorageImpl_Construct.

This makes cleanup after errors much easier, as we can just use the regular
destructor.
This commit is contained in:
Vincent Povirk 2009-11-23 17:49:32 -06:00 committed by Alexandre Julliard
parent 6c3961f0c4
commit 9da3365e84
1 changed files with 54 additions and 68 deletions

View File

@ -2233,14 +2233,15 @@ static const IStorageVtbl Storage32Impl_Vtbl =
};
static HRESULT StorageImpl_Construct(
StorageImpl* This,
HANDLE hFile,
LPCOLESTR pwcsName,
ILockBytes* pLkbyt,
DWORD openFlags,
BOOL fileBased,
BOOL create)
BOOL create,
StorageImpl** result)
{
StorageImpl* This;
HRESULT hr = S_OK;
DirEntry currentEntry;
BOOL readSuccessful;
@ -2249,6 +2250,10 @@ static HRESULT StorageImpl_Construct(
if ( FAILED( validateSTGM(openFlags) ))
return STG_E_INVALIDFLAG;
This = HeapAlloc(GetProcessHeap(), 0, sizeof(StorageImpl));
if (!This)
return E_OUTOFMEMORY;
memset(This, 0, sizeof(StorageImpl));
list_init(&This->base.strmHead);
@ -2259,6 +2264,7 @@ static HRESULT StorageImpl_Construct(
This->base.pssVtbl = &IPropertySetStorage_Vtbl;
This->base.v_destructor = StorageImpl_Destroy;
This->base.openFlags = (openFlags & ~STGM_CREATE);
This->base.ref = 1;
This->create = create;
/*
@ -2273,7 +2279,10 @@ static HRESULT StorageImpl_Construct(
This->pwcsName = HeapAlloc(GetProcessHeap(), 0,
(lstrlenW(pwcsName)+1)*sizeof(WCHAR));
if (!This->pwcsName)
return STG_E_INSUFFICIENTMEMORY;
{
hr = STG_E_INSUFFICIENTMEMORY;
goto end;
}
strcpyW(This->pwcsName, pwcsName);
}
@ -2289,7 +2298,10 @@ static HRESULT StorageImpl_Construct(
fileBased);
if (This->bigBlockFile == 0)
return E_FAIL;
{
hr = E_FAIL;
goto end;
}
if (create)
{
@ -2341,9 +2353,7 @@ static HRESULT StorageImpl_Construct(
if (FAILED(hr))
{
BIGBLOCKFILE_Destructor(This->bigBlockFile);
return hr;
goto end;
}
}
@ -2362,12 +2372,18 @@ static HRESULT StorageImpl_Construct(
*/
if(!(This->rootBlockChain =
BlockChainStream_Construct(This, &This->rootStartBlock, DIRENTRY_NULL)))
return STG_E_READFAULT;
{
hr = STG_E_READFAULT;
goto end;
}
if(!(This->smallBlockDepotChain =
BlockChainStream_Construct(This, &This->smallBlockDepotStart,
DIRENTRY_NULL)))
return STG_E_READFAULT;
{
hr = STG_E_READFAULT;
goto end;
}
/*
* Write the root storage entry (memory only)
@ -2420,8 +2436,8 @@ static HRESULT StorageImpl_Construct(
if (!readSuccessful)
{
/* TODO CLEANUP */
return STG_E_READFAULT;
hr = STG_E_READFAULT;
goto end;
}
/*
@ -2429,7 +2445,18 @@ static HRESULT StorageImpl_Construct(
*/
if(!(This->smallBlockRootChain =
BlockChainStream_Construct(This, NULL, This->base.storageDirEntry)))
return STG_E_READFAULT;
{
hr = STG_E_READFAULT;
}
end:
if (FAILED(hr))
{
IStorage_Release((IStorage*)This);
*result = NULL;
}
else
*result = This;
return hr;
}
@ -2447,7 +2474,8 @@ static void StorageImpl_Destroy(StorageBaseImpl* iface)
BlockChainStream_Destroy(This->rootBlockChain);
BlockChainStream_Destroy(This->smallBlockDepotChain);
BIGBLOCKFILE_Destructor(This->bigBlockFile);
if (This->bigBlockFile)
BIGBLOCKFILE_Destructor(This->bigBlockFile);
HeapFree(GetProcessHeap(), 0, This);
}
@ -5663,36 +5691,25 @@ HRESULT WINAPI StgCreateDocfile(
/*
* Allocate and initialize the new IStorage32object.
*/
newStorage = HeapAlloc(GetProcessHeap(), 0, sizeof(StorageImpl));
if (newStorage == 0)
{
hr = STG_E_INSUFFICIENTMEMORY;
goto end;
}
hr = StorageImpl_Construct(
newStorage,
hFile,
pwcsName,
NULL,
grfMode,
TRUE,
TRUE);
TRUE,
&newStorage);
if (FAILED(hr))
{
HeapFree(GetProcessHeap(), 0, newStorage);
goto end;
}
/*
* Get an "out" pointer for the caller.
*/
hr = StorageBaseImpl_QueryInterface(
(IStorage*)newStorage,
&IID_IStorage,
(void**)ppstgOpen);
*ppstgOpen = (IStorage*)newStorage;
end:
TRACE("<-- %p r = %08x\n", *ppstgOpen, hr);
@ -5947,27 +5964,17 @@ HRESULT WINAPI StgOpenStorage(
/*
* Allocate and initialize the new IStorage32object.
*/
newStorage = HeapAlloc(GetProcessHeap(), 0, sizeof(StorageImpl));
if (newStorage == 0)
{
hr = STG_E_INSUFFICIENTMEMORY;
goto end;
}
/* Initialize the storage */
hr = StorageImpl_Construct(
newStorage,
hFile,
pwcsName,
NULL,
grfMode,
TRUE,
FALSE );
FALSE,
&newStorage);
if (FAILED(hr))
{
HeapFree(GetProcessHeap(), 0, newStorage);
/*
* According to the docs if the file is not a storage, return STG_E_FILEALREADYEXISTS
*/
@ -5984,10 +5991,7 @@ HRESULT WINAPI StgOpenStorage(
/*
* Get an "out" pointer for the caller.
*/
hr = StorageBaseImpl_QueryInterface(
(IStorage*)newStorage,
&IID_IStorage,
(void**)ppstgOpen);
*ppstgOpen = (IStorage*)newStorage;
end:
TRACE("<-- %08x, IStorage %p\n", hr, ppstgOpen ? *ppstgOpen : NULL);
@ -6012,33 +6016,24 @@ HRESULT WINAPI StgCreateDocfileOnILockBytes(
/*
* Allocate and initialize the new IStorage object.
*/
newStorage = HeapAlloc(GetProcessHeap(), 0, sizeof(StorageImpl));
if (newStorage == 0)
return STG_E_INSUFFICIENTMEMORY;
hr = StorageImpl_Construct(
newStorage,
0,
0,
plkbyt,
grfMode,
FALSE,
TRUE);
TRUE,
&newStorage);
if (FAILED(hr))
{
HeapFree(GetProcessHeap(), 0, newStorage);
return hr;
}
/*
* Get an "out" pointer for the caller.
*/
hr = StorageBaseImpl_QueryInterface(
(IStorage*)newStorage,
&IID_IStorage,
(void**)ppstgOpen);
*ppstgOpen = (IStorage*)newStorage;
return hr;
}
@ -6068,33 +6063,24 @@ HRESULT WINAPI StgOpenStorageOnILockBytes(
/*
* Allocate and initialize the new IStorage object.
*/
newStorage = HeapAlloc(GetProcessHeap(), 0, sizeof(StorageImpl));
if (newStorage == 0)
return STG_E_INSUFFICIENTMEMORY;
hr = StorageImpl_Construct(
newStorage,
0,
0,
plkbyt,
grfMode,
FALSE,
FALSE);
FALSE,
&newStorage);
if (FAILED(hr))
{
HeapFree(GetProcessHeap(), 0, newStorage);
return hr;
}
/*
* Get an "out" pointer for the caller.
*/
hr = StorageBaseImpl_QueryInterface(
(IStorage*)newStorage,
&IID_IStorage,
(void**)ppstgOpen);
*ppstgOpen = (IStorage*)newStorage;
return hr;
}