diff options
| author | Odd Stranne <odd@mullvad.net> | 2018-04-23 11:44:58 +0200 |
|---|---|---|
| committer | Odd Stranne <odd@mullvad.net> | 2018-06-18 08:45:10 +0200 |
| commit | f7b1f77456cfdb4bf6f0daee4985e524223cdc51 (patch) | |
| tree | 5f13d69b1f3171f43be065b646ae884a46ca1111 | |
| parent | 496bc5a7635a1e27b315a9ce7058a639e24cb494 (diff) | |
| download | mullvadvpn-f7b1f77456cfdb4bf6f0daee4985e524223cdc51.tar.xz mullvadvpn-f7b1f77456cfdb4bf6f0daee4985e524223cdc51.zip | |
Add general COM helper functions
| -rw-r--r-- | windns/src/windns/comhelpers.cpp | 72 | ||||
| -rw-r--r-- | windns/src/windns/comhelpers.h | 26 |
2 files changed, 98 insertions, 0 deletions
diff --git a/windns/src/windns/comhelpers.cpp b/windns/src/windns/comhelpers.cpp new file mode 100644 index 0000000000..dea61b40d9 --- /dev/null +++ b/windns/src/windns/comhelpers.cpp @@ -0,0 +1,72 @@ +#include "stdafx.h" +#include "comhelpers.h" +#include <algorithm> + +_variant_t ComGetProperty(CComPtr<IWbemClassObject> obj, const std::wstring &name) +{ + _variant_t val; + + const auto status = obj->Get(name.c_str(), 0, &val, nullptr, nullptr); + + VALIDATE_COM(status, "Retrieve COM property value"); + + return val; +} + +_variant_t ComGetPropertyAlways(CComPtr<IWbemClassObject> obj, const std::wstring &name) +{ + auto val = ComGetProperty(obj, name); + + if (VT_EMPTY == V_VT(&val) || VT_NULL == V_VT(&val)) + { + throw std::runtime_error("A required COM property value is empty."); + } + + return val; +} + +std::wstring ComConvertString(BSTR src) +{ + return std::wstring(src, SysStringLen(src)); +} + +std::vector<std::wstring> ComConvertStringArray(SAFEARRAY *src) +{ + CComSafeArray<BSTR> safeArray(src); + + std::vector<std::wstring> result; + result.reserve(safeArray.GetCount()); + + for (ULONG i = 0; i < safeArray.GetCount(); ++i) + { + result.emplace_back(ComConvertString(safeArray.GetAt(i))); + } + + return result; +} + +CComSafeArray<BSTR> ComConvertIntoStringArray(const std::vector<std::wstring> &src) +{ + CComSafeArray<BSTR> result; + + std::for_each(src.begin(), src.end(), [&](const std::wstring &str) + { + result.Add(_bstr_t(str.c_str())); + }); + + return result; +} + +_variant_t ComPackageStringArray(CComSafeArray<BSTR> &src) +{ + VARIANT v; + + V_VT(&v) = VT_ARRAY | VT_BSTR; + V_ARRAY(&v) = src.Detach(); + + _variant_t vv; + + vv.Attach(v); + + return vv; +}
\ No newline at end of file diff --git a/windns/src/windns/comhelpers.h b/windns/src/windns/comhelpers.h new file mode 100644 index 0000000000..67e1a46aea --- /dev/null +++ b/windns/src/windns/comhelpers.h @@ -0,0 +1,26 @@ +#pragma once + +#include "libcommon/error.h" +#include <string> +#include <vector> +#include <stdexcept> +#include <winerror.h> +#include <atlbase.h> +#include <comutil.h> +#include <atlsafe.h> +#include <wbemidl.h> + +#define VALIDATE_COM(status, operation)\ +if(FAILED(status))\ +{\ + ::common::error::Throw(operation, status);\ +} + +_variant_t ComGetProperty(CComPtr<IWbemClassObject> obj, const std::wstring &name); +_variant_t ComGetPropertyAlways(CComPtr<IWbemClassObject> obj, const std::wstring &name); +std::wstring ComConvertString(BSTR src); +std::vector<std::wstring> ComConvertStringArray(SAFEARRAY *src); +CComSafeArray<BSTR> ComConvertIntoStringArray(const std::vector<std::wstring> &src); + +// NOTE: This consumes the source variable +_variant_t ComPackageStringArray(CComSafeArray<BSTR> &src); |
