168 lines
5 KiB
C++
168 lines
5 KiB
C++
//
|
|
// MODULE: LaunchTS.cpp
|
|
//
|
|
// PURPOSE: The interface that TSHOOT.OCX uses to get network and node information
|
|
// from the LaunchServ.
|
|
//
|
|
// PROJECT: Local Troubleshooter Launcher for the Device Manager
|
|
//
|
|
// COMPANY: Saltmine Creative, Inc. (206)-633-4743 support@saltmine.com
|
|
//
|
|
// AUTHOR: Richard Meadows
|
|
// COMMENTS BY: Joe Mabel
|
|
//
|
|
// ORIGINAL DATE: 2-26-98
|
|
//
|
|
//
|
|
// Version Date By Comments
|
|
//--------------------------------------------------------------------
|
|
// V0.1 - RM Original
|
|
///////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "LaunchServ.h"
|
|
#include "StateInfo.h"
|
|
#include "LaunchTS.h"
|
|
|
|
#include "ComGlobals.h"
|
|
|
|
extern CSMStateInfo g_StateInfo;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CLaunchTS - Created as a plain apartment model interface.
|
|
|
|
// This fills in m_refedLaunchState from TSLaunchServ's global memory.
|
|
// The resulting values tell us what troubleshooting network to use and can
|
|
// indicate a problem node and even indicate states to set for other nodes.
|
|
STDMETHODIMP CLaunchTS::GetShooterStates(DWORD * pdwResult)
|
|
{
|
|
HRESULT hRes;
|
|
m_csThreadSafeBr.Lock();
|
|
hRes = g_StateInfo.GetShooterStates(m_refedLaunchState, pdwResult);
|
|
m_csThreadSafeBr.Unlock();
|
|
return hRes;
|
|
}
|
|
|
|
// OUTPUT pbstrShooter is the name of the Troubleshooting network to launch to
|
|
// Note that this string is allocated by this function
|
|
// Returns true if there is a Troubleshooting network to launch to
|
|
// Must be called after CLaunchTS::GetShooterStates, since it assumes
|
|
// m_refedLaunchState contains good values
|
|
STDMETHODIMP CLaunchTS::GetTroubleShooter(BSTR * pbstrShooter)
|
|
{
|
|
LPTSTR pszCmd;
|
|
LPTSTR pszVal;
|
|
m_csThreadSafeBr.Lock();
|
|
if (!m_refedLaunchState.GetNetwork(&pszCmd, &pszVal))
|
|
{
|
|
m_csThreadSafeBr.Unlock();
|
|
return S_FALSE;
|
|
}
|
|
*pbstrShooter = SysAllocString((BSTR) CComBSTR(pszVal));
|
|
m_csThreadSafeBr.Unlock();
|
|
return S_OK;
|
|
}
|
|
|
|
// OUTPUT pbstrProblem is the symbolic name of the selected problem node
|
|
// Note that this string is allocated by this function
|
|
// Returns true if there is a selected problem node
|
|
// Must be called after CLaunchTS::GetShooterStates, since it assumes
|
|
// m_refedLaunchState contains good values
|
|
STDMETHODIMP CLaunchTS::GetProblem(BSTR * pbstrProblem)
|
|
{
|
|
LPTSTR pszCmd;
|
|
LPTSTR pszVal;
|
|
m_csThreadSafeBr.Lock();
|
|
if (!m_refedLaunchState.GetProblem(&pszCmd, &pszVal))
|
|
{
|
|
m_csThreadSafeBr.Unlock();
|
|
return S_FALSE;
|
|
}
|
|
*pbstrProblem = SysAllocString((BSTR) CComBSTR(pszVal));
|
|
m_csThreadSafeBr.Unlock();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CLaunchTS::GetMachine(BSTR * pbstrMachine)
|
|
{
|
|
m_csThreadSafeBr.Lock();
|
|
*pbstrMachine = ::SysAllocString((BSTR) CComBSTR(m_refedLaunchState.m_szMachineID));
|
|
m_csThreadSafeBr.Unlock();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CLaunchTS::GetPNPDevice(BSTR *pbstrPNPDevice)
|
|
{
|
|
m_csThreadSafeBr.Lock();
|
|
*pbstrPNPDevice = ::SysAllocString((BSTR) CComBSTR(m_refedLaunchState.m_szPNPDeviceID));
|
|
m_csThreadSafeBr.Unlock();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CLaunchTS::GetGuidClass(BSTR *pbstrGuidClass)
|
|
{
|
|
m_csThreadSafeBr.Lock();
|
|
*pbstrGuidClass = ::SysAllocString((BSTR) CComBSTR(m_refedLaunchState.m_szGuidClass));
|
|
m_csThreadSafeBr.Unlock();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CLaunchTS::GetDeviceInstance(BSTR *pbstrDeviceInstance)
|
|
{
|
|
m_csThreadSafeBr.Lock();
|
|
*pbstrDeviceInstance = ::SysAllocString((BSTR) CComBSTR(m_refedLaunchState.m_szDeviceInstanceID));
|
|
m_csThreadSafeBr.Unlock();
|
|
return S_OK;
|
|
}
|
|
|
|
// INPUT iNode - index of (non-problem) node. Typically, this function should be called
|
|
// in a loop where we first see if there is a pbstrNode value for iNode == 0 and then
|
|
// increment iNode until we reach a value for which pbstrNode is undefined.
|
|
// OUTPUT pbstrNode is the symbolic name of a (non-problem) node whose state we want to set
|
|
// Note that this string is allocated by this function
|
|
// Returns true if there is a selected problem node
|
|
// Must be called after CLaunchTS::GetShooterStates, since it assumes
|
|
// m_refedLaunchState contains good values
|
|
STDMETHODIMP CLaunchTS::GetNode(short iNode, BSTR * pbstrNode)
|
|
{
|
|
LPTSTR pszCmd;
|
|
LPTSTR pszVal;
|
|
m_csThreadSafeBr.Lock();
|
|
if (!m_refedLaunchState.GetNodeState(iNode, &pszCmd, &pszVal))
|
|
{
|
|
m_csThreadSafeBr.Unlock();
|
|
return S_FALSE;
|
|
}
|
|
*pbstrNode = SysAllocString((BSTR) CComBSTR(pszCmd));
|
|
m_csThreadSafeBr.Unlock();
|
|
return S_OK;
|
|
}
|
|
|
|
// see comments on CLaunchTS::GetNode; this returns the node state rather than
|
|
// the symbolic node name
|
|
STDMETHODIMP CLaunchTS::GetState(short iNode, BSTR * pbstrState)
|
|
{
|
|
LPTSTR pszCmd;
|
|
LPTSTR pszVal;
|
|
m_csThreadSafeBr.Lock();
|
|
if (!m_refedLaunchState.GetNodeState(iNode, &pszCmd, &pszVal))
|
|
{
|
|
m_csThreadSafeBr.Unlock();
|
|
return S_FALSE;
|
|
}
|
|
*pbstrState = SysAllocString((BSTR) CComBSTR(pszVal));
|
|
m_csThreadSafeBr.Unlock();
|
|
return S_OK;
|
|
}
|
|
|
|
// Test: Used to get network and node information from the server without
|
|
// launching the browser. Use the TShootATL::Test method before ILaunchTS::Test.
|
|
STDMETHODIMP CLaunchTS::Test()
|
|
{
|
|
extern CSMStateInfo g_StateInfo;
|
|
m_csThreadSafeBr.Lock();
|
|
g_StateInfo.TestGet(m_refedLaunchState);
|
|
m_csThreadSafeBr.Unlock();
|
|
return S_OK;
|
|
}
|