5 #include "ico_dbus_amb_efl.h"
9 /*============================================================================*/
11 /*============================================================================*/
12 #if defined(__GNUC__) && __GNUC__ >= 4
13 #define ICO_API __attribute__ ((visibility("default")))
18 E_DBus_Connection *conn = NULL;
19 static const char gBUSNAME[] = "org.automotive.message.broker";
20 static const char gAMBManagerPath[] = "org.automotive.Manager";
21 static const char gAMBManagerIf[] = "org.automotive.Manager";
22 static const char gAMBInterface[] = "org.automotive.";
23 static const char gAMBPROPERTIES_IF[] = "org.freedesktop.DBus.Properties";
39 union dbus_value_variant value;
40 ico_dbus_amb_getcb getcb;
41 ico_dbus_amb_noticb noticb;
42 ico_dbus_amb_findcb findcb;
43 enum MethodType mtype;
47 struct _signal_handler {
51 E_DBus_Signal_Handler *handler;
52 struct _method_args *args;
53 struct _signal_handler *next;
56 static struct _signal_handler *signal_handler_list = NULL;
58 static int getproperty(struct _method_args *args);
59 static void getproperty_cb(void *data, DBusMessage *msg, DBusError *error);
60 static void set_cb(void *data, DBusMessage *msg, DBusError *error);
61 static void get_cb(void *data, DBusMessage *msg, DBusError *error);
62 static void subscribe_cb(void *data, DBusMessage *msg);
64 ICO_API int ico_dbus_amb_start(void) {
70 conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
77 ICO_API int ico_dbus_amb_end(void) {
79 e_dbus_connection_close(conn);
84 ICO_API int ico_dbus_amb_get(const char *objectname, const char *property, int zone, dbus_type type, ico_dbus_amb_getcb cb, void *user_data) {
85 struct _method_args *args;
87 if (objectname == NULL || strlen(objectname) == 0) {
90 if (property == NULL || strlen(property) == 0) {
93 args = (struct _method_args*)malloc(sizeof(struct _method_args));
97 args->objectname = strdup(objectname);
98 args->property = strdup(property);
102 args->mtype = METHOD_GET;
103 args->user_data = user_data;
105 return getproperty(args);
109 ICO_API int ico_dbus_amb_set(const char *objectname, const char *property, int zone, dbus_type type, union dbus_value_variant value) {
110 struct _method_args *args;
112 if (objectname == NULL || strlen(objectname) == 0) {
115 if (property == NULL || strlen(property) == 0) {
118 args = (struct _method_args*)malloc(sizeof(struct _method_args));
122 args->objectname = strdup(objectname);
123 args->property = strdup(property);
126 args->mtype = METHOD_SET;
129 return getproperty(args);
133 ICO_API int ico_dbus_amb_subscribe(const char *objectname, const char *property, int zone, dbus_type type, ico_dbus_amb_noticb cb, void *user_data) {
134 struct _method_args *args;
135 struct _signal_handler *head;
137 if (objectname == NULL || strlen(objectname) == 0) {
140 if (property == NULL || strlen(property) == 0) {
144 if (signal_handler_list != NULL) {
145 head = signal_handler_list;
146 while (head != NULL) {
147 if (strcmp(head->property, property) == 0 && head->zone == zone && strcmp(head->objectname, objectname) == 0) {
154 args = (struct _method_args*)malloc(sizeof(struct _method_args));
158 args->objectname = strdup(objectname);
159 args->property = strdup(property);
163 args->mtype = METHOD_SUBSCRIBE;
164 args->user_data = user_data;
166 return getproperty(args);
169 ICO_API int ico_dbus_amb_unsubscribe(const char *objectname, const char *property, int zone) {
170 struct _signal_handler *head, *prev;
172 if (objectname == NULL || strlen(objectname) == 0) {
175 if (property == NULL || strlen(property) == 0) {
179 if (signal_handler_list != NULL) {
181 head = signal_handler_list;
182 while (head != NULL) {
183 if (strcmp(head->property, property) == 0 && head->zone == zone && strcmp(head->objectname, objectname) == 0) {
185 signal_handler_list = head->next;
188 prev->next = head->next;
190 e_dbus_signal_handler_del(conn, head->handler);
191 free(head->objectname);
192 free(head->property);
193 free(head->args->objectname);
194 free(head->args->property);
207 ICO_API int ico_dbus_amb_gethistory(const char *objectname, const char *property, int zone) {
212 ICO_API int ico_dbus_amb_find_property(const char *objectname,
213 const char *property,
216 ico_dbus_amb_findcb cb,
219 struct _method_args *args;
221 if (objectname == NULL || strlen(objectname) == 0) {
224 if (property == NULL || strlen(property) == 0) {
227 args = (struct _method_args*)malloc(sizeof(struct _method_args));
231 args->objectname = strdup(objectname);
232 args->property = strdup(property);
236 args->mtype = METHOD_FIND;
237 args->user_data = user_data;
239 return getproperty(args);
242 int getproperty(struct _method_args *args) {
245 msg = dbus_message_new_method_call(gBUSNAME, "/", gAMBManagerIf, "FindObjectForZone");
249 dbus_message_append_args(msg, DBUS_TYPE_STRING, &(args->objectname), DBUS_TYPE_INT32, &(args->zone), DBUS_TYPE_INVALID);
251 msg = dbus_message_new_method_call(gBUSNAME, "/", gAMBManagerIf, "findProperty");
255 dbus_message_append_args(msg, DBUS_TYPE_STRING, &(args->objectname), DBUS_TYPE_INVALID);
257 e_dbus_message_send(conn, msg, getproperty_cb, -1, (void*)args);
258 dbus_message_unref(msg);
262 void getproperty_cb(void *data, DBusMessage *msg, DBusError *error) {
263 struct _method_args *args;
266 DBusMessage *methodmsg;
269 E_DBus_Signal_Handler *sighandler;
270 struct _signal_handler *_sig_handler, *head;
273 args = (struct _method_args*)data;
276 if (NULL != args && NULL != error) {
277 ICO_ERR("FindProperty[%s]: %s : %s", args->property,
278 error->name, error->message);
279 if (METHOD_FIND == args->mtype) {
280 ico_dbus_error_t ico_error;
281 ico_error.name = error->name;
282 ico_error.message = error->message;
283 if (NULL != args->findcb) {
284 args->findcb(args->objectname, args->property, args->dtype,
285 args->user_data, &ico_error);
287 free(args->objectname);
288 free(args->property);
293 ICO_ERR("FindProperty: %s : %s", error->name, error->message);
299 dbus_message_get_args(msg, &e, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID);
300 //printf("Object Path:%s\n", path);
301 memset(interface, 0, sizeof(interface));
302 sprintf(interface, "%s%s", gAMBInterface, args->objectname);
303 interfacep = interface;
305 gettimeofday(&tv, NULL);
306 printf("%d.%06d LIB FINDPROPERTY %s %s\n", (int)tv.tv_sec, (int)tv.tv_usec, args->property, path);
308 switch(args->mtype) {
310 methodmsg = dbus_message_new_method_call(gBUSNAME, path, gAMBPROPERTIES_IF, "Set");
311 switch (args->dtype) {
312 case DBUS_TYPE_BYTE :
313 dbus_message_append_args(methodmsg, DBUS_TYPE_STRING, &interfacep, DBUS_TYPE_STRING, &(args->property), DBUS_TYPE_BYTE, &(args->value.yval), DBUS_TYPE_INVALID);
315 case DBUS_TYPE_BOOLEAN :
316 dbus_message_append_args(methodmsg, DBUS_TYPE_STRING, &interfacep, DBUS_TYPE_STRING, &(args->property), DBUS_TYPE_BOOLEAN, &(args->value.bval), DBUS_TYPE_INVALID);
318 case DBUS_TYPE_INT16 :
319 dbus_message_append_args(methodmsg, DBUS_TYPE_STRING, &interfacep, DBUS_TYPE_STRING, &(args->property), DBUS_TYPE_INT16, &(args->value.i16val), DBUS_TYPE_INVALID);
321 case DBUS_TYPE_UINT16 :
322 dbus_message_append_args(methodmsg, DBUS_TYPE_STRING, &interfacep, DBUS_TYPE_STRING, &(args->property), DBUS_TYPE_UINT16, &(args->value.ui16val), DBUS_TYPE_INVALID);
324 case DBUS_TYPE_INT32 :
325 dbus_message_append_args(methodmsg, DBUS_TYPE_STRING, &interfacep, DBUS_TYPE_STRING, &(args->property), DBUS_TYPE_INT32, &(args->value.i32val), DBUS_TYPE_INVALID);
327 case DBUS_TYPE_UINT32 :
328 dbus_message_append_args(methodmsg, DBUS_TYPE_STRING, &interfacep, DBUS_TYPE_STRING, &(args->property), DBUS_TYPE_UINT32, &(args->value.ui32val), DBUS_TYPE_INVALID);
330 case DBUS_TYPE_INT64 :
331 dbus_message_append_args(methodmsg, DBUS_TYPE_STRING, &interfacep, DBUS_TYPE_STRING, &(args->property), DBUS_TYPE_INT64, &(args->value.i64val), DBUS_TYPE_INVALID);
333 case DBUS_TYPE_UINT64 :
334 dbus_message_append_args(methodmsg, DBUS_TYPE_STRING, &interfacep, DBUS_TYPE_STRING, &(args->property), DBUS_TYPE_UINT64, &(args->value.ui64val), DBUS_TYPE_INVALID);
336 case DBUS_TYPE_DOUBLE :
337 dbus_message_append_args(methodmsg, DBUS_TYPE_STRING, &interfacep, DBUS_TYPE_STRING, &(args->property), DBUS_TYPE_DOUBLE, &(args->value.dval), DBUS_TYPE_INVALID);
339 case DBUS_TYPE_STRING :
340 dbus_message_append_args(methodmsg, DBUS_TYPE_STRING, &interfacep, DBUS_TYPE_STRING, &(args->property), DBUS_TYPE_STRING, &(args->value.sval), DBUS_TYPE_INVALID);
345 e_dbus_message_send(conn, methodmsg, set_cb, -1, NULL);
346 dbus_message_unref(methodmsg);
347 free(args->objectname);
348 free(args->property);
352 methodmsg = dbus_message_new_method_call(gBUSNAME, path, gAMBPROPERTIES_IF, "Get");
353 dbus_message_append_args(methodmsg, DBUS_TYPE_STRING, &interfacep, DBUS_TYPE_STRING, &(args->property), DBUS_TYPE_INVALID);
354 e_dbus_message_send(conn, methodmsg, get_cb, -1, (void*)args);
355 dbus_message_unref(methodmsg);
357 case METHOD_GETHISTORY :
359 case METHOD_SUBSCRIBE :
360 _sig_handler = (struct _signal_handler*)malloc(sizeof(struct _signal_handler));
361 if (_sig_handler == NULL) {
362 free(args->objectname);
363 free(args->property);
367 sighandler = e_dbus_signal_handler_add(conn, gBUSNAME, path, gAMBPROPERTIES_IF, "PropertiesChanged", subscribe_cb, (void*)args);
368 _sig_handler->property = strdup(args->property);
369 _sig_handler->objectname = strdup(args->objectname);
370 _sig_handler->zone = args->zone;
371 _sig_handler->handler = sighandler;
372 _sig_handler->args = args;
373 _sig_handler->next = NULL;
374 if (signal_handler_list == NULL) {
375 signal_handler_list = _sig_handler;
378 head = signal_handler_list;
379 while (head->next != NULL) {
382 head->next = _sig_handler;
385 case METHOD_UNSUBSCRIBE :
388 if (NULL != args->findcb) {
389 args->findcb(args->objectname, args->property, args->dtype,
390 args->user_data, NULL);
391 free(args->objectname);
392 free(args->property);
401 void set_cb(void *data, DBusMessage *msg, DBusError *error) {
404 fprintf(stderr, "set_cb::DBusError [%s: %s]\n", error->name, error->message);
410 void get_cb(void *data, DBusMessage *msg, DBusError *error) {
411 struct _method_args *args;
413 union dbus_value_variant value;
414 DBusMessageIter iter, variant;
418 fprintf(stderr, "get_cb::DBusError [%s: %s]\n", error->name, error->message);
422 if (!msg || !dbus_message_iter_init(msg, &iter)) {
426 args = (struct _method_args*)data;
427 dbus_message_iter_recurse(&iter, &variant);
429 switch (args->dtype) {
430 case DBUS_TYPE_BYTE :
431 dbus_message_iter_get_basic(&variant, &value.yval);
433 case DBUS_TYPE_BOOLEAN :
434 dbus_message_iter_get_basic(&variant, &value.bval);
436 case DBUS_TYPE_INT16 :
437 dbus_message_iter_get_basic(&variant, &value.i16val);
439 case DBUS_TYPE_UINT16 :
440 dbus_message_iter_get_basic(&variant, &value.ui16val);
442 case DBUS_TYPE_INT32 :
443 dbus_message_iter_get_basic(&variant, &value.i32val);
445 case DBUS_TYPE_UINT32 :
446 dbus_message_iter_get_basic(&variant, &value.ui32val);
448 case DBUS_TYPE_INT64 :
449 dbus_message_iter_get_basic(&variant, &value.i64val);
451 case DBUS_TYPE_UINT64 :
452 dbus_message_iter_get_basic(&variant, &value.ui64val);
454 case DBUS_TYPE_DOUBLE :
455 dbus_message_iter_get_basic(&variant, &value.dval);
457 case DBUS_TYPE_STRING :
458 dbus_message_iter_get_basic(&variant, &value.sval);
463 args->getcb(args->objectname, args->property, args->dtype, value, args->user_data);
464 free(args->objectname);
465 free(args->property);
469 static void subscribe_cb(void *data, DBusMessage *msg) {
470 struct _method_args *args;
472 union dbus_value_variant value;
481 DBusMessageIter iter, dict, entry, variant;
483 if (!msg || !dbus_message_iter_init(msg, &iter)) {
487 args = (struct _method_args*)data;
489 dbus_message_iter_next(&iter);
490 dbus_message_iter_recurse(&iter, &dict);
491 dbus_message_iter_recurse(&dict, &entry);
492 dbus_message_iter_get_basic(&entry, &propertyname);
493 if (strcmp(args->property, propertyname) != 0) {
496 dbus_message_iter_next(&entry);
497 dbus_message_iter_recurse(&entry, &variant);
499 switch (args->dtype) {
500 case DBUS_TYPE_BYTE :
501 dbus_message_iter_get_basic(&variant, &value.yval);
503 case DBUS_TYPE_BOOLEAN :
504 dbus_message_iter_get_basic(&variant, &value.bval);
506 case DBUS_TYPE_INT16 :
507 dbus_message_iter_get_basic(&variant, &value.i16val);
509 case DBUS_TYPE_UINT16 :
510 dbus_message_iter_get_basic(&variant, &value.ui16val);
512 case DBUS_TYPE_INT32 :
513 dbus_message_iter_get_basic(&variant, &value.i32val);
515 case DBUS_TYPE_UINT32 :
516 dbus_message_iter_get_basic(&variant, &value.ui32val);
518 case DBUS_TYPE_INT64 :
519 dbus_message_iter_get_basic(&variant, &value.i64val);
521 case DBUS_TYPE_UINT64 :
522 dbus_message_iter_get_basic(&variant, &value.ui64val);
524 case DBUS_TYPE_DOUBLE :
525 dbus_message_iter_get_basic(&variant, &value.dval);
527 case DBUS_TYPE_STRING :
528 dbus_message_iter_get_basic(&variant, &value.sval);
533 dbus_message_iter_next(&dict);
534 dbus_message_iter_recurse(&dict, &entry);
535 dbus_message_iter_get_basic(&entry, &sequencename);
536 dbus_message_iter_next(&entry);
537 dbus_message_iter_recurse(&entry, &variant);
538 dbus_message_iter_get_basic(&variant, &sequenceno);
539 dbus_message_iter_next(&dict);
540 dbus_message_iter_recurse(&dict, &entry);
541 dbus_message_iter_get_basic(&entry, &timename);
542 dbus_message_iter_next(&entry);
543 dbus_message_iter_recurse(&entry, &variant);
544 dbus_message_iter_get_basic(&variant, &time);
545 //printf("Subscribe %s, %s:%d, %s:%f\n", propertyname, sequencename, sequenceno, timename, time);
548 time_ms = time * 1000000;
550 tv.tv_usec = time_ms;
551 args->noticb(args->objectname, args->property, args->dtype, value, sequenceno, tv, args->user_data);