25 #ifndef CARGO_GVARIANT_FROM_GVARIANT_VISITOR_HPP
26 #define CARGO_GVARIANT_FROM_GVARIANT_VISITOR_HPP
53 mIter = g_variant_iter_new(variant);
63 g_variant_iter_free(
mIter);
69 void visit(
const std::string& name, T& value)
74 "GVariant doesn't match with Cargo. Can't set '" + name +
"'");
82 static std::unique_ptr<GVariant, decltype(&g_variant_unref)>
makeUnique(GVariant* variant)
84 return std::unique_ptr<GVariant, decltype(&g_variant_unref)>(variant, g_variant_unref);
87 static void checkType(GVariant*
object,
const GVariantType* type)
89 if (!g_variant_is_of_type(
object, type)) {
97 value =
static_cast<std::int8_t
>(g_variant_get_byte(
object));
103 value = g_variant_get_int16(
object);
109 value = g_variant_get_int32(
object);
115 value = g_variant_get_int64(
object);
121 value = g_variant_get_byte(
object);
126 checkType(
object, G_VARIANT_TYPE_UINT16);
127 value = g_variant_get_uint16(
object);
132 checkType(
object, G_VARIANT_TYPE_UINT32);
133 value = g_variant_get_uint32(
object);
138 checkType(
object, G_VARIANT_TYPE_UINT64);
139 value = g_variant_get_uint64(
object);
144 checkType(
object, G_VARIANT_TYPE_BOOLEAN);
145 value = g_variant_get_boolean(
object);
150 checkType(
object, G_VARIANT_TYPE_DOUBLE);
151 value = g_variant_get_double(
object);
156 checkType(
object, G_VARIANT_TYPE_STRING);
157 value = g_variant_get_string(
object, NULL);
162 checkType(
object, G_VARIANT_TYPE_STRING);
164 const char* source = g_variant_get_string(
object, NULL);
165 size_t len = std::strlen(source);
167 value =
new char[len + 1];
168 std::strncpy(value, source, len);
174 checkType(
object, G_VARIANT_TYPE_HANDLE);
175 value.
value = g_variant_get_handle(
object);
183 g_variant_iter_init(&iter,
object);
184 int length = g_variant_iter_n_children(&iter);
185 value.resize(static_cast<size_t>(length));
186 for (
int i = 0; i < length; ++i) {
187 auto child =
makeUnique(g_variant_iter_next_value(&iter));
189 fromGVariant(child.get(), value[
static_cast<size_t>(i)]);
193 template<
typename T, std::
size_t N>
199 g_variant_iter_init(&iter,
object);
201 for (T& value: values) {
202 auto child =
makeUnique(g_variant_iter_next_value(&iter));
208 static void fromGVariant(GVariant*
object, std::map<std::string, V>& values)
212 g_variant_iter_init(&iter,
object);
213 const int length = g_variant_iter_n_children(&iter);
214 for (
int i = 0; i < length; ++i) {
215 auto child =
makeUnique(g_variant_iter_next_value(&iter));
217 std::pair<std::string, V> val;
219 values.insert(std::move(val));
226 static void visit(GVariantIter* iter, T&& value)
228 auto child =
makeUnique(g_variant_iter_next_value(iter));
233 template<typename T, typename std::enable_if<isLikeTuple<T>::value,
int>::type = 0>
239 g_variant_iter_init(&iter,
object);
245 template<typename T, typename std::enable_if<std::is_enum<T>::value,
int>::type = 0>
249 *
reinterpret_cast<typename std::underlying_type<T>::type*
>(&value));
253 static typename std::enable_if<isUnion<T>::value>::type
256 checkType(
object, G_VARIANT_TYPE_VARIANT);
257 auto inner =
makeUnique(g_variant_get_variant(
object));
260 value.accept(visitor);
264 static typename std::enable_if<isVisitable<T>::value && !
isUnion<T>::value>::type
268 value.accept(visitor);
275 #endif // CARGO_GVARIANT_FROM_GVARIANT_VISITOR_HPP
Definition: is-union.hpp:60
Internal configuration helper.
static void fromGVariant(GVariant *object, bool &value)
Definition: from-gvariant-visitor.hpp:142
static void fromGVariant(GVariant *object, cargo::FileDescriptor &value)
Definition: from-gvariant-visitor.hpp:172
GVariantIter * mIter
Definition: from-gvariant-visitor.hpp:80
void visit(const std::string &name, T &value)
Definition: from-gvariant-visitor.hpp:69
static void fromGVariant(GVariant *object, std::int64_t &value)
Definition: from-gvariant-visitor.hpp:112
static void fromGVariant(GVariant *object, std::vector< T > &value)
Definition: from-gvariant-visitor.hpp:179
static void fromGVariant(GVariant *object, std::int16_t &value)
Definition: from-gvariant-visitor.hpp:100
Whenever possible, this type will be serialized using Linux file descriptor passing.
Definition: types.hpp:33
Helper function for iterating tuples, pairs and arrays.
Definition: from-gvariant-visitor.hpp:223
~FromGVariantVisitor()
Definition: from-gvariant-visitor.hpp:61
static std::enable_if< isUnion< T >::value >::type fromGVariant(GVariant *object, T &value)
Definition: from-gvariant-visitor.hpp:254
FromGVariantVisitor & operator=(const FromGVariantVisitor &)=delete
static void fromGVariant(GVariant *object, char *&value)
Definition: from-gvariant-visitor.hpp:160
static std::enable_if< isVisitable< T >::value &&!isUnion< T >::value >::type fromGVariant(GVariant *object, T &value)
Definition: from-gvariant-visitor.hpp:265
Internal configuration helper.
Definition: from-gvariant-visitor.hpp:47
static void fromGVariant(GVariant *object, std::uint8_t &value)
Definition: from-gvariant-visitor.hpp:118
static void visit(GVariantIter *iter, T &&value)
Definition: from-gvariant-visitor.hpp:226
static void fromGVariant(GVariant *object, T &value)
Definition: from-gvariant-visitor.hpp:246
static std::unique_ptr< GVariant, decltype(&g_variant_unref)> makeUnique(GVariant *variant)
Definition: from-gvariant-visitor.hpp:82
static void fromGVariant(GVariant *object, T &values)
Definition: from-gvariant-visitor.hpp:234
static void fromGVariant(GVariant *object, double &value)
Definition: from-gvariant-visitor.hpp:148
static void checkType(GVariant *object, const GVariantType *type)
Definition: from-gvariant-visitor.hpp:87
Base class for exceptions in libcargo.
Definition: exception.hpp:35
int value
Definition: types.hpp:34
static void fromGVariant(GVariant *object, std::string &value)
Definition: from-gvariant-visitor.hpp:154
static void fromGVariant(GVariant *object, std::uint32_t &value)
Definition: from-gvariant-visitor.hpp:130
static void fromGVariant(GVariant *object, std::array< T, N > &values)
Definition: from-gvariant-visitor.hpp:194
FromGVariantVisitor(GVariant *variant)
Definition: from-gvariant-visitor.hpp:49
static void fromGVariant(GVariant *object, std::map< std::string, V > &values)
Definition: from-gvariant-visitor.hpp:208
static void fromGVariant(GVariant *object, std::int8_t &value)
Definition: from-gvariant-visitor.hpp:94
FromGVariantVisitor(const FromGVariantVisitor &visitor)
Definition: from-gvariant-visitor.hpp:56
static void fromGVariant(GVariant *object, std::uint64_t &value)
Definition: from-gvariant-visitor.hpp:136
static void fromGVariant(GVariant *object, std::int32_t &value)
Definition: from-gvariant-visitor.hpp:106
void visitFields(T &t, F f, A...args)
Definition: visit-fields.hpp:58
static void fromGVariant(GVariant *object, std::uint16_t &value)
Definition: from-gvariant-visitor.hpp:124