//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997 - 1998 // // File: mmistrm.hxx // // Contents: Memory Mapped IStream // // Classes: CMmIStream // // History: 11-Feb-97 KyleP Created // //---------------------------------------------------------------------------- #include #pragma hdrstop #include 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 ) ); }