Andrew Eikum : ole32: Allow small block chains with no property.
Alexandre Julliard
julliard at winehq.org
Thu Aug 20 12:59:17 CDT 2009
Module: wine
Branch: master
Commit: 972e4a22f83f0799890c5a4ab0356513078fc8e0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=972e4a22f83f0799890c5a4ab0356513078fc8e0
Author: Andrew Eikum <aeikum at codeweavers.com>
Date: Wed Aug 19 15:19:07 2009 -0500
ole32: Allow small block chains with no property.
---
dlls/ole32/stg_stream.c | 2 +
dlls/ole32/storage32.c | 79 ++++++++++++++++++++++++++++++++++++-----------
dlls/ole32/storage32.h | 6 ++-
3 files changed, 67 insertions(+), 20 deletions(-)
diff --git a/dlls/ole32/stg_stream.c b/dlls/ole32/stg_stream.c
index 9acd414..f9a959d 100644
--- a/dlls/ole32/stg_stream.c
+++ b/dlls/ole32/stg_stream.c
@@ -232,6 +232,7 @@ static void StgStreamImpl_OpenBlockChain(
{
This->smallBlockChain = SmallBlockChainStream_Construct(
This->parentStorage->ancestorStorage,
+ NULL,
This->ownerProperty);
}
else
@@ -591,6 +592,7 @@ static HRESULT WINAPI StgStreamImpl_SetSize(
{
This->smallBlockChain = SmallBlockChainStream_Construct(
This->parentStorage->ancestorStorage,
+ NULL,
This->ownerProperty);
}
else
diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c
index 90eafb7..d8c1d0b 100644
--- a/dlls/ole32/storage32.c
+++ b/dlls/ole32/storage32.c
@@ -4579,7 +4579,6 @@ HRESULT BlockChainStream_ReadAt(BlockChainStream* This,
* BlockChainStream_WriteAt
*
* Writes the specified number of bytes to this chain at the specified offset.
- * bytesWritten may be NULL.
* Will fail if not all specified number of bytes have been written.
*/
HRESULT BlockChainStream_WriteAt(BlockChainStream* This,
@@ -4931,6 +4930,7 @@ static ULARGE_INTEGER BlockChainStream_GetSize(BlockChainStream* This)
SmallBlockChainStream* SmallBlockChainStream_Construct(
StorageImpl* parentStorage,
+ ULONG* headOfStreamPlaceHolder,
ULONG propertyIndex)
{
SmallBlockChainStream* newStream;
@@ -4938,6 +4938,7 @@ SmallBlockChainStream* SmallBlockChainStream_Construct(
newStream = HeapAlloc(GetProcessHeap(), 0, sizeof(SmallBlockChainStream));
newStream->parentStorage = parentStorage;
+ newStream->headOfStreamPlaceHolder = headOfStreamPlaceHolder;
newStream->ownerPropertyIndex = propertyIndex;
return newStream;
@@ -4960,6 +4961,9 @@ static ULONG SmallBlockChainStream_GetHeadOfChain(
StgProperty chainProperty;
BOOL readSuccessful;
+ if (This->headOfStreamPlaceHolder != NULL)
+ return *(This->headOfStreamPlaceHolder);
+
if (This->ownerPropertyIndex)
{
readSuccessful = StorageImpl_ReadProperty(
@@ -5322,7 +5326,6 @@ HRESULT SmallBlockChainStream_ReadAt(
* SmallBlockChainStream_WriteAt
*
* Writes the specified number of bytes to this chain at the specified offset.
- * bytesWritten may be NULL.
* Will fail if not all specified number of bytes have been written.
*/
HRESULT SmallBlockChainStream_WriteAt(
@@ -5362,9 +5365,6 @@ HRESULT SmallBlockChainStream_WriteAt(
/*
* Start writing the buffer.
- *
- * Here, I'm casting away the constness on the buffer variable
- * This is OK since we don't intend to modify that buffer.
*/
*bytesWritten = 0;
bufferWalker = buffer;
@@ -5511,26 +5511,32 @@ static BOOL SmallBlockChainStream_Enlarge(
blockIndex = SmallBlockChainStream_GetHeadOfChain(This);
/*
- * Empty chain
+ * Empty chain. Create the head.
*/
if (blockIndex == BLOCK_END_OF_CHAIN)
{
+ blockIndex = SmallBlockChainStream_GetNextFreeBlock(This);
+ SmallBlockChainStream_SetNextBlockInChain(
+ This,
+ blockIndex,
+ BLOCK_END_OF_CHAIN);
- StgProperty chainProp;
-
- StorageImpl_ReadProperty(This->parentStorage, This->ownerPropertyIndex,
- &chainProp);
+ if (This->headOfStreamPlaceHolder != NULL)
+ {
+ *(This->headOfStreamPlaceHolder) = blockIndex;
+ }
+ else
+ {
+ StgProperty chainProp;
- chainProp.startingBlock = SmallBlockChainStream_GetNextFreeBlock(This);
+ StorageImpl_ReadProperty(This->parentStorage, This->ownerPropertyIndex,
+ &chainProp);
- StorageImpl_WriteProperty(This->parentStorage, This->ownerPropertyIndex,
- &chainProp);
+ chainProp.startingBlock = blockIndex;
- blockIndex = chainProp.startingBlock;
- SmallBlockChainStream_SetNextBlockInChain(
- This,
- blockIndex,
- BLOCK_END_OF_CHAIN);
+ StorageImpl_WriteProperty(This->parentStorage, This->ownerPropertyIndex,
+ &chainProp);
+ }
}
currentBlock = blockIndex;
@@ -5606,6 +5612,32 @@ BOOL SmallBlockChainStream_SetSize(
}
/******************************************************************************
+ * SmallBlockChainStream_GetCount
+ *
+ * Returns the number of small blocks that comprises this chain.
+ * This is not the size of the stream as the last block may not be full!
+ *
+ */
+static ULONG SmallBlockChainStream_GetCount(SmallBlockChainStream* This)
+{
+ ULONG blockIndex;
+ ULONG count = 0;
+
+ blockIndex = SmallBlockChainStream_GetHeadOfChain(This);
+
+ while(blockIndex != BLOCK_END_OF_CHAIN)
+ {
+ count++;
+
+ if(FAILED(SmallBlockChainStream_GetNextBlockInChain(This,
+ blockIndex, &blockIndex)))
+ return 0;
+ }
+
+ return count;
+}
+
+/******************************************************************************
* SmallBlockChainStream_GetSize
*
* Returns the size of this chain.
@@ -5614,6 +5646,17 @@ static ULARGE_INTEGER SmallBlockChainStream_GetSize(SmallBlockChainStream* This)
{
StgProperty chainProperty;
+ if(This->headOfStreamPlaceHolder != NULL)
+ {
+ ULARGE_INTEGER result;
+ result.u.HighPart = 0;
+
+ result.u.LowPart = SmallBlockChainStream_GetCount(This) *
+ This->parentStorage->smallBlockSize;
+
+ return result;
+ }
+
StorageImpl_ReadProperty(
This->parentStorage,
This->ownerPropertyIndex,
diff --git a/dlls/ole32/storage32.h b/dlls/ole32/storage32.h
index 4be0631..68a82bb 100644
--- a/dlls/ole32/storage32.h
+++ b/dlls/ole32/storage32.h
@@ -464,14 +464,16 @@ struct SmallBlockChainStream
{
StorageImpl* parentStorage;
ULONG ownerPropertyIndex;
+ ULONG* headOfStreamPlaceHolder;
};
/*
* Methods of the SmallBlockChainStream class.
*/
SmallBlockChainStream* SmallBlockChainStream_Construct(
- StorageImpl* parentStorage,
- ULONG propertyIndex);
+ StorageImpl* parentStorage,
+ ULONG* headOfStreamPlaceHolder,
+ ULONG propertyIndex);
void SmallBlockChainStream_Destroy(
SmallBlockChainStream* This);
More information about the wine-cvs
mailing list