Fork Vasum on GitHub Official Vasum Wiki on Tizen.org
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
to-gvariant-visitor.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Contact: Mateusz Malicki (m.malicki2@samsung.com)
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License
17  */
18 
25 #ifndef CARGO_GVARIANT_TO_GVARIANT_VISITOR_HPP
26 #define CARGO_GVARIANT_TO_GVARIANT_VISITOR_HPP
27 
28 #include "cargo/is-visitable.hpp"
29 #include "cargo/is-union.hpp"
30 #include "cargo/is-like-tuple.hpp"
31 #include "cargo/types.hpp"
32 #include "cargo/visit-fields.hpp"
33 
34 #include <array>
35 #include <string>
36 #include <vector>
37 #include <map>
38 #include <glib.h>
39 #include <utility>
40 
41 namespace cargo {
42 
44 
45 public:
47  : mBuilder(g_variant_builder_new(G_VARIANT_TYPE_TUPLE))
48  {
49  }
50 
52  : mBuilder(visitor.mBuilder ? g_variant_builder_ref(visitor.mBuilder) : nullptr)
53  {
54  }
55 
57  {
58  if (mBuilder) {
59  g_variant_builder_unref(mBuilder);
60  }
61  }
62 
64 
65  GVariant* toVariant()
66  {
67  if (mBuilder) {
68  GVariant* ret = g_variant_builder_end(mBuilder);
69  g_variant_builder_unref(mBuilder);
70  mBuilder = nullptr;
71  return ret;
72  }
73  return nullptr;
74  }
75 
76  template<typename T>
77  void visit(const std::string& /* name */, const T& value)
78  {
79  writeInternal(value);
80  }
81 private:
82  GVariantBuilder* mBuilder;
83 
84  void writeInternal(std::int8_t value) {
85  add("y", value);
86  };
87  void writeInternal(std::int16_t value) {
88  add("n", value);
89  };
90  void writeInternal(std::int32_t value) {
91  add("i", value);
92  };
93  void writeInternal(std::int64_t value) {
94  add("x", value);
95  };
96  void writeInternal(std::uint8_t value) {
97  add("y", value);
98  };
99  void writeInternal(std::uint16_t value) {
100  add("q", value);
101  };
102  void writeInternal(std::uint32_t value) {
103  add("u", value);
104  };
105  void writeInternal(std::uint64_t value) {
106  add("t", value);
107  };
108  void writeInternal(bool value) {
109  add("b", value);
110  };
111  void writeInternal(double value) {
112  add("d", value);
113  };
114  void writeInternal(const std::string& value) {
115  add("s", value.c_str());
116  };
117  void writeInternal(const char* value) {
118  add("s", value);
119  };
121  add("h", value.value);
122  };
123 
124  template<typename T>
125  void writeInternal(const std::vector<T>& value)
126  {
127  if (!value.empty()) {
128  g_variant_builder_open(mBuilder, G_VARIANT_TYPE_ARRAY);
129  for (const T& v : value) {
130  writeInternal(v);
131  }
132  g_variant_builder_close(mBuilder);
133  } else {
134  g_variant_builder_add(mBuilder, "as", NULL);
135  }
136  }
137 
138  template<typename T, std::size_t N>
139  void writeInternal(const std::array<T, N>& values)
140  {
141  if (!values.empty()) {
142  g_variant_builder_open(mBuilder, G_VARIANT_TYPE_ARRAY);
143  for (const T& v : values) {
144  writeInternal(v);
145  }
146  g_variant_builder_close(mBuilder);
147  } else {
148  g_variant_builder_add(mBuilder, "as", NULL);
149  }
150  }
151 
152  template<typename V>
153  void writeInternal(const std::map<std::string, V>& values)
154  {
155  if (!values.empty()) {
156  g_variant_builder_open(mBuilder, G_VARIANT_TYPE_TUPLE);
157  for (const auto& v : values) {
158  writeInternal(v);
159  }
160  g_variant_builder_close(mBuilder);
161  } else {
162  g_variant_builder_add(mBuilder, "as", NULL);
163  }
164  }
165 
166  template<typename T, typename std::enable_if<isLikeTuple<T>::value, int>::type = 0>
167  void writeInternal(const T& values)
168  {
169  g_variant_builder_open(mBuilder, G_VARIANT_TYPE_TUPLE);
170  visitFields(values, this, std::string());
171  g_variant_builder_close(mBuilder);
172  }
173 
174  template<typename T, typename std::enable_if<std::is_enum<T>::value, int>::type = 0>
175  void writeInternal(const T& value)
176  {
177  writeInternal(static_cast<const typename std::underlying_type<T>::type>(value));
178  }
179 
180  template<typename T>
181  typename std::enable_if<isVisitable<T>::value && !isUnion<T>::value>::type
182  writeInternal(const T& value)
183  {
184  ToGVariantVisitor visitor;
185  value.accept(visitor);
186  g_variant_builder_add_value(mBuilder, visitor.toVariant());
187  }
188 
189  template<typename T>
190  typename std::enable_if<isVisitable<T>::value && isUnion<T>::value>::type
191  writeInternal(const T& value)
192  {
193  ToGVariantVisitor visitor;
194  value.accept(visitor);
195  add("v", visitor.toVariant());
196  }
197 
198  template<typename Value>
199  void add(const char* type, Value value) {
200  g_variant_builder_add(mBuilder, type, value);
201  }
202 };
203 
204 } // namespace cargo
205 
206 #endif // CARGO_GVARIANT_TO_GVARIANT_VISITOR_HPP
Definition: is-union.hpp:60
void writeInternal(const T &value)
Definition: to-gvariant-visitor.hpp:175
Internal configuration helper.
void writeInternal(const std::array< T, N > &values)
Definition: to-gvariant-visitor.hpp:139
void writeInternal(std::uint16_t value)
Definition: to-gvariant-visitor.hpp:99
void writeInternal(double value)
Definition: to-gvariant-visitor.hpp:111
void writeInternal(std::uint64_t value)
Definition: to-gvariant-visitor.hpp:105
~ToGVariantVisitor()
Definition: to-gvariant-visitor.hpp:56
ToGVariantVisitor(const ToGVariantVisitor &visitor)
Definition: to-gvariant-visitor.hpp:51
void writeInternal(std::uint8_t value)
Definition: to-gvariant-visitor.hpp:96
Whenever possible, this type will be serialized using Linux file descriptor passing.
Definition: types.hpp:33
Helper function for iterating tuples, pairs and arrays.
GVariantBuilder * mBuilder
Definition: to-gvariant-visitor.hpp:82
void writeInternal(const T &values)
Definition: to-gvariant-visitor.hpp:167
void writeInternal(const std::vector< T > &value)
Definition: to-gvariant-visitor.hpp:125
Definition: to-gvariant-visitor.hpp:43
void writeInternal(std::int64_t value)
Definition: to-gvariant-visitor.hpp:93
void writeInternal(std::int32_t value)
Definition: to-gvariant-visitor.hpp:90
Tuple or pair checker.
Types declarations.
Internal configuration helper.
void writeInternal(std::uint32_t value)
Definition: to-gvariant-visitor.hpp:102
void writeInternal(const std::map< std::string, V > &values)
Definition: to-gvariant-visitor.hpp:153
void writeInternal(std::int16_t value)
Definition: to-gvariant-visitor.hpp:87
ToGVariantVisitor & operator=(const ToGVariantVisitor &)=delete
void visit(const std::string &, const T &value)
Definition: to-gvariant-visitor.hpp:77
void writeInternal(bool value)
Definition: to-gvariant-visitor.hpp:108
int value
Definition: types.hpp:34
std::enable_if< isVisitable< T >::value &&!isUnion< T >::value >::type writeInternal(const T &value)
Definition: to-gvariant-visitor.hpp:182
std::enable_if< isVisitable< T >::value &&isUnion< T >::value >::type writeInternal(const T &value)
Definition: to-gvariant-visitor.hpp:191
ToGVariantVisitor()
Definition: to-gvariant-visitor.hpp:46
void writeInternal(const char *value)
Definition: to-gvariant-visitor.hpp:117
void writeInternal(const std::string &value)
Definition: to-gvariant-visitor.hpp:114
void writeInternal(std::int8_t value)
Definition: to-gvariant-visitor.hpp:84
void add(const char *type, Value value)
Definition: to-gvariant-visitor.hpp:199
void writeInternal(const cargo::FileDescriptor &value)
Definition: to-gvariant-visitor.hpp:120
GVariant * toVariant()
Definition: to-gvariant-visitor.hpp:65
void visitFields(T &t, F f, A...args)
Definition: visit-fields.hpp:58