|
|
//
// MODULE: DSCREAD.CPP
//
// PURPOSE: dsc reading classes
//
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 [email protected]
//
// 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
|