2 * event system low-level API
9 #include <bundle_internal.h>
12 #include <eventsystem.h>
13 #include <openssl/md5.h>
17 #define LOG_TAG "eventsystem"
19 #define SYS_EVENT_NAME_PREFIX "tizen.system.event"
20 #define EVENT_SYSTEM_PREFIX "eventsystem.id_"
21 #define EVENT_SYSTEM_PREFIX_LEN 15
22 #define EVENT_SYSTEM_MEMBER "eventsystem"
23 #define VALID_COUNT_OF_EVENTNAME_TOKEN 3
24 #define VALID_LAST_COUNT_FOR_EVENTNAME (VALID_COUNT_OF_EVENTNAME_TOKEN + 1)
25 #define MAX_COUNT_FOR_EVENTNAME_CHECK (VALID_LAST_COUNT_FOR_EVENTNAME + 1)
27 #define _E(fmt, arg...) LOGE(fmt, ##arg)
28 #define _D(fmt, arg...) LOGD(fmt, ##arg)
29 #define _W(fmt, arg...) LOGW(fmt, ##arg)
30 #define _I(fmt, arg...) LOGI(fmt, ##arg)
32 #define retvm_if(expr, val, fmt, arg...) do { \
35 _E("(%s) -> %s() return", #expr, __func__); \
40 #define retv_if(expr, val) do { \
42 _E("(%s) -> %s() return", #expr, __func__); \
47 #define tryvm_if(expr, val, fmt, arg...) do { \
49 _E("(%s) "fmt, #expr, ##arg); \
55 pthread_mutex_t send_sync_lock = PTHREAD_MUTEX_INITIALIZER;
57 static GList *system_event_list;
58 static int _initialized;
59 static GHashTable *check_tbl;
61 typedef struct eventmap {
70 eventsystem_handler ep_cb;
74 typedef struct eventinfo {
76 char *destination_name;
85 typedef struct sysevent_info {
87 guint owner_id_session;
88 char *own_name_system_bus;
89 char *own_name_session_bus;
91 static sysevent_info_s s_info;
93 static int __eventsystem_request_event_launch(const char *method_name,
94 const char *event_name, bundle *data);
95 static int __eventsystem_check_user_send_validation(const char *event_name);
96 static int __eventsystem_requet_destination_list(const char *event_name, GList **dest_list);
98 static int __event_compare_name_cb(gconstpointer a, gconstpointer b)
100 eventmap_s *key1 = (eventmap_s *)a;
101 eventmap_s *key2 = (eventmap_s *)b;
102 return strcmp(key1->interface_name, key2->interface_name) |
103 strcmp(key1->member_name, key2->member_name);
106 static int __event_compare_reg_id_cb(gconstpointer a, gconstpointer b)
108 eventmap_s *key1 = (eventmap_s *)a;
109 eventmap_s *key2 = (eventmap_s *)b;
110 return !(key1->reg_id == key2->reg_id);
113 static void __initialize(void)
115 #if (GLIB_MAJOR_VERSION <= 2 && GLIB_MINOR_VERSION < 36)
122 static char *__get_object_path(char *interface_name)
125 char *object_path = (char *)calloc(strlen(interface_name), sizeof(char)+2);
127 if (object_path == NULL) {
128 _E("failed to allocate memory");
132 object_path[0] = '/';
134 for (i = 0 ; interface_name[i] ; i++) {
136 if (interface_name[i] == '.') {
137 object_path[i+1] = '/';
139 object_path[i+1] = interface_name[i];
146 static char *__get_encoded_interface_name(char *interface_name)
148 unsigned char c[MD5_DIGEST_LENGTH] = {0, };
149 char *md5_evtid = NULL;
154 MD5_Init(&mdContext);
155 MD5_Update(&mdContext, interface_name, strlen(interface_name));
156 MD5_Final(c, &mdContext);
158 md5_evtid = (char *)calloc(EVENT_SYSTEM_PREFIX_LEN + (MD5_DIGEST_LENGTH * 2) + 1,
160 if (md5_evtid == NULL) {
161 _D("Malloc failed!!");
165 sprintf(md5_evtid, "%s", EVENT_SYSTEM_PREFIX);
169 temp += EVENT_SYSTEM_PREFIX_LEN;
171 for (index = 0; index < MD5_DIGEST_LENGTH; index++) {
172 sprintf(temp, "%02x", c[index]);
179 static char *__get_member_name_from_eventname(char *event_name)
182 char *ptr_last = NULL;
183 char *temp_name = NULL;
184 char *member_name = NULL;
187 temp_name = strdup(event_name);
188 if (temp_name == NULL) {
193 ptr = strtok(temp_name, ".");
195 _E("invalid event_name(%s), count(%d)", event_name, count);
196 FREE_AND_NULL(temp_name);
201 while (count < MAX_COUNT_FOR_EVENTNAME_CHECK) {
202 ptr = strtok(NULL, ".");
205 /* _D("(%d)ptr(%s)(%d)", count, ptr, strlen(ptr)); */
209 FREE_AND_NULL(temp_name);
211 if (count != VALID_LAST_COUNT_FOR_EVENTNAME) {
212 _E("invalid event_name(%s), count(%d)", event_name, count);
217 /* _D("new member_name(%s)(%d)", ptr_last, strlen(ptr_last)); */
218 member_name = strdup(ptr_last);
224 _E("ptr_last is NULL");
228 _D("member_name(%s)", member_name);
233 static int __check_validation_user_defined_name(const char *event_name)
235 char *event_id = NULL;
239 if (check_tbl == NULL) {
240 check_tbl = g_hash_table_new(g_str_hash, g_str_equal);
243 event_id = (char *)g_hash_table_lookup(check_tbl, event_name);
245 if (event_id == NULL) {
246 if (__eventsystem_check_user_send_validation(event_name) < 0) {
247 _E("invalid user-event name");
250 key = strdup(event_name);
255 g_hash_table_insert(check_tbl, key, key);
263 static int __check_eventname_validation_user(char *event_name)
266 int len = strlen(USER_EVENT_NAME_PREFIX);
268 if (strncmp(event_name, USER_EVENT_NAME_PREFIX, len) != 0) {
275 static int __check_eventname_validation_system(char *event_name)
278 int len = strlen(SYS_EVENT_NAME_PREFIX);
280 if (strncmp(event_name, SYS_EVENT_NAME_PREFIX, len) != 0) {
287 static int __get_gdbus_shared_connection(GDBusConnection **connection, GBusType bus_type,
288 eventsystem_event_type event_type)
290 GError *error = NULL;
297 *connection = g_bus_get_sync(bus_type, NULL, &error);
298 if (*connection == NULL) {
300 _E("Failed to get dbus [%s], bus_type [%d]",
301 error->message, bus_type);
307 if (((bus_type == G_BUS_TYPE_SYSTEM && !s_info.owner_id) ||
308 (bus_type == G_BUS_TYPE_SESSION && !s_info.owner_id_session))) {
310 char own_name[128] = {0, };
312 guid = g_dbus_generate_guid();
314 _E("failed to get guid");
317 snprintf(own_name, 128, "%s_%s_%s_%d", "event.busname",
318 (bus_type == G_BUS_TYPE_SESSION ? "session" : "system"),
322 _D("bus_name is [%s]", own_name);
323 owner_id = g_bus_own_name_on_connection(*connection, own_name,
324 G_BUS_NAME_OWNER_FLAGS_NONE,
325 NULL, NULL, NULL, NULL);
327 _E("g_bus_own_name_on_connection, error");
331 if (bus_type == G_BUS_TYPE_SESSION && event_type == ES_TYPE_USER) {
332 /* set same name on system-bus */
333 GDBusConnection *conn_system = NULL;
336 conn_system = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
337 if (conn_system == NULL) {
338 _E("failed to get system connection");
340 _E("error(%s)", error->message);
345 owner_id = g_bus_own_name_on_connection(conn_system,
346 own_name, G_BUS_NAME_OWNER_FLAGS_NONE,
347 NULL, NULL, NULL, NULL);
349 _E("g_bus_own_name_on_connection(for system), error");
350 g_object_unref(conn_system);
354 g_object_unref(conn_system);
358 if (bus_type == G_BUS_TYPE_SESSION) {
359 s_info.owner_id_session = owner_id;
360 s_info.own_name_session_bus = strdup(own_name);
361 if (s_info.own_name_session_bus == NULL) {
366 s_info.owner_id = owner_id;
367 s_info.own_name_system_bus = strdup(own_name);
368 if (s_info.own_name_system_bus == NULL) {
378 static void __eventsystem_event_handler(GDBusConnection *connection,
379 const gchar *sender_name, const gchar *object_path,
380 const gchar *interface_name, const gchar *signal_name,
381 GVariant *parameters, gpointer user_data)
385 GList *cb_list = NULL;
387 bundle_raw *raw = NULL;
388 gboolean is_trusted = FALSE;
390 em.interface_name = (char *)interface_name;
391 em.member_name = (char *)signal_name;
393 _D("sender_name(%s), interface_name(%s), signal_name(%s)",
394 sender_name, interface_name, signal_name);
396 cb_list = g_list_find_custom(system_event_list, &em,
397 (GCompareFunc)__event_compare_name_cb);
398 if (cb_list == NULL) {
402 g_variant_get(parameters, "(bus)", &is_trusted, &len, &raw);
404 buf = bundle_decode((bundle_raw *)raw, len);
406 em.event_name = ((eventmap_s *)cb_list->data)->event_name;
407 em.ep_cb = ((eventmap_s *)cb_list->data)->ep_cb;
409 em.ep_cb(em.event_name, buf, user_data);
412 bundle_free_encoded_rawdata(&raw);
416 static void __eventsystem_application_event_handler(GDBusConnection *connection,
417 const gchar *sender_name, const gchar *object_path,
418 const gchar *interface_name, const gchar *signal_name,
419 GVariant *parameters, gpointer user_data)
421 GList *cb_list = NULL;
423 bundle_raw *raw = NULL;
426 em.interface_name = (char *)interface_name;
427 em.member_name = (char *)signal_name;
429 _D("sender_name(%s), interface_name(%s), signal_name(%s)",
430 sender_name, interface_name, signal_name);
432 cb_list = g_list_find_custom(system_event_list, &em,
433 (GCompareFunc)__event_compare_name_cb);
435 if (cb_list == NULL) {
439 g_variant_get(parameters, "(bus)", NULL, &len, &raw);
441 em.event_name = ((eventmap_s *)cb_list->data)->event_name;
442 em.es_cb = ((eventmap_s *)cb_list->data)->es_cb;
444 em.es_cb(em.event_name, raw, len, user_data);
447 bundle_free_encoded_rawdata(&raw);
451 * application-use filter for user-event
453 static void __eventsystem_filter_userevent_for_application(GDBusConnection *connection,
454 const gchar *sender_name, const gchar *object_path,
455 const gchar *interface_name, const gchar *signal_name,
456 GVariant *parameters, gpointer user_data)
458 gboolean is_trusted = FALSE;
460 _D("sender_name(%s), interface_name(%s)", sender_name, interface_name);
462 g_variant_get(parameters, "(bus)", &is_trusted, NULL, NULL);
464 __eventsystem_application_event_handler(connection, sender_name,
465 object_path, interface_name, signal_name, parameters, user_data);
469 * application-use filter for system-event
471 static void __eventsystem_filter_sysevent_for_application(GDBusConnection *connection,
472 const gchar *sender_name, const gchar *object_path,
473 const gchar *interface_name, const gchar *signal_name,
474 GVariant *parameters, gpointer user_data)
476 _D("sender_name(%s), interface_name(%s)", sender_name, interface_name);
478 __eventsystem_application_event_handler(connection, sender_name,
479 object_path, interface_name, signal_name, parameters, user_data);
483 * internal-use filter for user-event
485 static void __eventsystem_filter_userevent_for_internal(GDBusConnection *connection,
486 const gchar *sender_name, const gchar *object_path,
487 const gchar *interface_name, const gchar *signal_name,
488 GVariant *parameters, gpointer user_data)
490 _D("sender_name(%s), interface_name(%s), signal_name(%s)",
491 sender_name, interface_name, signal_name);
493 __eventsystem_event_handler(connection, sender_name,
494 object_path, interface_name, signal_name, parameters, user_data);
498 * internal-use filter for system-event
500 static void __eventsystem_filter_sysevent_for_internal(GDBusConnection *connection,
501 const gchar *sender_name, const gchar *object_path,
502 const gchar *interface_name, const gchar *signal_name,
503 GVariant *parameters, gpointer user_data)
505 _D("sender_name(%s), interface_name(%s), signal_name(%s)",
506 sender_name, interface_name, signal_name);
508 __eventsystem_event_handler(connection, sender_name,
509 object_path, interface_name, signal_name, parameters, user_data);
512 static int __eventsystem_register_event_internal(const char *event_name,
513 eventmap_s **em_s, void *user_data)
515 eventmap_s *em = NULL;
516 char *interface_name = NULL;
517 char *object_path = NULL;
518 char *member_name = NULL;
519 char *sender_name = NULL;
520 GDBusSignalCallback filter;
522 guint subscription_id = 0;
524 int evt_type = ES_TYPE_UNKNOWN;
525 GDBusConnection *conn = NULL;
527 if (__check_eventname_validation_system((char *)event_name)) {
528 evt_type = ES_TYPE_SYSTEM;
529 } else if (__check_eventname_validation_user((char *)event_name)) {
530 evt_type = ES_TYPE_USER;
532 evt_type = ES_TYPE_UNKNOWN;
533 _E("unknown type event(%s)", event_name);
537 if (evt_type == ES_TYPE_SYSTEM) {
538 interface_name = strdup(SYS_EVENT_NAME_PREFIX);
539 if (interface_name == NULL) {
545 member_name = __get_member_name_from_eventname((char *)event_name);
546 if (member_name == NULL) {
547 _E("invalid member_name");
552 if (!g_dbus_is_member_name(member_name)) {
553 _E("invalid member name");
557 filter = __eventsystem_filter_sysevent_for_internal;
559 interface_name = __get_encoded_interface_name((char *)event_name);
560 if (!interface_name) {
561 _E("interface_name is NULL");
565 if (!g_dbus_is_interface_name(interface_name)) {
566 _E("invalid interface_name(%s)", interface_name);
570 member_name = strdup(EVENT_SYSTEM_MEMBER);
576 filter = __eventsystem_filter_userevent_for_internal;
579 object_path = __get_object_path(interface_name);
581 _E("object_path is NULL");
587 bus_type = G_BUS_TYPE_SYSTEM;
589 if (__get_gdbus_shared_connection(&conn, bus_type, evt_type) < 0) {
590 _E("getting gdbus-connetion error");
594 subscription_id = g_dbus_connection_signal_subscribe(conn,
595 sender_name, /* sender */
597 member_name, /* member */
598 object_path, /* object_path */
600 G_DBUS_SIGNAL_FLAGS_NONE,
603 NULL); /* user_data_free_func */
605 _D("event_name(%s), interface_name(%s)", event_name, interface_name);
606 _D("member_name(%s), subscription_id(%d), bus_type(%d)",
607 member_name, subscription_id, bus_type);
609 if (subscription_id != 0) {
610 em = calloc(1, sizeof(eventmap_s));
612 _E("memory alloc failed");
615 em->interface_name = strdup(interface_name);
616 em->member_name = strdup(member_name);
617 em->event_name = strdup(event_name);
618 em->bus_type = bus_type;
619 em->reg_id = subscription_id;
620 em->event_type = evt_type;
622 if (!em->interface_name || !em->member_name || !em->event_name) {
624 FREE_AND_NULL(em->interface_name);
625 FREE_AND_NULL(em->member_name);
626 FREE_AND_NULL(em->event_name);
636 _D("dbus subscribe: error(%d), event(%s)", subscription_id, event_name);
641 FREE_AND_NULL(object_path);
643 FREE_AND_NULL(member_name);
645 FREE_AND_NULL(interface_name);
648 g_object_unref(conn);
655 * function : register the event
657 int eventsystem_register_event(const char *event_name, unsigned int *reg_id,
658 eventsystem_handler callback, void *user_data)
660 eventmap_s *em = NULL;
661 int ret = ES_R_ERROR;
663 retvm_if(!g_dbus_is_interface_name(event_name), ES_R_EINVAL,
664 "Invalid argument : event_name(%s)", event_name);
665 retvm_if(!reg_id, ES_R_EINVAL, "Invalid argument : reg_id");
666 retvm_if(!callback, ES_R_EINVAL, "Invalid argument : callback");
672 ret = __eventsystem_register_event_internal(event_name, &em, user_data);
674 if (ret == ES_R_OK && em) {
675 em->ep_cb = callback;
676 system_event_list = g_list_append(system_event_list, em);
677 *reg_id = em->reg_id;
680 _E("error, ret(%d), em(%s)", ret, em);
687 * function : unregister the event
689 int eventsystem_unregister_event(unsigned int reg_id)
692 eventmap_s *em_data = NULL;
694 GList *cb_list = NULL;
695 GDBusConnection *conn = NULL;
696 eventsystem_event_type evt_type;
698 retvm_if(reg_id == 0, ES_R_EINVAL, "Invalid argument : reg_id");
705 cb_list = g_list_find_custom(system_event_list, &em,
706 (GCompareFunc)__event_compare_reg_id_cb);
708 em_data = (eventmap_s *)cb_list->data;
710 bus_type = em_data->bus_type;
711 evt_type = em_data->event_type;
713 _D("unsubscribe: reg_id(%d), bus_type(%d)", reg_id, bus_type);
715 if (__get_gdbus_shared_connection(&conn, bus_type, evt_type) < 0) {
716 _E("getting gdbus-connetion error");
719 g_dbus_connection_signal_unsubscribe(conn, reg_id);
721 system_event_list = g_list_remove(system_event_list, cb_list->data);
723 FREE_AND_NULL(em_data->interface_name);
724 FREE_AND_NULL(em_data->member_name);
725 FREE_AND_NULL(em_data->event_name);
726 FREE_AND_NULL(em_data);
727 g_object_unref(conn);
733 static int eventsystem_send_event(GDBusConnection *conn, eventinfo_s *evti, bundle *data)
735 GError *error = NULL;
736 GVariant *param = NULL;
739 bundle_raw *raw = NULL;
743 bundle_encode(buf, &raw, &len);
745 if (!evti->is_user_event)
746 evti->is_trusted = FALSE;
748 param = g_variant_new("(bus)", evti->is_trusted, len, raw);
749 ret = g_dbus_connection_emit_signal(conn,
750 evti->destination_name,
752 evti->interface_name,
757 _D("interface_name(%s)", evti->interface_name);
758 _D("object_path(%s)", evti->object_path);
759 _D("member_name(%s)", evti->member_name);
761 bundle_free_encoded_rawdata(&raw);
764 _E("Unable to connect to dbus: %s", error->message);
772 static void __eventsystem_free_trusted_list(gpointer data)
774 char *name = (char *)data;
779 static int __eventsystem_send_trusted_event(GDBusConnection *conn, eventinfo_s *evti,
780 bundle *data, GList *dest_list)
782 GList *tmp_list = NULL;
787 tmp_list = g_list_first(dest_list);
789 while (tmp_list != NULL) {
790 char *dest_name = (char *)tmp_list->data;
791 if (dest_name && dest_name[0] != '\0') {
792 _D("dest_name(%s)", dest_name);
793 evti->destination_name = dest_name;
794 ret = eventsystem_send_event(conn, evti, data);
795 if (ret != ES_R_OK) {
802 tmp_list = g_list_next(tmp_list);
804 g_list_free_full(dest_list, __eventsystem_free_trusted_list);
807 __eventsystem_request_event_launch("RequestTrustedEventLaunch",
808 evti->event_name, data);
811 _E("dest_list is null");
818 * function : send the user-event
820 int eventsystem_send_user_event(const char *event_name, bundle *data, bool is_trusted)
824 /* check validation */
825 retvm_if(!event_name, ES_R_EINVAL, "Invalid argument : event_name is NULL");
826 retvm_if(!data, ES_R_EINVAL, "Invalid argument : data is NULL");
827 retvm_if(!__check_eventname_validation_user((char *)event_name), ES_R_EINVAL,
828 "Invalid argument : event_name(%s)", event_name);
830 if (!__check_validation_user_defined_name(event_name)) {
831 _E("Invalid event name(%s)", event_name);
835 eventinfo_s *evti = NULL;
836 evti = calloc(1, sizeof(eventinfo_s));
838 _E("memory alloc failed");
841 evti->event_name = strdup(event_name);
842 if (!evti->event_name) {
843 _E("memory alloc failed");
848 evti->interface_name = __get_encoded_interface_name(evti->event_name);
849 if (!evti->interface_name) {
850 _E("interface_name is NULL");
854 evti->member_name = strdup(EVENT_SYSTEM_MEMBER);
855 if (!evti->member_name) {
856 _E("memory alloc failed");
861 evti->object_path = __get_object_path(evti->interface_name);
862 if (!evti->object_path) {
863 _E("object_path is NULL");
868 evti->destination_name = NULL;
869 evti->is_user_event = true;
870 evti->is_trusted = (gboolean)is_trusted;
872 GDBusConnection *conn = NULL;
873 if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SESSION, ES_TYPE_USER) == ES_R_OK) {
874 if (evti->is_trusted) {
875 GList *dest_list = NULL;
876 ret = __eventsystem_requet_destination_list(evti->event_name, &dest_list);
878 _E("failed to get dest list");
881 ret = __eventsystem_send_trusted_event(conn, evti,
885 ret = eventsystem_send_event(conn, evti, data);
886 if (ret == ES_R_OK) {
887 __eventsystem_request_event_launch("RequestEventLaunch",
888 evti->event_name, data);
892 _E("getting gdbus-connetion error");
897 g_object_unref(conn);
899 FREE_AND_NULL(evti->object_path);
901 FREE_AND_NULL(evti->member_name);
903 FREE_AND_NULL(evti->interface_name);
905 FREE_AND_NULL(evti->event_name);
913 * function : send the system-event
915 int eventsystem_send_system_event(const char *event_name, bundle *data)
919 pthread_mutex_lock(&send_sync_lock);
921 /* check validation */
922 tryvm_if(!event_name, ret = ES_R_EINVAL, "Invalid argument : event_name is NULL");
923 tryvm_if(!data, ret = ES_R_EINVAL, "Invalid argument : data is NULL");
924 tryvm_if(!__check_eventname_validation_system((char *)event_name), ret = ES_R_EINVAL,
925 "Invalid argument : event_name(%s)", event_name);
926 tryvm_if(!g_dbus_is_interface_name(event_name), ret = ES_R_EINVAL,
927 "Invalid argument : event_name(%s)", event_name);
929 _D("event_name(%s)", event_name);
931 eventinfo_s *evti = NULL;
932 evti = calloc(1, sizeof(eventinfo_s));
934 _E("memory alloc failed");
935 pthread_mutex_unlock(&send_sync_lock);
938 evti->event_name = strdup(event_name);
939 if (!evti->event_name) {
944 evti->interface_name = strdup(SYS_EVENT_NAME_PREFIX);
945 if (!evti->interface_name) {
950 evti->member_name = __get_member_name_from_eventname(evti->event_name);
951 if (!evti->member_name) {
952 _E("member_name is NULL");
956 if (!g_dbus_is_member_name(evti->member_name)) {
957 _E("Invalid member_name(%s)", evti->member_name);
961 evti->object_path = __get_object_path(evti->interface_name);
962 if (!evti->object_path) {
963 _E("object_path is NULL");
967 evti->destination_name = NULL;
968 evti->is_user_event = false;
969 evti->is_trusted = FALSE;
971 GDBusConnection *conn = NULL;
972 if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) == ES_R_OK) {
973 ret = eventsystem_send_event(conn, evti, data);
975 _E("getting gdbus-connection error");
980 g_object_unref(conn);
982 FREE_AND_NULL(evti->object_path);
984 FREE_AND_NULL(evti->member_name);
986 FREE_AND_NULL(evti->interface_name);
988 FREE_AND_NULL(evti->event_name);
993 pthread_mutex_unlock(&send_sync_lock);
999 * function : request sending the event
1001 int eventsystem_request_sending_system_event(const char *event_name, bundle *data)
1004 GDBusConnection *conn = NULL;
1005 GError *error = NULL;
1006 GDBusProxy *proxy = NULL;
1007 GVariant *param = NULL;
1008 GVariant *value = NULL;
1010 bundle_raw *raw = NULL;
1013 _D("event_name(%s)", event_name);
1015 if (!_initialized) {
1019 if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) < 0) {
1020 _E("getting gdbus-connetion error");
1025 proxy = g_dbus_proxy_new_sync(conn,
1026 G_DBUS_PROXY_FLAGS_NONE, NULL,
1027 ESD_BUS_NAME, ESD_OBJECT_PATH, ESD_INTERFACE_NAME,
1029 if (proxy == NULL) {
1030 _E("failed to create new proxy, error(%s)", error->message);
1031 g_error_free(error);
1036 bundle_encode(data, &raw, &len);
1038 param = g_variant_new("(ssi)", event_name, raw, len);
1039 value = g_dbus_proxy_call_sync(proxy, "RequestSendingEvent", param,
1040 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1041 if (error != NULL) {
1042 _E("proxy call sync error(%s)", error->message);
1043 g_error_free(error);
1048 g_variant_get(value, "(i)", &result);
1050 _D("result(%d)", result);
1055 g_variant_unref(value);
1058 g_object_unref(conn);
1064 static int __eventsystem_request_event_launch(const char *method_name,
1065 const char *event_name, bundle *data)
1068 GDBusConnection *conn = NULL;
1069 GError *error = NULL;
1070 GDBusProxy *proxy = NULL;
1071 GVariant *param = NULL;
1072 GVariant *value = NULL;
1074 bundle_raw *raw = NULL;
1077 _D("event_name(%s)", event_name);
1079 if (!_initialized) {
1083 if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) < 0) {
1084 _E("getting gdbus-connetion error");
1089 proxy = g_dbus_proxy_new_sync(conn,
1090 G_DBUS_PROXY_FLAGS_NONE, NULL,
1091 ESD_BUS_NAME, ESD_OBJECT_PATH, ESD_INTERFACE_NAME,
1093 if (proxy == NULL) {
1094 _E("failed to create new proxy, error(%s)", error->message);
1095 g_error_free(error);
1100 bundle_encode(data, &raw, &len);
1102 param = g_variant_new("(ssi)", event_name, raw, len);
1103 value = g_dbus_proxy_call_sync(proxy, method_name, param,
1104 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1105 if (error != NULL) {
1106 _E("proxy call sync error(%s)", error->message);
1107 g_error_free(error);
1112 g_variant_get(value, "(i)", &result);
1114 _D("result(%d)", result);
1119 g_variant_unref(value);
1122 g_object_unref(conn);
1128 static int __eventsystem_check_user_send_validation(const char *event_name)
1130 int ret = ES_R_EINVAL;
1131 GDBusConnection *conn = NULL;
1132 GError *error = NULL;
1133 GDBusProxy *proxy = NULL;
1134 GVariant *param = NULL;
1135 GVariant *value = NULL;
1138 if (!_initialized) {
1142 if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) < 0) {
1143 _E("getting gdbus-connetion error");
1148 proxy = g_dbus_proxy_new_sync(conn,
1149 G_DBUS_PROXY_FLAGS_NONE, NULL,
1150 ESD_BUS_NAME, ESD_OBJECT_PATH, ESD_INTERFACE_NAME,
1152 if (proxy == NULL) {
1153 _E("failed to create new proxy, error(%s)", error->message);
1154 g_error_free(error);
1159 param = g_variant_new("(s)", event_name);
1160 value = g_dbus_proxy_call_sync(proxy, "CheckUserSendValidation", param,
1161 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1162 if (error != NULL) {
1163 _E("proxy call sync error(%s)", error->message);
1164 g_error_free(error);
1169 g_variant_get(value, "(i)", &result);
1171 _D("result(%d)", result);
1177 g_variant_unref(value);
1180 g_object_unref(conn);
1186 static int __eventsystem_check_privilege_validation(const char *event_name)
1188 int ret = ES_R_ENOTPERMITTED;
1189 GDBusConnection *conn = NULL;
1190 GError *error = NULL;
1191 GDBusProxy *proxy = NULL;
1192 GVariant *param = NULL;
1193 GVariant *value = NULL;
1196 if (!_initialized) {
1200 if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) < 0) {
1201 _E("getting gdbus-connetion error");
1206 proxy = g_dbus_proxy_new_sync(conn,
1207 G_DBUS_PROXY_FLAGS_NONE, NULL,
1208 ESD_BUS_NAME, ESD_OBJECT_PATH, ESD_INTERFACE_NAME,
1210 if (proxy == NULL) {
1211 _E("failed to create new proxy, error(%s)", error->message);
1212 g_error_free(error);
1217 param = g_variant_new("(s)", event_name);
1218 value = g_dbus_proxy_call_sync(proxy, "CheckPrivilegeValidation", param,
1219 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1220 if (error != NULL) {
1221 _E("proxy call sync error(%s)", error->message);
1222 g_error_free(error);
1227 g_variant_get(value, "(i)", &result);
1229 _D("result(%d)", result);
1235 g_variant_unref(value);
1238 g_object_unref(conn);
1244 static int __eventsystem_setup_trusted_peer(const char *event_name, const char *dest_bus_name)
1246 int ret = ES_R_ERROR;
1247 GDBusConnection *conn = NULL;
1248 GError *error = NULL;
1249 GDBusProxy *proxy = NULL;
1250 GVariant *param = NULL;
1251 GVariant *value = NULL;
1254 if (!_initialized) {
1258 if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) < 0) {
1259 _E("getting gdbus-connetion error");
1264 proxy = g_dbus_proxy_new_sync(conn,
1265 G_DBUS_PROXY_FLAGS_NONE, NULL,
1266 ESD_BUS_NAME, ESD_OBJECT_PATH, ESD_INTERFACE_NAME,
1268 if (proxy == NULL) {
1269 _E("failed to create new proxy, error(%s)", error->message);
1270 g_error_free(error);
1275 param = g_variant_new("(ss)", event_name, dest_bus_name);
1277 value = g_dbus_proxy_call_sync(proxy, "SetupTrustedPeer", param,
1278 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1279 if (error != NULL) {
1280 _E("proxy call sync error(%s)", error->message);
1281 g_error_free(error);
1286 g_variant_get(value, "(i)", &result);
1288 _D("result(%d)", result);
1294 g_variant_unref(value);
1297 g_object_unref(conn);
1303 static int __eventsystem_requet_destination_list(const char *event_name, GList **dest_list)
1305 int ret = ES_R_ERROR;
1306 GDBusConnection *conn = NULL;
1307 GError *error = NULL;
1308 GDBusProxy *proxy = NULL;
1309 GVariant *param = NULL;
1310 GVariant *value = NULL;
1313 char *dest_name = NULL;
1316 if (!_initialized) {
1320 if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) < 0) {
1321 _E("getting gdbus-connetion error");
1326 proxy = g_dbus_proxy_new_sync(conn,
1327 G_DBUS_PROXY_FLAGS_NONE, NULL,
1328 ESD_BUS_NAME, ESD_OBJECT_PATH, ESD_INTERFACE_NAME,
1330 if (proxy == NULL) {
1331 _E("failed to create new proxy, error(%s)", error->message);
1332 g_error_free(error);
1337 param = g_variant_new("(s)", event_name);
1339 value = g_dbus_proxy_call_sync(proxy, "GetTrustedPeerList", param,
1340 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1341 if (error != NULL) {
1342 _E("proxy call sync error(%s)", error->message);
1343 g_error_free(error);
1348 g_variant_get(value, "(ias)", &result, &iter);
1350 _D("result(%d)", result);
1354 while (g_variant_iter_loop(iter, "s", &str)) {
1355 dest_name = strdup((char *)str);
1357 _D("dest name(%s)", str);
1358 *dest_list = g_list_append(*dest_list, dest_name);
1360 _E("out of memory");
1366 g_variant_iter_free(iter);
1369 g_variant_unref(value);
1372 g_object_unref(conn);
1378 #ifdef APPFW_EVENT_SYSTEM_EARLIER_FEATURE
1379 static int __eventsystem_request_earlier_data(const char *event_name,
1380 eventsystem_cb callback, void *user_data)
1383 GDBusConnection *conn = NULL;
1384 GError *error = NULL;
1385 GDBusProxy *proxy = NULL;
1386 GVariant *param = NULL;
1388 bundle_raw *raw = NULL;
1391 if (!_initialized) {
1395 if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) < 0) {
1396 _E("getting gdbus-connetion error");
1401 proxy = g_dbus_proxy_new_sync(conn,
1402 G_DBUS_PROXY_FLAGS_NONE, NULL,
1403 ESD_BUS_NAME, ESD_OBJECT_PATH, ESD_INTERFACE_NAME,
1406 if (proxy == NULL) {
1407 _E("failed to create new proxy, error(%s)", error->message);
1408 g_error_free(error);
1413 param = g_variant_new("(s)", event_name);
1414 GVariant *value = g_dbus_proxy_call_sync(proxy, "GetEarlierData", param,
1415 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1416 if (error != NULL) {
1417 _E("proxy call sync error(%s)", error->message);
1418 g_error_free(error);
1423 g_variant_get(value, "(iis)", &result, &len, &raw);
1424 g_variant_unref(value);
1426 _D("result(%d), len(%d)", result, len);
1428 if (!result && raw && len > 0) {
1429 callback(event_name, raw, len, user_data);
1430 bundle_free_encoded_rawdata(&raw);
1436 g_variant_unref(value);
1439 g_object_unref(conn);
1446 int eventsystem_register_application_event(const char *event_name, unsigned int *reg_id,
1447 int *event_type, eventsystem_cb callback, void *user_data)
1450 char *interface_name = NULL;
1451 char *object_path = NULL;
1452 char *member_name = NULL;
1453 char *sender_name = NULL;
1454 GDBusSignalCallback filter;
1456 guint subscription_id = 0;
1458 GDBusConnection *conn = NULL;
1460 if (!_initialized) {
1464 if (__check_eventname_validation_system((char *)event_name)) {
1465 if (__eventsystem_check_privilege_validation(event_name) != ES_R_OK) {
1466 _E("invalid privilege(%s)", event_name);
1467 return ES_R_ENOTPERMITTED;
1469 *event_type = ES_TYPE_SYSTEM;
1470 } else if (__check_eventname_validation_user((char *)event_name)) {
1471 *event_type = ES_TYPE_USER;
1473 *event_type = ES_TYPE_UNKNOWN;
1474 _E("unknown type event(%s)", event_name);
1478 if (*event_type == ES_TYPE_SYSTEM) {
1479 interface_name = strdup(SYS_EVENT_NAME_PREFIX);
1480 if (interface_name == NULL) {
1481 _E("out of memory");
1484 if (!g_dbus_is_interface_name(interface_name)) {
1485 _E("invalid interface_name(%s)", interface_name);
1486 FREE_AND_NULL(interface_name);
1489 member_name = __get_member_name_from_eventname((char *)event_name);
1490 if (member_name == NULL) {
1491 _E("member_name is NULL(%s)", event_name);
1492 FREE_AND_NULL(interface_name);
1495 if (!g_dbus_is_member_name(member_name)) {
1496 _E("Invalid member_name(%s)", member_name);
1497 FREE_AND_NULL(interface_name);
1498 FREE_AND_NULL(member_name);
1501 filter = __eventsystem_filter_sysevent_for_application;
1502 bus_type = G_BUS_TYPE_SYSTEM;
1504 interface_name = __get_encoded_interface_name((char *)event_name);
1505 if (!interface_name) {
1506 _E("interface_name is NULL");
1509 if (!g_dbus_is_interface_name(interface_name)) {
1510 _E("invalid interface_name(%s)", interface_name);
1511 FREE_AND_NULL(interface_name);
1514 member_name = strdup(EVENT_SYSTEM_MEMBER);
1516 _E("out_of_memory");
1517 FREE_AND_NULL(interface_name);
1520 filter = __eventsystem_filter_userevent_for_application;
1521 bus_type = G_BUS_TYPE_SESSION;
1524 object_path = __get_object_path(interface_name);
1526 _E("failed get object_path");
1527 FREE_AND_NULL(interface_name);
1528 FREE_AND_NULL(member_name);
1533 _D("interface_name(%s), object_path(%s)", interface_name, object_path);
1534 _D(" member_name(%s), sender_name(%s), type(%d), bus_type(%d)",
1535 member_name, sender_name, *event_type, bus_type);
1537 if (__get_gdbus_shared_connection(&conn, bus_type, *event_type) < 0) {
1538 _E("getting gdbus-connetion error");
1539 FREE_AND_NULL(interface_name);
1540 FREE_AND_NULL(object_path);
1541 FREE_AND_NULL(member_name);
1545 #ifdef APPFW_EVENT_SYSTEM_EARLIER_FEATURE
1546 __eventsystem_request_earlier_data(event_name, callback, user_data);
1549 subscription_id = g_dbus_connection_signal_subscribe(conn,
1550 sender_name, /* sender */
1552 member_name, /* member */
1553 object_path, /* object_path */
1555 G_DBUS_SIGNAL_FLAGS_NONE,
1558 NULL); /* user_data_free_func */
1560 _D("event_name(%s), subscription_id(%d)", event_name, subscription_id);
1562 if (subscription_id != 0) {
1563 em = calloc(1, sizeof(eventmap_s));
1565 _E("memory alloc failed");
1568 em->interface_name = strdup(interface_name);
1569 em->member_name = strdup(member_name);
1570 em->event_name = strdup(event_name);
1571 em->es_cb = callback;
1572 em->bus_type = bus_type;
1573 em->reg_id = subscription_id;
1574 em->event_type = *event_type;
1576 if (!em->interface_name || !em->member_name ||
1578 _E("out_of_memory");
1579 FREE_AND_NULL(em->interface_name);
1580 FREE_AND_NULL(em->member_name);
1581 FREE_AND_NULL(em->event_name);
1586 g_list_append(system_event_list, em);
1587 *reg_id = subscription_id;
1591 if (em->bus_type == G_BUS_TYPE_SESSION &&
1592 em->event_type == ES_TYPE_USER) {
1593 if (s_info.own_name_session_bus == NULL) {
1594 _E("session bus is not ready");
1597 if (__eventsystem_setup_trusted_peer(event_name,
1598 s_info.own_name_session_bus) < 0) {
1599 _E("failed to setup trusted peer");
1607 _E("dbus subscribe: error(%d)", subscription_id);
1611 FREE_AND_NULL(interface_name);
1612 FREE_AND_NULL(object_path);
1613 FREE_AND_NULL(member_name);
1615 g_object_unref(conn);
1621 int eventsystem_unregister_application_event(unsigned int reg_id)
1624 eventmap_s *em_data = NULL;
1626 GList *cb_list = NULL;
1627 GDBusConnection *conn = NULL;
1628 eventsystem_event_type evt_type;
1630 retvm_if(reg_id == 0, ES_R_EINVAL, "Invalid argument : reg_id");
1632 if (!_initialized) {
1637 cb_list = g_list_find_custom(system_event_list, &em,
1638 (GCompareFunc)__event_compare_reg_id_cb);
1640 em_data = (eventmap_s *)cb_list->data;
1642 bus_type = em_data->bus_type;
1643 evt_type = em_data->event_type;
1645 _D("unsubscribe: reg_id(%d), bus_type(%d)", reg_id, bus_type);
1647 if (__get_gdbus_shared_connection(&conn, bus_type, evt_type) < 0) {
1648 _E("getting gdbus-connetion error");
1651 g_dbus_connection_signal_unsubscribe(conn, reg_id);
1653 system_event_list = g_list_remove(system_event_list, cb_list->data);
1655 FREE_AND_NULL(em_data->interface_name);
1656 FREE_AND_NULL(em_data->member_name);
1657 FREE_AND_NULL(em_data->event_name);
1658 FREE_AND_NULL(em_data);
1659 g_object_unref(conn);
1661 _E("not found matched item");
1668 int eventsystem_application_finalize(void)
1670 gpointer key, value;
1672 _D("release all resouces");
1674 if (system_event_list) {
1675 g_list_free(system_event_list);
1679 GHashTableIter iter;
1681 g_hash_table_iter_init(&iter, check_tbl);
1683 while (g_hash_table_iter_next(&iter, &key, &value)) {
1684 char *val_item = (char *)value;
1688 _E("check_tbl, val_item is NULL");
1690 g_hash_table_iter_remove(&iter);
1692 g_hash_table_unref(check_tbl);
1695 FREE_AND_NULL(s_info.own_name_system_bus);
1696 FREE_AND_NULL(s_info.own_name_session_bus);