// ConnectionManager.cpp : Implementation of CConnectionManager #include "stdafx.h" #include "Connection.h" #include "ConnMgr.h" #include "ConnectionManager.h" #include #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; }