|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: C O N M A N 2 . C P P
//
// Contents: Connection manager 2.
//
// Notes:
//
// Author: ckotze 16 Mar 2001
//
//----------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include <atlbase.h>
#include "cobase.h"
#include "conman.h"
#include "conman2.h"
#include "ncnetcon.h"
HRESULT CConnectionManager2::EnumConnectionProperties(OUT SAFEARRAY** ppsaConnectionProperties) { TraceFileFunc(ttidConman);
CComPtr<INetConnectionManager> pConMan; NETCON_PROPERTIES_EX* pPropsEx; HRESULT hr = S_OK;
hr = CoCreateInstance(CLSID_ConnectionManager, NULL, CLSCTX_INPROC, IID_INetConnectionManager, reinterpret_cast<void**>(&pConMan));
if (SUCCEEDED(hr)) { CComPtr<IEnumNetConnection> pNetConnection; hr = pConMan->EnumConnections(NCME_DEFAULT, &pNetConnection); if (SUCCEEDED(hr)) { INetConnection* pConn; ULONG ulFetched; LISTNETCONPROPEX listNCProperties; ITERNETCONPROPEX iterProps; HRESULT hrFetched = S_OK; do { hrFetched = pNetConnection->Next(1, &pConn, &ulFetched); if ( (S_OK == hr) && (ulFetched) ) { CComPtr<INetConnection2> pConn2; // Does the class manager support INetConnection2?
// if so use it directly
hr = pConn->QueryInterface(IID_INetConnection2, reinterpret_cast<void**>(&pConn2)); if (SUCCEEDED(hr)) { hr = pConn2->GetPropertiesEx(&pPropsEx); } else { // This class manager does not support INetConnection2. Convert the connection
NETCON_PROPERTIES* pProps; hr = pConn->GetProperties(&pProps); if (SUCCEEDED(hr)) { pPropsEx = reinterpret_cast<NETCON_PROPERTIES_EX*>(CoTaskMemAlloc(sizeof(NETCON_PROPERTIES_EX))); if (pPropsEx) { CComPtr<IPersistNetConnection> pPersistNetConnection; hr = pConn->QueryInterface(IID_IPersistNetConnection, reinterpret_cast<LPVOID *>(&pPersistNetConnection)); if (SUCCEEDED(hr)) { ZeroMemory(pPropsEx, sizeof(NETCON_PROPERTIES_EX)); hr = HrBuildPropertiesExFromProperties(pProps, pPropsEx, pPersistNetConnection); } } else { hr = E_OUTOFMEMORY; } FreeNetconProperties(pProps); } }
if (S_OK == hr) { listNCProperties.insert(listNCProperties.end(), pPropsEx); } else { TraceTag(ttidError, "Failed to retrieve connection information for connection. Connection will be ommitted from Connections Folder."); }
ReleaseObj(pConn); } } while ( (S_OK == hrFetched) && (ulFetched) );
if (listNCProperties.size()) { hr = S_OK; if (listNCProperties.size() != 0) { SAFEARRAYBOUND rgsaBound[1]; LONG lIndex; rgsaBound[0].cElements = listNCProperties.size(); rgsaBound[0].lLbound = 0; lIndex = rgsaBound[0].lLbound; *ppsaConnectionProperties = SafeArrayCreate(VT_VARIANT, 1, rgsaBound); for (ITERNETCONPROPEX iter = listNCProperties.begin(); iter != listNCProperties.end(); iter++) { HRESULT hrT = S_OK; VARIANT varElement; SAFEARRAY* psaPropertiesEx = NULL;
pPropsEx = *iter;
hrT = HrSafeArrayFromNetConPropertiesEx(pPropsEx, &psaPropertiesEx);
if (SUCCEEDED(hrT)) { VariantInit(&varElement); varElement.vt = VT_VARIANT | VT_ARRAY; varElement.parray = psaPropertiesEx;
hrT = SafeArrayPutElement(*ppsaConnectionProperties, &lIndex, &varElement); VariantClear(&varElement); }
if (FAILED(hrT)) { hr = hrT; break; }
lIndex++; } } }
for (ITERNETCONPROPEX iter = listNCProperties.begin(); iter != listNCProperties.end(); iter++) { HrFreeNetConProperties2(*iter); } } }
if (SUCCEEDED(hr) && !(*ppsaConnectionProperties) ) { hr = S_FALSE; }
TraceHr (ttidError, FAL, hr, FALSE, "CConnectionManager2::EnumConnectionProperties"); return hr; }
|