You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
217 lines
5.6 KiB
217 lines
5.6 KiB
//
|
|
// MODULE: TOPIC.CPP
|
|
//
|
|
// PURPOSE: Class CTopic brings together all of the data structures that represent a
|
|
// troubleshooting topic. Most importantly, this represents the belief network,
|
|
// but it also represents the HTI template, the data derived from the BES (back
|
|
// end search) file, and any other persistent data.
|
|
//
|
|
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 [email protected]
|
|
//
|
|
// AUTHOR: Joe Mabel
|
|
//
|
|
// ORIGINAL DATE: 9-9-98
|
|
//
|
|
// NOTES:
|
|
// 1. The bulk of the methods on this class are inherited from CBeliefNetwork
|
|
//
|
|
// Version Date By Comments
|
|
//--------------------------------------------------------------------
|
|
// V3.0 09-09-98 JM
|
|
//
|
|
|
|
#pragma warning(disable:4786)
|
|
|
|
#include "stdafx.h"
|
|
#include "Topic.h"
|
|
#include "propnames.h"
|
|
#include "event.h"
|
|
#include "CharConv.h"
|
|
#include "SafeTime.h"
|
|
|
|
#ifdef LOCAL_TROUBLESHOOTER
|
|
#include "CHMFileReader.h"
|
|
#include "apgtstscread.h"
|
|
#endif
|
|
#include "apgts.h" // Need for Local-Online macros.
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CTopic::CTopic( LPCTSTR pathDSC
|
|
,LPCTSTR pathHTI
|
|
,LPCTSTR pathBES
|
|
,LPCTSTR pathTSC ) :
|
|
CBeliefNetwork(pathDSC),
|
|
m_pHTI(NULL),
|
|
m_pBES(NULL),
|
|
m_pathHTI(pathHTI),
|
|
m_pathBES(pathBES),
|
|
m_pathTSC(pathTSC),
|
|
m_bTopicIsValid(true),
|
|
m_bTopicIsRead(false)
|
|
{
|
|
}
|
|
|
|
CTopic::~CTopic()
|
|
{
|
|
if (m_pHTI)
|
|
delete m_pHTI;
|
|
if (m_pBES)
|
|
delete m_pBES;
|
|
}
|
|
|
|
bool CTopic::IsRead()
|
|
{
|
|
bool ret = false;
|
|
LOCKOBJECT();
|
|
ret = m_bTopicIsRead;
|
|
UNLOCKOBJECT();
|
|
return ret;
|
|
}
|
|
|
|
bool CTopic::Read()
|
|
{
|
|
LOCKOBJECT();
|
|
m_bTopicIsValid = false;
|
|
try
|
|
{
|
|
if (CBeliefNetwork::Read())
|
|
{
|
|
if (m_pHTI)
|
|
delete m_pHTI;
|
|
|
|
if (RUNNING_LOCAL_TS())
|
|
m_pHTI = new CAPGTSHTIReader( CPhysicalFileReader::makeReader( m_pathHTI ), GetMultilineNetProp(H_NET_HTI_LOCAL, _T("%s\r\n")) );
|
|
else
|
|
m_pHTI = new CAPGTSHTIReader( new CNormalFileReader( m_pathHTI ), GetMultilineNetProp(H_NET_HTI_ONLINE, _T("%s\r\n")) );
|
|
|
|
if (m_pHTI->Read())
|
|
{
|
|
#ifdef LOCAL_TROUBLESHOOTER
|
|
// it can fail reading TCS file - we don't care
|
|
CAPGTSTSCReader( CPhysicalFileReader::makeReader( m_pathTSC ), &m_Cache ).Read();
|
|
#endif
|
|
|
|
// at this point, we're OK, because BES is optional
|
|
m_bTopicIsValid = true;
|
|
|
|
if (m_pBES)
|
|
{
|
|
delete m_pBES;
|
|
m_pBES= NULL;
|
|
}
|
|
|
|
CString strBESfromNet= GetMultilineNetProp( H_NET_BES, _T("%s\r\n") );
|
|
if ((!m_pathBES.IsEmpty()) || (!strBESfromNet.IsEmpty()))
|
|
{
|
|
// Only allocate a BESReader for a valid filename.
|
|
m_pBES = new CAPGTSBESReader(new CNormalFileReader(m_pathBES), strBESfromNet );
|
|
m_pBES->Read();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (bad_alloc&)
|
|
{
|
|
// Note memory failure in event log.
|
|
CBuildSrcFileLinenoStr SrcLoc( __FILE__, __LINE__ );
|
|
CEvent::ReportWFEvent( SrcLoc.GetSrcFileLineStr(),
|
|
SrcLoc.GetSrcFileLineStr(),
|
|
_T(""), _T(""), EV_GTS_CANT_ALLOC );
|
|
}
|
|
m_bTopicIsRead = true;
|
|
UNLOCKOBJECT();
|
|
|
|
return m_bTopicIsValid;
|
|
}
|
|
|
|
// should only be called in a context where we know we have a valid topic.
|
|
// Needn't lock, because m_pBES won't change once topic is read.
|
|
bool CTopic::HasBES()
|
|
{
|
|
return (m_pBES ? true : false);
|
|
}
|
|
|
|
|
|
// Should only be called in a context where we know we have a valid topic.
|
|
// Does not need to lock, because:
|
|
// - CAPGTSBESReader provides its own locking
|
|
// - m_pBES won't change once topic is read.
|
|
void CTopic::GenerateBES(
|
|
const vector<CString> & arrstrIn,
|
|
CString & strEncoded,
|
|
CString & strRaw)
|
|
{
|
|
if (m_pBES)
|
|
m_pBES->GenerateBES(arrstrIn, strEncoded, strRaw);
|
|
}
|
|
|
|
// Should only be called in a context where we know we have a valid topic.
|
|
// Does not need to lock, because:
|
|
// - CAPGTSHTIReader provides its own locking
|
|
// - m_pHTI won't change once topic is read.
|
|
void CTopic::CreatePage( const CHTMLFragments& fragments,
|
|
CString& out,
|
|
const map<CString,CString> & mapStrs,
|
|
CString strHTTPcookies/*= _T("")*/ )
|
|
{
|
|
if (m_pHTI)
|
|
{
|
|
// You can compile with the SHOWPROGRESS option to get a report on the progress of this page.
|
|
#ifdef SHOWPROGRESS
|
|
time_t timeStart = 0;
|
|
time_t timeEnd = 0;
|
|
time(&timeStart);
|
|
#endif // SHOWPROGRESS
|
|
m_pHTI->CreatePage(fragments, out, mapStrs, strHTTPcookies );
|
|
#ifdef SHOWPROGRESS
|
|
time(&timeEnd);
|
|
|
|
CString strProgress;
|
|
CSafeTime safetimeStart(timeStart);
|
|
CSafeTime safetimeEnd(timeEnd);
|
|
|
|
strProgress = _T("\n<BR>-----------------------------");
|
|
strProgress += _T("\n<BR>Start CTopic::CreatePage ");
|
|
strProgress += safetimeStart.StrLocalTime();
|
|
strProgress += _T("\n<BR>End CTopic::CreatePage ");
|
|
strProgress += safetimeEnd.StrLocalTime();
|
|
|
|
int i = out.Find(_T("<BODY"));
|
|
i = out.Find(_T('>'), i); // end of BODY tag
|
|
if (i>=0)
|
|
{
|
|
out = out.Left(i+1)
|
|
+ strProgress
|
|
+ out.Mid(i+1);
|
|
}
|
|
#endif // SHOWPROGRESS
|
|
}
|
|
}
|
|
|
|
// JSM V3.2
|
|
// Should only be called in a context where we know we have a valid topic.
|
|
// Does not need to lock, because:
|
|
// - CAPGTSHTIReader provides its own locking
|
|
// - m_pHTI won't change once topic is read.
|
|
void CTopic::ExtractNetProps(vector <CString> &arr_props)
|
|
{
|
|
if (m_pHTI)
|
|
m_pHTI->ExtractNetProps(arr_props);
|
|
|
|
}
|
|
|
|
|
|
// Should only be called in a context where we know we have a valid topic.
|
|
// Does not need to lock, because:
|
|
// - CAPGTSHTIReader provides its own locking
|
|
// - m_pHTI won't change once topic is read.
|
|
bool CTopic::HasHistoryTable()
|
|
{
|
|
bool ret = false;
|
|
if (m_pHTI)
|
|
ret = m_pHTI->HasHistoryTable();
|
|
return ret;
|
|
}
|