windows-nt/Source/XPSP1/NT/net/config/netman/conman/conman2.cpp
2020-09-26 16:20:57 +08:00

153 lines
5.4 KiB
C++

//+---------------------------------------------------------------------------
//
// 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 "dialup.h"
#include "ncnetcon.h"
HRESULT CConnectionManager2::EnumConnectionProperties(OUT SAFEARRAY** ppsaConnectionProperties)
{
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;
hr = pConn->QueryInterface(IID_INetConnection2, reinterpret_cast<void**>(&pConn2));
if (SUCCEEDED(hr))
{
hr = pConn2->GetPropertiesEx(&pPropsEx);
}
else
{
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;
}