Kaydet (Commit) 04ed83d6 authored tarafından Tomaž Vajngerl's avatar Tomaž Vajngerl

opengl: fix blocklist parsing

Devices weren't copied correctly - delete copy constructor as
it is not needed.

Split parsing to more methods so it is more readable.

Parse vendor name (ati, intel, ...) and convert to vendorId

Change-Id: I91ed7d8c5713dec160e217defb27f25cd3e8178c
üst c082bf7a
...@@ -67,7 +67,6 @@ struct DriverInfo ...@@ -67,7 +67,6 @@ struct DriverInfo
uint64_t driverVersion, bool bWhiteListed = false, const char *suggestedVersion = nullptr); uint64_t driverVersion, bool bWhiteListed = false, const char *suggestedVersion = nullptr);
DriverInfo(); DriverInfo();
DriverInfo(const DriverInfo&);
~DriverInfo(); ~DriverInfo();
OperatingSystem meOperatingSystem; OperatingSystem meOperatingSystem;
......
...@@ -413,17 +413,6 @@ DriverInfo::DriverInfo(OperatingSystem os, const OUString& vendor, ...@@ -413,17 +413,6 @@ DriverInfo::DriverInfo(OperatingSystem os, const OUString& vendor,
maSuggestedVersion = OStringToOUString(OString(suggestedVersion), RTL_TEXTENCODING_UTF8); maSuggestedVersion = OStringToOUString(OString(suggestedVersion), RTL_TEXTENCODING_UTF8);
} }
DriverInfo::DriverInfo(const DriverInfo& aOrig)
: meOperatingSystem(aOrig.meOperatingSystem),
mnOperatingSystemVersion(aOrig.mnOperatingSystemVersion),
maAdapterVendor(aOrig.maAdapterVendor),
mbWhitelisted(aOrig.mbWhitelisted),
meComparisonOp(aOrig.meComparisonOp),
mnDriverVersion(aOrig.mnDriverVersion),
mnDriverVersionMax(aOrig.mnDriverVersionMax)
{
}
DriverInfo::~DriverInfo() DriverInfo::~DriverInfo()
{ {
} }
...@@ -490,12 +479,10 @@ bool WinOpenGLDeviceInfo::FindBlocklistedDeviceInList() ...@@ -490,12 +479,10 @@ bool WinOpenGLDeviceInfo::FindBlocklistedDeviceInList()
continue; continue;
} }
if (std::none_of(maDriverInfo[i].maDevices.begin(), maDriverInfo[i].maDevices.end(), [](const OUString& rString){ return rString == "all"; } )) if (std::none_of(maDriverInfo[i].maDevices.begin(), maDriverInfo[i].maDevices.end(), compareIgnoreAsciiCase("all")) &&
std::none_of(maDriverInfo[i].maDevices.begin(), maDriverInfo[i].maDevices.end(), compareIgnoreAsciiCase(maAdapterDeviceID)))
{ {
if (std::none_of(maDriverInfo[i].maDevices.begin(), maDriverInfo[i].maDevices.end(), compareIgnoreAsciiCase(maAdapterDeviceID))) continue;
{
continue;
}
} }
switch (maDriverInfo[i].meComparisonOp) switch (maDriverInfo[i].meComparisonOp)
......
...@@ -105,6 +105,36 @@ wgl::VersionComparisonOp getComparison(const OString& rString) ...@@ -105,6 +105,36 @@ wgl::VersionComparisonOp getComparison(const OString& rString)
throw InvalidFileException(); throw InvalidFileException();
} }
OUString getVendor(const OString& rString)
{
if (rString == "all")
{
return "";
}
else if (rString == "intel")
{
return "0x8086";
}
else if (rString == "nvidia")
{
return "0x10de";
}
else if (rString == "amd")
{
return "0x1022";
}
else if (rString == "ati")
{
return "0x1002";
}
else if (rString == "microsoft")
{
return "0x1414";
}
throw InvalidFileException();
}
uint64_t getVersion(const OString& rString) uint64_t getVersion(const OString& rString)
{ {
OUString aString = OStringToOUString(rString, RTL_TEXTENCODING_UTF8); OUString aString = OStringToOUString(rString, RTL_TEXTENCODING_UTF8);
...@@ -121,7 +151,66 @@ uint64_t getVersion(const OString& rString) ...@@ -121,7 +151,66 @@ uint64_t getVersion(const OString& rString)
} }
void WinBlocklistParser::handleDevice(wgl::DriverInfo& rDriver, xmlreader::XmlReader& rReader) void WinBlocklistParser::handleDevices(wgl::DriverInfo& rDriver, xmlreader::XmlReader& rReader)
{
int nLevel = 1;
bool bInMsg = false;
while(true)
{
xmlreader::Span name;
int nsId;
xmlreader::XmlReader::Result res = rReader.nextItem(
xmlreader::XmlReader::TEXT_NORMALIZED, &name, &nsId);
OString aId(name.begin, name.length);
if (res == xmlreader::XmlReader::RESULT_BEGIN)
{
++nLevel;
if (nLevel > 2)
throw InvalidFileException();
if (name.equals("msg"))
{
bInMsg = true;
}
else if (name.equals("device"))
{
int nsIdDeveice;
while (rReader.nextAttribute(&nsIdDeveice, &name))
{
if (name.equals("id"))
{
name = rReader.getAttributeValue(false);
OString aDeviceId(name.begin, name.length);
rDriver.maDevices.push_back(OStringToOUString(aDeviceId, RTL_TEXTENCODING_UTF8));
}
}
}
else
throw InvalidFileException();
}
else if (res == xmlreader::XmlReader::RESULT_END)
{
--nLevel;
bInMsg = false;
if (!nLevel)
break;
}
else if (res == xmlreader::XmlReader::RESULT_TEXT)
{
if (bInMsg)
{
OString sMsg(name.begin, name.length);
rDriver.maMsg = OStringToOUString(sMsg, RTL_TEXTENCODING_UTF8);
}
}
}
}
void WinBlocklistParser::handleEntry(wgl::DriverInfo& rDriver, xmlreader::XmlReader& rReader)
{ {
if (meBlockType == BlockType::WHITELIST) if (meBlockType == BlockType::WHITELIST)
{ {
...@@ -151,10 +240,7 @@ void WinBlocklistParser::handleDevice(wgl::DriverInfo& rDriver, xmlreader::XmlRe ...@@ -151,10 +240,7 @@ void WinBlocklistParser::handleDevice(wgl::DriverInfo& rDriver, xmlreader::XmlRe
{ {
name = rReader.getAttributeValue(false); name = rReader.getAttributeValue(false);
OString sVendor(name.begin, name.length); OString sVendor(name.begin, name.length);
rDriver.maAdapterVendor = getVendor(sVendor);
// TODO: moggi: check that only valid vendors are imported
OUString aVendor = OStringToOUString(sVendor, RTL_TEXTENCODING_UTF8);
rDriver.maAdapterVendor = aVendor;
} }
else if (name.equals("compare")) else if (name.equals("compare"))
{ {
...@@ -187,55 +273,7 @@ void WinBlocklistParser::handleDevice(wgl::DriverInfo& rDriver, xmlreader::XmlRe ...@@ -187,55 +273,7 @@ void WinBlocklistParser::handleDevice(wgl::DriverInfo& rDriver, xmlreader::XmlRe
} }
} }
int nLevel = 1; handleDevices(rDriver, rReader);
bool bInMsg = false;
while(true)
{
xmlreader::Span name;
int nsId;
xmlreader::XmlReader::Result res = rReader.nextItem(
xmlreader::XmlReader::TEXT_NORMALIZED, &name, &nsId);
if (res == xmlreader::XmlReader::RESULT_BEGIN)
{
++nLevel;
if (nLevel > 2)
throw InvalidFileException();
if (name.equals("msg"))
{
bInMsg = true;
}
else if (name.equals("device"))
{
bool bSuccess = rReader.nextAttribute(&nsId, &name);
if (!bSuccess || !name.equals("id"))
throw InvalidFileException();
name = rReader.getAttributeValue(false);
OString aDeviceId(name.begin, name.length);
rDriver.maDevices.push_back(OStringToOUString(aDeviceId, RTL_TEXTENCODING_UTF8));
}
else
throw InvalidFileException();
}
else if (res == xmlreader::XmlReader::RESULT_END)
{
--nLevel;
bInMsg = false;
if (!nLevel)
break;
}
else if (res == xmlreader::XmlReader::RESULT_TEXT)
{
if (bInMsg)
{
OString sMsg(name.begin, name.length);
rDriver.maMsg = OStringToOUString(sMsg, RTL_TEXTENCODING_UTF8);
}
}
}
} }
void WinBlocklistParser::handleList(xmlreader::XmlReader& rReader) void WinBlocklistParser::handleList(xmlreader::XmlReader& rReader)
...@@ -253,13 +291,13 @@ void WinBlocklistParser::handleList(xmlreader::XmlReader& rReader) ...@@ -253,13 +291,13 @@ void WinBlocklistParser::handleList(xmlreader::XmlReader& rReader)
if (name.equals("entry")) if (name.equals("entry"))
{ {
wgl::DriverInfo aDriver; wgl::DriverInfo aDriver;
handleDevice(aDriver, rReader); handleEntry(aDriver, rReader);
mrDriverList.push_back(aDriver); mrDriverList.push_back(aDriver);
} }
else if (name.equals("entryRange")) else if (name.equals("entryRange"))
{ {
wgl::DriverInfo aDriver; wgl::DriverInfo aDriver;
handleDevice(aDriver, rReader); handleEntry(aDriver, rReader);
mrDriverList.push_back(aDriver); mrDriverList.push_back(aDriver);
} }
else else
......
...@@ -24,8 +24,8 @@ public: ...@@ -24,8 +24,8 @@ public:
void parse(); void parse();
private: private:
void handleDevice(wgl::DriverInfo& rDriver, xmlreader::XmlReader& rReader); void handleEntry(wgl::DriverInfo& rDriver, xmlreader::XmlReader& rReader);
void handleDevices(wgl::DriverInfo& rDriver, xmlreader::XmlReader& rReader);
void handleList(xmlreader::XmlReader& rReader); void handleList(xmlreader::XmlReader& rReader);
void handleContent(xmlreader::XmlReader& rReader); void handleContent(xmlreader::XmlReader& rReader);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment