[PATCH 4/5] windowscodecs: Support Seek for memory streams in IWICStream

Tony Wasserka tony.wasserka at freenet.de
Fri Aug 21 04:11:39 CDT 2009


---
 dlls/windowscodecs/stream.c |   19 +++++++++++++++++--
 1 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/dlls/windowscodecs/stream.c b/dlls/windowscodecs/stream.c
index 7846a2a..1989f81 100644
--- a/dlls/windowscodecs/stream.c
+++ b/dlls/windowscodecs/stream.c
@@ -128,8 +128,23 @@ static HRESULT WINAPI StreamOnMemory_Write(IStream *iface,
 static HRESULT WINAPI StreamOnMemory_Seek(IStream *iface,
     LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
 {
-    FIXME("(%p): stub\n", iface);
-    return E_NOTIMPL;
+    StreamOnMemory *This = (StreamOnMemory*)iface;
+    LARGE_INTEGER NewPosition;
+    TRACE("(%p)\n", This);
+
+    if (dlibMove.QuadPart > 0xFFFFFFFF) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
+
+    if (dwOrigin == STREAM_SEEK_SET) NewPosition.QuadPart = dlibMove.QuadPart;
+    else if (dwOrigin == STREAM_SEEK_CUR) NewPosition.QuadPart = This->dwCurPos + dlibMove.QuadPart;
+    else if (dwOrigin == STREAM_SEEK_END) NewPosition.QuadPart = This->dwMemsize + dlibMove.QuadPart;
+    else return E_INVALIDARG;
+
+    if (NewPosition.QuadPart > This->dwMemsize) return E_INVALIDARG;
+    if (NewPosition.QuadPart < 0) return E_INVALIDARG;
+    This->dwCurPos = NewPosition.LowPart;
+
+    if(plibNewPosition) plibNewPosition->QuadPart = This->dwCurPos;
+    return S_OK;
 }
 
 /* SetSize isn't implemented in the native windowscodecs DLL either */
-- 
1.6.3.3


--------------010403000508060104030805--



More information about the wine-patches mailing list