automotive-message-broker  0.14.803
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
libamb-util.h
1 /*
2  * Automotive Message Broker Client Library
3  *
4  * Copyright (C) 2016 Samsung Electronics Co., Ltd.
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 
19 #ifndef __LIBAMB_UTIL_H__
20 #define __LIBAMB_UTIL_H__
21 
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25 
26 #include <glib.h>
27 #include <gio/gio.h>
28 #include <stdio.h>
29 #include <errno.h>
30 
31 #include "libamb-common.h"
32 #include "libamb-client.h"
33 
34 #define g_variant_get_gboolean g_variant_get_boolean
35 #define g_variant_get_guchar g_variant_get_byte
36 #define g_variant_get_gint16 g_variant_get_int16
37 #define g_variant_get_guint16 g_variant_get_uint16
38 #define g_variant_get_gint32 g_variant_get_int32
39 #define g_variant_get_guint32 g_variant_get_uint32
40 #define g_variant_get_gint64 g_variant_get_int64
41 #define g_variant_get_guint64 g_variant_get_uint64
42 #define g_variant_get_gdouble g_variant_get_double
43 
44 #define g_variant_new_gboolean g_variant_new_boolean
45 #define g_variant_new_guchar g_variant_new_byte
46 #define g_variant_new_gint16 g_variant_new_int16
47 #define g_variant_new_guint16 g_variant_new_uint16
48 #define g_variant_new_gint32 g_variant_new_int32
49 #define g_variant_new_guint32 g_variant_new_uint32
50 #define g_variant_new_gint64 g_variant_new_int64
51 #define g_variant_new_guint64 g_variant_new_uint64
52 #define g_variant_new_gdouble g_variant_new_double
53 
64 #define CAN_OBJECT(obj_name, value_type, alias_name) \
65  struct obj_name ## Type { \
66  gint32 Zone; \
67  gint32 ValueSequence; \
68  gdouble Time; \
69  value_type Value; \
70  }; \
71  int amb_get_ ## obj_name ## _with_zone(struct obj_name ## Type **retobj, int zone) \
72  { \
73  GVariant *variant; \
74  GVariantIter *iter; \
75  gchar *key; \
76  GVariant *value; \
77  GVariant *tmp; \
78  int ret; \
79  struct obj_name ## Type *retdata = NULL; \
80  \
81  retdata = g_malloc0(sizeof(*retdata)); \
82  if (!retdata) { \
83  return -ENOMEM; \
84  } \
85  ret = amb_get_property_all_with_zone(&variant, #obj_name, zone); \
86  if (ret < 0) { \
87  return ret; \
88  } \
89  \
90  g_variant_get(variant, "(a{sv})", &iter); \
91  while(g_variant_iter_loop(iter, "{sv}", &key, &value)) { \
92  if (!g_strcmp0(key, "Zone")) { \
93  g_variant_get(value, "v", &tmp); \
94  retdata->Zone = g_variant_get_int32(tmp); \
95  g_variant_unref(tmp); \
96  } else if (!g_strcmp0(key, "ValueSequence") || !g_strcmp0(key, #alias_name "Sequence")) { \
97  g_variant_get(value, "v", &tmp); \
98  retdata->ValueSequence = g_variant_get_int32(tmp); \
99  g_variant_unref(tmp); \
100  } else if (!g_strcmp0(key, "Time")) { \
101  g_variant_get(value, "v", &tmp); \
102  retdata->Time = g_variant_get_double(tmp); \
103  g_variant_unref(tmp); \
104  } else if (!g_strcmp0(key, "Value") || !g_strcmp0(key, #alias_name)) { \
105  g_variant_get(value, "v", &tmp); \
106  retdata->Value = g_variant_get_ ## value_type(tmp); \
107  g_variant_unref(tmp); \
108  } \
109  } \
110  \
111  g_variant_iter_free(iter); \
112  amb_release_property_all_with_zone(variant); \
113  *retobj = retdata; \
114  return 0; \
115  } \
116  \
117  int amb_convert_ ## obj_name ## Type (gpointer data, struct obj_name ## Type *retdata) \
118  { \
119  GVariantIter *iter; \
120  gchar *key; \
121  GVariant *value; \
122  GVariant *gdata; \
123  \
124  gdata = (GVariant *)data; \
125  g_variant_get(gdata, "a{sv}", &iter); \
126  while(g_variant_iter_loop(iter, "{sv}", &key, &value)) { \
127  if (!g_strcmp0(key, "Zone")) { \
128  g_variant_get(value, "i", &retdata->Zone); \
129  } else if (!g_strcmp0(key, "ValueSequence") || !g_strcmp0(key, #alias_name "Sequence")) { \
130  g_variant_get(value, "i", &retdata->ValueSequence); \
131  } else if (!g_strcmp0(key, "Time")) { \
132  g_variant_get(value, "d", &retdata->Time); \
133  } else if (!g_strcmp0(key, "Value") || !g_strcmp0(key, #alias_name)) { \
134  retdata->Value = g_variant_get_ ## value_type(value); \
135  } \
136  } \
137  g_variant_iter_free(iter); \
138  return 0; \
139  }
140 
151 #define CAN_OBJECT_WRITABLE(obj_name, value_type, alias_name) \
152  int amb_set_ ## obj_name ## _with_zone(value_type value, int zone) \
153  { \
154  GVariant *variant; \
155  int ret; \
156  variant = g_variant_new_ ## value_type(value); \
157  ret = amb_set_property(#obj_name, \
158  g_strcmp0(#alias_name, "NULL") ? #alias_name : "Value", \
159  zone, variant);\
160  if (ret < 0) { \
161  fprintf(stderr, "Fail to amb_set_property: %d\n", ret); \
162  return ret; \
163  } \
164  \
165  return 0; \
166  }
167 
168 #ifdef __cplusplus
169 }
170 #endif
171 
172 #endif /* __LIBAMB_UTIL_H__ */