public int Commit(IStreamImpl *pinst, uint grfCommitFlags) { var stm = (Stream)GCHandle.FromIntPtr(pinst->source).Target !; stm.Flush(); return(S_OK); }
public int SetSize(IStreamImpl *pinst, ULARGE_INTEGER libNewSize) { var stm = (Stream)GCHandle.FromIntPtr(pinst->source).Target !; stm.SetLength((long)libNewSize.QuadPart + pinst->offset); return(S_OK); }
public int Read(IStreamImpl *pinst, void *pv, uint cb, uint *pcbRead) { var stm = (Stream)GCHandle.FromIntPtr(pinst->source).Target !; *pcbRead = (uint)stm.Read(new Span <byte>(pv, (int)cb)); return(S_OK); }
public int QueryInterface(IStreamImpl *pinst, Guid *riid, void **ppvObject) { var iid = *riid; if (iid == __uuidof <IStream>() || iid == __uuidof <ISequentialStream>() || iid == __uuidof <IUnknown>()) { *ppvObject = pinst; return(S_OK); } return(E_NOINTERFACE); }
public int Stat(IStreamImpl *pinst, STATSTG *pstatstg, uint grfStatFlag) { var stm = (Stream)GCHandle.FromIntPtr(pinst->source).Target !; *pstatstg = new STATSTG { cbSize = new ULARGE_INTEGER { QuadPart = (ulong)(stm.Length - pinst->offset) }, type = (uint)STGTY.STGTY_STREAM }; return(S_OK); }
public int Write(IStreamImpl *pinst, void *pv, uint cb, uint *pcbWritten) { var stm = (Stream)GCHandle.FromIntPtr(pinst->source).Target !; stm.Write(new ReadOnlySpan <byte>(pv, (int)cb)); if (pcbWritten is not null) { *pcbWritten = cb; } return(S_OK); }
public int Seek(IStreamImpl *pinst, LARGE_INTEGER dlibMove, uint dwOrigin, ULARGE_INTEGER *plibNewPosition) { long npos = dlibMove.QuadPart + (dwOrigin == (uint)SeekOrigin.Begin ? pinst->offset : 0); var stm = (Stream)GCHandle.FromIntPtr(pinst->source).Target !; long cpos = stm.Position; if (!(dwOrigin == (uint)SeekOrigin.Current && npos == 0) && !(dwOrigin == (uint)SeekOrigin.Begin && npos == cpos)) { cpos = stm.Seek(npos, (SeekOrigin)dwOrigin); } if (plibNewPosition is not null) { plibNewPosition->QuadPart = (ulong)(cpos - pinst->offset); } return(S_OK); }
public uint Release(IStreamImpl *pinst) => 1;
public uint AddRef(IStreamImpl *pinst) => 1;
public int Clone(IStreamImpl *pinst, IStream **ppstm) => E_NOTIMPL;
public int UnlockRegion(IStreamImpl *pinst, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, uint dwLockType) => E_NOTIMPL;
public int Revert(IStreamImpl *pinst) => E_NOTIMPL;
public int CopyTo(IStreamImpl *pinst, IStream *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten) => E_NOTIMPL;