Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

460 lines
7.9 KiB

//
// 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 [email protected]
//
// 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);
}