USING: accessors alien.c-types classes.struct combinators continuations io kernel libc literals locals sequences specialized-arrays windows.com memoize windows.com.wrapper windows.kernel32 windows.ole32 windows.types ; IN: windows.streams SPECIALIZED-ARRAY: uchar buf buf length :> bytes pv buf bytes memcpy out-read [ bytes out-read 0 ULONG set-alien-value ] when cb bytes = [ S_OK ] [ S_FALSE ] if ] with-hresult ; inline :: IStream-write ( stream pv cb out-written -- hresult ) [ pv cb stream stream-write out-written [ cb out-written 0 ULONG set-alien-value ] when S_OK ] with-hresult ; inline : origin>seek-type ( origin -- seek-type ) { { $ STREAM_SEEK_SET [ seek-absolute ] } { $ STREAM_SEEK_CUR [ seek-relative ] } { $ STREAM_SEEK_END [ seek-end ] } } case ; :: IStream-seek ( stream move origin new-position -- hresult ) [ move origin origin>seek-type stream stream-seek new-position [ stream stream-tell new-position 0 ULARGE_INTEGER set-alien-value ] when S_OK ] with-hresult ; inline :: IStream-set-size ( stream new-size -- hresult ) STG_E_INVALIDFUNCTION ; :: IStream-copy-to ( stream other-stream cb out-read out-written -- hresult ) [ cb stream stream-read :> buf buf length :> bytes out-read [ bytes out-read 0 ULONG set-alien-value ] when other-stream buf bytes out-written IStream::Write ] with-hresult ; inline :: IStream-commit ( stream flags -- hresult ) stream stream-flush S_OK ; :: IStream-revert ( stream -- hresult ) STG_E_INVALIDFUNCTION ; :: IStream-lock-region ( stream offset cb lock-type -- hresult ) STG_E_INVALIDFUNCTION ; :: IStream-unlock-region ( stream offset cb lock-type -- hresult ) STG_E_INVALIDFUNCTION ; :: stream-size ( stream -- size ) stream stream-tell :> old-pos 0 seek-end stream stream-seek stream stream-tell :> size old-pos seek-absolute stream stream-seek size ; :: IStream-stat ( stream out-stat stat-flag -- hresult ) [ out-stat f >>pwcsName STGTY_STREAM >>type stream stream-size >>cbSize FILETIME >>mtime FILETIME >>ctime FILETIME >>atime STGM_READWRITE >>grfMode 0 >>grfLocksSupported GUID_NULL >>clsid 0 >>grfStateBits 0 >>reserved drop S_OK ] with-hresult ; :: IStream-clone ( out-clone-stream -- hresult ) f out-clone-stream 0 void* set-alien-value STG_E_INVALIDFUNCTION ; CONSTANT: stream-wrapper $[ { { IStream { [ IStream-read ] [ IStream-write ] [ IStream-seek ] [ IStream-set-size ] [ IStream-copy-to ] [ IStream-commit ] [ IStream-revert ] [ IStream-lock-region ] [ IStream-unlock-region ] [ IStream-stat ] [ IStream-clone ] } } } ] PRIVATE> : stream>IStream ( stream -- IStream ) stream-wrapper com-wrap ;