bool WmiNetworkAdapterRecordProcessor::Process()

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;
}