windows-nt/Source/XPSP1/NT/enduser/troubleshoot/tshoot/htmlfrag.h
2020-09-26 16:20:57 +08:00

226 lines
8 KiB
C++

//
// MODULE: HTMLFrag.h
//
// PURPOSE: declaration of the CHTMLFragments and CHTMLFragmentsTS classes.
// This is how CInfer packages up fragments of HTML to be rendered in accord
// with a template.
//
// PROJECT: Generic Troubleshooter DLL for Microsoft AnswerPoint
//
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 support@saltmine.com
//
// AUTHOR: Joe Mabel
//
// ORIGINAL DATE: 8-27-1998
//
// NOTES:
//
// Version Date By Comments
//--------------------------------------------------------------------
// V3.0 8-27-98 JM Original
//
//////////////////////////////////////////////////////////////////////
#ifndef __HTMLFRAG_H_
#define __HTMLFRAG_H_
#include <vector>
using namespace std;
// JSM V3.2
#include <map>
using namespace std;
#include "apgtsstr.h"
// Predefined variable names
// They belong to DISPLAY command
#define VAR_PROBLEM_ASK _T("ProblemAsk")
#define VAR_RECOMMENDATIONS _T("Recommendations")
#define VAR_STATES _T("States")
#define VAR_QUESTIONS _T("Questions")
#define VAR_SUCCESS _T("Success")
#define VAR_STARTFORM _T("StartForm")
// V3.2 Additions.
namespace
{
const CString kstrCond_NumericCompare= _T("NumericCompare");
}
struct FragmentID
{
FragmentID() : Index(-1) {};
FragmentID(const CString & v, int i) : VarName(v), Index(i) {};
CString VarName; // must be a known, predefined variable name
int Index; // index into array associated with this variable name
// OR -1 for not relevant
bool operator < (const FragmentID & fid) const
{ return (VarName < fid.VarName || Index < fid.Index); };
bool operator == (const FragmentID & fid) const
{ return (VarName == fid.VarName || Index == fid.Index); };
};
class CHTMLValue
{
CString m_strValName;
CString m_strValValue;
public:
CHTMLValue() {}
CHTMLValue(const CString& name) : m_strValName(name) {}
CHTMLValue(const CString& name, const CString& value) : m_strValName(name), m_strValValue(value) {}
virtual ~CHTMLValue() {}
public:
bool operator == (const CHTMLValue& sib);
void SetName(const CString& name) {m_strValName = name;}
CString GetName() {return m_strValName;}
bool SetValue(const CString& value);
bool GetNumeric(long&);
bool GetString(CString&);
bool GetBoolean(bool&);
bool IsValid() {return IsNumeric() || IsString() || IsBoolean();}
bool IsNumeric();
bool IsString();
bool IsBoolean();
};
// vectors definition
typedef vector<FragmentID> FragmentIDVector;
typedef vector<CHTMLValue> HTMLValueVector;
// Template should see only a const object of this class
class CHTMLFragments
{
HTMLValueVector m_HTMLValueVector;
public:
enum FragCommand { eNotOfInterest, eResource };
public:
CHTMLFragments() {};
virtual ~CHTMLFragments()=0 {};
// pure virtuals
virtual int GetCount(const FragmentIDVector & fidvec) const =0;
virtual CString GetText(const FragmentIDVector & fidvec, const FragCommand fragCmd= eNotOfInterest ) =0;
virtual bool IsValidSeqOfVars(const FragmentIDVector & arrParents, const FragmentIDVector & arrChildren) const =0 ;
// value handling
virtual bool SetValue(const CString& assignment_expression);
virtual CHTMLValue* GetValue(const CString& value_name);
// JSM V3.2 needed by mechanism which replaces <!GTS property "netprop">
// w/ the corresponding BNTS network property
virtual CString GetNetProp(const CString & strNetPropName) = 0;
// V3.2 enhancement for the Start Over button.
virtual void SetStartOverLink( const CString & str ) {};
virtual CString GetStartOverLink() {return _T("");}
};
// Implementation specific to the predefined variables above
class CHTMLFragmentsTS : public CHTMLFragments
{
#ifdef __DEBUG_CUSTOM
protected:
#else
private:
#endif
const bool m_bIncludesHistoryTable;
const bool m_bIncludesHiddenHistory;
CString m_strStartForm; // The fixed, initial part of the HTML form on every
// page that has a form. (The FORM tag + the topic
// name in a hidden field of that form)
CString m_strProblem; // problem name (for history table)
vector<CString> m_vstrVisitedNodes; // name of each visited node (for history table)
#pragma warning(disable:4786)
vector< vector<CString> > m_vvstrStatesOfVisitedNodes; // text corresponding
// to each state of each visited node (for history table).
// This includes radio button.
CString m_strCurrentNode; // full text for current node, sometimes includes
// hidden history
CString m_strCurrentNodeSimple; // text for current node, always excludes hidden history
CString m_strHiddenHistory; // If there is to be no history table, this encodes
// the history in hidden fields (for an HTML form)
CString m_strNil;
CString m_strYes; // constant "Yes" for m_bSuccess == true
bool m_bSuccess; // true only is current node is BYE (success) node.
const CString m_strScriptPath; // path to the resource directory, used for server side logic.
CString m_strStartOverLink; // V3.2 - for Online TS, contains the text for the start over
// link (which is disguised as a button). Unlike other
// properties, this is set by APGTSContext and gotten
// by CInfer, not set by CInfer and gotten by CAPGTSHTIReader
// V3.2 map BNTS network property name to net property (value)
// allows us to convert <!GTS property "netprop"> when reading the HTI file
map<CString,CString> m_mapstrNetProps;
private:
CHTMLFragmentsTS(); // Do not instantiate
public:
CHTMLFragmentsTS( const CString & strScriptPath, bool bIncludesHistoryTable );
~CHTMLFragmentsTS();
// inherited methods
int GetCount(const FragmentIDVector & fidvec) const;
CString GetText( const FragmentIDVector & fidvec, const FragCommand fragCmd= eNotOfInterest );
virtual bool IsValidSeqOfVars(const FragmentIDVector & arrParents, const FragmentIDVector & arrChildren) const;
void SetStartOverLink( const CString & str ); // V3.2 enhancement for the Start Over button.
CString GetStartOverLink(); // V3.2 enhancement for the Start Over button.
// methods specific to this class
void SetStartForm(const CString & str);
void SetProblemText(const CString & str);
void SetCurrentNodeText(const CString & str);
void SetHiddenHistoryText(const CString & str);
void SetSuccessBool(bool bSuccess);
CString GetCurrentNodeText();
int PushBackVisitedNodeText(const CString & str);
int PushBackStateText(UINT iVisitedNode, const CString & str);
bool IncludesHistoryTable() const;
bool IncludesHiddenHistory() const;
// Functions which parse and evaluate numeric and string conditionals.
bool NumericConditionEvaluatesToTrue( const CString & str );
bool StringConditionEvaluatesToTrue( const CString & str );
CString RemoveOuterParenthesis( const CString & str );
bool RetNumericOperands( const CString & str, const CString & strOperator,
long &lLeftOperand, long &lRightOperand );
bool RetStringOperands( const CString & str, const CString & strOperator,
CString & strLeftOperand, CString & strRightOperand );
int CleanStringOperand( CString& strOperand );
// JSM V3.2 these functions used by the mechanism which replaces
// <!GTS property "netprop"> w/ the corresponding BNTS network property
//
// CAPGTSHTIReader finds the names of the network properties and passes
// them in via AddNetPropName
// CInfer later gets the network property names, calls the BNTS
// to find out the network property values, and passes the values to HTMLFragmentsTS
// Later, CAPGTSHTIReader queries HTMLFragmentsTS for network property values
// during the parsing process.
//
// add the name of a network property to the internal list
void AddNetPropName(const CString & strNetPropName);
// returns the network property, requested by name. (returns null if not avail.)
CString GetNetProp(const CString & strNetPropName);
// set the value of the network property identified by strNetPropName
BOOL SetNetProp(CString strNetPropName, CString strNetProp);
// iterate (by name) thru the list of net props
BOOL IterateNetProp(CString & strNameIterator);
// end JSM V3.2
private:
void RebuildCurrentNodeText();
};
#endif // __HTMLFRAG_H_