ole32: Fix CopyTo to work correctly with LARGE_INTEGERs.

This commit is contained in:
Huw Davies 2008-03-06 15:13:24 +00:00 committed by Alexandre Julliard
parent be874f1a26
commit 60ee0c3eff
1 changed files with 11 additions and 27 deletions

View File

@ -689,28 +689,23 @@ static HRESULT WINAPI StgStreamImpl_CopyTo(
if ( pstm == 0 ) if ( pstm == 0 )
return STG_E_INVALIDPOINTER; return STG_E_INVALIDPOINTER;
totalBytesRead.u.LowPart = totalBytesRead.u.HighPart = 0; totalBytesRead.QuadPart = 0;
totalBytesWritten.u.LowPart = totalBytesWritten.u.HighPart = 0; totalBytesWritten.QuadPart = 0;
/* while ( cb.QuadPart > 0 )
* use stack to store data temporarily
* there is surely a more performant way of doing it, for now this basic
* implementation will do the job
*/
while ( cb.u.LowPart > 0 )
{ {
if ( cb.u.LowPart >= 128 ) if ( cb.QuadPart >= sizeof(tmpBuffer) )
copySize = 128; copySize = sizeof(tmpBuffer);
else else
copySize = cb.u.LowPart; copySize = cb.u.LowPart;
IStream_Read(iface, tmpBuffer, copySize, &bytesRead); IStream_Read(iface, tmpBuffer, copySize, &bytesRead);
totalBytesRead.u.LowPart += bytesRead; totalBytesRead.QuadPart += bytesRead;
IStream_Write(pstm, tmpBuffer, bytesRead, &bytesWritten); IStream_Write(pstm, tmpBuffer, bytesRead, &bytesWritten);
totalBytesWritten.u.LowPart += bytesWritten; totalBytesWritten.QuadPart += bytesWritten;
/* /*
* Check that read & write operations were successful * Check that read & write operations were successful
@ -723,25 +718,14 @@ static HRESULT WINAPI StgStreamImpl_CopyTo(
} }
if (bytesRead!=copySize) if (bytesRead!=copySize)
cb.u.LowPart = 0; cb.QuadPart = 0;
else else
cb.u.LowPart -= bytesRead; cb.QuadPart -= bytesRead;
} }
/* if (pcbRead) pcbRead->QuadPart = totalBytesRead.QuadPart;
* Update number of bytes read and written if (pcbWritten) pcbWritten->QuadPart = totalBytesWritten.QuadPart;
*/
if (pcbRead)
{
pcbRead->u.LowPart = totalBytesRead.u.LowPart;
pcbRead->u.HighPart = totalBytesRead.u.HighPart;
}
if (pcbWritten)
{
pcbWritten->u.LowPart = totalBytesWritten.u.LowPart;
pcbWritten->u.HighPart = totalBytesWritten.u.HighPart;
}
return hr; return hr;
} }