377 lines
7.1 KiB
C++
377 lines
7.1 KiB
C++
|
// 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<CSuites> *pSuites;
|
||
|
|
||
|
HRESULT hr = CComObject<CSuites>::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;
|
||
|
}
|