windows-nt/Source/XPSP1/NT/termsrv/setup/tsdiag/dll/tsdgns.cpp

377 lines
7.1 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
// 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;
}