StreamConnector
The StreamConnector class comes with ADE in the examples folder. It wraps the IStream
class used by COM,
allowing convenient use of CAObject::PictureToStream and CATable::GraphToStream from a .NET program.
' StreamConnector.vb ' ' (c) 2003-2015 Lumina Decision Systems, Inc. All rights reserved. ' ' The System.IO.Stream class in .NET is not compatible with the IStream ' class used by COM. This class adds a wrapper around an existing IO.Stream ' to implement the IStream interface. The resulting class is both an ' IStream and a Stream. The underlying stream does not have to be ' inheritable. Imports System.Collections.Generic Imports System.Runtime.InteropServices Imports System.Runtime.InteropServices.ComTypes Imports System.IO Public Class StreamConnector Inherits Stream Implements IStream Sub New(ByVal stream As Stream) m_stream = stream End Sub ' ========================================================================================== ' First we replicate the System.IO.Stream interface: Public Overrides Sub Close() m_stream.Close() End Sub Public Overloads Sub Dispose() m_stream.Dispose() End Sub 'Protected Overrides Sub Dispose(ByVal disposing As Boolean) ' m_stream.Dispose(disposing) 'End Sub Public Overrides Sub EndWrite(ByVal asyncResult As System.IAsyncResult) m_stream.EndWrite(asyncResult) End Sub Public Overrides Sub Flush() m_stream.Flush() End Sub Public Overrides Sub SetLength(ByVal value As Long) m_stream.SetLength(value) End Sub Public Overrides Sub Write(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer) m_stream.Write(buffer, offset, count) End Sub Public Overrides Sub WriteByte(ByVal value As Byte) m_stream.WriteByte(value) End Sub Public Overrides Function BeginRead(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer, ByVal callback As System.AsyncCallback, ByVal state As Object) As System.IAsyncResult BeginRead = m_stream.BeginRead(buffer, offset, count, callback, state) End Function Public Overrides Function BeginWrite(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer, ByVal callback As System.AsyncCallback, ByVal state As Object) As System.IAsyncResult BeginWrite = m_stream.BeginWrite(buffer, offset, count, callback, state) End Function Public Overrides Function EndRead(ByVal asyncResult As System.IAsyncResult) As Integer EndRead = m_stream.EndRead(asyncResult) End Function Public Overrides Function Read(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer) As Integer Read = m_stream.Read(buffer, offset, count) End Function Public Overrides Function ReadByte() As Integer ReadByte = m_stream.ReadByte() End Function Public Overrides Function Seek(ByVal offset As Long, ByVal origin As System.IO.SeekOrigin) As Long Seek = m_stream.Seek(offset, origin) End Function Public Overrides ReadOnly Property CanRead() As Boolean Get CanRead = m_stream.CanRead End Get End Property Public Overrides ReadOnly Property CanSeek() As Boolean Get CanSeek = m_stream.CanSeek End Get End Property Public Overrides ReadOnly Property CanTimeout() As Boolean Get CanTimeout = m_stream.CanTimeout End Get End Property Public Overrides ReadOnly Property CanWrite() As Boolean Get CanWrite = m_stream.CanWrite End Get End Property Public Overrides ReadOnly Property Length() As Long Get Length = m_stream.Length End Get End Property Public Overrides Property Position() As Long Get Position = m_stream.Position End Get Set(ByVal value As Long) m_stream.Position = value End Set End Property Public Overrides Property ReadTimeout() As Integer Get ReadTimeout = m_stream.ReadTimeout End Get Set(ByVal value As Integer) m_stream.ReadTimeout = value End Set End Property Public Overrides Property WriteTimeout() As Integer Get WriteTimeout = m_stream.WriteTimeout End Get Set(ByVal value As Integer) m_stream.WriteTimeout = value End Set End Property ' ========================================================================================== ' And implement the IStream interface: Sub Clone(ByRef ppstm As IStream) Implements IStream.Clone ppstm = New StreamConnector(m_stream) End Sub Sub Commit(ByVal flags As Integer) Implements IStream.Commit End Sub Overloads Sub CopyTo(ByVal dst As IStream, ByVal cb As Long, ByVal pcbRead As System.IntPtr, ByVal pcbWritten As System.IntPtr) Implements IStream.CopyTo Dim bytes(cb) As Byte Dim n As Integer = m_stream.Read(bytes, 0, cb) System.Runtime.InteropServices.Marshal.WriteInt32(pcbWritten, n) dst.Write(bytes, n, pcbWritten) End Sub Sub LockRegion(ByVal libOffset As Long, ByVal cb As Long, ByVal dwLockType As Integer) Implements IStream.LockRegion End Sub Sub IStreamRead(ByVal pv() As Byte, ByVal cb As Integer, ByVal pcbRead As System.IntPtr) Implements IStream.Read Marshal.WriteInt32(pcbRead, m_stream.Read(pv, 0, cb)) End Sub Sub Revert() Implements IStream.Revert End Sub Sub IStreamSeek(ByVal dlibMove As Long, ByVal dwOrigin As Integer, ByVal plibNewPosition As System.IntPtr) Implements IStream.Seek Dim so As SeekOrigin = SeekOrigin.Begin Select Case dwOrigin Case 1 so = SeekOrigin.Current Case 2 so = SeekOrigin.End End Select Marshal.WriteInt32(plibNewPosition, m_stream.Seek(dlibMove, so)) End Sub Sub SetSize(ByVal libNewSize As Long) Implements IStream.SetSize m_stream.SetLength(libNewSize) End Sub Sub Stat(ByRef pstatstg As System.Runtime.InteropServices.ComTypes.STATSTG, ByVal grfStatFlag As Integer) Implements IStream.Stat pstatstg = New ComTypes.STATSTG End Sub Sub UnlockRegion(ByVal libOffset As Long, ByVal cb As Long, ByVal dwLockType As Integer) Implements IStream.UnlockRegion End Sub Sub IStreamWrite(ByVal pv() As Byte, ByVal cb As Integer, ByVal pcbWritten As System.IntPtr) Implements IStream.Write If cb < pv.Length Then cb = pv.Length m_stream.Write(pv, 0, cb) Marshal.WriteInt32(pcbWritten, cb) End Sub Private m_stream As Stream End Class
See Also
Comments
Enable comment auto-refresher