windows-nt/Source/XPSP1/NT/enduser/troubleshoot/msinfo/fileio.cpp

491 lines
11 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
// FileIO.cpp Implementation of MSInfoFile classes.
//
// Copyright (c) 1998-1999 Microsoft Corporation
#include "FileIO.h"
#include "DataSrc.h"
#include "Resource.h"
CFileFormatException CMSInfoFile::xptFileFormat;
const unsigned CMSInfoFile::DefaultReadBufferSize = 512; // 256;
/*
* CMSInfoFile - Construct an MSInfoFile, setting the CFile to the pointer passed
*
* History: a-jsari 10/20/97 Initial version
*/
CMSInfoFile::CMSInfoFile(CFile *pFile)
{
if (pFile != NULL)
m_pFile = pFile;
}
/*
* CMSInfoFile - Construct an MSInfoFile, opening the CFile
*
* History: a-jsari 11/13/97 Initial version
*/
CMSInfoFile::CMSInfoFile(LPCTSTR szFileName, UINT nFlags)
:m_strFileName(szFileName)
{
m_pFile = new CFile(szFileName, nFlags);
if (m_pFile == NULL) ::AfxThrowMemoryException();
}
/*
* ~CMSInfoFile - Destroy an MSInfoFile, closing the CFile pointer
*
* History: a-jsari 10/20/97 Initial version
*/
CMSInfoFile::~CMSInfoFile()
{
if (m_pFile)
{
m_pFile->Close();
delete m_pFile;
}
}
/*
* ReadUnsignedInt - Read an int from a file with the same byte-order
* as our current implementation.
*
* History: a-jsari 10/21/97 Initial version
*/
void CMSInfoFile::ReadUnsignedInt(unsigned &uValue)
{
ReadUnsignedFromCFile(m_pFile, uValue);
}
/*
* ReadUnsignedLong - Read a long from a file with the same byte-order
* as our current implementation.
*
* History: a-jsari 12/1/97 Initial version
*/
void CMSInfoFile::ReadUnsignedLong(unsigned long &dwValue)
{
long lValue;
ReadLongFromCFile(m_pFile, lValue);
::memcpy(&dwValue, &lValue, sizeof(unsigned long));
}
/*
* ReadLong - Read a long from a file written with our current byte-order
*
* History: a-jsari 10/21/97 Initial version
*/
void CMSInfoFile::ReadLong(long &lValue)
{
ReadLongFromCFile(m_pFile, lValue);
}
/*
* ReadSignedInt - Read a signed integer value.
*
* History: a-jsari 10/20/97 Initial version
*/
void CMSInfoFile::ReadSignedInt(int &wValue)
{
unsigned uValue;
ReadUnsignedInt(uValue);
::memcpy(&wValue, &uValue, sizeof(int));
}
/*
* ReadTchar - Read a tchar.
*
* History: a-jsari 12/26/97 Initial version.
*/
void CMSInfoFile::ReadTchar(TCHAR &tcValue)
{
ReadTcharFromCFile(m_pFile, tcValue);
}
/*
* ReadString - Read a string.
*
* History: a-jsari 10/20/97 Initial version.
*/
void CMSInfoFile::ReadString(CString &szString)
{
unsigned wStringLength;
WCHAR szBuffer[DefaultReadBufferSize]; // Maximum string length = sizeof(szBuffer)
LPWSTR pszBuffer = szBuffer;
ASSERT(m_pFile);
ReadUnsignedInt(wStringLength);
if (wStringLength > sizeof(szBuffer))
ThrowFileFormatException();
szBuffer[wStringLength] = (WCHAR)'\0';
wStringLength *= sizeof(WCHAR);
if (m_pFile->Read(reinterpret_cast<void *>(pszBuffer), wStringLength) != wStringLength)
ThrowFileFormatException();
szString = pszBuffer;
}
/*
* WriteHeader - Write the header for the current version (currently
* Version 5.00).
*
* History: a-jsari 10/31/97 Initial version
*/
void CMSInfoFile::WriteHeader(CDataSource *)
{
time_t tNow;
WriteUnsignedInt(VERSION_500_MAGIC_NUMBER); // File magic number.
WriteUnsignedInt(0x500); // Version number
time(&tNow);
WriteLong((LONG)tNow); // Current time.
#ifdef _WIN64
WriteLong((LONG) (tNow>>32));
#endif
WriteString(""); // Network machine
WriteString(""); // Network user name.
}
/*
* WriteChildMark - Write the special integer which specifies that the
* following folder will be the child of the previous folder.
*
* History: a-jsari 11/5/97 Initial version.
*/
void CMSInfoFile::WriteChildMark()
{
WriteUnsignedInt(CBufferV500DataSource::CHILD);
}
/*
* WriteEndMark - Write the special integer which specifies that the
* end of data has been reached.
*
* History: a-jsari 11/5/97 Initial version.
*/
void CMSInfoFile::WriteEndMark()
{
WriteUnsignedInt(CBufferV500DataSource::END);
}
/*
* WriteNextMark - Write the special integer which specifies that the
* following folder will be the next folder in the list.
*
* History: a-jsari 11/5/97 Initial version.
*/
void CMSInfoFile::WriteNextMark()
{
WriteUnsignedInt(CBufferV500DataSource::NEXT);
}
/*
* WriteParentMark - Write the special mark specifying a parent node, with
* the number of times the reading function should go up.
*
* History: a-jsari 11/5/97 Initial version.
*/
void CMSInfoFile::WriteParentMark(unsigned cIterations)
{
WriteUnsignedInt(CBufferV500DataSource::PARENT | cIterations);
}
/*
* WriteByte - Write a byte to our internal file.
*
* History: a-jsari 10/22/97 Initial version
*/
void CMSInfoFile::WriteByte(BYTE bValue)
{
m_pFile->Write(reinterpret_cast<void *>(&bValue), sizeof(bValue));
}
/*
* WriteString - Write szValue as a string of wide characters, prefixed by
* the string length.
*
* History: a-jsari 10/22/97 Initial version
*/
void CMSInfoFile::WriteString(CString szValue)
{
LPWSTR pszString;
USES_CONVERSION;
WriteUnsignedInt(szValue.GetLength());
pszString = T2W(const_cast<LPTSTR>((LPCTSTR)szValue));
m_pFile->Write(reinterpret_cast<void *>(pszString),
szValue.GetLength() * sizeof(WCHAR));
}
/*
* WriteLong - Write a long value to our internal file.
*
* History: a-jsari 10/22/97 Initial version
*/
void CMSInfoFile::WriteLong(long lValue)
{
m_pFile->Write(reinterpret_cast<void *>(&lValue), sizeof(lValue));
}
/*
* WriteUnsignedInt - Write an unsigned integer value to our internal file.
*
* History: a-jsari 10/22/97 Initial version
*/
void CMSInfoFile::WriteUnsignedInt(unsigned uValue)
{
m_pFile->Write(reinterpret_cast<void *>(&uValue), sizeof(uValue));
}
/*
* WriteUnsignedLong - Write an unsigned long value to our internal file.
*
* History: a-jsari 12/1/97 Initial version
*/
void CMSInfoFile::WriteUnsignedLong(unsigned long dwValue)
{
long lValue;
::memcpy(&lValue, &dwValue, sizeof(dwValue));
WriteLong(lValue);
}
/*
* ReadTcharFromCFile - Read a TCHAR value from the file specified.
*
* History: a-jsari 12/26/97 Initial version
*/
void CMSInfoFile::ReadTcharFromCFile(CFile *pFile, TCHAR &tcValue)
{
ASSERT(pFile != NULL);
if (pFile->Read(reinterpret_cast<void *>(&tcValue), sizeof(tcValue)) != sizeof(tcValue))
ThrowFileFormatException();
}
/*
* ReadUnsignedFromCFile - Read an unsigned value from the file specified.
*
* History: a-jsari 10/20/97 Initial version
*/
void CMSInfoFile::ReadUnsignedFromCFile(CFile *pFile, unsigned &uValue)
{
ASSERT(pFile);
if (pFile->Read(reinterpret_cast<void *>(&uValue), sizeof(uValue)) != sizeof(uValue))
ThrowFileFormatException();
}
/*
* ReadLongFromCFile - Read a long from the file specified.
*
* History: a-jsari 10/20/97 Initial version.
*/
void CMSInfoFile::ReadLongFromCFile(CFile *pFile, long &lValue)
{
ASSERT(pFile);
if (pFile->Read(reinterpret_cast<void *>(&lValue), sizeof(lValue)) != sizeof(lValue))
ThrowFileFormatException();
}
/*
* CMSInfoTextFile - Constructor
*
* History: a-jsari 11/13/97 Initial version
*/
CMSInfoTextFile::CMSInfoTextFile(LPCTSTR szFileName, UINT nFlags)
{
try
{
m_pFile = new CFile(szFileName, nFlags);
}
catch (CFileException * e)
{
e->ReportError();
throw;
}
}
/*
* CMSInfoTextFile - Constructor
*
* History: a-jsari 12/26/97 Initial version
*/
CMSInfoTextFile::CMSInfoTextFile(CFile *pFile)
:CMSInfoFile(pFile)
{
}
/*
* WriteHeader - Write the special header for the text file.
*
* History: a-jsari 10/31/97 Initial version
*/
void CMSInfoTextFile::WriteHeader(CDataSource *pSource)
{
AFX_MANAGE_STATE(::AfxGetStaticModuleState());
// mark file as unicode
WCHAR wHeader = 0xFEFF;
m_pFile->Write( &wHeader, 2);
// FIX: Make this point to the right time.
CTime tNow = CTime::GetCurrentTime();
CString strTimeFormat;
strTimeFormat.LoadString(IDS_TIME_FORMAT);
CString strHeaderText = tNow.Format(strTimeFormat);
WriteString(strHeaderText);
WriteString(pSource->MachineName());
}
/*
* WriteTitle - Write the title of a folder.
*
* History: a-jsari 11/5/97 Initial version
*/
void CMSInfoTextFile::WriteTitle(CString szName)
{
CString szWriteString = _T("[");
szWriteString += szName + _T("]\n\n");
WriteString(szWriteString);
}
/*
* WriteLong - Write a long value in the text file.
*
* History: a-jsari 10/23/97 Initial version
*/
void CMSInfoTextFile::WriteLong(long lValue)
{
CString szTextValue;
szTextValue.Format(_T("%ld"), lValue);
WriteString(szTextValue);
}
/*
* WriteUnsignedInt - Write an unsigned value in the text file.
*
* History: a-jsari 10/23/97 Initial version
*/
void CMSInfoTextFile::WriteUnsignedInt(unsigned uValue)
{
CString szTextValue;
szTextValue.Format(_T("%ud"), uValue);
WriteString(szTextValue);
}
/*
* WriteString - Write a string to a text file.
*
* History: a-jsari 10/23/97 Initial version
*/
void CMSInfoTextFile::WriteString(CString szValue)
{
if (szValue.GetLength() == 0)
return;
dynamic_cast<CFile *>(m_pFile)->Write((LPCTSTR)szValue, szValue.GetLength() * sizeof(TCHAR));
}
/*
* WriteString - Write a string to a memory file.
*
* History: a-jsari 1/5/98 Initial version
*/
void CMSInfoMemoryFile::WriteString(CString szValue)
{
if (szValue.GetLength() == 0)
return;
m_pFile->Write((LPCTSTR)szValue, szValue.GetLength() * sizeof(TCHAR));
}
#if 0
/*
* ReadUnsignedInt -
*
* History: a-jsari 10/21/97 Initial version
*/
void CMSInfoReverseEndianFile::ReadUnsignedInt(unsigned &uValue)
{
CMSInfoReverseEndianFile::ReadUnsignedFromCFile(m_pFile, uValue);
}
/*
* ReadLong -
*
* History: a-jsari 10/21/97 Initial version
*/
void CMSInfoReverseEndianFile::ReadLong(long &lValue)
{
CMSInfoReverseEndianFile::ReadLongFromCFile(m_pFile, lValue);
}
/*
* ReadString -
*
* History: a-jsari 10/21/97 Initial version
*/
void CMSInfoReverseEndianFile::ReadString(CString &szValue)
{
unsigned uStringLength;
WCHAR szBuffer[DefaultReadBufferSize];
LPWSTR pszBuffer = szBuffer;
ReadUnsignedInt(uStringLength);
for (unsigned i = uStringLength ; i > 0 ; --i) {
szBuffer[i] = 0;
for (unsigned j = sizeof(WCHAR) ; j > 0 ; --j) {
BYTE bRead;
ReadByte(bRead);
szBuffer[i] >>= 8;
szBuffer[i] |= bRead;
}
}
}
/*
* ReadIntegerFromCFile - Template class to read an arbitrarily sized int
* from a CFile pointer.
*
* History: a-jsari 10/21/97 Initial version
*/
template <class T> void ReadIntegerFromCFile(CFile *pFile, T &tValue)
{
union ReverseBuffer { BYTE bytes[sizeof(T)]; T tVal; };
union ReverseBuffer rbReverse;
union ReverseBuffer rbSwap;
if (pFile->Read(reinterpret_cast<void *>(&tValue), sizeof(T)) != sizeof(T))
ThrowFileFormatException();
unsigned j = 0;
for (unsigned i = sizeof(union ReverseBuffer) ; i > 0 ; --i, ++j) {
rbSwap.bytes[i] = rbReverse.bytes[j];
}
tValue = rbReverse.tVal;
}
/*
* ReadUnsignedFromCFile -
*
* History: a-jsari 10/21/97 Initial version
*/
void CMSInfoReverseEndianFile::ReadUnsignedFromCFile(CFile *pFile, unsigned &uValue)
{
ReadIntegerFromCFile<unsigned>(pFile, uValue);
}
/*
* ReadLongFromCFile -
*
* History: a-jsari 10/21/97 Initial version
*/
void CMSInfoReverseEndianFile::ReadLongFromCFile(CFile *pFile, long &lValue)
{
ReadIntegerFromCFile<long>(pFile, lValue);
}
#endif