190 lines
4.2 KiB
C++
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
|