Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

167 lines
5.0 KiB

//
// 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 [email protected]
//
// 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;
}