|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1992.
//
// File: mread.hxx
//
// Contents: Multistream inline functions
//
// Classes: None.
//
// Functions: None
//
//--------------------------------------------------------------------------
#ifndef __MREAD_HXX__
#define __MREAD_HXX__
#include "h/difat.hxx"
#include "h/sstream.hxx"
//+-------------------------------------------------------------------------
//
// Function: ConvertSectAndOffset
//
// Synopsis: Convert a sector and offset into a byte offset in
// a stream.
//
// Arguments: [sect] -- Sector
// [off] -- Offset
// [uShift] -- Shift count for sectorsize
//
// Returns: Byte offset into stream.
//
// Algorithm: The byte offset is sect left-shifted uShift times,
// plus the offset, plus SECTORSIZE bytes for the
// header.
//
//--------------------------------------------------------------------------
inline ULONGLONG ConvertSectOffset(SECT sect, OFFSET off, USHORT uShift) { ULONGLONG ulTemp = ((ULONGLONG)(sect+1) << uShift) + off; msfDebugOut((DEB_ITRACE,"Convert got %lu\n",ulTemp)); return ulTemp; }
//+-------------------------------------------------------------------------
//
// Method: CMStream::GetStart, private
//
// Synopsis: Given an SID, return the starting sector
//
// Arguments: [sid] -- Sid to find start for
//
// Returns: Starting sector for given SID.
//
// Notes: This function only works for controls structures,
// not for ordinary streams.
//
//--------------------------------------------------------------------------
inline SECT CMStream::GetStart(SID sid) const { SECT sectRet; msfAssert(sid > MAXREGSID);
if (SIDFAT == sid) { sectRet = _hdr.GetFatStart(); } else if (SIDDIR == sid) { sectRet = _hdr.GetDirStart(); } else if (SIDDIF == sid) { sectRet = _hdr.GetDifStart(); } else { msfAssert(SIDMINIFAT == sid); sectRet = _hdr.GetMiniFatStart(); } return sectRet; }
//+---------------------------------------------------------------------------
//
// Member: CMStream::GetSect, private
//
// Synopsis: For a given SID and sect, return the location of that
// sector in the multistream.
//
// Arguments: [sid] -- SID of sector to locate
// [sect] -- Offset into chain to locate
// [psect] -- Pointer to return location.
//
// Returns: Appropriate status code
//
// Modifies:
//
// Notes:
//
//----------------------------------------------------------------------------
inline SCODE CMStream::GetSect(SID sid, SECT sect, SECT *psect) { SCODE sc; SECT start; if (sid == SIDFAT) { msfChk(_fatDif.GetFatSect(sect, &start)); } else if (sid == SIDDIF) { msfChk(_fatDif.GetSect(sect, &start)); } else { start = GetStart(sid); msfChk(_fat.GetSect(start, sect, &start)); }
*psect = start; Err: return sc; }
//+-------------------------------------------------------------------------
//
// Member: CMStream::SetSize, public
//
// Synposis: Sets the size of the parent LStream to match
// current Fat information.
//
// Arguments: None.
//
// Returns: Error code from call to parent LStream SetSize()
//
// Algorithm: Query the Fat for the last sector used.
// Convert that sector into a byte offset.
// Call SetSize on the parent LStream.
//
//---------------------------------------------------------------------------
inline SCODE CMStream::SetSize(VOID) { SCODE sc = S_OK; ULONGLONG ulSize; ULARGE_INTEGER cbSize;
msfDebugOut((DEB_TRACE,"In CMStream::SetSize()\n"));
SECT sectMax; msfChk(_fat.GetMaxSect(§Max)); ulSize = ConvertSectOffset(sectMax, 0, GetSectorShift());
cbSize.QuadPart = ulSize; msfHChk((*_pplstParent)->SetSize(cbSize));
msfDebugOut((DEB_ITRACE,"Exiting CMStream::SetSize()\n"));
Err: return sc; }
//+-------------------------------------------------------------------------
//
// Member: CMStream::SetMiniSize, public
//
// Synposis: Sets the size of the MiniFat storage stream to match
// current Fat information.
//
// Arguments: None.
//
// Returns: Error code from call to stream SetSize()
//
// Algorithm: Query the Fat for the last sector used.
// Convert that sector into a byte offset.
// Call SetSize on the Minifat storage stream.
//
//---------------------------------------------------------------------------
inline SCODE CMStream::SetMiniSize(VOID) { SCODE sc; ULONG ulNewSize;
SECT sectMax; msfChk(_fatMini.GetMaxSect(§Max)); ulNewSize = sectMax << MINISECTORSHIFT; msfChk(_pdsministream->CDirectStream::SetSize(ulNewSize));
Err: return sc; }
#endif //__MREAD_HXX__
|