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:
parent
da984870cd
commit
58669ece91
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
|
Loading…
Reference in New Issue