shlwapi: Implement IStream::Write, Seek and SetSize.

On Write holes between file size and cursor are filled with 0 bytes.
On SetSize holes caused by increasing file size are filled with 0 bytes.
This commit is contained in:
Peter Oberndorfer 2009-09-28 22:24:08 +02:00 committed by Alexandre Julliard
parent da984870cd
commit 58669ece91
1 changed files with 52 additions and 8 deletions

View File

@ -144,13 +144,29 @@ static HRESULT WINAPI IStream_fnRead (IStream * iface, void* pv, ULONG cb, ULONG
static HRESULT WINAPI IStream_fnWrite (IStream * iface, const void* pv, ULONG cb, ULONG* pcbWritten) static HRESULT WINAPI IStream_fnWrite (IStream * iface, const void* pv, ULONG cb, ULONG* pcbWritten)
{ {
ISHRegStream *This = (ISHRegStream *)iface; ISHRegStream *This = (ISHRegStream *)iface;
DWORD newLen = This->dwPos + cb;
TRACE("(%p)\n",This); TRACE("(%p, %p, %d, %p)\n",This, pv, cb, pcbWritten);
if (newLen < This->dwPos) /* overflow */
return STG_E_INSUFFICIENTMEMORY;
if (newLen > This->dwLength)
{
LPBYTE newBuf = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->pbBuffer, newLen);
if (!newBuf)
return STG_E_INSUFFICIENTMEMORY;
This->dwLength = newLen;
This->pbBuffer = newBuf;
}
memmove(This->pbBuffer + This->dwPos, pv, cb);
This->dwPos += cb; /* adjust pointer */
if (pcbWritten) if (pcbWritten)
*pcbWritten = 0; *pcbWritten = cb;
return E_NOTIMPL; return S_OK;
} }
/************************************************************************** /**************************************************************************
@ -159,12 +175,28 @@ static HRESULT WINAPI IStream_fnWrite (IStream * iface, const void* pv, ULONG cb
static HRESULT WINAPI IStream_fnSeek (IStream * iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition) static HRESULT WINAPI IStream_fnSeek (IStream * iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition)
{ {
ISHRegStream *This = (ISHRegStream *)iface; ISHRegStream *This = (ISHRegStream *)iface;
LARGE_INTEGER tmp;
TRACE("(%p, %s, %d %p)\n", This,
wine_dbgstr_longlong(dlibMove.QuadPart), dwOrigin, plibNewPosition);
TRACE("(%p)\n",This); if (dwOrigin == STREAM_SEEK_SET)
tmp = dlibMove;
else if (dwOrigin == STREAM_SEEK_CUR)
tmp.QuadPart = This->dwPos + dlibMove.QuadPart;
else if (dwOrigin == STREAM_SEEK_END)
tmp.QuadPart = This->dwLength + dlibMove.QuadPart;
else
return STG_E_INVALIDPARAMETER;
if (tmp.QuadPart < 0)
return STG_E_INVALIDFUNCTION;
/* we cut off the high part here */
This->dwPos = tmp.LowPart;
if (plibNewPosition) if (plibNewPosition)
plibNewPosition->QuadPart = 0; plibNewPosition->QuadPart = This->dwPos;
return E_NOTIMPL; return S_OK;
} }
/************************************************************************** /**************************************************************************
@ -173,9 +205,21 @@ static HRESULT WINAPI IStream_fnSeek (IStream * iface, LARGE_INTEGER dlibMove, D
static HRESULT WINAPI IStream_fnSetSize (IStream * iface, ULARGE_INTEGER libNewSize) static HRESULT WINAPI IStream_fnSetSize (IStream * iface, ULARGE_INTEGER libNewSize)
{ {
ISHRegStream *This = (ISHRegStream *)iface; ISHRegStream *This = (ISHRegStream *)iface;
DWORD newLen;
LPBYTE newBuf;
TRACE("(%p)\n",This); TRACE("(%p, %s)\n", This, wine_dbgstr_longlong(libNewSize.QuadPart));
return E_NOTIMPL;
/* we cut off the high part here */
newLen = libNewSize.LowPart;
newBuf = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->pbBuffer, newLen);
if (!newBuf)
return STG_E_INSUFFICIENTMEMORY;
This->pbBuffer = newBuf;
This->dwLength = newLen;
return S_OK;
} }
/************************************************************************** /**************************************************************************