mirror of https://github.com/tongzx/nt5src
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.
185 lines
7.3 KiB
185 lines
7.3 KiB
//
|
|
// MODULE: APGTSHTIREAD.H
|
|
//
|
|
// PURPOSE: HTI template file reading classes
|
|
//
|
|
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 [email protected]
|
|
//
|
|
// AUTHOR: Oleg Kalosha
|
|
//
|
|
// ORIGINAL DATE: 8-12-98
|
|
//
|
|
// NOTES:
|
|
//
|
|
// Version Date By Comments
|
|
//--------------------------------------------------------------------
|
|
// V3.0 08-04-98 OK
|
|
//
|
|
|
|
#ifndef __APGTSHTIREAD_H_
|
|
#define __APGTSHTIREAD_H_
|
|
|
|
#include "templateread.h"
|
|
#include "HTMLFrag.h"
|
|
|
|
|
|
// these are not really commands, just service symbols
|
|
#define COMMAND_STARTSTR _T("<!GTS")
|
|
#define COMMAND_ENDSTR _T(">")
|
|
#define COMMAND_IFSTR _T("if")
|
|
#define COMMAND_STARTVARSTR _T("$")
|
|
// JSM V3.2 -- used to decode string argumentss
|
|
#define COMMAND_DOUBLEQUOTE _T("\"")
|
|
#define COMMAND_ESCAPECHAR _T("\\")
|
|
// commands that have to be interpreted
|
|
#define COMMAND_ELSESTR _T("else")
|
|
#define COMMAND_ENDIFSTR _T("endif")
|
|
#define COMMAND_FORANYSTR _T("forany")
|
|
#define COMMAND_ENDFORSTR _T("endfor")
|
|
// commands that presume putting substitution string on their place
|
|
#define COMMAND_DISPLAYSTR _T("display")
|
|
#define COMMAND_RESOURCESTR _T("resource")
|
|
// command that brings general information, that can be processed
|
|
// in classes inherited from CHTMLFragmentsTS
|
|
#define COMMAND_INFORMATION _T("information")
|
|
// command that makes CHTMLFragmentsTS store some value
|
|
#define COMMAND_VALUE _T("value")
|
|
// command that substitutes Network Property in the HTML:
|
|
#define COMMAND_PROPERTY _T("property")
|
|
//
|
|
|
|
// V3.2 Additions.
|
|
#define COMMAND_ELSEIFSTR _T("elseif")
|
|
#define COMMAND_COOKIE _T("<!Cookie")
|
|
|
|
#define DELIMITER_POSTFIX _T("!")
|
|
#define DELIMITER_PREFIX _T("_")
|
|
|
|
//
|
|
// NO error handling here - whatever the result is, it will be accepted,
|
|
// the program flow should go to the end. NO throw exception.
|
|
//
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
// CAPGTSHTIReader
|
|
// Term "Interpret" here is: unwind initial script with <!GTS forany $Something> or
|
|
// <!GTS if $Something> to <!GTS forany $Something!24_SomethingElse!2...>
|
|
// This interpreted script is to be ready for direct substitutions of <!GTS display ...>
|
|
// and <!GTS resource ...>, which are only commands left in the interpreted script
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
class CAPGTSHTIReader : public CTemplateReader
|
|
{
|
|
protected: // we can use data in inherited class
|
|
vector<CString> m_arrInterpreted; // (partly) interpreted template - some clauses
|
|
// are interpreted, when fully parsed - ready
|
|
// for simple template substitution.
|
|
const CHTMLFragments* m_pFragments;
|
|
|
|
public:
|
|
CAPGTSHTIReader(CPhysicalFileReader * pPhysicalFileReader, LPCTSTR szDefaultContents = NULL);
|
|
~CAPGTSHTIReader();
|
|
|
|
protected:
|
|
virtual void Parse(); // do nothing - no traditional parsing, we first have to interpret
|
|
|
|
public:
|
|
void CreatePage( const CHTMLFragments& fragments,
|
|
CString& out,
|
|
const map<CString,CString> & mapStrs,
|
|
CString strHTTPcookies= _T("") );
|
|
|
|
bool HasHistoryTable();
|
|
|
|
// JSM V3.2 returns a vector containing all net props which appear
|
|
// in the HTI file in lines like <!GTS property "fooprop">
|
|
void ExtractNetProps(vector<CString> &arr_props);
|
|
|
|
protected:
|
|
// level below CreatePage(...)
|
|
virtual void InitializeInterpreted(); // init string array with data read from HTI file
|
|
virtual void Interpret(); // zoom this template in a simple template where all we need is string substitution
|
|
virtual void ParseInterpreted(); // perform this substitution
|
|
virtual void SetOutputToInterpreted(); // set standard template output (m_StreamOutput)
|
|
// from interpreted m_arrInterpreted
|
|
//
|
|
// we can read output by CTemplateReader::GetOutput();
|
|
//
|
|
protected:
|
|
// level below ...Interpret...(...)
|
|
bool ExtractClause(vector<CString>& arr_text,
|
|
long* pstart_index,
|
|
vector<CString>& arr_clause);
|
|
bool InterpretClause(vector<CString>& arr_clause);
|
|
protected:
|
|
// used by previous ExtractClause
|
|
// start_index is supposed to be positioned to beginning of clause
|
|
bool ExtractClause(vector<CString>& arr_text,
|
|
long* pstart_index,
|
|
vector<CString>& arr_clause,
|
|
const CString& str_start_command,
|
|
const CString& str_end_command);
|
|
// used by InterpretClause
|
|
bool InterpretForanyClause(vector<CString>& arr_clause);
|
|
bool InterpretIfClause(vector<CString>& arr_clause);
|
|
// lowest level - parsing and changing <!GTS &...> - strings
|
|
// This function extracts command from line
|
|
bool GetCommand(const CString& line, CString& command);
|
|
// This command composes <!GTS operator $variable>
|
|
bool ComposeCommand(const CString& oper, const CString& variable, CString& command);
|
|
// This function extracts variable from line
|
|
bool GetVariable(const CString& line, CString& variable);
|
|
// This function parses variable like Recommendations!199_States!99 into array
|
|
void ParseVariable(const CString& variable, FragmentIDVector& out);
|
|
// This function composes variable from array
|
|
void ComposeVariable(const FragmentIDVector& parsed, CString& variable);
|
|
// This function substitutes <!GTS ....> in "line" with "str_substitution"
|
|
bool SubstituteCommandBlockWith(const CString& str_substitution, CString& line);
|
|
// This function composes command block <!GTS command $variable >
|
|
void ComposeCommandBlock(const CString& command, const CString& variable, CString& command_block);
|
|
|
|
// NOTION of prefix - postfix. Prefix - parent variable, delimited by "_" from our variable,
|
|
// and postfix - number, delimited from our variable by "!"
|
|
|
|
// This function forms variable like Recommendations!11 where postfix == 11
|
|
void PostfixVariable(const long postfix, CString& variable);
|
|
// This function forms variable like Recommendations!1_State where prefix == Recommendations!1
|
|
void PrefixVariable(const CString& prefix, CString& variable);
|
|
|
|
private:
|
|
// VERY low level
|
|
// This function reads command and variable from the <!GTS command $variable > block
|
|
bool GetCommandVariableFromControlBlock(const CString& control_block, CString& command, CString& variable);
|
|
// This function reads command block (<!GTS command $variable >) from line
|
|
bool GetControlBlockFromLine(const CString& line, CString& control_block);
|
|
|
|
// JSM V3.2
|
|
// extracts a string argument from a part of the command block; called by GetCommandVariableFromControlBlock
|
|
CString GetStringArg(const CString & strText);
|
|
// Converts a double-quoted string w/ an `escape character' to a correct CString.
|
|
CString GetEscapedText(const CString &strText);
|
|
// utility function called by the above:
|
|
CString RemoveEscapesFrom(const CString &strIn);
|
|
|
|
|
|
#ifdef __DEBUG_CUSTOM
|
|
public:
|
|
bool FlushOutputStreamToFile(const CString& file_name);
|
|
#endif
|
|
|
|
private:
|
|
// This function handles the substituting of "<!Cookie" clauses with the either
|
|
// values from cookies or the default value.
|
|
void SubstituteCookieValues( CString& strText );
|
|
|
|
// This function searches the HTTP cookies for a given cookie name and attribute. If
|
|
// found, this function returns a value of true and the located cookie value.
|
|
bool LocateCookieValue( const CString& strCookieName,
|
|
const CString& strCookieAttr,
|
|
CString& strCookieValue );
|
|
private:
|
|
CString m_strHTTPcookies; // V3.2 Enhancement, contains cookies from HTTP header
|
|
// which are used in the Online Troubleshooter.
|
|
map<CString,CString> m_mapCookies;
|
|
};
|
|
|
|
#endif // __APGTSHTIREAD_H_
|