// // MODULE: APGTSCTX.CPP // // PURPOSE: Implementation file for Thread Context // // 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.2 6/4/97 RWM Local Version for Memphis // V0.3 04/09/98 JM/OK+ Local Version for NT5 // //#include "windows.h" #include "stdafx.h" #include "time.h" #include "apgts.h" #include "ErrorEnums.h" #include "bnts.h" #include "BackupInfo.h" #include "cachegen.h" #include "apgtsinf.h" #include "apgtscmd.h" #include "apgtshtx.h" #include "apgtscls.h" #include "TSHOOT.h" int idcomp(const void *elem1, const void *elem2); //----------------- // APGTSContext::APGTSContext() { m_pConf = NULL; m_dwErr = 0; m_infer = NULL; m_currcfg = NULL; _tcscpy(m_resptype, _T("200 OK")); m_pszheader = NULL; m_pCtxt = NULL; m_pQry = NULL; return; } // // APGTSContext::APGTSContext( BNCTL *currcfg, CDBLoadConfiguration *pConf, CHttpQuery *pHttpQuery) { m_infer = NULL; Initialize(currcfg, pConf, pHttpQuery); return; } // // void APGTSContext::Initialize( BNCTL *currcfg, CDBLoadConfiguration *pConf, CHttpQuery *pHttpQuery) { struct tm *newtime; TCHAR buf[MAXBUF+1]; m_pConf = pConf; m_dwErr = 0; m_infer = NULL; m_currcfg = currcfg; _tcscpy(m_resptype, _T("200 OK")); if (m_pszheader) delete m_pszheader; m_pszheader = new CString(); if (m_pCtxt) delete m_pCtxt; m_pCtxt = new CString(); m_pQry = pHttpQuery; if (m_pszheader) *m_pszheader += _T("Content-Type: text/html\r\n"); m_pConf->GetVrootPath(m_vroot); time( &m_aclock ); newtime = localtime( &m_aclock ); _tcscpy(buf,_tasctime(newtime)); if (_tcslen(buf)) buf[_tcslen(buf)-1] = _T('\0');// remove cr // get ip address to put into event log DWORD bufsize = MAXBUF - 1; if (!m_pCtxt || !m_pszheader) { m_dwErr = EV_GTS_ERROR_NO_STRING; return; } if (!m_pQry) { m_dwErr = EV_GTS_ERROR_NO_QUERY; return; } // create inference engine and related structures m_infer = new CInfer(m_pCtxt); if (!m_infer) { m_dwErr = EV_GTS_ERROR_NO_INFER; return; } } void APGTSContext::RemoveSkips() { ASSERT(m_infer); if (m_infer) m_infer->RemoveSkips(); return; } void APGTSContext::ResetService() { m_infer->ResetService(); return; } void APGTSContext::RenderNext(CString &strPage) { CString strTmp; strTmp.LoadString(IDS_ER_ERRORS_OCCURED); if (m_pszheader) { *m_pszheader += _T("\r\n"); } if (m_pCtxt) { if (m_dwErr) *m_pCtxt += strTmp; // write out CString here if (m_pCtxt->GetLength() > 0) strPage = m_pCtxt->GetBuffer(0); } else { strPage = strTmp; } return; } void APGTSContext::Empty() { *m_pCtxt = _T(""); return; } // // APGTSContext::~APGTSContext() { // AfxMessageBox("Context"); if (m_infer) delete m_infer; if (m_pCtxt) delete m_pCtxt; if (m_pszheader) delete m_pszheader; } // This must be called to process the data // // // void APGTSContext::DoContent(CHttpQuery *pQry) { CString strRefedCmd; CString strRefedValue; CString strTxt; ASSERT(NULL != pQry); m_pQry = pQry; if (m_pQry->GetFirst(strRefedCmd, strRefedValue)) { DWORD dwStat = ProcessCommands((LPCTSTR) strRefedCmd, (LPCTSTR) strRefedValue); if (dwStat != 0) { TCHAR temp[MAXCHAR]; if (dwStat != EV_GTS_INF_FIRSTACC) m_dwErr = dwStat; _stprintf(temp, _T("%d"), 0); // used to put extended error here ReportWFEvent( _T("[apgtscxt]"), //Module Name _T("[EndCommands]"), //event //m_pszQuery, NULL, temp, dwStat ); } } else { strTxt.LoadString(IDS_ER_NO_INPUT_PARAMS); *m_pCtxt += strTxt; ReportWFEvent( _T("[apgtscxt]"), //Module Name _T("[ProcessQuery]"), //event //m_ipstr, NULL, _T(""), EV_GTS_USER_NO_STRING ); } } // // DWORD APGTSContext::ProcessCommands(LPCTSTR pszCmd, LPCTSTR pszValue) { DWORD dwStat = 0; CString strTxt; // first command should be troubleshooter type if (!_tcscmp(pszCmd, C_TYPE) || !_tcscmp(pszCmd, C_PRELOAD)) { DWORD dwOff; CHTMLInputTemplate *pInputTemplate; //CSearchForm *pBESearch = NULL; BCache *pAPI; if (m_pConf->FindAPIFromValue(m_currcfg, pszValue, &pInputTemplate, /*&pBESearch, */ &pAPI, &dwOff)) { if ((dwStat = m_infer->Initialize(/*pBESearch*/)) != 0) { strTxt.LoadString(IDS_ER_MISSING_API); *m_pCtxt += strTxt; } else { dwStat = DoInference(pszCmd, pszValue, pInputTemplate, pAPI, dwOff); } } else { dwStat = EV_GTS_ERROR_INF_BADTYPECMD; strTxt.LoadString(IDS_ER_UNEXP_CMDA); *m_pCtxt += strTxt; *m_pCtxt += pszValue; } } else if (!_tcscmp(pszCmd, C_FIRST)) { DisplayFirstPage(); dwStat = EV_GTS_INF_FIRSTACC; } else { dwStat = EV_GTS_ERROR_INF_BADCMD; strTxt.LoadString(IDS_ER_UNEXP_CMD); *m_pCtxt += strTxt; *m_pCtxt += pszCmd; } return (dwStat); } // // DWORD APGTSContext::DoInference(LPCTSTR pszCmd, LPCTSTR pszValue, CHTMLInputTemplate *pInputTemplate, BCache *pAPI, DWORD dwOff) { DWORD dwCount = 0, dwStat = 0; BOOL bPreload = FALSE; CString strTxt; if (!_tcscmp(pszCmd, C_PRELOAD)) bPreload = TRUE; pInputTemplate->SetInfer(m_infer, m_vroot); m_infer->SetBelief(pAPI); // set type troubleshooter type in template pInputTemplate->SetType(pszValue); m_infer->SetType(pszValue); int refedCmd, refedVal; BOOL bProbAsk = TRUE; // RSStack InvertState; while (m_pQry->GetNext(refedCmd, refedVal)) { dwCount++; if (!m_infer->FSetNodeOfIdh(refedCmd, refedVal)) dwStat = EV_GTS_ERROR_INF_NODE_SET; } // if (0 == dwCount) { m_infer->SetProblemAsk(); m_infer->ClearDoubleSkip(); } else { m_infer->ClearProblemAsk(); } if (!dwStat) { pInputTemplate->Print(dwCount, m_pCtxt); /* if (m_infer->IsService(m_pszheader)) { strTxt.LoadString(IDS_I_OBJ_MOVED); _tcscpy(m_resptype, (LPCTSTR) strTxt); } */ } else { strTxt.LoadString(IDS_ER_SVR_BAD_DATA); *m_pCtxt += strTxt; } return dwStat; } // // void APGTSContext::DisplayFirstPage() { DWORD i, apicount; CString strTxt; *m_pCtxt += _T(""); strTxt.LoadString(IDS_FP_TITLE); *m_pCtxt += strTxt; *m_pCtxt += _T("\n"); *m_pCtxt += _T("\n

"); strTxt.LoadString(IDS_FP_HEADER); *m_pCtxt += strTxt; *m_pCtxt += VERSIONSTR; *m_pCtxt += _T("

\n"); *m_pCtxt = _T("
\n"); apicount = m_pConf->GetFileCount(m_currcfg); if (!apicount) { strTxt.LoadString(IDS_ER_NO_API); *m_pCtxt += strTxt; } else { for (i=0;iGetTagStr(m_currcfg, i)); *m_pCtxt += strTxt; *m_pCtxt += _T("GetTagStr(m_currcfg, i); *m_pCtxt += _T("\">\n"); *m_pCtxt += _T("\n"); } } *m_pCtxt += _T("
\n"); } // id compare in descending order // int idcomp(const void *elem1, const void *elem2) { return(((EVAL_WORD_METRIC *)elem2)->dwVal - ((EVAL_WORD_METRIC *)elem1)->dwVal); }