in host/common/win32/wmiusers.cpp [94:273]
bool WmiNetworkAdapterRecordProcessor::Process(IWbemClassObject *precordobj)
{
if (0 == m_pNicInfos)
{
m_ErrMsg = "nic infos to fill is not supplied in process wmi network adapter class";
return false;
}
if (0 == precordobj)
{
m_ErrMsg = "record object is not specified for wmi network adapter class";
return false;
}
bool bprocessed = true;
USES_CONVERSION;
VARIANT vtProp;
HRESULT hrCol;
std::stringstream ssmessage;
std::string hardwareaddress;
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(MACADDRESSCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
hardwareaddress = W2A(V_BSTR(&vtProp));
}
VariantClear(&vtProp);
ssmessage << MACADDRESSCOLUMNNAME << " : " << hardwareaddress << std::endl;
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += MACADDRESSCOLUMNNAME;
m_ErrMsg += " from wmi network adapter class";
return bprocessed;
}
unsigned int index = ~0;
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(INDEXCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_I4 == V_VT(&vtProp))
{
index = V_I4(&vtProp);
}
VariantClear(&vtProp);
ssmessage << INDEXCOLUMNNAME << " : " << index << std::endl;
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += INDEXCOLUMNNAME;
m_ErrMsg += " from wmi network adapter class";
return bprocessed;
}
if (~0 == index)
{
bprocessed = false;
m_ErrMsg = "failed to get correct type for ";
m_ErrMsg += INDEXCOLUMNNAME;
m_ErrMsg += " from wmi network adapter class";
return bprocessed;
}
if (hardwareaddress.empty())
{
ssmessage << "Skipping record as " << MACADDRESSCOLUMNNAME << " is empty.";
m_TraceMsg = ssmessage.str();
return bprocessed;
}
Objects_t *pnicobjs;
NicInfosIter_t nicinfoiter = m_pNicInfos->find(hardwareaddress);
if (nicinfoiter != m_pNicInfos->end())
{
ssmessage << "Found existing NicInfo object for MAC address " << hardwareaddress << std::endl;
Objects_t &nicobjs = nicinfoiter->second;
pnicobjs = &nicobjs;
}
else
{
ssmessage << "Creating new NicInfo object for MAC address " << hardwareaddress << std::endl;
std::pair<NicInfosIter_t, bool> pr = m_pNicInfos->insert(std::make_pair(hardwareaddress, Objects_t()));
Objects_t &nicobjs = pr.first->second;
pnicobjs = &nicobjs;
}
std::stringstream ssindex;
ssindex << index;
Object *p;
ObjectsIter_t nicobjiter = std::find_if(pnicobjs->begin(), pnicobjs->end(), ObjectEqAttr(NSNicInfo::INDEX, ssindex.str()));
if (nicobjiter != pnicobjs->end())
{
ssmessage << "Found existing NicInfo object for index " << index << std::endl;
Object &nicobj = *nicobjiter;
p = &nicobj;
}
else
{
ssmessage << "Creating new NicInfo object for index " << index << std::endl;
ObjectsIter_t nit = pnicobjs->insert(pnicobjs->end(), Object());
Object &nicobj = *nit;
p = &nicobj;
p->m_Attributes.insert(std::make_pair(NSNicInfo::INDEX, ssindex.str()));
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(NAMECOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
p->m_Attributes.insert(std::make_pair(NSNicInfo::NAME, W2A(V_BSTR(&vtProp))));
ssmessage << NAMECOLUMNNAME << " : " << W2A(V_BSTR(&vtProp)) << std::endl;
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += NAMECOLUMNNAME;
m_ErrMsg += " from wmi network adapter class";
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(MANUFACTURERCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (VT_BSTR == V_VT(&vtProp))
{
p->m_Attributes.insert(std::make_pair(NSNicInfo::MANUFACTURER, W2A(V_BSTR(&vtProp))));
ssmessage << MANUFACTURERCOLUMNNAME << " : " << W2A(V_BSTR(&vtProp)) << std::endl;
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += MANUFACTURERCOLUMNNAME;
m_ErrMsg += " from wmi network adapter class";
}
VariantInit(&vtProp);
hrCol = precordobj->Get(A2W(MAXSPEEDCOLUMNNAME), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
/* TODO: this is not supported as of now;
* but will this occur as I8 ? */
if (VT_I8 == V_VT(&vtProp))
{
std::stringstream ssmaxspeed;
ssmaxspeed << V_I8(&vtProp);
p->m_Attributes.insert(std::make_pair(NSNicInfo::MAX_SPEED, ssmaxspeed.str()));
ssmessage << MAXSPEEDCOLUMNNAME << " : " << ssmaxspeed.str() << std::endl;
}
VariantClear(&vtProp);
}
else
{
bprocessed = false;
m_ErrMsg = "failed to get ";
m_ErrMsg += MAXSPEEDCOLUMNNAME;
m_ErrMsg += " from wmi network adapter class";
}
m_TraceMsg = ssmessage.str();
return bprocessed;
}