Commit 41193de1 authored by David Hedberg's avatar David Hedberg Committed by Alexandre Julliard

ole32: Avoid unneccessary stream conversion.

Truncating a large stream to less than 0x1000 bytes would cause an unnecessarily expensive conversion.
parent 8b913427
...@@ -2489,7 +2489,7 @@ static HRESULT StorageImpl_StreamSetSize(StorageBaseImpl *base, DirRef index, ...@@ -2489,7 +2489,7 @@ static HRESULT StorageImpl_StreamSetSize(StorageBaseImpl *base, DirRef index,
} }
else if (bigblock && newsize.QuadPart < LIMIT_TO_USE_SMALL_BLOCK) else if (bigblock && newsize.QuadPart < LIMIT_TO_USE_SMALL_BLOCK)
{ {
smallblock = Storage32Impl_BigBlocksToSmallBlocks(This, pbigblock); smallblock = Storage32Impl_BigBlocksToSmallBlocks(This, pbigblock, newsize);
if (!smallblock) if (!smallblock)
return E_FAIL; return E_FAIL;
} }
...@@ -4132,12 +4132,13 @@ BlockChainStream* Storage32Impl_SmallBlocksToBigBlocks( ...@@ -4132,12 +4132,13 @@ BlockChainStream* Storage32Impl_SmallBlocksToBigBlocks(
*/ */
SmallBlockChainStream* Storage32Impl_BigBlocksToSmallBlocks( SmallBlockChainStream* Storage32Impl_BigBlocksToSmallBlocks(
StorageImpl* This, StorageImpl* This,
BlockChainStream** ppbbChain) BlockChainStream** ppbbChain,
ULARGE_INTEGER newSize)
{ {
ULARGE_INTEGER size, offset, cbTotalRead; ULARGE_INTEGER size, offset, cbTotalRead;
ULONG cbRead, cbWritten, sbHeadOfChain = BLOCK_END_OF_CHAIN; ULONG cbRead, cbWritten, sbHeadOfChain = BLOCK_END_OF_CHAIN;
DirRef streamEntryRef; DirRef streamEntryRef;
HRESULT resWrite = S_OK, resRead; HRESULT resWrite = S_OK, resRead = S_OK;
DirEntry streamEntry; DirEntry streamEntry;
BYTE* buffer; BYTE* buffer;
SmallBlockChainStream* sbTempChain; SmallBlockChainStream* sbTempChain;
...@@ -4150,14 +4151,15 @@ SmallBlockChainStream* Storage32Impl_BigBlocksToSmallBlocks( ...@@ -4150,14 +4151,15 @@ SmallBlockChainStream* Storage32Impl_BigBlocksToSmallBlocks(
if(!sbTempChain) if(!sbTempChain)
return NULL; return NULL;
SmallBlockChainStream_SetSize(sbTempChain, newSize);
size = BlockChainStream_GetSize(*ppbbChain); size = BlockChainStream_GetSize(*ppbbChain);
SmallBlockChainStream_SetSize(sbTempChain, size); size.QuadPart = min(size.QuadPart, newSize.QuadPart);
offset.u.HighPart = 0; offset.u.HighPart = 0;
offset.u.LowPart = 0; offset.u.LowPart = 0;
cbTotalRead.QuadPart = 0; cbTotalRead.QuadPart = 0;
buffer = HeapAlloc(GetProcessHeap(), 0, This->bigBlockSize); buffer = HeapAlloc(GetProcessHeap(), 0, This->bigBlockSize);
do while(cbTotalRead.QuadPart < size.QuadPart)
{ {
resRead = BlockChainStream_ReadAt(*ppbbChain, offset, resRead = BlockChainStream_ReadAt(*ppbbChain, offset,
min(This->bigBlockSize, size.u.LowPart - offset.u.LowPart), min(This->bigBlockSize, size.u.LowPart - offset.u.LowPart),
...@@ -4183,7 +4185,7 @@ SmallBlockChainStream* Storage32Impl_BigBlocksToSmallBlocks( ...@@ -4183,7 +4185,7 @@ SmallBlockChainStream* Storage32Impl_BigBlocksToSmallBlocks(
resRead = STG_E_READFAULT; resRead = STG_E_READFAULT;
break; break;
} }
}while(cbTotalRead.QuadPart < size.QuadPart); }
HeapFree(GetProcessHeap(), 0, buffer); HeapFree(GetProcessHeap(), 0, buffer);
size.u.HighPart = 0; size.u.HighPart = 0;
......
...@@ -412,7 +412,8 @@ BlockChainStream* Storage32Impl_SmallBlocksToBigBlocks( ...@@ -412,7 +412,8 @@ BlockChainStream* Storage32Impl_SmallBlocksToBigBlocks(
SmallBlockChainStream* Storage32Impl_BigBlocksToSmallBlocks( SmallBlockChainStream* Storage32Impl_BigBlocksToSmallBlocks(
StorageImpl* This, StorageImpl* This,
BlockChainStream** ppbbChain); BlockChainStream** ppbbChain,
ULARGE_INTEGER newSize);
/**************************************************************************** /****************************************************************************
* StgStreamImpl definitions. * StgStreamImpl definitions.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment