// tsdgns.cpp : Implementation of CTSDiagnosis #include "stdafx.h" #include "TSDiag.h" #include "tsdgns.h" #include "testdata.h" #include "suites.h" static int iTSDiag = 0; CTSDiagnosis::CTSDiagnosis() { m_dwSuite = 0; iTSDiag++; TCHAR szString[256]; _stprintf(szString, _T("iTSDiag = %d\n"), iTSDiag); OutputDebugString(szString); } CTSDiagnosis::~CTSDiagnosis() { iTSDiag--; TCHAR szString[256]; _stprintf(szString, _T("iTSDiag = %d\n"), iTSDiag); OutputDebugString(szString); } DWORD CTSDiagnosis::GetTotalTestCount () { return GlobalTestData.GetTestCount(m_dwSuite); } STDMETHODIMP CTSDiagnosis::get_TestCount(long *pVal) { // TODO: Add your implementation code here *pVal = GetTotalTestCount (); return ERROR_SUCCESS; } STDMETHODIMP CTSDiagnosis::get_TestDescription(int i, BSTR * pVal) { // TODO: Add your implementation code here if (i >= (int)GetTotalTestCount ()) { return ERROR_INVALID_PARAMETER; } if (!pVal) { return ERROR_INVALID_PARAMETER; } return E_NOTIMPL; return ERROR_SUCCESS; } STDMETHODIMP CTSDiagnosis::get_TestApplicable(int i, BOOL *pbApplicable) { if (i >= (int)GetTotalTestCount ()) { return ERROR_INVALID_PARAMETER; } if (!pbApplicable) { return ERROR_INVALID_PARAMETER; } PTVerificationTest pTest = GlobalTestData.GetTest(m_dwSuite, i); if (pTest->pfnNeedRunTest && !(*(pTest->pfnNeedRunTest))()) { *pbApplicable = FALSE; } else { *pbApplicable = TRUE; } return ERROR_SUCCESS; } STDMETHODIMP CTSDiagnosis::RunTest(int i) { USES_CONVERSION; if (i >= (int)GetTotalTestCount ()) { return ERROR_INVALID_PARAMETER; } PTVerificationTest pTest = GlobalTestData.GetTest(m_dwSuite, i); if (pTest->pfnNeedRunTest && !(*(pTest->pfnNeedRunTest))()) { return ERROR_INVALID_PARAMETER; } ASSERT (pTest->pfnTestFunc); char szOutput[512]; ostrstream oTestResult(szOutput, 512); ZeroMemory(oTestResult.str(), 512); m_lTestResult = (*(pTest->pfnTestFunc))(oTestResult); //oTestResult << "\0"; m_bstrTestResultString = oTestResult.str(); return S_OK; } STDMETHODIMP CTSDiagnosis::get_TestResultString(BSTR *pVal) { if (!pVal) { return ERROR_INVALID_PARAMETER; } *pVal = m_bstrTestResultString.copy(); return S_OK; } STDMETHODIMP CTSDiagnosis::get_TestResult(long *pVal) { if (!pVal) { return ERROR_INVALID_PARAMETER; } *pVal = m_lTestResult; return S_OK; } STDMETHODIMP CTSDiagnosis::put_TestType(VARIANT newVal) { switch(newVal.vt) { case VT_I4 : case VT_UI2: case VT_UINT: case VT_INT: { if (DWORD(newVal.iVal) >= GlobalTestData.GetSuiteCount()) { return E_INVALIDARG; } else { m_dwSuite = newVal.iVal; } } break; case VT_BSTR : { if (!newVal.bstrVal) { return E_INVALIDARG; } else { _bstr_t bstrGroupName = newVal.bstrVal; for (DWORD i = 0; i < GlobalTestData.GetSuiteCount(); i++) { if (0 == _tcscmp(bstrGroupName, GlobalTestData.GetSuiteName(i)) ) { m_dwSuite = i; } } if (i == GlobalTestData.GetSuiteCount()) { return E_INVALIDARG; } } } break; default: return E_INVALIDARG; break; } return S_OK; } STDMETHODIMP CTSDiagnosis::get_TestDetails(int i, BSTR *pVal) { // TODO: Add your implementation code here if (i >= (int)GetTotalTestCount ()) { return ERROR_INVALID_PARAMETER; } if (!pVal) { return ERROR_INVALID_PARAMETER; } bstr_t bstrTestDetails; PTVerificationTest pTest = GlobalTestData.GetTest(m_dwSuite, i); bstrTestDetails = pTest->TestDetails; *pVal = bstrTestDetails.copy(); return ERROR_SUCCESS; } STDMETHODIMP CTSDiagnosis::ExecuteIt(BSTR strCommand) { ASSERT(strCommand); HINSTANCE hInst = ShellExecute(NULL, _T("open"), strCommand, NULL, NULL, SW_SHOW ); if (32 > PtrToLong(hInst)) { PROCESS_INFORMATION pinfo; STARTUPINFO sinfo; ZeroMemory(&sinfo, sizeof(sinfo)); sinfo.cb = sizeof(sinfo); if (CreateProcess( NULL, // name of executable module strCommand, // command line string NULL, // SD NULL, // SD FALSE, // handle inheritance option CREATE_NEW_PROCESS_GROUP, // creation flags NULL, // new environment block NULL, // current directory name &sinfo, // startup information &pinfo // process information )) { // MessageBox(NULL, _T("Executed fine"), _T("TSDIAG"), MB_OK); } else { MessageBox(NULL, _T("Failed to Execute"), _T("TSDIAG"), MB_OK); } } return S_OK; } STDMETHODIMP CTSDiagnosis::put_RemoteMachineName(BSTR newVal) { if (!GlobalTestData.SetMachineName(newVal)) return E_OUTOFMEMORY; return S_OK; } STDMETHODIMP CTSDiagnosis::get_SuiteApplicable (DWORD dwSuite, BOOL * pVal) { if (!pVal) { return ERROR_INVALID_PARAMETER; } if (dwSuite >= GlobalTestData.GetSuiteCount()) { return ERROR_INVALID_PARAMETER; } *pVal = GlobalTestData.CanExecuteSuite(dwSuite); return S_OK; } STDMETHODIMP CTSDiagnosis::get_SuiteErrorText (DWORD dwSuite, BSTR * pVal) { if (!pVal) { return ERROR_INVALID_PARAMETER; } if (dwSuite >= GlobalTestData.GetSuiteCount()) { return ERROR_INVALID_PARAMETER; } bstr_t bstrSuiteError; bstrSuiteError = GlobalTestData.GetSuiteErrorText(dwSuite); *pVal = bstrSuiteError.copy(); return S_OK; } STDMETHODIMP CTSDiagnosis::ExecuteCommand (BSTR strCommand) { ASSERT(strCommand); HINSTANCE hInst = ShellExecute(NULL, _T("open"), strCommand, NULL, NULL, SW_SHOW ); if (32 > PtrToLong(hInst)) { PROCESS_INFORMATION pinfo; STARTUPINFO sinfo; ZeroMemory(&sinfo, sizeof(sinfo)); sinfo.cb = sizeof(sinfo); if (CreateProcess( NULL, // name of executable module strCommand, // command line string NULL, // SD NULL, // SD FALSE, // handle inheritance option CREATE_NEW_PROCESS_GROUP, // creation flags NULL, // new environment block NULL, // current directory name &sinfo, // startup information &pinfo // process information )) { // MessageBox(NULL, _T("Executed fine"), _T("TSDIAG"), MB_OK); } else { MessageBox(NULL, _T("Failed to Execute"), _T("TSDIAG"), MB_OK); } } return S_OK; } STDMETHODIMP CTSDiagnosis::put_MachineName (BSTR newVal) { if (!GlobalTestData.SetMachineName(newVal)) { return E_OUTOFMEMORY; } return S_OK; } STDMETHODIMP CTSDiagnosis::get_Suites (VARIANT * pVal) { if (!pVal) { return E_POINTER; } CComObject *pSuites; HRESULT hr = CComObject::CreateInstance(&pSuites); if (FAILED(hr)) return hr; // if we need to initialize our Suites object, it should be done here. IDispatch* pDisp = NULL; hr = pSuites->QueryInterface(&pDisp); if (SUCCEEDED(hr)) { pVal->vt = VT_DISPATCH; pVal->pdispVal = pDisp; // if we need to initialize our Suites object, it should be done here. } else { delete pSuites; } return hr; }