267 lines
6.1 KiB
C++
267 lines
6.1 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1997 - 1998
|
||
|
//
|
||
|
// File: mmistrm.hxx
|
||
|
//
|
||
|
// Contents: Memory Mapped IStream
|
||
|
//
|
||
|
// Classes: CMmIStream
|
||
|
//
|
||
|
// History: 11-Feb-97 KyleP Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#include <pch.cxx>
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include <mmistrm.hxx>
|
||
|
|
||
|
unsigned const cbMaxMappable = 1024 * 1024;
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CMmIStream::CMMIStream, public
|
||
|
//
|
||
|
// Synopsis: Constructor
|
||
|
//
|
||
|
// History: 11-Feb-97 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
CMmIStream::CMmIStream()
|
||
|
: _pStream( 0 ),
|
||
|
_pBuf( 0 )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CMmIStream::~CMMIStream, public
|
||
|
//
|
||
|
// Synopsis: Destructor
|
||
|
//
|
||
|
// History: 11-Feb-97 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
CMmIStream::~CMmIStream()
|
||
|
{
|
||
|
Close();
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CMmIStream::Open, public
|
||
|
//
|
||
|
// Synopsis: Opens a stream
|
||
|
//
|
||
|
// History: 11-Feb-97 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
void CMmIStream::Open( IStream * pStream )
|
||
|
{
|
||
|
Win4Assert( 0 == _pStream );
|
||
|
Win4Assert( 0 == _pBuf );
|
||
|
|
||
|
_pStream = pStream;
|
||
|
_pStream->AddRef();
|
||
|
|
||
|
//
|
||
|
// Get stream stats.
|
||
|
//
|
||
|
|
||
|
SCODE sc = pStream->Stat( &_statstg, STATFLAG_NONAME );
|
||
|
|
||
|
if ( FAILED(sc) )
|
||
|
{
|
||
|
THROW( CException( sc ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CMmIStream::Close, public
|
||
|
//
|
||
|
// Synopsis: Close a stream
|
||
|
//
|
||
|
// History: 11-Feb-97 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
void CMmIStream::Close()
|
||
|
{
|
||
|
if ( 0 != _pStream )
|
||
|
_pStream->Release();
|
||
|
|
||
|
delete [] _pBuf;
|
||
|
|
||
|
_pStream = 0;
|
||
|
_pBuf = 0;
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CMmIStream::MapAll, public
|
||
|
//
|
||
|
// Synopsis: Map all of a stream
|
||
|
//
|
||
|
// Arguments: [sbuf] -- Stream buffer to fill in
|
||
|
//
|
||
|
// History: 11-Feb-97 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
void CMmIStream::MapAll( CMmStreamBuf& sbuf )
|
||
|
{
|
||
|
//
|
||
|
// Only 'map' up to a reasonable size.
|
||
|
//
|
||
|
|
||
|
if ( 0 != SizeHigh() )
|
||
|
THROW( CException( STATUS_SECTION_TOO_BIG ) );
|
||
|
|
||
|
Map( sbuf, SizeLow(), 0, 0 );
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CMmIStream::Map, public
|
||
|
//
|
||
|
// Synopsis: Map part of a stream
|
||
|
//
|
||
|
// Arguments: [sbuf] -- Stream buffer to fill in
|
||
|
// [cb] -- Size to map
|
||
|
// [offLow] -- Offset in stream
|
||
|
// [offHigh] -- Offset in stream
|
||
|
// [fMapForWrite] -- TRUE --> Writeable (invalid option here)
|
||
|
//
|
||
|
// History: 11-Feb-97 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
void CMmIStream::Map ( CMmStreamBuf& sbuf,
|
||
|
ULONG cb,
|
||
|
ULONG offLow,
|
||
|
ULONG offHigh,
|
||
|
BOOL fMapForWrite )
|
||
|
{
|
||
|
//
|
||
|
// Only 'map' up to a reasonable size.
|
||
|
//
|
||
|
|
||
|
if ( cb > cbMaxMappable )
|
||
|
THROW( CException( STATUS_SECTION_TOO_BIG ) );
|
||
|
|
||
|
//
|
||
|
// Now, allocate the memory.
|
||
|
//
|
||
|
|
||
|
Win4Assert( 0 == _pBuf );
|
||
|
_pBuf = new BYTE [ cb ];
|
||
|
|
||
|
//
|
||
|
// Then seek and read.
|
||
|
//
|
||
|
|
||
|
LARGE_INTEGER off = { offLow, offHigh };
|
||
|
|
||
|
SCODE sc = _pStream->Seek( off,
|
||
|
STREAM_SEEK_SET, // From beginning of file
|
||
|
0 ); // Don't return new seek pointer
|
||
|
|
||
|
if ( FAILED(sc) )
|
||
|
{
|
||
|
THROW( CException( sc ) );
|
||
|
}
|
||
|
|
||
|
ULONG cbRead = 0;
|
||
|
|
||
|
sc = _pStream->Read( _pBuf, cb, &cbRead );
|
||
|
|
||
|
if ( FAILED(sc) )
|
||
|
{
|
||
|
THROW( CException( sc ) );
|
||
|
}
|
||
|
|
||
|
if ( cb > cbRead )
|
||
|
{
|
||
|
THROW( CException( E_FAIL ) );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Finally, set up the buffer.
|
||
|
//
|
||
|
|
||
|
sbuf.SetBuf( _pBuf );
|
||
|
sbuf.SetSize ( cbRead );
|
||
|
sbuf.SetStream ( this );
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CMmIStream::Unmap, public
|
||
|
//
|
||
|
// Synopsis: Unmap stream
|
||
|
//
|
||
|
// Arguments: [sbuf] -- Stream buffer to unmap
|
||
|
//
|
||
|
// History: 11-Feb-97 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
void CMmIStream::Unmap ( CMmStreamBuf& sbuf )
|
||
|
{
|
||
|
Win4Assert( sbuf.Get() == _pBuf );
|
||
|
|
||
|
sbuf.SetBuf( 0 );
|
||
|
sbuf.SetSize( 0 );
|
||
|
|
||
|
delete [] _pBuf;
|
||
|
_pBuf = 0;
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CMmIStream::Flush, public
|
||
|
//
|
||
|
// Synopsis: Flush stream
|
||
|
//
|
||
|
// Arguments: [sbuf] -- Stream buffer to flush
|
||
|
// [cb] -- # bytes to flush
|
||
|
//
|
||
|
// History: 11-Feb-97 KyleP Created
|
||
|
//
|
||
|
// Notes: Only r/o streams supported. Flush has no meaning.
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
void CMmIStream::Flush ( CMmStreamBuf& sbuf, ULONG cb, BOOL fThrowOnFailure )
|
||
|
{
|
||
|
Win4Assert( !"Not implemented" );
|
||
|
THROW( CException( E_FAIL ) );
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CMmIStream::FlushMetaData, public
|
||
|
//
|
||
|
// Synopsis: Flush stream
|
||
|
//
|
||
|
// Arguments: [sbuf] -- Stream buffer to flush
|
||
|
// [cb] -- # bytes to flush
|
||
|
//
|
||
|
// History: 11-Feb-97 KyleP Created
|
||
|
//
|
||
|
// Notes: Only r/o streams supported. Flush has no meaning.
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
void CMmIStream::FlushMetaData( BOOL fThrowOnFailure )
|
||
|
{
|
||
|
Win4Assert( !"Not implemented" );
|
||
|
THROW( CException( E_FAIL ) );
|
||
|
}
|