35e471bb4d
...for LIBO_INTERNAL_ONLY. These had been missed by
1b43cceaea
"Make many OUString functions take
std::u16string_view parameters" because they did not match the multi-overload
pattern that was addressed there, but they nevertheless benefit from being
changed just as well (witness e.g. the various resulting changes from copy() to
subView()).
This showed a conversion from OStringChar to std::string_view to be missing
(while the corresponding conversion form OUStringChar to std::u16string_view was
already present).
The improvement to loplugin:stringadd became necessary to fix
> [CPT] compilerplugins/clang/test/stringadd.cxx
> error: 'error' diagnostics expected but not seen:
> File ~/lo/core/compilerplugins/clang/test/stringadd.cxx Line 43 (directive at ~/lo/core/compilerplugins/clang/test/stringadd.cxx:42): simplify by merging with the preceding assignment [loplugin:stringadd]
> File ~/lo/core/compilerplugins/clang/test/stringadd.cxx Line 61 (directive at ~/lo/core/compilerplugins/clang/test/stringadd.cxx:60): simplify by merging with the preceding assignment [loplugin:stringadd]
> 2 errors generated.
Change-Id: Ie40de0616a66e60e289c1af0ca60aed6f9ecc279
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107602
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
180 lines
5.2 KiB
C++
180 lines
5.2 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*/
|
|
|
|
#ifndef INCLUDED_VCL_DRIVERBLOCKLIST_HXX
|
|
#define INCLUDED_VCL_DRIVERBLOCKLIST_HXX
|
|
|
|
#include <vcl/dllapi.h>
|
|
#include <xmlreader/xmlreader.hxx>
|
|
|
|
#include <string_view>
|
|
#include <vector>
|
|
|
|
namespace DriverBlocklist
|
|
{
|
|
// Details of how to treat a version number.
|
|
enum class VersionType
|
|
{
|
|
OpenGL, // a.b.c.d, 1.98 > 1.978
|
|
Vulkan // a.b.c , 1.98 < 1.978
|
|
};
|
|
|
|
VCL_DLLPUBLIC bool IsDeviceBlocked(const OUString& blocklistURL, VersionType versionType,
|
|
std::u16string_view driverVersion, std::u16string_view vendorId,
|
|
const OUString& deviceId);
|
|
|
|
#ifdef _WIN32
|
|
VCL_DLLPUBLIC int32_t GetWindowsVersion();
|
|
#endif
|
|
|
|
enum DeviceVendor
|
|
{
|
|
VendorAll,
|
|
VendorIntel,
|
|
VendorNVIDIA,
|
|
VendorAMD,
|
|
VendorMicrosoft,
|
|
};
|
|
const int DeviceVendorMax = VendorMicrosoft + 1;
|
|
|
|
/// Returns vendor for the given vendor ID, or VendorAll if not known.
|
|
VCL_DLLPUBLIC DeviceVendor GetVendorFromId(uint32_t id);
|
|
|
|
VCL_DLLPUBLIC std::string_view GetVendorNameFromId(uint32_t id);
|
|
|
|
// The rest should be private (only for the unittest).
|
|
|
|
struct InvalidFileException
|
|
{
|
|
};
|
|
|
|
enum OperatingSystem
|
|
{
|
|
DRIVER_OS_UNKNOWN = 0,
|
|
DRIVER_OS_WINDOWS_FIRST,
|
|
DRIVER_OS_WINDOWS_7 = DRIVER_OS_WINDOWS_FIRST,
|
|
DRIVER_OS_WINDOWS_8,
|
|
DRIVER_OS_WINDOWS_8_1,
|
|
DRIVER_OS_WINDOWS_10,
|
|
DRIVER_OS_WINDOWS_LAST = DRIVER_OS_WINDOWS_10,
|
|
DRIVER_OS_WINDOWS_ALL,
|
|
DRIVER_OS_LINUX,
|
|
DRIVER_OS_OSX_FIRST,
|
|
DRIVER_OS_OSX_10_5 = DRIVER_OS_OSX_FIRST,
|
|
DRIVER_OS_OSX_10_6,
|
|
DRIVER_OS_OSX_10_7,
|
|
DRIVER_OS_OSX_10_8,
|
|
DRIVER_OS_OSX_LAST = DRIVER_OS_OSX_10_8,
|
|
DRIVER_OS_OSX_ALL,
|
|
DRIVER_OS_ANDROID,
|
|
DRIVER_OS_ALL
|
|
};
|
|
|
|
enum VersionComparisonOp
|
|
{
|
|
DRIVER_LESS_THAN, // driver < version
|
|
DRIVER_LESS_THAN_OR_EQUAL, // driver <= version
|
|
DRIVER_GREATER_THAN, // driver > version
|
|
DRIVER_GREATER_THAN_OR_EQUAL, // driver >= version
|
|
DRIVER_EQUAL, // driver == version
|
|
DRIVER_NOT_EQUAL, // driver != version
|
|
DRIVER_BETWEEN_EXCLUSIVE, // driver > version && driver < versionMax
|
|
DRIVER_BETWEEN_INCLUSIVE, // driver >= version && driver <= versionMax
|
|
DRIVER_BETWEEN_INCLUSIVE_START, // driver >= version && driver < versionMax
|
|
DRIVER_COMPARISON_IGNORED
|
|
};
|
|
|
|
struct DriverInfo
|
|
{
|
|
DriverInfo(OperatingSystem os, const OUString& vendor, VersionComparisonOp op,
|
|
uint64_t driverVersion, bool bAllowListed = false,
|
|
const char* suggestedVersion = nullptr);
|
|
|
|
DriverInfo();
|
|
|
|
OperatingSystem meOperatingSystem;
|
|
OUString maAdapterVendor;
|
|
std::vector<OUString> maDevices;
|
|
|
|
bool mbAllowlisted;
|
|
|
|
VersionComparisonOp meComparisonOp;
|
|
|
|
/* versions are assumed to be A.B.C.D packed as 0xAAAABBBBCCCCDDDD */
|
|
uint64_t mnDriverVersion;
|
|
uint64_t mnDriverVersionMax;
|
|
|
|
OUString maSuggestedVersion;
|
|
OUString maMsg;
|
|
};
|
|
|
|
class VCL_DLLPUBLIC Parser
|
|
{
|
|
public:
|
|
Parser(const OUString& rURL, std::vector<DriverInfo>& rDriverList, VersionType versionType);
|
|
bool parse();
|
|
|
|
private:
|
|
void handleEntry(DriverInfo& rDriver, xmlreader::XmlReader& rReader);
|
|
void handleList(xmlreader::XmlReader& rReader);
|
|
void handleContent(xmlreader::XmlReader& rReader);
|
|
static void handleDevices(DriverInfo& rDriver, xmlreader::XmlReader& rReader);
|
|
uint64_t getVersion(std::string_view rString);
|
|
|
|
enum class BlockType
|
|
{
|
|
ALLOWLIST,
|
|
DENYLIST,
|
|
UNKNOWN
|
|
};
|
|
|
|
BlockType meBlockType;
|
|
std::vector<DriverInfo>& mrDriverList;
|
|
OUString maURL;
|
|
const VersionType mVersionType;
|
|
};
|
|
|
|
OUString VCL_DLLPUBLIC GetVendorId(DeviceVendor id);
|
|
|
|
bool VCL_DLLPUBLIC FindBlocklistedDeviceInList(std::vector<DriverInfo>& aDeviceInfos,
|
|
VersionType versionType,
|
|
std::u16string_view sDriverVersion,
|
|
std::u16string_view sAdapterVendorID,
|
|
OUString const& sAdapterDeviceID,
|
|
OperatingSystem system,
|
|
const OUString& blocklistURL = OUString());
|
|
|
|
#define GFX_DRIVER_VERSION(a, b, c, d) \
|
|
((uint64_t(a) << 48) | (uint64_t(b) << 32) | (uint64_t(c) << 16) | uint64_t(d))
|
|
|
|
inline uint64_t OpenGLVersion(uint32_t a, uint32_t b, uint32_t c, uint32_t d)
|
|
{
|
|
// We make sure every driver number is padded by 0s, this will allow us the
|
|
// easiest 'compare as if decimals' approach. See ParseDriverVersion for a
|
|
// more extensive explanation of this approach.
|
|
while (b > 0 && b < 1000)
|
|
{
|
|
b *= 10;
|
|
}
|
|
while (c > 0 && c < 1000)
|
|
{
|
|
c *= 10;
|
|
}
|
|
while (d > 0 && d < 1000)
|
|
{
|
|
d *= 10;
|
|
}
|
|
return GFX_DRIVER_VERSION(a, b, c, d);
|
|
}
|
|
|
|
} // namespace
|
|
|
|
#endif
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|