unsigned short CpuPropertiesInstance::GetFamily()

in source/code/scxsystemlib/cpuproperties/cpupropertiesinstance.cpp [74:205]


    unsigned short CpuPropertiesInstance::GetFamily()
    {
        std::wstring vendorId;
        bool vendorIdResult = m_cpuinfo.VendorId(vendorId);
        std::wstring modelName;
        bool modelNameResult = m_cpuinfo.ModelName(modelName);

        if ((vendorIdResult == false) || (modelNameResult == false))
        {
            return 2; // Unknown family.
        }

        if (vendorId == L"GenuineIntel")
        {
            // Typical brand string for Intel processor is:
            // "Intel(R) Xeon(R) CPU           L5630  @ 2.13GHz"

            // Find terminating "CPU"
            size_t pos = modelName.find(L"CPU");
            if (pos == wstring::npos)
            {
                return 2; // Unknown family.
            }
            modelName = modelName.substr(0, pos);
            modelName = StrToUpper(modelName);

            // Remove from brand string parts we don't care about.
            StrReplaceAll(modelName, L"(R)", L" ");
            StrReplaceAll(modelName, L"(TM)", L" ");
            StrReplaceAll(modelName, L"MOBILE", L" ");
            StrReplaceAll(modelName, L"GENUINE", L" ");

            std::vector<std::wstring> tokens;
            StrTokenize(modelName, tokens);
            if ((tokens.size() < 2) || (tokens[0] != L"INTEL"))
            {
                return 2; // Unknown family.
            }

            if (tokens[1] == L"XEON")
            {
                return 179; // Intel Xeon family.
            }
            else if (tokens[1] == L"PENTIUM")
            {
                if (tokens.size() >= 3)
                {
                    if (tokens[2] == L"III")
                    {
                        if ((tokens.size() >= 4) && tokens[3] == L"XEON")
                        {
                            return 176; // Intel Pentium III Xeon family.
                        }
                        return 17; // Intel Pentium III family.
                    }
                    else if (tokens[2] == L"4")
                    {
                        return 178; // Intel Pentium 4 family.
                    }                
                    else if (tokens[2] == L"M")
                    {
                        return 185; // Intel Pentium M family.
                    }                
                }
                return 11; // Intel Pentium Brand family.
            }
            else if (tokens[1] == L"CELERON")
            {
                return 15; // Intel Celeron Family.
            }
        }
        else if (vendorId == L"AuthenticAMD")
        {
            // Typical brand string for AMD processor is:
            // "Dual-Core AMD Opteron(tm) Processor 2210"

            modelName = StrToUpper(modelName);

            // Remove from processor name parts we don't care about.
            StrReplaceAll(modelName, L"(R)", L" ");
            StrReplaceAll(modelName, L"(TM)", L" ");
            StrReplaceAll(modelName, L"MOBILE", L" ");
            StrReplaceAll(modelName, L"DUAL CORE", L" ");
            StrReplaceAll(modelName, L"DUAL-CORE", L" ");

            std::vector<std::wstring> tokens;
            StrTokenize(modelName, tokens);
            if (tokens.size() == 0)
            {
                return 2; // Unknown family.
            }
            if (tokens[0] == L"AMD-K5")
            {
                return 25; // AMD K5 family.
            }
            else if (tokens[0] == L"AMD-K6")
            {
                return 26; // AMD K6 family.
            }
            else if (tokens[0] == L"AMD-K7")
            {
                return 190; // AMD K7 family.
            }
            else if ((tokens.size() >= 2) && tokens[0] == L"AMD")
            {
                if (tokens[1] == L"ATHLON")
                {
                    if (tokens.size() >= 3)
                    {
                        if (tokens[2] == L"64")
                        {
                            return 131; // AMD Athlon 64 family.
                        }
                        else if (tokens[2] == L"XP")
                        {
                            return 182; // AMD Athlon XP family.
                        }                            
                    }
                    return 29; // AMD Athlon family.
                }
                else if (tokens[1] == L"DURON")
                {
                    return 24; // AMD Duron family.
                }
                else if (tokens[1] == L"OPTERON")
                {
                    return 132; // AMD Opteron family.
                }
            }
        }
        return 2; // Unknown family.
    }