windows-nt/Source/XPSP1/NT/enduser/troubleshoot/tshoot/dscread.cpp
2020-09-26 16:20:57 +08:00

190 lines
4.2 KiB
C++

//
// MODULE: DSCREAD.CPP
//
// PURPOSE: dsc reading classes
//
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 support@saltmine.com
//
// AUTHOR: Oleg Kalosha
//
// ORIGINAL DATE: 8-19-98
//
// NOTES:
//
// Version Date By Comments
//--------------------------------------------------------------------
// V3.0 08-04-98 OK
//
#include "stdafx.h"
#include "dscread.h"
#include "fileread.h"
#include "event.h"
#include "baseexception.h"
#ifdef LOCAL_TROUBLESHOOTER
#include "CHMfileReader.h"
#endif
////////////////////////////////////////////////////////////////////////////////////
// CDSCReaderException
////////////////////////////////////////////////////////////////////////////////////
// source_file is LPCSTR rather than LPCTSTR because __FILE__ is char[35]
CDSCReaderException::CDSCReaderException(CDSCReader* reader, eErr err, LPCSTR source_file, int line)
: CBaseException(source_file, line),
m_pDSCReader(reader),
m_eErr(err)
{
}
CDSCReaderException::~CDSCReaderException()
{
}
void CDSCReaderException::Clear()
{
m_pDSCReader->Clear();
}
////////////////////////////////////////////////////////////////////////////////////
// CDSCReader
// This handles just the reading of BNTS. CBN packages it up for public consumption.
////////////////////////////////////////////////////////////////////////////////////
CDSCReader::CDSCReader(CPhysicalFileReader* pPhysicalFileReader)
: CStateless(),
m_pPhysicalFileReader(pPhysicalFileReader),
m_strPath(pPhysicalFileReader->GetPathName()),
m_strName(pPhysicalFileReader->GetJustName()),
m_bIsRead(false),
m_bDeleteFile(false)
{
// Arbitrary default for m_stimeLastWrite
m_stimeLastWrite.wYear = 0;
m_stimeLastWrite.wMonth = 0;
m_stimeLastWrite.wDayOfWeek =0;
m_stimeLastWrite.wDay = 1;
m_stimeLastWrite.wHour = 0;
m_stimeLastWrite.wMinute = 0;
m_stimeLastWrite.wSecond = 0;
m_stimeLastWrite.wMilliseconds = 0;
}
CDSCReader::~CDSCReader()
{
delete m_pPhysicalFileReader;
}
bool CDSCReader::IsValid() const
{
bool ret = false;
LOCKOBJECT();
ret = m_Network.BValidNet() ? true : false;
UNLOCKOBJECT();
return ret;
}
bool CDSCReader::IsRead() const
{
bool ret = false;
LOCKOBJECT();
ret = m_bIsRead;
UNLOCKOBJECT();
return ret;
}
bool CDSCReader::Read()
{
bool ret = false;
#ifdef LOCAL_TROUBLESHOOTER
CHMfileHandler( m_strPath );
#endif
LOCKOBJECT();
if (m_bIsRead)
Clear();
if (m_Network.BReadModel(m_strPath, NULL))
{
m_bIsRead = true;
ret = true;
}
UNLOCKOBJECT();
if (m_bDeleteFile)
::DeleteFile( m_strPath );
return ret;
}
void CDSCReader::Clear()
{
LOCKOBJECT();
m_Network.Clear();
m_bIsRead = false;
UNLOCKOBJECT();
}
#ifdef LOCAL_TROUBLESHOOTER
// Function called from the ctor to handle the checking and optionally writing out
// of a CHM file to a temporary file.
bool CDSCReader::CHMfileHandler( LPCTSTR path )
{
bool bRetVal= false;
if (CCHMFileReader::IsCHMfile( m_strPath ))
{
CString strContent;
CFileReader file_reader(m_pPhysicalFileReader, false/*don't delete physical reader*/);
// read file from inside CHM
if (!file_reader.Read())
return bRetVal;
file_reader.GetContent(strContent);
// Build the temporary file name.
TCHAR szTempDir[ _MAX_DIR ];
::GetTempPath( sizeof( szTempDir ), szTempDir );
CString strTmpFName= szTempDir;
strTmpFName+= file_reader.GetJustNameWithoutExtension();
strTmpFName+= _T(".");
strTmpFName+= file_reader.GetJustExtension();
// Open the temporary file and write out the contents of the CHM file.
HANDLE hTmpFile= ::CreateFile( strTmpFName,
GENERIC_WRITE,
0, // No Sharing.
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_TEMPORARY,
NULL );
if (INVALID_HANDLE_VALUE != hTmpFile)
{
DWORD dwBytesWritten;
if (!::WriteFile( hTmpFile, (LPCTSTR)strContent, strContent.GetLength(), &dwBytesWritten, NULL))
{
// >>> Need to consider what we should do in this case.
}
else
{
bRetVal= true;
}
::CloseHandle( hTmpFile );
}
if (bRetVal)
{
// Reassign the path to the temporary file.
m_strPath= strTmpFName;
// Set the delete flag to true.
m_bDeleteFile= true;
}
}
return( bRetVal );
}
#endif