windows-nt/Source/XPSP1/NT/inetsrv/query/qutil/querylib/fmapio.cxx

222 lines
5.9 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+---------------------------------------------------------------------------
//
// Copyright (C) 1996, Microsoft Corporation.
//
// File: fmapio.cxx
//
// Contents: A class to read lines from a unicode or an ascii file.
//
// History: 96/Jan/3 DwightKr Created
// Aug 20 1996 SrikantS Moved from web
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
//+---------------------------------------------------------------------------
//
// Member: CFileMapView::CFileMapView - public
//
// Synopsis: Maps a file in its entirety
//
// Arguments: [wcsFileName] - full path of file to map
//
// History: 96/Jan/03 DwightKr created
//
//----------------------------------------------------------------------------
CFileMapView::CFileMapView( WCHAR const * wcsFileName ) :
_hFile(INVALID_HANDLE_VALUE),
_hMap(0),
_pbBuffer(0),
_cbBuffer(0),
_IsUnicode(FALSE)
{
//
// Open the file
//
_hFile = CreateFile( wcsFileName,
GENERIC_READ,
FILE_SHARE_READ,
0,
OPEN_EXISTING,
0,
0 );
if ( INVALID_HANDLE_VALUE == _hFile )
{
qutilDebugOut(( DEB_IWARN, "Unable to open %ws for mapping\n", wcsFileName ));
THROW( CException() );
}
_cbBuffer = GetFileSize( _hFile, 0 );
END_CONSTRUCTION(CFileMapView);
}
//+---------------------------------------------------------------------------
//
// Member: CFileMapView::~CFileMapView - public
//
// Synopsis: Release handles & unmap file
//
// History: 96/Jan/03 DwightKr created
//
//----------------------------------------------------------------------------
CFileMapView::~CFileMapView()
{
if ( 0 != _pbBuffer )
{
UnmapViewOfFile( _pbBuffer );
}
if ( 0 != _hMap )
{
CloseHandle( _hMap );
}
if ( INVALID_HANDLE_VALUE != _hFile )
{
CloseHandle( _hFile );
}
}
//+---------------------------------------------------------------------------
//
// Member: CFileMapView::Init - public
//
// Synopsis: Maps the file
//
// History: 96/Jan/03 DwightKr created
//
//----------------------------------------------------------------------------
void CFileMapView::Init()
{
//
// Create a map of the file
//
_hMap = CreateFileMapping( _hFile,
0,
PAGE_READONLY,
0,
_cbBuffer,
0 );
if ( 0 == _hMap )
{
qutilDebugOut(( DEB_IWARN, "CreateFileMapping failed\n" ));
THROW( CException() );
}
_pbBuffer = (BYTE *) MapViewOfFile( _hMap,
FILE_MAP_READ,
0,
0,
_cbBuffer );
if ( 0 == _pbBuffer )
{
qutilDebugOut(( DEB_IWARN, "MapViewOfFile failed\n" ));
THROW( CException() );
}
_IsUnicode = (GetBufferSize() > 3) && // At least one unicode character
(_pbBuffer[0] == 0xFF) && // Begins with OxFF 0xFE
(_pbBuffer[1] == 0xFE) &&
((GetBufferSize() & 1) == 0); // Must be an even # of bytes
}
//+---------------------------------------------------------------------------
//
// Member: CFileBuffer::CFileBuffer - public
//
// Synopsis: Constructor
//
// Arguments: [fileMap] - a mapped file
//
// History: 96/May/06 DwightKr created
//
//----------------------------------------------------------------------------
CFileBuffer::CFileBuffer( CFileMapView & fileMap,
UINT codePage )
{
//
// We need to return unicode data from methods of this class. If the file
// contains ASCII data, convert it to unicode here.
//
if ( !fileMap.IsUnicode() )
{
_cwcFileBuffer = MultiByteToXArrayWideChar( fileMap.GetBuffer(),
fileMap.GetBufferSize(),
codePage,
_pwBuffer );
_wcsNextLine = _pwBuffer.Get();
}
else
{
//
// We have a unicode file. Skip past the leading 0xFF - 0xFE bytes
//
_wcsNextLine = (WCHAR *) (fileMap.GetBuffer() + 2);
_cwcFileBuffer = (fileMap.GetBufferSize() - 2) / sizeof(WCHAR);
}
END_CONSTRUCTION(CFileBuffer);
}
//+---------------------------------------------------------------------------
//
// Member: CFileBuffer::fgetsw - public
//
// Synopsis: Gets the next line from the file
//
// Arguments: [wcsLine] - buffer to return next line into
// [cwcLine] - size of the buffer in characters
//
// History: 96/May/06 DwightKr created
//
//----------------------------------------------------------------------------
ULONG CFileBuffer::fgetsw( XGrowable<WCHAR> & xLine )
{
ULONG cwcCopied = 0;
//
// Copy characters upto either cwcLine, a CR, or the end of
// the string.
//
while ( (_cwcFileBuffer > 0) )
{
xLine.SetSize( cwcCopied + 1 );
xLine[ cwcCopied] = *_wcsNextLine;
cwcCopied++;
_wcsNextLine++;
_cwcFileBuffer--;
//
// If we just copied over a CR, then break out of the
// loop; we've found the end of a line.
//
if ( L'\n' == xLine[ cwcCopied - 1] )
{
break;
}
}
xLine.SetSize( cwcCopied + 1 );
xLine[ cwcCopied ] = 0; // Null terminate
return cwcCopied;
}