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.
 
 
 
 
 
 

499 lines
15 KiB

//
// MODULE: APGTSINF.H
//
// PURPOSE: Inference support header
//
// PROJECT: Generic Troubleshooter DLL for Microsoft AnswerPoint
//
// COMPANY: Saltmine Creative, Inc. (206)-633-4743 [email protected]
//
// AUTHOR: Roman Mach
// further work by Richard Meadows (RWM), Joe Mabel, Oleg Kalosha
//
// ORIGINAL DATE: 8-2-96
//
// NOTES:
// 1. Based on Print Troubleshooter DLL
//
// Version Date By Comments
//--------------------------------------------------------------------
// V0.1 - RM Original
// V0.2 6/4/97 RWM Local Version for Memphis
// V0.3 3/24/98 JM Local Version for NT5
#include "ErrorEnums.h"
#include "sniff.h"
typedef unsigned int NID; // numeric node ID in the form used by BNTS
// Please Note: these values are mirrored in dtguiapi.bas, please keep in sync
const NID nidNil = 12346;
const NID nidService = 12345;
#define IDH_BYE 101 // success page
#define IDH_FAIL 102 // "no more recommendations" page
typedef UINT IDH; // help index. For values where a NID is defined,
// add idhFirst to get an IDH. IDH_BYE & IDH_FAIL
// are also good IDHs.
const IDH idhFirst = 1000;
#define IDH_FROM_NID(NID) (NID + idhFirst)
#define IDH_SERVICE IDH_FROM_NID(nidService)
#define MAXBUF 256 * 2
#define MAXPROBID 100 // allow for this many problem nodes in a network
enum { cnidMacSkip = 32 }; // max # of "skipped" nodes
typedef TCHAR* TSZ;
typedef const TCHAR* TSZC;// >>> why distinguished from TSZ?
typedef unsigned int CNID; // a count of node IDs.
typedef unsigned int IST; // state number (associated with a node)
// 0 - normal
// 1 - abnormal
// 102 - skipped
#define MAX_NID 64 // allow for this many nodes to be given states by user on the
// way to solving the problem
void WideToMB(const WCHAR *szIn, CHAR *szOut); // Converts Unicode chars to Multi Byte.
class GTSCacheGenerator; // forward reference
class GTSAPI : public BNTS
{
#define SZ_CACHE_NAME _T(".tsc")
public:
GTSAPI(TCHAR *binfile, TCHAR *tagstr, TCHAR *szResourcePath);
virtual ~GTSAPI();
BOOL BNodeSet(int state, bool bset); // Old comment says "For debugging" but I doubt it.
// Maybe that's just why its public. - JM 3/98
void AddValue(int value);
// Temporary BNTS wrappers for unicode build with non unicode bnts.dll
CString m_strResult;
BOOL BMultiByteReadModel(LPCTSTR szcFn, LPCSTR szcFnError);
BOOL BReadModel (LPCTSTR szcFn, LPCSTR szcFnError = NULL)
{
#ifndef _UNICODE
return BNTS::BReadModel(szcFn, szcFnError);
#else
return BMultiByteReadModel(szcFn, szcFnError);
#endif
};
BOOL BMultiByteNodePropItemStr(LPCTSTR szcPropType, int index);
virtual BOOL BNodePropItemStr(TSZC szcPropType, int index)
{
#ifndef _UNICODE
return BNTS::BNodePropItemStr(szcPropType, index);
#else
return BMultiByteNodePropItemStr(szcPropType, index);
#endif
};
BOOL BMultiByteNetPropItemStr(LPCTSTR szcPropType, int index);
virtual BOOL BNetPropItemStr(TSZC szcPropType, int index)
{
#ifndef _UNICODE
return BNTS::BNetPropItemStr(szcPropType, index);
#else
return BMultiByteNetPropItemStr(szcPropType, index);
#endif
};
LPCTSTR SzcMultiByteResult();
virtual LPCTSTR SzcResult()
{
#ifndef _UNICODE
return BNTS::SzcResult();
#else
return SzcMultiByteResult();
#endif
};
int IMultiByteNode(LPCTSTR szSymName);
virtual int INode(LPCTSTR szSymName)
{
#ifndef _UNICODE
return BNTS::INode(szSymName);
#else
return IMultiByteNode(szSymName);
#endif
};
// Temporary BNTS wrappers for debug build with release bnts.dll
/*
BOOL BNetPropItemStr(LPCTSTR szPropItem, int index, CString &str)
{
BOOL bRet;
str.GetBuffer(STRBUFSIZE);
bRet = BNTS::BNetPropItemStr(szPropItem, index, str);
str.ReleaseBuffer();
return bRet;
};
BOOL BNodePropItemStr(LPCTSTR szPropItem, int index, CString &str)
{
BOOL bRet;
str.GetBuffer(STRBUFSIZE);
bRet = BNTS::BNodePropItemStr(szPropItem, index, str);
str.ReleaseBuffer();
return bRet;
};
void NodeStateName(int index, CString &str)
{
str.GetBuffer(STRBUFSIZE);
BNTS::NodeStateName(index, str);
str.ReleaseBuffer();
return;
};
void NodeSymName(CString &str)
{
str.GetBuffer(STRBUFSIZE);
BNTS::NodeSymName(str);
str.ReleaseBuffer();
return;
};
void NodeFullName(CString &str)
{
str.GetBuffer(STRBUFSIZE);
BNTS::NodeFullName(str);
str.ReleaseBuffer();
return;
};
*/
// Regular functions.
//virtual BOOL NodeSet(NID nid, IST ist);
VOID ResetNodes();
DWORD Reload(/*CWordList *pWXList*/);
DWORD GetStatus();
UINT GetProblemArray(IDH **idh);
IDH GetProblemAsk();
UINT GetNodeList(NID **pNid, IST **pIst);
int GTSGetRecommendations(CNID& cnid, NID rgnid[]);
void RemoveRecommendation(int Nid);
VOID GetSearchWords(/*CWordList *pWords*/);
DWORD EvalWord(TCHAR *token);
//WNODE_ELEM *GetWNode(NID nid);
BOOL BNodeSetCurrent(int node);
VOID ScanAPIKeyWords(/*CWordList *pWXList*/);
protected:
VOID Destroy();
protected:
GTSCacheGenerator m_CacheGen;
// These 2 arrays tie together nodes & their states
NID m_rgnid[MAX_NID];
IST m_rgist[MAX_NID];
IST m_rgsniff[MAX_NID]; // array of states, showing if the node was sniffed
UINT m_cnid; // current size of m_rgnid, m_rgist; number of nodes to which
// a state has been assigned.
TCHAR m_binfile[MAXBUF]; // name of DSC file (>>> full path or not?)
// >>>should be renamed! DSC file replaced BIN file.
TCHAR m_tagstr[MAXBUF];
TCHAR m_szResourcePath[MAXBUF]; // full path of resource directory
DWORD m_dwErr;
TCHAR* m_pchHtml;
IDH m_idstore[MAXPROBID]; // problem node convenience array in the
// form of IDH values
UINT m_currid; // Despite bad name, number of values in m_idstore
IDH m_probask; // IDH value corresponding to ProblemAsk: number of nodes
// in the network + 1000
CBNCache *m_pCache; // cache for states of this network
};
////////////////////////////////////////////////////////////////////////////////////////
// BCache class declaration
//
// these are returns by GTSGetRecommendations member function
//
#define RECOMMEND_SUCCESS 1
#define RECOMMEND_FAIL 0
#define RECOMMEND_IMPOSSIBLE 99
#define RECOMMEND_NODE_WORKED 100
#define RECOMMEND_NO_MORE_DATA 101
//
#define NODE_ID_NONE -1
//
class CHttpQuery;
class BCache : public GTSAPI, public CSniffedNodeContainer
{
public:
BCache(TCHAR *binfile, TCHAR *tagstr, TCHAR *szResourcePath, const CString& strFile);
~BCache();
void SetHttpQuery(CHttpQuery *p) {m_pHttpQuery = p;return;};
UINT StatesFromServ();
UINT StatesNowSet();
DWORD Initialize(/*CWordList *pWXList*/);
DWORD ReadModel();
void ReadCacheFile(LPCTSTR szCache);
int GTSGetRecommendations(CNID& cnid, NID rgnid[], bool bSniffed =false);
void RemoveRecommendation(int Nid);
BOOL NodeSet(NID nid, IST ist, bool bPrevious);
void ResetNodes();
int CNode();
BOOL BImpossible();
BOOL BNetPropItemStr(LPCTSTR szPropType, int index);
BOOL BNetPropItemReal(LPCTSTR szPropType, int index, double &dbl);
BOOL BNodeSetCurrent(int node);
int INode(LPCTSTR szNodeSymName);
ESTDLBL ELblNode();
int INodeCst();
BOOL BNodeSet(int istate, bool bSet = true);
int INodeState();
void NodeStateName(int istate);
void NodeSymName();
void NodeFullName();
BOOL BNodePropItemStr(LPCTSTR szPropType, int index);
BOOL BNodePropItenReal(LPCTSTR szPropType, int index, double &dbl);
void NodeBelief();
bool BValidNet();
bool BValidNode();
void Clear();
void RemoveStates() {m_NodeState.RemoveAll();};
void RemoveNode(int Node) {VERIFY(m_NodeState.RemoveKey(Node));};
LPCTSTR SzcResult() const;
void ReadTheDscModel(int From = TSERR_ENGINE_BNTS_READ);
const CArray<int, int>& GetArrLastSniffed();
int GetCountRecommendedNodes();
int GetCountSniffedRecommendedNodes();
bool IsReverse();
void SetReverse(bool);
void SetRunWithKnownProblem(bool);
bool IsRunWithKnownProblem();
void SetAdditionalDataOnNodeSet(NID nid);
protected:
int GetIndexNodeInCache(NID nid);
protected:
CHttpQuery *m_pHttpQuery;
BOOL CheckNode(int Node);
void AddToCache(CString &strCacheFile, const CString& strCacheFileWithinCHM);
BOOL m_bNeedModel; // TRUE -> Need to read the model before querying the bnts library.
BOOL m_bModelRead;
BOOL m_bDeleteModelFile;
CString m_strModelFile; // Filename of model file
CString m_strFile; // name of *.dsz or *.dsc file inside *.chm file
// (in this case network file is actually a *.chm file)
int m_CurNode;
CMap<int, int, int, int>m_NodeState;
CString m_strResult;
CArray<int, int> m_arrNidLastSniffed; // array in sniffed nodes traversed during last navigation
bool m_bReverse; // indicated if the current movement is in the forward or reverse direction
bool m_bRunWithKnownProblem; //indicates that the tshooter was started with known problem
};
typedef struct tag_TShooter
{
TCHAR m_szName[MAXBUF];
TCHAR m_szDisplayName[MAXBUF];
} TShooter;
//
//
class CInfer
{
public:
CInfer( CString *pCtxt);
~CInfer();
void ClearDoubleSkip() {m_SkippedTwice.RemoveAll();};
VOID AssertFailed(TSZC szcFile, UINT iline, TSZC szcCond, BOOL fFatal);
DWORD Initialize(/*CSearchForm *pBESearch*/);
void LoadTShooters(HKEY hRegKey);
int GetCount() {return m_acnid;};
void BackUp(int nid, int state);
void ClearBackup() {m_Backup.Clear();};
void WriteProblem();
BOOL FSetNodeOfIdh(IDH, IST);
int GetForcedRecommendation();
int Finish(CString *cstr);
void ResetService();
VOID PrintRecommendations();
VOID WriteOutLogs();
VOID SetBelief(BCache *pAPI);
TCHAR *EvalData(UINT var_index);
BOOL NextVar(UINT var_index);
BOOL InitVar(UINT var_index);
void SetProblemAsk();
void ClearProblemAsk();
void SetType(LPCTSTR type);
BOOL IsService(CString *cstr);
VOID RemoveSkips();
CSniffedNodeContainer* GetSniffedNodeContainer() {return m_api;}
protected:
void GetBackButton(CString &strBack);
void GetNextButton(CString &strNext);
void GetStartButton(CString &strStart);
void GetStd3ButtonEnList(CString *cstr, bool bIncludeBackButton, bool bIncludeNextButton, bool bIncludeStartButton);
bool GetNetPropItemStrs(TSZC item, UINT Res, CString *cstr);
bool GetNodePropItemStrs(TSZC item, UINT Res, CString *cstr);
VOID GetByeMsg(LPCTSTR szIdh, CString *cstr);
VOID GetFailMsg(LPCTSTR szIdh, CString *cstr);
VOID GetServiceMsg(LPCTSTR szIdh, CString *cstr);
VOID GetSkippedNodesMsg(LPCTSTR szIdh, CString *cstr);
VOID GetImpossibleNodesMsg(LPCTSTR szIdh, CString *cstr);
VOID GetFixRadios(LPCTSTR szIdh, CString *cstr);
VOID GetInfoRadios(LPCTSTR szIdh, CString *cstr);
VOID PrintMessage(TSZC szcFormat, ...) const;
VOID PrintString(TSZC szcFormat, ...) const;
void WriteResult(UINT name, UINT value, BOOL bSet, TSZC szctype, CString *cstr) const;
VOID CloseTable();
BOOL FxGetNode(NID nid, BOOL fStatus, CString *cstr) const;
void FxGetState(CString *cstr);
void FxInitState(NID nid);
VOID GetIdhPage(IDH idh, CString *cstr);
bool BelongsOnProblemPage(int index);
VOID GetIdhProblemPage(IDH idh, CString *cstr);
VOID OutputBackend(CString *cstr) const;
BOOL DisplayTerms(/*CWordList *pWords, */CString *cstr, BOOL bText, BOOL bOr) const;
VOID AddBackendDebug(CString *cstr) const;
void GetTS(CString *pCtmp);
private:
VOID AddSkip(NID nid);
BOOL FSkip(NID nid) const;
void SaveNID(UINT nid);
private:
CBackupInfo m_Backup;
UINT m_cnidSkip; // count of elements in m_rgnidSkip
NID m_rgnidSkip[cnidMacSkip]; // nodes for which the user has been unable to give
// a yes or no answer.
UINT m_ilineStat;
BOOL m_fDone; // (>>> Not well-understood 11/04/97 JM)
// Set TRUE when we write out service, fail, or
// success page, but there's some scenario where
// we clear it "so that the Previous button will work"
// on BYE page"
UINT m_ishowService; // >>> (JM 12/97) I suspect this is the same as OnlineTS's
// BOOL m_bAnythingElse; which is documented as
// Set TRUE if user wants to see if there is anything
// else they can try (obtained from a service node in the
// previous call to the DLL
IDH m_idhQuestion; // >>> (JM 12/97) I suspect this is the same as OnlineTS's
// NID m_nidAnythingElse; which is documented as
// Node to use if m_bAnythingElse is TRUE
private:
CString *m_pCtmp; // (uses new) just a scratch buffer
int m_cShooters; // a count of troubleshooting belief networks. JM strongly
// suspects 3/98 that in Local TS it never gets past 1.
// >>> presumably count of m_aShooters, so why don't we just
// use GetCount(), anyway?.
int m_iShooter; // index of a troubleshooting belief network. JM strongly
// suspects 3/98 that in Local TS it is always 0.
// presumably index into m_aShooters.
CMap<int, int, int, int>m_SkippedTwice;
CArray<TShooter, TShooter &> m_aShooters;
NID m_cnid; // number of positions used in m_rgnid
NID m_rgnid[64]; // node numbers of recommendations the user has visited
NID m_question_rgnid[64]; // new recommendations. We only care about the first
// recommendation not already offered and skipped.
UINT m_cur_rec; // index into m_rgnid. We use this to loop through as we write
// the "visited node table"
UINT m_max_rec; // number of defined values in m_question_rgnid
UINT m_cur_rec_inid;
// The next 3 variables deal with states of a single node N, typically m_rgnid[m_cur_rec]
UINT m_cur_state_set; // state value of node N
UINT m_cur_cst; // count of states of node N
UINT m_cur_ist; // index into states of node N, used to build a list of radio
// buttons and log entries.
UINT m_problemAsk; // >>> A thinly disguised Boolean. >>>(I think) something to do with
// whether we return data on the problem node (vs. state-dependent
// data) JM 10/30//97
TCHAR m_problem[200]; // once a problem is chosen, this is where we put the associated
// text description of the problem. Full text description plus
// a hidden data field.
NID m_firstNid;
UINT m_firstSet;
TCHAR m_tstype[30]; // symbolic name of troubleshooter
//
// now in the CSniffedContainer object
/*
IDH m_idhSniffedRecommendation; // if a recommendation from a sniffer overrides normal
// method of getting a recommendation, here's where we store it.
// Otherwise, nidNil+idhFirst.
*/
protected:
TSZ m_szFile;
FILE* m_pfile;
BOOL m_bHttp;
CHAR m_szTemp1[MAXBUF];
CString *m_pCtxt; // points to a buffer passed in to constructor. This is where
// we build the HTML to pass back to the user
TCHAR m_currdir[MAXBUF];
CString *m_pResult; // A string to indicate (in the log) a FINAL result of a
// Troubleshoot session. e.g. ">Success", ">Nothing Else",
// ">Anything Else?", ">Help Elsewhere"
CString *m_pSearchStr; // a string consisting of the search words implied by our node
// choices, separated by "and" or "or" (depending on the
// value of m_pBESearch->IsAND). Used as part of Back End
// Search redirection. >>> Probably irrelevant to Local TS,
// which doesn't use BES
BCache *m_api; // cache for associated belief network
BOOL m_bService;
NID m_nidPreloadCheck;
CNID m_acnid; // count of nodes at *m_api
};