mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-10-29 08:13:44 +01:00
Bluetooth (Windows): adds a string variant helper; removes propsys dependency
This commit is contained in:
+1
-1
@@ -1020,6 +1020,7 @@ elseif(WIN32)
|
||||
src/common/windows/registry.c
|
||||
src/common/windows/unicode.c
|
||||
src/common/windows/wmi.cpp
|
||||
src/common/windows/variant.cpp
|
||||
src/common/windows/version.c
|
||||
src/detection/battery/battery_windows.c
|
||||
src/detection/bios/bios_windows.c
|
||||
@@ -1735,7 +1736,6 @@ elseif(WIN32)
|
||||
PRIVATE "wtsapi32"
|
||||
PRIVATE "cfgmgr32"
|
||||
PRIVATE "winbrand"
|
||||
PRIVATE "propsys"
|
||||
PRIVATE "secur32"
|
||||
PRIVATE "wintrust"
|
||||
)
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
#include "variant.hpp"
|
||||
|
||||
#include <oleauto.h>
|
||||
|
||||
FFWmiVariant::FFWmiVariant(std::initializer_list<PCWSTR> strings): FFWmiVariant()
|
||||
{
|
||||
SAFEARRAYBOUND bound = {
|
||||
.cElements = (ULONG) strings.size(),
|
||||
.lLbound = 0,
|
||||
};
|
||||
SAFEARRAY* psa = SafeArrayCreate(VT_BSTR, 1, &bound);
|
||||
|
||||
LONG i = 0;
|
||||
for (PCWSTR str : strings) {
|
||||
SafeArrayPutElement(psa, &i, bstr_t(str));
|
||||
++i;
|
||||
}
|
||||
|
||||
this->vt = VT_ARRAY | VT_BSTR;
|
||||
this->parray = psa;
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <string_view>
|
||||
#include <cassert>
|
||||
|
||||
template <typename TVariant>
|
||||
struct FFBaseVariant: TVariant
|
||||
@@ -137,6 +138,7 @@ struct FFWmiVariant: FFBaseVariant<VARIANT>
|
||||
FFWmiVariant(const FFWmiVariant&) = delete;
|
||||
FFWmiVariant(FFWmiVariant&&); // don't define it to enforce NRVO optimization
|
||||
explicit FFWmiVariant() { VariantInit(this); }
|
||||
explicit FFWmiVariant(std::initializer_list<PCWSTR> strings);
|
||||
~FFWmiVariant() { VariantClear(this); }
|
||||
};
|
||||
static_assert(sizeof(FFWmiVariant) == sizeof(VARIANT), "");
|
||||
@@ -149,3 +151,18 @@ struct FFPropVariant: FFBaseVariant<PROPVARIANT>
|
||||
~FFPropVariant() { PropVariantClear(this); }
|
||||
};
|
||||
static_assert(sizeof(FFPropVariant) == sizeof(PROPVARIANT), "");
|
||||
|
||||
namespace
|
||||
{
|
||||
// Provide our bstr_t to avoid libstdc++ dependency
|
||||
struct bstr_t
|
||||
{
|
||||
explicit bstr_t(const wchar_t* str) noexcept: _bstr(SysAllocString(str)) {}
|
||||
~bstr_t(void) noexcept { SysFreeString(_bstr); }
|
||||
explicit operator const wchar_t*(void) const noexcept { return _bstr; }
|
||||
operator BSTR(void) const noexcept { return _bstr; }
|
||||
|
||||
private:
|
||||
BSTR _bstr;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ extern "C" {
|
||||
|
||||
#include <initguid.h>
|
||||
#include <wbemidl.h>
|
||||
#include <cassert>
|
||||
|
||||
#include "variant.hpp"
|
||||
|
||||
@@ -74,21 +73,6 @@ struct FFWmiQuery
|
||||
}
|
||||
};
|
||||
|
||||
namespace
|
||||
{
|
||||
// Provide our bstr_t to avoid libstdc++ dependency
|
||||
struct bstr_t
|
||||
{
|
||||
explicit bstr_t(const wchar_t* str) noexcept: _bstr(SysAllocString(str)) {}
|
||||
~bstr_t(void) noexcept { SysFreeString(_bstr); }
|
||||
explicit operator const wchar_t*(void) const noexcept { return _bstr; }
|
||||
operator BSTR(void) const noexcept { return _bstr; }
|
||||
|
||||
private:
|
||||
BSTR _bstr;
|
||||
};
|
||||
}
|
||||
|
||||
#else
|
||||
// Win32 COM headers requires C++ compiler
|
||||
#error Must be included in C++ source file
|
||||
|
||||
@@ -6,8 +6,6 @@ extern "C"
|
||||
#include "common/windows/unicode.hpp"
|
||||
#include "common/windows/util.hpp"
|
||||
|
||||
STDAPI InitVariantFromStringArray(_In_reads_(cElems) PCWSTR *prgsz, _In_ ULONG cElems, _Out_ VARIANT *pvar);
|
||||
|
||||
extern "C"
|
||||
const char* ffBluetoothDetectBattery(FFlist* devices)
|
||||
{
|
||||
@@ -27,13 +25,7 @@ const char* ffBluetoothDetectBattery(FFlist* devices)
|
||||
if (FAILED(pnpEntityClass->GetMethod(bstr_t(L"GetDeviceProperties"), 0, &pInParams, NULL)))
|
||||
return "Failed to get GetDeviceProperties method";
|
||||
|
||||
VARIANT devicePropertyKeys;
|
||||
PCWSTR props[] = { L"{104EA319-6EE2-4701-BD47-8DDBF425BBE5} 2", L"DEVPKEY_Bluetooth_DeviceAddress" };
|
||||
|
||||
if (FAILED(InitVariantFromStringArray(props, ARRAY_SIZE(props), &devicePropertyKeys)))
|
||||
return "Failed to init variant from string array";
|
||||
on_scope_exit releaseDevicePropertyKeys([&] { VariantClear(&devicePropertyKeys); });
|
||||
|
||||
FFWmiVariant devicePropertyKeys({ L"{104EA319-6EE2-4701-BD47-8DDBF425BBE5} 2", L"DEVPKEY_Bluetooth_DeviceAddress" });
|
||||
if (FAILED(pInParams->Put(L"devicePropertyKeys", 0, &devicePropertyKeys, CIM_FLAG_ARRAY | CIM_STRING)))
|
||||
return "Failed to put devicePropertyKeys";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user