Fixed a few bugs in the OLE storage implementation, added a new set of

trace statements for the OLE storage related methods and introduced a
new debug channel for the storage subsystem.
This commit is contained in:
Francis Beaudet 1999-05-02 11:41:10 +00:00 committed by Alexandre Julliard
parent 92ae219e04
commit ec2edc7ee4
4 changed files with 282 additions and 139 deletions

View File

@ -132,39 +132,40 @@ int dbch_snoop = 120;
int dbch_sound = 121;
int dbch_static = 122;
int dbch_statusbar = 123;
int dbch_stress = 124;
int dbch_string = 125;
int dbch_syscolor = 126;
int dbch_system = 127;
int dbch_tab = 128;
int dbch_tapi = 129;
int dbch_task = 130;
int dbch_text = 131;
int dbch_thread = 132;
int dbch_thunk = 133;
int dbch_timer = 134;
int dbch_toolbar = 135;
int dbch_toolhelp = 136;
int dbch_tooltips = 137;
int dbch_trackbar = 138;
int dbch_treeview = 139;
int dbch_ttydrv = 140;
int dbch_tweak = 141;
int dbch_updown = 142;
int dbch_ver = 143;
int dbch_virtual = 144;
int dbch_vxd = 145;
int dbch_wave = 146;
int dbch_win = 147;
int dbch_win16drv = 148;
int dbch_win32 = 149;
int dbch_wing = 150;
int dbch_winsock = 151;
int dbch_wnet = 152;
int dbch_x11 = 153;
int dbch_x11drv = 154;
int dbch_storage = 124;
int dbch_stress = 125;
int dbch_string = 126;
int dbch_syscolor = 127;
int dbch_system = 128;
int dbch_tab = 129;
int dbch_tapi = 130;
int dbch_task = 131;
int dbch_text = 132;
int dbch_thread = 133;
int dbch_thunk = 134;
int dbch_timer = 135;
int dbch_toolbar = 136;
int dbch_toolhelp = 137;
int dbch_tooltips = 138;
int dbch_trackbar = 139;
int dbch_treeview = 140;
int dbch_ttydrv = 141;
int dbch_tweak = 142;
int dbch_updown = 143;
int dbch_ver = 144;
int dbch_virtual = 145;
int dbch_vxd = 146;
int dbch_wave = 147;
int dbch_win = 148;
int dbch_win16drv = 149;
int dbch_win32 = 150;
int dbch_wing = 151;
int dbch_winsock = 152;
int dbch_wnet = 153;
int dbch_x11 = 154;
int dbch_x11drv = 155;
#define DEBUG_CHANNEL_COUNT 155
#define DEBUG_CHANNEL_COUNT 156
char debug_msg_enabled[DEBUG_CHANNEL_COUNT][DEBUG_CLASS_COUNT] = {
{1, 1, 0, 0},
@ -321,6 +322,7 @@ char debug_msg_enabled[DEBUG_CHANNEL_COUNT][DEBUG_CLASS_COUNT] = {
{1, 1, 0, 0},
{1, 1, 0, 0},
{1, 1, 0, 0},
{1, 1, 0, 0},
{1, 1, 0, 0}
};
@ -449,6 +451,7 @@ const char * const debug_ch_name[DEBUG_CHANNEL_COUNT] = {
"sound",
"static",
"statusbar",
"storage",
"stress",
"string",
"syscolor",

View File

@ -17,7 +17,7 @@
#include "objbase.h"
DEFAULT_DEBUG_CHANNEL(ole)
DEFAULT_DEBUG_CHANNEL(storage)
/****************************************************************************
* HGLOBALStreamImpl definition.
@ -252,6 +252,8 @@ HGLOBALStreamImpl* HGLOBALStreamImpl_Construct(
*/
void HGLOBALStreamImpl_Destroy(HGLOBALStreamImpl* This)
{
TRACE(storage, "(%p)\n", This);
/*
* Release the HGlobal if the constructor asked for that.
*/
@ -376,6 +378,9 @@ HRESULT WINAPI HGLOBALStreamImpl_Read(
void* supportBuffer;
ULONG bytesReadBuffer;
ULONG bytesToReadFromBuffer;
TRACE(storage, "(%p, %p, %ld, %p)\n", iface,
pv, cb, pcbRead);
/*
* If the caller is not interested in the nubmer of bytes read,
@ -444,6 +449,9 @@ HRESULT WINAPI HGLOBALStreamImpl_Write(
void* supportBuffer;
ULARGE_INTEGER newSize;
ULONG bytesWritten = 0;
TRACE(storage, "(%p, %p, %ld, %p)\n", iface,
pv, cb, pcbWritten);
/*
* If the caller is not interested in the number of bytes written,
@ -468,7 +476,7 @@ HRESULT WINAPI HGLOBALStreamImpl_Write(
if (newSize.LowPart > This->streamSize.LowPart)
{
/* grow stream */
HGLOBALStreamImpl_SetSize(iface, newSize);
IStream_SetSize(iface, newSize);
}
/*
@ -514,6 +522,9 @@ HRESULT WINAPI HGLOBALStreamImpl_Seek(
ULARGE_INTEGER newPosition;
TRACE(storage, "(%p, %ld, %ld, %p)\n", iface,
dlibMove.LowPart, dwOrigin, plibNewPosition);
/*
* The caller is allowed to pass in NULL as the new position return value.
* If it happens, we assign it to a dynamic variable to avoid special cases
@ -587,6 +598,8 @@ HRESULT WINAPI HGLOBALStreamImpl_SetSize(
{
HGLOBALStreamImpl* const This=(HGLOBALStreamImpl*)iface;
TRACE(storage, "(%p, %ld)\n", iface, libNewSize.LowPart);
/*
* As documented.
*/
@ -628,6 +641,9 @@ HRESULT WINAPI HGLOBALStreamImpl_CopyTo(
ULARGE_INTEGER totalBytesRead;
ULARGE_INTEGER totalBytesWritten;
TRACE(storage, "(%p, %p, %ld, %p, %p)\n", iface, pstm,
cb.LowPart, pcbRead, pcbWritten);
/*
* Sanity check
*/
@ -649,24 +665,27 @@ HRESULT WINAPI HGLOBALStreamImpl_CopyTo(
else
copySize = cb.LowPart;
HGLOBALStreamImpl_Read(iface, tmpBuffer, 128, &bytesRead);
IStream_Read(iface, tmpBuffer, copySize, &bytesRead);
totalBytesRead.LowPart += bytesRead;
HGLOBALStreamImpl_Write(pstm, tmpBuffer, bytesRead, &bytesWritten);
IStream_Write(pstm, tmpBuffer, bytesRead, &bytesWritten);
totalBytesWritten.LowPart += bytesWritten;
/*
* Check that read & write operations were succesfull
*/
if ( (bytesRead != copySize) && (bytesWritten != copySize) )
if (bytesRead != bytesWritten)
{
hr = STG_E_MEDIUMFULL;
break;
}
cb.LowPart = cb.LowPart - copySize;
if (bytesRead!=copySize)
cb.LowPart = 0;
else
cb.LowPart -= bytesRead;
}
/*
@ -777,6 +796,6 @@ HRESULT WINAPI HGLOBALStreamImpl_Clone(
IStream* iface,
IStream** ppstm) /* [out] */
{
FIXME(ole, "not implemented!\n");
FIXME(storage, "not implemented!\n");
return E_NOTIMPL;
}

View File

@ -20,7 +20,7 @@
#include "storage32.h"
DEFAULT_DEBUG_CHANNEL(ole)
DEFAULT_DEBUG_CHANNEL(storage)
/*
@ -113,6 +113,8 @@ StgStreamImpl* StgStreamImpl_Construct(
*/
void StgStreamImpl_Destroy(StgStreamImpl* This)
{
TRACE(storage, "(%p)\n", This);
/*
* Release the reference we are holding on the parent storage.
*/
@ -314,7 +316,10 @@ HRESULT WINAPI StgStreamImpl_Read(
ULONG bytesReadBuffer;
ULONG bytesToReadFromBuffer;
TRACE(storage, "(%p, %p, %ld, %p)\n",
iface, pv, cb, pcbRead);
/*
* If the caller is not interested in the nubmer of bytes read,
* we use another buffer to avoid "if" statements in the code.
@ -394,6 +399,9 @@ HRESULT WINAPI StgStreamImpl_Write(
ULARGE_INTEGER newSize;
ULONG bytesWritten = 0;
TRACE(storage, "(%p, %p, %ld, %p)\n",
iface, pv, cb, pcbWritten);
/*
* If the caller is not interested in the number of bytes written,
@ -402,6 +410,11 @@ HRESULT WINAPI StgStreamImpl_Write(
if (pcbWritten == 0)
pcbWritten = &bytesWritten;
/*
* Initialize the out parameter
*/
*pcbWritten = 0;
if (cb == 0)
{
return S_OK;
@ -418,7 +431,7 @@ HRESULT WINAPI StgStreamImpl_Write(
if (newSize.LowPart > This->streamSize.LowPart)
{
/* grow stream */
StgStreamImpl_SetSize(iface, newSize);
IStream_SetSize(iface, newSize);
}
/*
@ -471,6 +484,9 @@ HRESULT WINAPI StgStreamImpl_Seek(
ULARGE_INTEGER newPosition;
TRACE(storage, "(%p, %ld, %ld, %p)\n",
iface, dlibMove.LowPart, dwOrigin, plibNewPosition);
/*
* The caller is allowed to pass in NULL as the new position return value.
* If it happens, we assign it to a dynamic variable to avoid special cases
@ -547,6 +563,8 @@ HRESULT WINAPI StgStreamImpl_SetSize(
StgProperty curProperty;
BOOL Success;
TRACE(storage, "(%p, %ld)\n", iface, libNewSize.LowPart);
/*
* As documented.
*/
@ -584,9 +602,9 @@ HRESULT WINAPI StgStreamImpl_SetSize(
&curProperty);
/*
* Determine if we have to switch from small to big blocks or vice versa
*/
if (curProperty.size.LowPart < LIMIT_TO_USE_SMALL_BLOCK)
*/
if ( (This->smallBlockChain!=0) &&
(curProperty.size.LowPart < LIMIT_TO_USE_SMALL_BLOCK) )
{
if (libNewSize.LowPart >= LIMIT_TO_USE_SMALL_BLOCK)
{
@ -650,6 +668,9 @@ HRESULT WINAPI StgStreamImpl_CopyTo(
ULARGE_INTEGER totalBytesRead;
ULARGE_INTEGER totalBytesWritten;
TRACE(storage, "(%p, %p, %ld, %p, %p)\n",
iface, pstm, cb.LowPart, pcbRead, pcbWritten);
/*
* Sanity check
*/
@ -671,24 +692,27 @@ HRESULT WINAPI StgStreamImpl_CopyTo(
else
copySize = cb.LowPart;
StgStreamImpl_Read(iface, tmpBuffer, 128, &bytesRead);
IStream_Read(iface, tmpBuffer, copySize, &bytesRead);
totalBytesRead.LowPart += bytesRead;
StgStreamImpl_Write(pstm, tmpBuffer, bytesRead, &bytesWritten);
IStream_Write(pstm, tmpBuffer, bytesRead, &bytesWritten);
totalBytesWritten.LowPart += bytesWritten;
/*
* Check that read & write operations were succesfull
*/
if ( (bytesRead != copySize) && (bytesWritten != copySize) )
if (bytesRead != bytesWritten)
{
hr = STG_E_MEDIUMFULL;
break;
}
cb.LowPart = cb.LowPart - copySize;
if (bytesRead!=copySize)
cb.LowPart = 0;
else
cb.LowPart -= bytesRead;
}
/*
@ -743,7 +767,7 @@ HRESULT WINAPI StgStreamImpl_LockRegion(
ULARGE_INTEGER cb, /* [in] */
DWORD dwLockType) /* [in] */
{
FIXME(ole, "not implemented!\n");
FIXME(storage, "not implemented!\n");
return E_NOTIMPL;
}
@ -753,7 +777,7 @@ HRESULT WINAPI StgStreamImpl_UnlockRegion(
ULARGE_INTEGER cb, /* [in] */
DWORD dwLockType) /* [in] */
{
FIXME(ole, "not implemented!\n");
FIXME(storage, "not implemented!\n");
return E_NOTIMPL;
}
@ -798,6 +822,6 @@ HRESULT WINAPI StgStreamImpl_Clone(
IStream* iface,
IStream** ppstm) /* [out] */
{
FIXME(ole, "not implemented!\n");
FIXME(storage, "not implemented!\n");
return E_NOTIMPL;
}

View File

@ -27,7 +27,7 @@
#include "storage32.h"
#include "ole2.h"
DEFAULT_DEBUG_CHANNEL(ole)
DEFAULT_DEBUG_CHANNEL(storage)
#define FILE_BEGIN 0
@ -270,9 +270,9 @@ ULONG WINAPI StorageBaseImpl_Release(
HRESULT WINAPI StorageBaseImpl_OpenStream(
IStorage* iface,
const OLECHAR* pwcsName, /* [string][in] */
void* reserved1, /* [unique][in] */
DWORD grfMode, /* [in] */
DWORD reserved2, /* [in] */
void* reserved1, /* [unique][in] */
DWORD grfMode, /* [in] */
DWORD reserved2, /* [in] */
IStream** ppstm) /* [out] */
{
ICOM_THIS(StorageBaseImpl,iface);
@ -281,6 +281,9 @@ HRESULT WINAPI StorageBaseImpl_OpenStream(
StgProperty currentProperty;
ULONG foundPropertyIndex;
TRACE(storage, "(%p, %s, %p, %lx, %ld, %p)\n",
iface, debugstr_w(pwcsName), reserved1, grfMode, reserved2, ppstm);
/*
* Perform a sanity check on the parameters.
*/
@ -364,9 +367,9 @@ HRESULT WINAPI StorageBaseImpl_OpenStorage(
IStorage* iface,
const OLECHAR* pwcsName, /* [string][unique][in] */
IStorage* pstgPriority, /* [unique][in] */
DWORD grfMode, /* [in] */
DWORD grfMode, /* [in] */
SNB snbExclude, /* [unique][in] */
DWORD reserved, /* [in] */
DWORD reserved, /* [in] */
IStorage** ppstg) /* [out] */
{
ICOM_THIS(StorageBaseImpl,iface);
@ -374,6 +377,10 @@ HRESULT WINAPI StorageBaseImpl_OpenStorage(
IEnumSTATSTGImpl* propertyEnumeration;
StgProperty currentProperty;
ULONG foundPropertyIndex;
TRACE(storage, "(%p, %s, %p, %lx, %p, %ld, %p)\n",
iface, debugstr_w(pwcsName), pstgPriority,
grfMode, snbExclude, reserved, ppstg);
/*
* Perform a sanity check on the parameters.
@ -461,15 +468,18 @@ HRESULT WINAPI StorageBaseImpl_OpenStorage(
* See Windows documentation for more details on IStorage methods.
*/
HRESULT WINAPI StorageBaseImpl_EnumElements(
IStorage* iface,
DWORD reserved1, /* [in] */
void* reserved2, /* [size_is][unique][in] */
DWORD reserved3, /* [in] */
IEnumSTATSTG** ppenum) /* [out] */
IStorage* iface,
DWORD reserved1, /* [in] */
void* reserved2, /* [size_is][unique][in] */
DWORD reserved3, /* [in] */
IEnumSTATSTG** ppenum) /* [out] */
{
ICOM_THIS(StorageBaseImpl,iface);
IEnumSTATSTGImpl* newEnum;
TRACE(storage, "(%p, %ld, %p, %ld, %p)\n",
iface, reserved1, reserved2, reserved3, ppenum);
/*
* Perform a sanity check on the parameters.
*/
@ -508,13 +518,16 @@ HRESULT WINAPI StorageBaseImpl_EnumElements(
*/
HRESULT WINAPI StorageBaseImpl_Stat(
IStorage* iface,
STATSTG* pstatstg, /* [out] */
DWORD grfStatFlag) /* [in] */
STATSTG* pstatstg, /* [out] */
DWORD grfStatFlag) /* [in] */
{
ICOM_THIS(StorageBaseImpl,iface);
StgProperty curProperty;
BOOL readSucessful;
TRACE(storage, "(%p, %p, %lx)\n",
iface, pstatstg, grfStatFlag);
/*
* Perform a sanity check on the parameters.
*/
@ -563,6 +576,9 @@ HRESULT WINAPI StorageBaseImpl_RenameElement(
StgProperty currentProperty;
ULONG foundPropertyIndex;
TRACE(storage, "(%p, %s, %s)\n",
iface, debugstr_w(pwcsOldName), debugstr_w(pwcsNewName));
/*
* Create a property enumeration to search the properties
*/
@ -704,9 +720,9 @@ HRESULT WINAPI StorageBaseImpl_RenameElement(
HRESULT WINAPI StorageBaseImpl_CreateStream(
IStorage* iface,
const OLECHAR* pwcsName, /* [string][in] */
DWORD grfMode, /* [in] */
DWORD reserved1, /* [in] */
DWORD reserved2, /* [in] */
DWORD grfMode, /* [in] */
DWORD reserved1, /* [in] */
DWORD reserved2, /* [in] */
IStream** ppstm) /* [out] */
{
ICOM_THIS(StorageBaseImpl,iface);
@ -715,6 +731,10 @@ HRESULT WINAPI StorageBaseImpl_CreateStream(
StgProperty currentProperty, newStreamProperty;
ULONG foundPropertyIndex, newPropertyIndex;
TRACE(storage, "(%p, %s, %lx, %ld, %ld, %p)\n",
iface, debugstr_w(pwcsName), grfMode,
reserved1, reserved2, ppstm);
/*
* Validate parameters
*/
@ -761,7 +781,9 @@ HRESULT WINAPI StorageBaseImpl_CreateStream(
* An element with this name already exists
*/
if (grfMode & STGM_CREATE)
StorageImpl_DestroyElement((IStorage*)This->ancestorStorage, pwcsName);
{
IStorage_DestroyElement(iface, pwcsName);
}
else
return STG_E_FILEALREADYEXISTS;
}
@ -851,12 +873,14 @@ HRESULT WINAPI StorageBaseImpl_CreateStream(
*/
HRESULT WINAPI StorageBaseImpl_SetClass(
IStorage* iface,
REFCLSID clsid) /* [in] */
REFCLSID clsid) /* [in] */
{
ICOM_THIS(StorageBaseImpl,iface);
HRESULT hRes = E_FAIL;
StgProperty curProperty;
BOOL success;
TRACE(storage, "(%p, %p)\n", iface, clsid);
success = StorageImpl_ReadProperty(This->ancestorStorage,
This->rootPropertySetIndex,
@ -903,6 +927,9 @@ HRESULT WINAPI StorageImpl_CreateStorage(
ULONG newPropertyIndex;
HRESULT hr;
TRACE(storage, "(%p, %s, %lx, %ld, %ld, %p)\n",
iface, debugstr_w(pwcsName), grfMode,
reserved1, reserved2, ppstg);
/*
* Validate parameters
@ -942,7 +969,7 @@ HRESULT WINAPI StorageImpl_CreateStorage(
* An element with this name already exists
*/
if (grfMode & STGM_CREATE)
StorageImpl_DestroyElement((IStorage*)This->ancestorStorage, pwcsName);
IStorage_DestroyElement(iface, pwcsName);
else
return STG_E_FILEALREADYEXISTS;
}
@ -1001,7 +1028,7 @@ HRESULT WINAPI StorageImpl_CreateStorage(
/*
* Open it to get a pointer to return.
*/
hr = StorageBaseImpl_OpenStorage(
hr = IStorage_OpenStorage(
iface,
(OLECHAR*)pwcsName,
0,
@ -1212,7 +1239,7 @@ static void updatePropertyChain(
found = 1;
}
}
else
else if (diff > 0)
{
if (next != PROPERTY_NULL)
{
@ -1230,6 +1257,14 @@ static void updatePropertyChain(
found = 1;
}
}
else
{
/*
* Trying to insert an item with the same name in the
* subtree structure.
*/
assert(FALSE);
}
previous = currentProperty.previousProperty;
next = currentProperty.nextProperty;
@ -1253,10 +1288,10 @@ static void updatePropertyChain(
*/
HRESULT WINAPI StorageImpl_CopyTo(
IStorage* iface,
DWORD ciidExclude, /* [in] */
const IID *rgiidExclude,/* [size_is][unique][in] */
DWORD ciidExclude, /* [in] */
const IID* rgiidExclude, /* [size_is][unique][in] */
SNB snbExclude, /* [unique][in] */
IStorage *pstgDest) /* [unique][in] */
IStorage* pstgDest) /* [unique][in] */
{
IEnumSTATSTG *elements = 0;
STATSTG curElement, strStat;
@ -1265,7 +1300,11 @@ HRESULT WINAPI StorageImpl_CopyTo(
IStream *pstrTmp, *pstrChild;
if ((ciidExclude != 0) || (rgiidExclude != NULL) || (snbExclude != NULL))
FIXME( ole, "Exclude option not implemented\n");
FIXME( storage, "Exclude option not implemented\n");
TRACE(storage, "(%p, %ld, %p, %p, %p)\n",
iface, ciidExclude, rgiidExclude,
snbExclude, pstgDest);
/*
* Perform a sanity check
@ -1284,7 +1323,7 @@ HRESULT WINAPI StorageImpl_CopyTo(
/*
* set the class ID
*/
StorageBaseImpl_Stat( iface, &curElement, STATFLAG_NONAME);
IStorage_Stat( iface, &curElement, STATFLAG_NONAME);
IStorage_SetClass( pstgDest, &curElement.clsid );
do
@ -1305,9 +1344,9 @@ HRESULT WINAPI StorageImpl_CopyTo(
/*
* open child source storage
*/
hr = StorageBaseImpl_OpenStorage( iface, curElement.pwcsName, NULL,
STGM_READ|STGM_SHARE_EXCLUSIVE,
NULL, 0, &pstgChild );
hr = IStorage_OpenStorage( iface, curElement.pwcsName, NULL,
STGM_READ|STGM_SHARE_EXCLUSIVE,
NULL, 0, &pstgChild );
if (hr != S_OK)
break;
@ -1327,7 +1366,8 @@ HRESULT WINAPI StorageImpl_CopyTo(
* create a new storage in destination storage
*/
hr = IStorage_CreateStorage( pstgDest, curElement.pwcsName,
STGM_FAILIFTHERE|STGM_WRITE, 0, 0,
STGM_FAILIFTHERE|STGM_WRITE|STGM_SHARE_EXCLUSIVE,
0, 0,
&pstgTmp );
/*
* if it already exist, don't create a new one use this one
@ -1368,17 +1408,22 @@ HRESULT WINAPI StorageImpl_CopyTo(
/*
* open child stream storage
*/
hr = StorageBaseImpl_OpenStream( iface, curElement.pwcsName, NULL,
STGM_READ|STGM_SHARE_EXCLUSIVE,
0, &pstrChild );
hr = IStorage_OpenStream( iface, curElement.pwcsName, NULL,
STGM_READ|STGM_SHARE_EXCLUSIVE,
0, &pstrChild );
if (hr != S_OK)
break;
/*
* Get the size of the stream
* Get the size of the source stream
*/
IStream_Stat( pstrChild, &strStat, STATFLAG_NONAME );
/*
* Set the size of the destination stream.
*/
IStream_SetSize(pstrTmp, strStat.cbSize);
/*
* do the copy
@ -1391,7 +1436,7 @@ HRESULT WINAPI StorageImpl_CopyTo(
}
else
{
WARN(ole, "unknown element type: %ld\n", curElement.type);
WARN(storage, "unknown element type: %ld\n", curElement.type);
}
} while (hr == S_OK);
@ -1414,7 +1459,7 @@ HRESULT WINAPI StorageImpl_MoveElementTo(
const OLECHAR *pwcsNewName,/* [string][in] */
DWORD grfFlags) /* [in] */
{
FIXME(ole, "not implemented!\n");
FIXME(storage, "not implemented!\n");
return E_NOTIMPL;
}
@ -1425,7 +1470,7 @@ HRESULT WINAPI StorageImpl_Commit(
IStorage* iface,
DWORD grfCommitFlags)/* [in] */
{
FIXME(ole, "(%ld): stub!\n", grfCommitFlags);
FIXME(storage, "(%ld): stub!\n", grfCommitFlags);
return S_OK;
}
@ -1435,7 +1480,7 @@ HRESULT WINAPI StorageImpl_Commit(
HRESULT WINAPI StorageImpl_Revert(
IStorage* iface)
{
FIXME(ole, "not implemented!\n");
FIXME(storage, "not implemented!\n");
return E_NOTIMPL;
}
@ -1465,6 +1510,9 @@ HRESULT WINAPI StorageImpl_DestroyElement(
ULONG typeOfRelation;
ULONG parentPropertyId;
TRACE(storage, "(%p, %s)\n",
iface, debugstr_w(pwcsName));
/*
* Perform a sanity check on the parameters.
*/
@ -1680,6 +1728,11 @@ static HRESULT deleteStreamProperty(
return hr;
}
/*
* Release the stream object.
*/
IStream_Release(pis);
/*
* Invalidate the property by zeroing it's name member.
*/
@ -1689,7 +1742,6 @@ static HRESULT deleteStreamProperty(
* Here we should re-read the property so we get the updated pointer
* but since we are here to zap it, I don't do it...
*/
StorageImpl_WriteProperty(
parentStorage->ancestorStorage,
indexOfPropertyToDelete,
@ -1952,7 +2004,7 @@ HRESULT WINAPI StorageImpl_SetElementTimes(
const FILETIME *patime, /* [in] */
const FILETIME *pmtime) /* [in] */
{
FIXME(ole, "not implemented!\n");
FIXME(storage, "not implemented!\n");
return E_NOTIMPL;
}
@ -1964,7 +2016,7 @@ HRESULT WINAPI StorageImpl_SetStateBits(
DWORD grfStateBits,/* [in] */
DWORD grfMask) /* [in] */
{
FIXME(ole, "not implemented!\n");
FIXME(storage, "not implemented!\n");
return E_NOTIMPL;
}
@ -2159,6 +2211,8 @@ HRESULT StorageImpl_Construct(
void StorageImpl_Destroy(
StorageImpl* This)
{
TRACE(storage, "(%p)\n", This);
BlockChainStream_Destroy(This->smallBlockRootChain);
BlockChainStream_Destroy(This->rootBlockChain);
BlockChainStream_Destroy(This->smallBlockDepotChain);
@ -4004,12 +4058,17 @@ BOOL BlockChainStream_ReadAt(BlockChainStream* This,
BYTE* bufferWalker;
BYTE* bigBlockBuffer;
if (This->lastBlockNoInSequence == 0xFFFFFFFF)
This->lastBlockNoInSequence = blockNoInSequence;
/*
* Find the first block in the stream that contains part of the buffer.
*/
if (blockNoInSequence > This->lastBlockNoInSequence)
if ( (This->lastBlockNoInSequence == 0xFFFFFFFF) ||
(This->lastBlockNoInSequenceIndex == BLOCK_END_OF_CHAIN) ||
(blockNoInSequence < This->lastBlockNoInSequence) )
{
blockIndex = BlockChainStream_GetHeadOfChain(This);
This->lastBlockNoInSequence = blockNoInSequence;
}
else
{
ULONG temp = blockNoInSequence;
@ -4017,11 +4076,6 @@ BOOL BlockChainStream_ReadAt(BlockChainStream* This,
blockNoInSequence -= This->lastBlockNoInSequence;
This->lastBlockNoInSequence = temp;
}
else
{
blockIndex = BlockChainStream_GetHeadOfChain(This);
This->lastBlockNoInSequence = blockNoInSequence;
}
while ( (blockNoInSequence > 0) && (blockIndex != BLOCK_END_OF_CHAIN))
{
@ -4093,13 +4147,17 @@ BOOL BlockChainStream_WriteAt(BlockChainStream* This,
BYTE* bufferWalker;
BYTE* bigBlockBuffer;
if (This->lastBlockNoInSequence == 0xFFFFFFFF)
This->lastBlockNoInSequence = blockNoInSequence;
/*
* Find the first block in the stream that contains part of the buffer.
*/
if (blockNoInSequence > This->lastBlockNoInSequence)
if ( (This->lastBlockNoInSequence == 0xFFFFFFFF) ||
(This->lastBlockNoInSequenceIndex == BLOCK_END_OF_CHAIN) ||
(blockNoInSequence < This->lastBlockNoInSequence) )
{
blockIndex = BlockChainStream_GetHeadOfChain(This);
This->lastBlockNoInSequence = blockNoInSequence;
}
else
{
ULONG temp = blockNoInSequence;
@ -4107,11 +4165,6 @@ BOOL BlockChainStream_WriteAt(BlockChainStream* This,
blockNoInSequence -= This->lastBlockNoInSequence;
This->lastBlockNoInSequence = temp;
}
else
{
blockIndex = BlockChainStream_GetHeadOfChain(This);
This->lastBlockNoInSequence = blockNoInSequence;
}
while ( (blockNoInSequence > 0) && (blockIndex != BLOCK_END_OF_CHAIN))
{
@ -4174,6 +4227,12 @@ BOOL BlockChainStream_Shrink(BlockChainStream* This,
ULONG numBlocks;
ULONG count = 1;
/*
* Reset the last accessed block cache.
*/
This->lastBlockNoInSequence = 0xFFFFFFFF;
This->lastBlockNoInSequenceIndex = BLOCK_END_OF_CHAIN;
/*
* Figure out how many blocks are needed to contain the new size
*/
@ -4306,27 +4365,30 @@ BOOL BlockChainStream_Enlarge(BlockChainStream* This,
/*
* Add new blocks to the chain
*/
while (oldNumBlocks < newNumBlocks)
if (oldNumBlocks < newNumBlocks)
{
blockIndex = StorageImpl_GetNextFreeBigBlock(This->parentStorage);
while (oldNumBlocks < newNumBlocks)
{
blockIndex = StorageImpl_GetNextFreeBigBlock(This->parentStorage);
StorageImpl_SetNextBlockInChain(
This->parentStorage,
currentBlock,
blockIndex);
StorageImpl_SetNextBlockInChain(
This->parentStorage,
currentBlock,
blockIndex);
StorageImpl_SetNextBlockInChain(
This->parentStorage,
blockIndex,
BLOCK_END_OF_CHAIN);
StorageImpl_SetNextBlockInChain(
This->parentStorage,
blockIndex,
BLOCK_END_OF_CHAIN);
currentBlock = blockIndex;
oldNumBlocks++;
currentBlock = blockIndex;
oldNumBlocks++;
}
This->tailIndex = blockIndex;
This->numBlocks = newNumBlocks;
}
This->tailIndex = blockIndex;
This->numBlocks = newNumBlocks;
return TRUE;
}
@ -4902,7 +4964,7 @@ BOOL SmallBlockChainStream_Shrink(
{
ULONG blockIndex, extraBlock;
ULONG numBlocks;
ULONG count = 1;
ULONG count = 0;
numBlocks = newSize.LowPart / This->parentStorage->smallBlockSize;
@ -4920,14 +4982,40 @@ BOOL SmallBlockChainStream_Shrink(
count++;
}
/* Get the next block before marking the new end */
extraBlock = SmallBlockChainStream_GetNextBlockInChain(This, blockIndex);
/*
* If the count is 0, we have a special case, the head of the chain was
* just freed.
*/
if (count == 0)
{
StgProperty chainProp;
/* Mark the new end of chain */
SmallBlockChainStream_SetNextBlockInChain(
This,
blockIndex,
BLOCK_END_OF_CHAIN);
StorageImpl_ReadProperty(This->parentStorage,
This->ownerPropertyIndex,
&chainProp);
chainProp.startingBlock = BLOCK_END_OF_CHAIN;
StorageImpl_WriteProperty(This->parentStorage,
This->ownerPropertyIndex,
&chainProp);
/*
* We start freeing the chain at the head block.
*/
extraBlock = blockIndex;
}
else
{
/* Get the next block before marking the new end */
extraBlock = SmallBlockChainStream_GetNextBlockInChain(This, blockIndex);
/* Mark the new end of chain */
SmallBlockChainStream_SetNextBlockInChain(
This,
blockIndex,
BLOCK_END_OF_CHAIN);
}
/*
* Mark the extra blocks as free
@ -4962,6 +5050,7 @@ BOOL SmallBlockChainStream_Enlarge(
*/
if (blockIndex == BLOCK_END_OF_CHAIN)
{
StgProperty chainProp;
StorageImpl_ReadProperty(This->parentStorage, This->ownerPropertyIndex,
@ -5108,6 +5197,10 @@ HRESULT WINAPI StgCreateDocfile(
DWORD fileAttributes;
WCHAR tempFileName[MAX_PATH];
TRACE(storage, "(%s, %lx, %ld, %p)\n",
debugstr_w(pwcsName), grfMode,
reserved, ppstgOpen);
/*
* Validate the parameters
*/
@ -5153,7 +5246,7 @@ HRESULT WINAPI StgCreateDocfile(
fileAttributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS;
if (grfMode & STGM_TRANSACTED)
FIXME(ole, "Transacted mode not implemented.\n");
FIXME(storage, "Transacted mode not implemented.\n");
/*
* Initialize the "out" parameter.
@ -5220,6 +5313,10 @@ HRESULT WINAPI StgOpenStorage(
DWORD shareMode;
DWORD accessMode;
TRACE(storage, "(%s, %p, %lx, %p, %ld, %p)\n",
debugstr_w(pwcsName), pstgPriority, grfMode,
snbExclude, reserved, ppstgOpen);
/*
* Perform a sanity check
*/
@ -5313,7 +5410,7 @@ HRESULT WINAPI ReadClassStg(IStorage *pstg,CLSID *pclsid){
STATSTG pstatstg;
HRESULT hRes;
TRACE(ole,"()\n");
TRACE(storage,"()\n");
if(pclsid==NULL)
return E_POINTER;
@ -5338,7 +5435,7 @@ HRESULT WINAPI OleLoadFromStream(IStream *pStm,REFIID iidInterface,void** ppvOb
CLSID clsid;
HRESULT res;
FIXME(ole,"(),stub!\n");
FIXME(storage,"(),stub!\n");
res=ReadClassStm(pStm,&clsid);
@ -5365,7 +5462,7 @@ HRESULT WINAPI OleSaveToStream(IPersistStream *pPStm,IStream *pStm)
CLSID clsid;
HRESULT res;
TRACE(ole,"(%p,%p)\n",pPStm,pStm);
TRACE(storage,"(%p,%p)\n",pPStm,pStm);
res=IPersistStream_GetClassID(pPStm,&clsid);
@ -5555,11 +5652,11 @@ static DWORD GetCreationModeFromSTGM(DWORD stgm)
if ( stgm & STGM_CREATE)
return CREATE_ALWAYS;
if (stgm & STGM_CONVERT) {
FIXME(ole, "STGM_CONVERT not implemented!\n");
FIXME(storage, "STGM_CONVERT not implemented!\n");
return CREATE_NEW;
}
/* All other cases */
if (stgm & ~ (STGM_CREATE|STGM_CONVERT))
FIXME(ole,"unhandled storage mode : 0x%08lx\n",stgm & ~ (STGM_CREATE|STGM_CONVERT));
FIXME(storage,"unhandled storage mode : 0x%08lx\n",stgm & ~ (STGM_CREATE|STGM_CONVERT));
return CREATE_NEW;
}