automotive-message-broker
0.14.803
Main Page
Related Pages
Modules
Namespaces
Classes
Files
Examples
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Groups
Pages
lib
client
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
EXPORT 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
EXPORT 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
\
141
EXPORT int amb_get_ ## obj_name ## _by_value(int *zone, int *valuesequence, double *time, value_type *value) \
142
{ \
143
struct obj_name ## Type *p; \
144
int ret = amb_get_ ## obj_name ## _with_zone(&p, 0); \
145
if (ret != 0) \
146
return ret; \
147
\
148
*zone = p->Zone; \
149
*valuesequence = p->ValueSequence; \
150
*time = p->Time; \
151
*value = p->Value; \
152
\
153
amb_release_data(p); \
154
return 0; \
155
} \
156
\
157
EXPORT int amb_convert_ ## obj_name ##_by_value(void *data, int *zone, int *valuesequence, double *time, value_type *value) \
158
{ \
159
struct obj_name ## Type retdata; \
160
amb_convert_## obj_name ## Type(data, &retdata); \
161
\
162
*zone = retdata.Zone; \
163
*valuesequence = retdata.ValueSequence; \
164
*time = retdata.Time; \
165
*value = retdata.Value; \
166
return 0; \
167
}
168
179
#define CAN_OBJECT_WRITABLE(obj_name, value_type, alias_name) \
180
EXPORT int amb_set_ ## obj_name ## _with_zone(value_type value, int zone) \
181
{ \
182
GVariant *variant; \
183
int ret; \
184
variant = g_variant_new_ ## value_type(value); \
185
ret = amb_set_property(#obj_name, \
186
g_strcmp0(#alias_name, "NULL") ? #alias_name : "Value", \
187
zone, variant);\
188
if (ret < 0) { \
189
fprintf(stderr, "Fail to amb_set_property: %d\n", ret); \
190
return ret; \
191
} \
192
\
193
return 0; \
194
}
195
196
#ifdef __cplusplus
197
}
198
#endif
199
200
#endif
/* __LIBAMB_UTIL_H__ */
Generated by
1.8.2