280 lines
7.1 KiB
C++
280 lines
7.1 KiB
C++
// ConnectionManager.cpp : Implementation of CConnectionManager
|
|
#include "stdafx.h"
|
|
#include "Connection.h"
|
|
#include "ConnMgr.h"
|
|
#include "ConnectionManager.h"
|
|
|
|
#include <process.h>
|
|
#include "Ping.h"
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CConnectionManager
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
|
|
CConnectionManager::CConnectionManager()
|
|
{
|
|
OutputDebugString(_T("CConnectionManager::CConnectionManager()\n"));
|
|
}
|
|
|
|
CConnectionManager::~CConnectionManager()
|
|
{
|
|
OutputDebugString(_T("CConnectionManager::~CConnectionManager()\n"));
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Final Construct and Release
|
|
|
|
HRESULT CConnectionManager::FinalConstruct()
|
|
{
|
|
OutputDebugString(_T("CConnectionManager::FinalConstruct()\n"));
|
|
|
|
HRESULT hRes = CreateLocator();
|
|
|
|
return hRes;
|
|
}
|
|
|
|
void CConnectionManager::FinalRelease()
|
|
{
|
|
OutputDebugString(_T("CConnectionManager::FinalRelease()\n"));
|
|
|
|
Destroy();
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Startup/Termination
|
|
|
|
HRESULT CConnectionManager::CreateLocator()
|
|
{
|
|
OutputDebugString(_T("CConnectionManager::CreateLocator()\n"));
|
|
|
|
m_pIWbemLocator = NULL;
|
|
|
|
HRESULT hr = CoCreateInstance(CLSID_WbemLocator,
|
|
NULL,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_IWbemLocator,
|
|
(LPVOID*)&m_pIWbemLocator);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
OutputDebugString(_T("Failed to create Locator !"));
|
|
return hr;
|
|
}
|
|
|
|
ASSERT(m_pIWbemLocator);
|
|
|
|
return hr;
|
|
}
|
|
|
|
void CConnectionManager::Destroy()
|
|
{
|
|
OutputDebugString(_T("CConnectionManager::Destroy()\n"));
|
|
|
|
// destroy all the connections laying around
|
|
POSITION pos = m_ConnectionMap.GetStartPosition();
|
|
CConnection* pConnection = NULL;
|
|
CString sName;
|
|
while( pos != NULL )
|
|
{
|
|
m_ConnectionMap.GetNextAssoc( pos, sName, pConnection);
|
|
ASSERT(pConnection);
|
|
ASSERT_VALID(pConnection);
|
|
if( pConnection )
|
|
delete pConnection;
|
|
}
|
|
|
|
m_ConnectionMap.RemoveAll();
|
|
|
|
if( m_pIWbemLocator )
|
|
{
|
|
m_pIWbemLocator->Release();
|
|
m_pIWbemLocator = NULL;
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Helper functions
|
|
BOOL CConnectionManager::ValidMachine(BSTR& bsMachine)
|
|
{
|
|
OutputDebugString(_T("CConnection::ValidateMachine()\n"));
|
|
CPing Pong;
|
|
|
|
// Resolve the machine name to see it is valid
|
|
unsigned long ulIP = Pong.ResolveName(bsMachine);
|
|
if( ulIP == 0L )
|
|
{
|
|
CString sDebugString;
|
|
sDebugString.Format(_T("Could not resolve hostname for <%s>.\n"), CString(bsMachine));
|
|
OutputDebugString(sDebugString);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Interface Methods.
|
|
|
|
STDMETHODIMP CConnectionManager::GetConnection(BSTR bsMachineName,
|
|
IWbemServices __RPC_FAR *__RPC_FAR * ppIWbemServices,
|
|
long* lStatus)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
CString sDebugString;
|
|
sDebugString.Format(_T("CConnectionManager::GetConnection() for %s.\n"), CString(bsMachineName));
|
|
OutputDebugString(sDebugString);
|
|
|
|
|
|
*ppIWbemServices = NULL;
|
|
*lStatus = 0;
|
|
|
|
// if connection is already in the map, return it.
|
|
CConnection* pConnection = NULL;
|
|
|
|
if( m_ConnectionMap.Lookup(bsMachineName,pConnection) != 0 )
|
|
{
|
|
ASSERT(pConnection);
|
|
ASSERT_VALID(pConnection);
|
|
|
|
if( pConnection->m_bAvailable)
|
|
{
|
|
*ppIWbemServices = pConnection->m_pIWbemServices;
|
|
(*ppIWbemServices)->AddRef();
|
|
*lStatus = 1;
|
|
}
|
|
else
|
|
{
|
|
sDebugString.Format(_T("GetConnection(%s)-Connection is unavailable. Last connect attempt result=<%X>.\n"), CString(bsMachineName), pConnection->m_hrLastConnectResult);
|
|
OutputDebugString(sDebugString);
|
|
}
|
|
return pConnection->m_hrLastConnectResult;
|
|
}
|
|
|
|
// if not valid, do not add it the map
|
|
if (!ValidMachine(bsMachineName))
|
|
return E_FAIL;
|
|
|
|
// otherwise create a new connection.
|
|
pConnection = new CConnection(bsMachineName, m_pIWbemLocator);
|
|
m_ConnectionMap.SetAt(bsMachineName,pConnection);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CConnectionManager::RemoveConnection(BSTR bsMachineName,IWbemObjectSink * pSink)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
|
|
|
OutputDebugString(_T("CConnectionManager::RemoveConnection()\n"));
|
|
|
|
CConnection* pConnection = NULL;
|
|
|
|
if( m_ConnectionMap.Lookup(bsMachineName,pConnection) != 0 )
|
|
{
|
|
ASSERT(pConnection);
|
|
ASSERT_VALID(pConnection);
|
|
|
|
if( pConnection == NULL )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
if (pSink)
|
|
pConnection->RemoveEventEntry(pSink);
|
|
|
|
if( pConnection->GetEventConsumerCount() == 0 )
|
|
{
|
|
if (!m_ConnectionMap.RemoveKey(bsMachineName))
|
|
OutputDebugString(_T("CConnectionManager::RemoveConnection() - Failed to Remove Connection!\n"));
|
|
delete pConnection;
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CConnectionManager::RegisterEventNotification(BSTR bsMachineName,
|
|
BSTR bsQuery,
|
|
IWbemObjectSink * pSink)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
|
OutputDebugString(_T("CConnectionManager::RegisterEventNotification()\n"));
|
|
|
|
ASSERT(pSink);
|
|
|
|
CConnection* pConnection = NULL;
|
|
if( m_ConnectionMap.Lookup(bsMachineName,pConnection) == 0 )
|
|
{
|
|
OutputDebugString(_T("CConnectionManager::RegisterEventNotification()-Failed to find connection\n"));
|
|
return E_FAIL;
|
|
}
|
|
|
|
ASSERT(pConnection);
|
|
|
|
BOOL bResultRegister = pConnection->AddEventEntry(bsQuery,pSink);
|
|
|
|
if (!bResultRegister)
|
|
{
|
|
OutputDebugString(_T("CConnectionManager::RegisterEventNotification()-Failed to add event.\n"));
|
|
return E_FAIL;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CConnectionManager::ExecQueryAsync(BSTR bsMachineName, BSTR bsQuery, IWbemObjectSink *pSink)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
|
|
|
OutputDebugString(_T("CConnectionManager::ExecQueryAsync()\n"));
|
|
|
|
ASSERT(pSink);
|
|
|
|
CConnection* pConnection = NULL;
|
|
if( m_ConnectionMap.Lookup(bsMachineName,pConnection) == 0 )
|
|
{
|
|
OutputDebugString(_T("CConnectionManager::ExecQueryAsync()-Failed to find connection\n"));
|
|
return E_FAIL;
|
|
}
|
|
|
|
ASSERT(pConnection);
|
|
HRESULT hRes = S_OK;
|
|
|
|
if( pConnection->m_bAvailable )
|
|
{
|
|
OutputDebugString(_T("ExecQueryAsync - connection available\n"));
|
|
ASSERT(pConnection->m_pIWbemServices);
|
|
BSTR bsLanguage = SysAllocString(_T("WQL"));
|
|
hRes = pConnection->m_pIWbemServices->ExecQueryAsync(bsLanguage, bsQuery, WBEM_FLAG_BIDIRECTIONAL, NULL, pSink);
|
|
SysFreeString(bsLanguage);
|
|
CString sDebugString;
|
|
sDebugString.Format(_T("ExecQueryAsync returns %x\n"),hRes);
|
|
OutputDebugString(sDebugString);
|
|
}
|
|
else
|
|
{
|
|
OutputDebugString(_T("ExecQueryAsync - no connection available\n"));
|
|
|
|
BOOL bResultRegister = pConnection->AddEventEntry(bsQuery,pSink);
|
|
|
|
if (!bResultRegister)
|
|
{
|
|
OutputDebugString(_T("CConnectionManager::ExecQueryAsync()-Failed to add event.\n"));
|
|
return E_FAIL;
|
|
}
|
|
}
|
|
|
|
return hRes;
|
|
}
|
|
|
|
STDMETHODIMP CConnectionManager::ConnectToNamespace(BSTR bsNamespace, IWbemServices __RPC_FAR *__RPC_FAR * ppIWbemServices)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = m_pIWbemLocator->ConnectServer(bsNamespace,0L,0L,0L,0L,0L,0L,ppIWbemServices);
|
|
|
|
return hr;
|
|
}
|