460 lines
7.9 KiB
C++
460 lines
7.9 KiB
C++
//
|
|
// MODULE: APGTSHDT.CPP
|
|
//
|
|
// PURPOSE: Methods for the various commands (classes). Commands are
|
|
// Resposable for executing themseleves.
|
|
//
|
|
// PROJECT: Generic Troubleshooter DLL for Microsoft AnswerPoint
|
|
//
|
|
// COMPANY: Saltmine Creative, Inc. (206)-633-4743 support@saltmine.com
|
|
//
|
|
// AUTHOR: Roman Mach
|
|
//
|
|
// ORIGINAL DATE: 8-2-96
|
|
//
|
|
// NOTES:
|
|
// 1. Based on Print Troubleshooter DLL
|
|
//
|
|
// Version Date By Comments
|
|
//--------------------------------------------------------------------
|
|
// V0.1 - RM Original
|
|
// V0.15 8/15/96 VM New htx format
|
|
// V0.2 6/4/97 RWM Local Version for Memphis
|
|
// V0.3 04/09/98 JM/OK+ Local Version for NT5
|
|
//
|
|
#include "stdafx.h"
|
|
//#include <windows.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdarg.h>
|
|
#include <search.h>
|
|
#include <dos.h>
|
|
#include <ctype.h>
|
|
#include <limits.h>
|
|
#include <time.h>
|
|
|
|
#include "apgts.h"
|
|
#include "bnts.h"
|
|
#include "BackupInfo.h"
|
|
#include "cachegen.h"
|
|
#include "apgtsinf.h"
|
|
#include "apgtscmd.h"
|
|
#include "apgtshtx.h"
|
|
|
|
#include "ErrorEnums.h"
|
|
|
|
#include "chmread.h"
|
|
//
|
|
//
|
|
HTXCommand::HTXCommand(UINT type, const TCHAR *idstr)
|
|
{
|
|
m_beforehtmlstr = NULL;
|
|
m_afterhtmlstr = NULL;
|
|
m_beforesize = 0;
|
|
m_aftersize = 0;
|
|
m_start = 0;
|
|
m_end = 0;
|
|
m_type = type;
|
|
m_idstr = idstr;
|
|
m_error = FALSE;
|
|
m_next = NULL;
|
|
}
|
|
|
|
//
|
|
//
|
|
HTXCommand::~HTXCommand()
|
|
{
|
|
if (m_beforehtmlstr != NULL)
|
|
free(m_beforehtmlstr);
|
|
|
|
if (m_afterhtmlstr != NULL)
|
|
free(m_afterhtmlstr);
|
|
}
|
|
|
|
//
|
|
//
|
|
void HTXCommand::SetStart(UINT pos)
|
|
{
|
|
m_start = pos;
|
|
}
|
|
|
|
//
|
|
//
|
|
void HTXCommand::SetEnd(UINT pos)
|
|
{
|
|
m_end = pos;
|
|
}
|
|
|
|
//
|
|
//
|
|
UINT HTXCommand::GetStart()
|
|
{
|
|
return (m_start);
|
|
}
|
|
|
|
//
|
|
//
|
|
UINT HTXCommand::GetEnd()
|
|
{
|
|
return (m_end);
|
|
}
|
|
|
|
//
|
|
//
|
|
UINT HTXCommand::GetType()
|
|
{
|
|
return (m_type);
|
|
}
|
|
|
|
//
|
|
//
|
|
UINT HTXCommand::GetStatus()
|
|
{
|
|
return (m_error);
|
|
}
|
|
|
|
//
|
|
//
|
|
const TCHAR *HTXCommand::GetIDStr()
|
|
{
|
|
return (m_idstr);
|
|
}
|
|
|
|
//
|
|
//
|
|
UINT HTXCommand::GetBeforeLen()
|
|
{
|
|
return (m_beforelen);
|
|
}
|
|
|
|
//
|
|
//
|
|
UINT HTXCommand::GetAfterLen()
|
|
{
|
|
return (m_afterlen);
|
|
}
|
|
|
|
//
|
|
//
|
|
TCHAR *HTXCommand::GetBeforeStr()
|
|
{
|
|
return (m_beforehtmlstr);
|
|
}
|
|
|
|
//
|
|
//
|
|
TCHAR *HTXCommand::GetAfterStr()
|
|
{
|
|
return (m_afterhtmlstr);
|
|
}
|
|
|
|
//
|
|
//
|
|
UINT HTXCommand::ReadBeforeStr(UINT start, UINT end, LPCTSTR startstr)
|
|
{
|
|
m_beforesize = (UINT) (end - start);
|
|
|
|
ASSERT (m_beforesize >= 0);
|
|
|
|
m_beforehtmlstr = (TCHAR *)malloc((m_beforesize + 1) * sizeof (TCHAR));
|
|
if (m_beforehtmlstr == NULL)
|
|
return (m_error = TRUE);
|
|
// copy data
|
|
memcpy(m_beforehtmlstr, &startstr[start], m_beforesize * sizeof (TCHAR));
|
|
|
|
m_beforehtmlstr[m_beforesize] = _T('\0');
|
|
m_beforelen = _tcslen(m_beforehtmlstr);
|
|
return (FALSE);
|
|
}
|
|
|
|
//
|
|
//
|
|
UINT HTXCommand::ReadAfterStr(UINT start, UINT end, LPCTSTR startstr)
|
|
{
|
|
m_aftersize = (UINT) (end - start);
|
|
|
|
ASSERT (m_aftersize >= 0);
|
|
|
|
m_afterhtmlstr = (TCHAR *)malloc((m_aftersize + 1) * sizeof (TCHAR));
|
|
if (m_afterhtmlstr == NULL)
|
|
return (m_error = TRUE);
|
|
// copy data
|
|
memcpy(m_afterhtmlstr, &startstr[start], m_aftersize * sizeof (TCHAR));
|
|
|
|
m_afterhtmlstr[m_aftersize] = _T('\0');
|
|
m_afterlen = _tcslen(m_afterhtmlstr);
|
|
return (FALSE);
|
|
}
|
|
|
|
//
|
|
//
|
|
HTXCommand *HTXCommand::Execute(CString *cstr, CInfer *infer)
|
|
{
|
|
*cstr += GetAfterStr();
|
|
return( this);
|
|
}
|
|
|
|
HTXCommand *HTXCommand::GetNext()
|
|
{
|
|
return(m_next);
|
|
}
|
|
|
|
void HTXCommand::SetNext(HTXCommand *next)
|
|
{
|
|
m_next = next;
|
|
}
|
|
|
|
|
|
HTXIfCommand::HTXIfCommand(UINT type, TCHAR *idstr, UINT variable): HTXCommand(type, idstr)
|
|
{
|
|
m_else = NULL;
|
|
m_endif = NULL;
|
|
m_var_index = variable;
|
|
}
|
|
|
|
HTXIfCommand::~HTXIfCommand()
|
|
{
|
|
|
|
}
|
|
//
|
|
// PURPOSE: Will execute the 'if' command. When done it will return a pointer
|
|
// to the 'endif' command.
|
|
//
|
|
HTXCommand *HTXIfCommand::Execute(CString *cstr, CInfer *infer)
|
|
{
|
|
HTXCommand *cur_com;
|
|
|
|
if ( infer->EvalData(m_var_index ) != NULL) {
|
|
*cstr += GetAfterStr();
|
|
//execute if commands
|
|
cur_com = this->GetNext();
|
|
while (cur_com->GetType() != HTX_TYPEELSE &&
|
|
cur_com->GetType() != HTX_TYPEENDIF) {
|
|
cur_com = cur_com->Execute(cstr, infer);
|
|
cur_com = cur_com->GetNext();
|
|
}
|
|
} else {
|
|
if ((cur_com = this->GetElse()) != NULL) {
|
|
while (cur_com->GetType() != HTX_TYPEENDIF) {
|
|
cur_com = cur_com->Execute(cstr, infer);
|
|
cur_com = cur_com->GetNext();
|
|
}
|
|
}
|
|
}
|
|
cur_com = this->GetEndIf();
|
|
cur_com->Execute(cstr, infer);
|
|
return(cur_com);
|
|
}
|
|
|
|
HTXCommand *HTXCommand::GetElse()
|
|
{
|
|
return(NULL);
|
|
}
|
|
HTXCommand *HTXCommand::GetEndIf()
|
|
{
|
|
return(NULL);
|
|
|
|
}
|
|
HTXCommand *HTXCommand::GetEndFor()
|
|
{
|
|
return(NULL);
|
|
|
|
}
|
|
void HTXCommand::SetElse(HTXCommand *elseif)
|
|
{
|
|
}
|
|
|
|
void HTXCommand::SetEndIf(HTXCommand *endifif)
|
|
{
|
|
}
|
|
void HTXCommand::SetEndFor(HTXCommand *endfor)
|
|
{
|
|
}
|
|
void HTXCommand::GetResource(CString &strResPath, const CString& strCHM)
|
|
{
|
|
}
|
|
//
|
|
//
|
|
HTXCommand *HTXIfCommand::GetEndIf()
|
|
{
|
|
return(m_endif);
|
|
}
|
|
|
|
//
|
|
//
|
|
void HTXIfCommand::SetEndIf(HTXCommand *endif)
|
|
{
|
|
m_endif = endif;
|
|
}
|
|
|
|
//
|
|
//
|
|
HTXCommand *HTXIfCommand::GetElse()
|
|
{
|
|
return(m_else);
|
|
}
|
|
|
|
//
|
|
//
|
|
void HTXIfCommand::SetElse(HTXCommand *elseif)
|
|
{
|
|
m_else = elseif;
|
|
}
|
|
|
|
HTXForCommand::HTXForCommand(UINT type, TCHAR *idstr, UINT variable): HTXCommand(type, idstr)
|
|
{
|
|
m_endfor = NULL;
|
|
m_var_index = variable;
|
|
}
|
|
|
|
HTXForCommand::~HTXForCommand()
|
|
{
|
|
}
|
|
|
|
//
|
|
// PURPOSE: Executes the 'forany' command. when done it
|
|
// will retrurn a pointer to the 'endfor' command.
|
|
//
|
|
HTXCommand *HTXForCommand::Execute(CString *cstr, CInfer *infer)
|
|
{
|
|
HTXCommand *cur_com;
|
|
|
|
if (!(infer->InitVar(m_var_index)) ){
|
|
this->GetEndFor()->Execute(cstr,infer);
|
|
return(this->GetEndFor());
|
|
}
|
|
|
|
cur_com = this;
|
|
do {
|
|
*cstr += cur_com->GetAfterStr();
|
|
cur_com = cur_com->GetNext();
|
|
while (cur_com->GetType() != HTX_TYPEENDFOR) {
|
|
cur_com = cur_com->Execute(cstr, infer);
|
|
cur_com = cur_com->GetNext();
|
|
}
|
|
cur_com = this;
|
|
} while (infer->NextVar(m_var_index));
|
|
cur_com = this->GetEndFor();
|
|
cur_com->Execute(cstr,infer);
|
|
return(cur_com);
|
|
}
|
|
|
|
//
|
|
//
|
|
HTXCommand *HTXForCommand::GetEndFor()
|
|
{
|
|
return(m_endfor);
|
|
}
|
|
|
|
//
|
|
//
|
|
void HTXForCommand::SetEndFor(HTXCommand *endfor)
|
|
{
|
|
m_endfor = endfor;
|
|
}
|
|
|
|
HTXDisplayCommand::HTXDisplayCommand(UINT type, TCHAR *idstr, UINT variable): HTXCommand(type, idstr)
|
|
{
|
|
m_var_index = variable;
|
|
}
|
|
|
|
HTXDisplayCommand::~HTXDisplayCommand()
|
|
{
|
|
|
|
}
|
|
|
|
HTXCommand *HTXDisplayCommand::Execute(CString *cstr, CInfer *infer)
|
|
{
|
|
TCHAR *pstr;
|
|
|
|
if ((pstr=infer->EvalData(m_var_index))!= NULL)
|
|
*cstr += pstr;
|
|
*cstr += GetAfterStr();
|
|
return(this);
|
|
}
|
|
|
|
HTXResourceCommand::HTXResourceCommand(UINT type, TCHAR *idstr)
|
|
: HTXCommand(type, idstr)
|
|
{
|
|
m_strResource = _T("");
|
|
m_strFileName = _T("");
|
|
return;
|
|
}
|
|
|
|
HTXResourceCommand::~HTXResourceCommand()
|
|
{
|
|
return;
|
|
}
|
|
|
|
void HTXResourceCommand::GetResName(LPCTSTR var_name)
|
|
{
|
|
m_strFileName = &var_name[1];
|
|
// Remove the > from the end.
|
|
TCHAR EndChar[2];
|
|
EndChar[0] = m_strFileName.GetAt(m_strFileName.GetLength() - 1);
|
|
EndChar[1] = NULL;
|
|
if (0 == _tcsncmp(_T(">") , EndChar, 1))
|
|
{
|
|
m_strFileName.GetBufferSetLength(m_strFileName.GetLength() - 1);
|
|
m_strFileName.ReleaseBuffer();
|
|
}
|
|
return;
|
|
}
|
|
|
|
// strCHM contains CHM file name. Must be empty if resource file is not inside CHM.
|
|
void HTXResourceCommand::GetResource(CString& strResPath, const CString& strCHM)
|
|
{
|
|
CString strFile;
|
|
|
|
if (strCHM.GetLength())
|
|
{
|
|
char* tmp_buf =NULL;
|
|
ULONG Bytes =0;
|
|
|
|
strFile = strResPath + strCHM;
|
|
// m_filename is CHM file path and name
|
|
// and strFile - file name within CHM
|
|
if (S_OK != ::ReadChmFile(strFile, m_strFileName, (void**)&tmp_buf, &Bytes))
|
|
{
|
|
// ERROR READING CHM
|
|
return;
|
|
}
|
|
tmp_buf[Bytes] = NULL;
|
|
m_strResource = tmp_buf;
|
|
}
|
|
else
|
|
{
|
|
FILE *pFile;
|
|
CHAR szBuf[4097];
|
|
size_t Bytes =0;
|
|
|
|
strFile = strResPath + m_strFileName;
|
|
if (NULL == (pFile = _tfopen((LPCTSTR) strFile, _T("rb"))))
|
|
ReportError(TSERR_RES_MISSING);
|
|
do
|
|
{
|
|
if((Bytes = fread(szBuf, 1, 4096, pFile)) > 0)
|
|
{
|
|
szBuf[Bytes] = NULL;
|
|
m_strResource += szBuf;
|
|
}
|
|
} while (Bytes == 4096);
|
|
if (!feof(pFile))
|
|
{
|
|
fclose(pFile);
|
|
ReportError(TSERR_RES_MISSING);
|
|
}
|
|
fclose(pFile);
|
|
}
|
|
return;
|
|
}
|
|
|
|
HTXCommand *HTXResourceCommand::Execute(CString *cstr, CInfer *)
|
|
{
|
|
// Read the resource file into cstr.
|
|
*cstr += m_strResource;
|
|
*cstr += GetAfterStr();
|
|
return(this);
|
|
} |