2 * event system low-level API
11 #include <eventsystem.h>
12 #include <openssl/md5.h>
16 #define LOG_TAG "eventsystem"
18 #define SYS_EVENT_NAME_PREFIX "tizen.system.event"
19 #define EVENT_SYSTEM_PREFIX "eventsystem.id_"
20 #define EVENT_SYSTEM_PREFIX_LEN 15
21 #define EVENT_SYSTEM_MEMBER "eventsystem"
22 #define VALID_COUNT_OF_EVENTNAME_TOKEN 3
23 #define VALID_LAST_COUNT_FOR_EVENTNAME (VALID_COUNT_OF_EVENTNAME_TOKEN + 1)
24 #define MAX_COUNT_FOR_EVENTNAME_CHECK (VALID_LAST_COUNT_FOR_EVENTNAME + 1)
26 #define _E(fmt, arg...) LOGE(fmt, ##arg)
27 #define _D(fmt, arg...) LOGD(fmt, ##arg)
28 #define _W(fmt, arg...) LOGW(fmt, ##arg)
29 #define _I(fmt, arg...) LOGI(fmt, ##arg)
31 #define retvm_if(expr, val, fmt, arg...) do { \
34 _E("(%s) -> %s() return", #expr, __func__); \
39 #define retv_if(expr, val) do { \
41 _E("(%s) -> %s() return", #expr, __func__); \
46 pthread_mutex_t send_sync_lock = PTHREAD_MUTEX_INITIALIZER;
48 static GList *system_event_list;
49 static int _initialized;
50 static GHashTable *filter_tbl;
51 static GHashTable *check_tbl;
53 typedef struct eventmap {
62 eventsystem_handler ep_cb;
66 typedef struct eventinfo {
76 typedef struct sysevent_info {
78 guint owner_id_session;
80 static sysevent_info_s s_info;
82 static int __eventsystem_request_event_launch(const char *event_name, bundle *data);
83 static bool __eventsystem_check_sender_validation_userevent(GDBusConnection *connection,
85 static int __eventsystem_check_user_send_validation(const char *event_name);
86 static int __eventsystem_check_user_certificate(int sender_pid);
88 static int __event_compare_name_cb(gconstpointer a, gconstpointer b)
90 eventmap_s *key1 = (eventmap_s *)a;
91 eventmap_s *key2 = (eventmap_s *)b;
92 return strcmp(key1->interface_name, key2->interface_name) |
93 strcmp(key1->member_name, key2->member_name);
96 static int __event_compare_reg_id_cb(gconstpointer a, gconstpointer b)
98 eventmap_s *key1 = (eventmap_s *)a;
99 eventmap_s *key2 = (eventmap_s *)b;
100 return !(key1->reg_id == key2->reg_id);
103 static void __initialize(void)
109 static char *__get_object_path(char *interface_name)
112 char *object_path = (char *)calloc(strlen(interface_name), sizeof(char)+2);
114 if (object_path == NULL) {
115 _E("failed to allocate memory");
119 object_path[0] = '/';
121 for (i = 0 ; interface_name[i] ; i++) {
123 if (interface_name[i] == '.') {
124 object_path[i+1] = '/';
126 object_path[i+1] = interface_name[i];
133 static char *__get_encoded_interface_name(char *interface_name)
135 unsigned char c[MD5_DIGEST_LENGTH] = {0, };
136 char *md5_evtid = NULL;
141 MD5_Init(&mdContext);
142 MD5_Update(&mdContext, interface_name, strlen(interface_name));
143 MD5_Final(c, &mdContext);
145 md5_evtid = (char *)calloc(EVENT_SYSTEM_PREFIX_LEN + (MD5_DIGEST_LENGTH * 2) + 1,
147 if (md5_evtid == NULL) {
148 _D("Malloc failed!!");
152 sprintf(md5_evtid, "%s", EVENT_SYSTEM_PREFIX);
156 temp += EVENT_SYSTEM_PREFIX_LEN;
158 for (index = 0; index < MD5_DIGEST_LENGTH; index++) {
159 sprintf(temp, "%02x", c[index]);
166 static char *__get_member_name_from_eventname(char *event_name)
169 char *ptr_last = NULL;
170 char *temp_name = NULL;
171 char *member_name = NULL;
174 temp_name = strdup(event_name);
175 if (temp_name == NULL) {
180 ptr = strtok(temp_name, ".");
182 _E("invalid event_name(%s), count(%d)", event_name, count);
187 while (count < MAX_COUNT_FOR_EVENTNAME_CHECK) {
188 ptr = strtok(NULL, ".");
191 /* _D("(%d)ptr(%s)(%d)", count, ptr, strlen(ptr)); */
195 FREE_AND_NULL(temp_name);
197 if (count != VALID_LAST_COUNT_FOR_EVENTNAME) {
198 _E("invalid event_name(%s), count(%d)", event_name, count);
203 /* _D("new member_name(%s)(%d)", ptr_last, strlen(ptr_last)); */
204 member_name = strdup(ptr_last);
210 _E("ptr_last is NULL");
214 _D("member_name(%s)", member_name);
219 static int __check_validation_user_defined_name(const char *event_name)
221 char *event_id = NULL;
225 if (check_tbl == NULL) {
226 check_tbl = g_hash_table_new(g_str_hash, g_str_equal);
229 event_id = (char *)g_hash_table_lookup(check_tbl, event_name);
231 if (event_id == NULL) {
232 if (__eventsystem_check_user_send_validation(event_name) < 0) {
233 _E("invalid user-event name");
236 key = strdup(event_name);
241 g_hash_table_insert(check_tbl, key, key);
249 static int __check_eventname_validation_user(char *event_name)
252 int len = strlen(USER_EVENT_NAME_PREFIX);
254 if (strncmp(event_name, USER_EVENT_NAME_PREFIX, len) != 0) {
261 static int __check_eventname_validation_system(char *event_name)
264 int len = strlen(SYS_EVENT_NAME_PREFIX);
266 if (strncmp(event_name, SYS_EVENT_NAME_PREFIX, len) != 0) {
273 static int __get_proc_status_by_pid(const char *what, int pid)
279 char _path[128] = {0, };
280 char _buf[1024] = {0, };
284 snprintf(_path, 128, "/proc/%d/status", pid);
286 fd = open(_path, O_RDONLY);
288 _E("open file(%s) error(%d), pid(%d)", _path, fd, pid);
292 ret = read(fd, _buf, 1024);
294 _E("read file(%s) error(%d), pid(%d)", _path, ret, pid);
298 pval = strstr(_buf, what);
305 for (i = 0; i < strlen(pval); i++) {
307 if (ch == ' ' || ch == '\t') {
308 ret = (int)strtol(pval, &ptr, 10);
310 if ((int)strlen(ptr) >= (int)strlen(pval)) {
316 } else if (ch == '\n')
327 static int __get_gdbus_shared_connection(GDBusConnection **connection,
328 GBusType bus_type, const char *interface_name)
330 GError *error = NULL;
337 *connection = g_bus_get_sync(bus_type, NULL, &error);
338 if (*connection == NULL) {
340 _E("Failed to get dbus [%s], bus_type [%d]",
341 error->message, bus_type);
347 if (interface_name &&
348 ((bus_type == G_BUS_TYPE_SYSTEM && !s_info.owner_id) ||
349 (bus_type == G_BUS_TYPE_SESSION && !s_info.owner_id_session))) {
350 char own_name[128] = {0, };
351 snprintf(own_name, 128, "%s_%d_%d", interface_name,
353 _D("own_name is [%s]", own_name);
354 owner_id = g_bus_own_name_on_connection(*connection, own_name,
355 G_BUS_NAME_OWNER_FLAGS_NONE,
356 NULL, NULL, NULL, NULL);
358 _E("g_bus_own_name_on_connection, error");
361 if (bus_type == G_BUS_TYPE_SESSION) {
362 s_info.owner_id_session = owner_id;
364 s_info.owner_id = owner_id;
371 static int __get_sender_pid(GDBusConnection *conn, const char *sender_name)
373 GDBusMessage *msg = NULL;
374 GDBusMessage *reply = NULL;
379 msg = g_dbus_message_new_method_call("org.freedesktop.DBus", "/org/freedesktop/DBus",
380 "org.freedesktop.DBus", "GetConnectionUnixProcessID");
382 _D("Can't allocate new method call");
386 g_dbus_message_set_body(msg, g_variant_new ("(s)", sender_name));
387 reply = g_dbus_connection_send_message_with_reply_sync(conn, msg,
388 G_DBUS_SEND_MESSAGE_FLAGS_NONE, -1, NULL, NULL, &err);
392 _E("Failed to get pid [%s]", err->message);
398 body = g_dbus_message_get_body(reply);
399 g_variant_get(body, "(u)", &pid);
405 g_object_unref(reply);
410 static void __eventsystem_event_handler(GDBusConnection *connection,
411 const gchar *sender_name, const gchar *object_path,
412 const gchar *interface_name, const gchar *signal_name,
413 GVariant *parameters, gpointer user_data)
417 GList *cb_list = NULL;
419 bundle_raw *raw = NULL;
420 gboolean is_trusted = FALSE;
422 em.interface_name = (char *)interface_name;
423 em.member_name = (char *)signal_name;
425 _D("sender_name(%s), interface_name(%s), signal_name(%s)",
426 sender_name, interface_name, signal_name);
428 cb_list = g_list_find_custom(system_event_list, &em,
429 (GCompareFunc)__event_compare_name_cb);
430 if (cb_list == NULL) {
434 g_variant_get(parameters, "(bus)", &is_trusted, &len, &raw);
436 buf = bundle_decode((bundle_raw *)raw, len);
438 em.event_name = ((eventmap_s *)cb_list->data)->event_name;
439 em.ep_cb = ((eventmap_s *)cb_list->data)->ep_cb;
441 em.ep_cb(em.event_name, buf, user_data);
444 bundle_free_encoded_rawdata(&raw);
448 static void __eventsystem_application_event_handler(GDBusConnection *connection,
449 const gchar *sender_name, const gchar *object_path,
450 const gchar *interface_name, const gchar *signal_name,
451 GVariant *parameters, gpointer user_data)
453 GList *cb_list = NULL;
455 bundle_raw *raw = NULL;
458 em.interface_name = (char *)interface_name;
459 em.member_name = (char *)signal_name;
461 _D("sender_name(%s), interface_name(%s), signal_name(%s)",
462 sender_name, interface_name, signal_name);
464 cb_list = g_list_find_custom(system_event_list, &em,
465 (GCompareFunc)__event_compare_name_cb);
467 if (cb_list == NULL) {
471 g_variant_get(parameters, "(bus)", NULL, &len, &raw);
473 em.event_name = ((eventmap_s *)cb_list->data)->event_name;
474 em.es_cb = ((eventmap_s *)cb_list->data)->es_cb;
476 em.es_cb(em.event_name, raw, len, user_data);
479 bundle_free_encoded_rawdata(&raw);
482 static bool __eventsystem_check_sender_validation_userevent(GDBusConnection *connection,
485 char *sender_id = NULL;
489 if (filter_tbl == NULL) {
490 filter_tbl = g_hash_table_new(g_str_hash, g_str_equal);
493 sender_id = (char *)g_hash_table_lookup(filter_tbl, sender_name);
495 if (sender_id == NULL) {
496 sender_pid = __get_sender_pid(connection, sender_name);
498 if (sender_pid > 0) {
499 if (__eventsystem_check_user_certificate(sender_pid) < 0) {
504 key = strdup(sender_name);
509 g_hash_table_insert(filter_tbl, key, key);
511 _E("failed to get sender_pid");
515 _D("sender_id(%s)", sender_id);
522 * application-use filter for user-event
524 static void __eventsystem_filter_userevent_for_application(GDBusConnection *connection,
525 const gchar *sender_name, const gchar *object_path,
526 const gchar *interface_name, const gchar *signal_name,
527 GVariant *parameters, gpointer user_data)
529 gboolean is_trusted = FALSE;
531 _D("sender_name(%s), interface_name(%s)", sender_name, interface_name);
533 g_variant_get(parameters, "(bus)", &is_trusted, NULL, NULL);
535 /* check signature */
537 __eventsystem_check_sender_validation_userevent(connection,
538 (char *)sender_name) == false) {
542 __eventsystem_application_event_handler(connection, sender_name,
543 object_path, interface_name, signal_name, parameters, user_data);
547 * application-use filter for system-event
549 static void __eventsystem_filter_sysevent_for_application(GDBusConnection *connection,
550 const gchar *sender_name, const gchar *object_path,
551 const gchar *interface_name, const gchar *signal_name,
552 GVariant *parameters, gpointer user_data)
554 _D("sender_name(%s), interface_name(%s)", sender_name, interface_name);
556 __eventsystem_application_event_handler(connection, sender_name,
557 object_path, interface_name, signal_name, parameters, user_data);
561 * internal-use filter for user-event
563 static void __eventsystem_filter_userevent_for_internal(GDBusConnection *connection,
564 const gchar *sender_name, const gchar *object_path,
565 const gchar *interface_name, const gchar *signal_name,
566 GVariant *parameters, gpointer user_data)
568 _D("sender_name(%s), interface_name(%s), signal_name(%s)",
569 sender_name, interface_name, signal_name);
571 __eventsystem_event_handler(connection, sender_name,
572 object_path, interface_name, signal_name, parameters, user_data);
576 * internal-use filter for system-event
578 static void __eventsystem_filter_sysevent_for_internal(GDBusConnection *connection,
579 const gchar *sender_name, const gchar *object_path,
580 const gchar *interface_name, const gchar *signal_name,
581 GVariant *parameters, gpointer user_data)
583 _D("sender_name(%s), interface_name(%s), signal_name(%s)",
584 sender_name, interface_name, signal_name);
586 __eventsystem_event_handler(connection, sender_name,
587 object_path, interface_name, signal_name, parameters, user_data);
590 static int __eventsystem_register_event_internal(const char *event_name,
591 eventmap_s **em_s, void *user_data)
593 eventmap_s *em = NULL;
594 char *interface_name = NULL;
595 char *object_path = NULL;
596 char *member_name = NULL;
597 char *sender_name = NULL;
598 GDBusSignalCallback filter;
600 guint subscription_id = 0;
602 int evt_type = ES_TYPE_UNKNOWN;
603 GDBusConnection *conn = NULL;
605 if (__check_eventname_validation_system((char *)event_name)) {
606 evt_type = ES_TYPE_SYSTEM;
607 } else if (__check_eventname_validation_user((char *)event_name)) {
608 evt_type = ES_TYPE_USER;
610 evt_type = ES_TYPE_UNKNOWN;
611 _E("unknown type event(%s)", event_name);
615 if (evt_type == ES_TYPE_SYSTEM) {
616 interface_name = strdup(SYS_EVENT_NAME_PREFIX);
617 if (interface_name == NULL) {
623 member_name = __get_member_name_from_eventname((char *)event_name);
624 if (member_name == NULL) {
625 _E("invalid member_name");
630 if (!g_dbus_is_member_name(member_name)) {
631 _E("invalid member name");
635 filter = __eventsystem_filter_sysevent_for_internal;
637 interface_name = __get_encoded_interface_name((char *)event_name);
638 if (!interface_name) {
639 _E("interface_name is NULL");
643 if (!g_dbus_is_interface_name(interface_name)) {
644 _E("invalid interface_name(%s)", interface_name);
648 member_name = strdup(EVENT_SYSTEM_MEMBER);
654 filter = __eventsystem_filter_userevent_for_internal;
657 object_path = __get_object_path(interface_name);
659 _E("object_path is NULL");
665 bus_type = G_BUS_TYPE_SYSTEM;
667 if (__get_gdbus_shared_connection(&conn, bus_type, interface_name) < 0) {
668 _E("getting gdbus-connetion error");
672 subscription_id = g_dbus_connection_signal_subscribe(conn,
673 sender_name, /* sender */
675 member_name, /* member */
676 object_path, /* object_path */
678 G_DBUS_SIGNAL_FLAGS_NONE,
681 NULL); /* user_data_free_func */
683 _D("event_name(%s), interface_name(%s)", event_name, interface_name);
684 _D("member_name(%s), subscription_id(%d), bus_type(%d)",
685 member_name, subscription_id, bus_type);
687 if (subscription_id != 0) {
688 em = calloc(1, sizeof(eventmap_s));
690 _E("memory alloc failed");
693 em->interface_name = strdup(interface_name);
694 em->member_name = strdup(member_name);
695 em->event_name = strdup(event_name);
696 em->bus_type = bus_type;
697 em->reg_id = subscription_id;
698 em->event_type = evt_type;
700 if (!em->interface_name || !em->member_name || !em->event_name) {
702 FREE_AND_NULL(em->interface_name);
703 FREE_AND_NULL(em->member_name);
704 FREE_AND_NULL(em->event_name);
714 _D("dbus subscribe: error(%d), event(%s)", subscription_id, event_name);
719 FREE_AND_NULL(object_path);
721 FREE_AND_NULL(member_name);
723 FREE_AND_NULL(interface_name);
726 g_object_unref(conn);
733 * function : register the event
735 int eventsystem_register_event(const char *event_name, unsigned int *reg_id,
736 eventsystem_handler callback, void *user_data)
738 eventmap_s *em = NULL;
739 int ret = ES_R_ERROR;
741 retvm_if(!g_dbus_is_interface_name(event_name), ES_R_EINVAL,
742 "Invalid argument : event_name(%s)", event_name);
743 retvm_if(!reg_id, ES_R_EINVAL, "Invalid argument : reg_id");
744 retvm_if(!callback, ES_R_EINVAL, "Invalid argument : callback");
750 ret = __eventsystem_register_event_internal(event_name, &em, user_data);
752 if (ret == ES_R_OK && em) {
753 em->ep_cb = callback;
754 system_event_list = g_list_append(system_event_list, em);
755 *reg_id = em->reg_id;
758 _E("error, ret(%d), em(%s)", ret, em);
765 * function : unregister the event
767 int eventsystem_unregister_event(unsigned int reg_id)
770 eventmap_s *em_data = NULL;
772 GList *cb_list = NULL;
773 GDBusConnection *conn = NULL;
775 retvm_if(reg_id == 0, ES_R_EINVAL, "Invalid argument : reg_id");
782 cb_list = g_list_find_custom(system_event_list, &em,
783 (GCompareFunc)__event_compare_reg_id_cb);
785 em_data = (eventmap_s *)cb_list->data;
787 bus_type = em_data->bus_type;
789 _D("unsubscribe: reg_id(%d), bus_type(%d)", reg_id, bus_type);
791 if (__get_gdbus_shared_connection(&conn, bus_type, em_data->interface_name) < 0) {
792 _E("getting gdbus-connetion error");
795 g_dbus_connection_signal_unsubscribe(conn, reg_id);
797 system_event_list = g_list_remove(system_event_list, cb_list->data);
799 FREE_AND_NULL(em_data->interface_name);
800 FREE_AND_NULL(em_data->member_name);
801 FREE_AND_NULL(em_data->event_name);
802 FREE_AND_NULL(em_data);
803 g_object_unref(conn);
809 static int eventsystem_send_event(GDBusConnection *conn, eventinfo_s *evti, bundle *data)
811 GError *error = NULL;
812 GVariant *param = NULL;
815 bundle_raw *raw = NULL;
819 bundle_encode(buf, &raw, &len);
821 if (!evti->is_user_event)
822 evti->is_trusted = FALSE;
824 param = g_variant_new("(bus)", evti->is_trusted, len, raw);
825 ret = g_dbus_connection_emit_signal(conn,
828 evti->interface_name,
833 _D("interface_name(%s)", evti->interface_name);
834 _D("object_path(%s)", evti->object_path);
835 _D("member_name(%s)", evti->member_name);
837 bundle_free_encoded_rawdata(&raw);
840 _E("Unable to connect to dbus: %s", error->message);
849 * function : send the user-event
851 int eventsystem_send_user_event(const char *event_name, bundle *data, bool is_trusted)
855 /* check validation */
856 retvm_if(!event_name, ES_R_EINVAL, "Invalid argument : event_name is NULL");
857 retvm_if(!data, ES_R_EINVAL, "Invalid argument : data is NULL");
858 retvm_if(!__check_eventname_validation_user((char *)event_name), ES_R_EINVAL,
859 "Invalid argument : event_name(%s)", event_name);
861 if (!__check_validation_user_defined_name(event_name)) {
862 _E("Invalid event name(%s)", event_name);
866 eventinfo_s *evti = NULL;
867 evti = calloc(1, sizeof(eventinfo_s));
869 _E("memory alloc failed");
872 evti->event_name = strdup(event_name);
873 if (!evti->event_name) {
874 _E("memory alloc failed");
879 evti->interface_name = __get_encoded_interface_name(evti->event_name);
880 if (!evti->interface_name) {
881 _E("interface_name is NULL");
885 evti->member_name = strdup(EVENT_SYSTEM_MEMBER);
886 if (!evti->member_name) {
887 _E("memory alloc failed");
892 evti->object_path = __get_object_path(evti->interface_name);
893 if (!evti->object_path) {
894 _E("object_path is NULL");
899 evti->is_user_event = true;
900 evti->is_trusted = (gboolean)is_trusted;
902 GDBusConnection *conn = NULL;
903 if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SESSION,
904 evti->interface_name) == ES_R_OK) {
905 ret = eventsystem_send_event(conn, evti, data);
907 if (ret == ES_R_OK) {
908 __eventsystem_request_event_launch(evti->event_name, data);
911 _E("getting gdbus-connetion error");
916 g_object_unref(conn);
918 FREE_AND_NULL(evti->object_path);
920 FREE_AND_NULL(evti->member_name);
922 FREE_AND_NULL(evti->interface_name);
924 FREE_AND_NULL(evti->event_name);
932 * function : send the system-event
934 int eventsystem_send_system_event(const char *event_name, bundle *data)
938 pthread_mutex_lock(&send_sync_lock);
940 /* check validation */
941 retvm_if(!event_name, ES_R_EINVAL, "Invalid argument : event_name is NULL");
942 retvm_if(!data, ES_R_EINVAL, "Invalid argument : data is NULL");
943 retvm_if(!__check_eventname_validation_system((char *)event_name), ES_R_EINVAL,
944 "Invalid argument : event_name(%s)", event_name);
945 retvm_if(!g_dbus_is_interface_name(event_name), ES_R_EINVAL,
946 "Invalid argument : event_name(%s)", event_name);
948 /* only permitted process could send the system-evnet */
950 int sender_ppid = __get_proc_status_by_pid("PPid:", pid);
951 int sender_uid = __get_proc_status_by_pid("Uid:", pid);
953 _D("event_name(%s), pid(%d), sender_ppid(%d), sender_uid(%d)",
954 event_name, pid, sender_ppid, sender_uid);
956 eventinfo_s *evti = NULL;
957 evti = calloc(1, sizeof(eventinfo_s));
959 _E("memory alloc failed");
960 pthread_mutex_unlock(&send_sync_lock);
963 evti->event_name = strdup(event_name);
964 if (!evti->event_name) {
969 evti->interface_name = strdup(SYS_EVENT_NAME_PREFIX);
970 if (!evti->interface_name) {
975 evti->member_name = __get_member_name_from_eventname(evti->event_name);
976 if (!evti->member_name) {
977 _E("member_name is NULL");
981 if (!g_dbus_is_member_name(evti->member_name)) {
982 _E("Invalid member_name(%s)", evti->member_name);
986 evti->object_path = __get_object_path(evti->interface_name);
987 if (!evti->object_path) {
988 _E("object_path is NULL");
992 evti->is_user_event = false;
993 evti->is_trusted = FALSE;
995 GDBusConnection *conn = NULL;
996 if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, evti->interface_name) == ES_R_OK) {
997 ret = eventsystem_send_event(conn, evti, data);
999 _E("getting gdbus-connection error");
1004 g_object_unref(conn);
1006 FREE_AND_NULL(evti->object_path);
1008 FREE_AND_NULL(evti->member_name);
1010 FREE_AND_NULL(evti->interface_name);
1012 FREE_AND_NULL(evti->event_name);
1014 FREE_AND_NULL(evti);
1016 pthread_mutex_unlock(&send_sync_lock);
1022 * function : request sending the event
1024 int eventsystem_request_sending_system_event(const char *event_name, bundle *data)
1027 GDBusConnection *conn = NULL;
1028 GError *error = NULL;
1029 GDBusProxy *proxy = NULL;
1030 GVariant *param = NULL;
1031 GVariant *value = NULL;
1033 bundle_raw *raw = NULL;
1036 _D("event_name(%s)", event_name);
1038 if (!_initialized) {
1042 if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, NULL) < 0) {
1043 _E("getting gdbus-connetion error");
1048 proxy = g_dbus_proxy_new_sync(conn,
1049 G_DBUS_PROXY_FLAGS_NONE, NULL,
1050 ESD_BUS_NAME, ESD_OBJECT_PATH, ESD_INTERFACE_NAME,
1052 if (proxy == NULL) {
1053 _E("failed to create new proxy, error(%s)", error->message);
1054 g_error_free(error);
1059 bundle_encode(data, &raw, &len);
1061 param = g_variant_new("(ssi)", event_name, raw, len);
1062 value = g_dbus_proxy_call_sync(proxy, "RequestSendingEvent", param,
1063 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1064 if (error != NULL) {
1065 _E("proxy call sync error(%s)", error->message);
1066 g_error_free(error);
1071 g_variant_get(value, "(i)", &result);
1073 _D("result(%d)", result);
1078 g_variant_unref(value);
1081 g_object_unref(conn);
1087 static int __eventsystem_request_event_launch(const char *event_name, bundle *data)
1090 GDBusConnection *conn = NULL;
1091 GError *error = NULL;
1092 GDBusProxy *proxy = NULL;
1093 GVariant *param = NULL;
1094 GVariant *value = NULL;
1096 bundle_raw *raw = NULL;
1099 _D("event_name(%s)", event_name);
1101 if (!_initialized) {
1105 if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, NULL) < 0) {
1106 _E("getting gdbus-connetion error");
1111 proxy = g_dbus_proxy_new_sync(conn,
1112 G_DBUS_PROXY_FLAGS_NONE, NULL,
1113 ESD_BUS_NAME, ESD_OBJECT_PATH, ESD_INTERFACE_NAME,
1115 if (proxy == NULL) {
1116 _E("failed to create new proxy, error(%s)", error->message);
1117 g_error_free(error);
1122 bundle_encode(data, &raw, &len);
1124 param = g_variant_new("(ssi)", event_name, raw, len);
1125 value = g_dbus_proxy_call_sync(proxy, "RequestEventLaunch", param,
1126 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1127 if (error != NULL) {
1128 _E("proxy call sync error(%s)", error->message);
1129 g_error_free(error);
1134 g_variant_get(value, "(i)", &result);
1136 _D("result(%d)", result);
1141 g_variant_unref(value);
1144 g_object_unref(conn);
1150 static int __eventsystem_check_user_certificate(int sender_pid)
1153 GDBusConnection *conn = NULL;
1154 GError *error = NULL;
1155 GDBusProxy *proxy = NULL;
1156 GVariant *param = NULL;
1157 GVariant *value = NULL;
1158 gint result = ES_R_ERROR;;
1160 if (!_initialized) {
1164 if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, NULL) < 0) {
1165 _E("getting gdbus-connetion error");
1170 proxy = g_dbus_proxy_new_sync(conn,
1171 G_DBUS_PROXY_FLAGS_NONE, NULL,
1172 ESD_BUS_NAME, ESD_OBJECT_PATH, ESD_INTERFACE_NAME,
1174 if (proxy == NULL) {
1175 _E("failed to create new proxy, error(%s)", error->message);
1176 g_error_free(error);
1181 param = g_variant_new("(i)", sender_pid);
1182 value = g_dbus_proxy_call_sync(proxy, "CheckUserCertValidation", param,
1183 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1184 if (error != NULL) {
1185 _E("proxy call sync error(%s)", error->message);
1186 g_error_free(error);
1191 g_variant_get(value, "(i)", &result);
1193 _D("result(%d)", result);
1199 g_variant_unref(value);
1202 g_object_unref(conn);
1208 static int __eventsystem_check_user_send_validation(const char *event_name)
1211 GDBusConnection *conn = NULL;
1212 GError *error = NULL;
1213 GDBusProxy *proxy = NULL;
1214 GVariant *param = NULL;
1215 GVariant *value = NULL;
1216 gint result = ES_R_ERROR;;
1218 if (!_initialized) {
1222 if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, NULL) < 0) {
1223 _E("getting gdbus-connetion error");
1228 proxy = g_dbus_proxy_new_sync(conn,
1229 G_DBUS_PROXY_FLAGS_NONE, NULL,
1230 ESD_BUS_NAME, ESD_OBJECT_PATH, ESD_INTERFACE_NAME,
1232 if (proxy == NULL) {
1233 _E("failed to create new proxy, error(%s)", error->message);
1234 g_error_free(error);
1239 param = g_variant_new("(s)", event_name);
1240 value = g_dbus_proxy_call_sync(proxy, "CheckUserSendValidation", param,
1241 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1242 if (error != NULL) {
1243 _E("proxy call sync error(%s)", error->message);
1244 g_error_free(error);
1249 g_variant_get(value, "(i)", &result);
1251 _D("result(%d)", result);
1257 g_variant_unref(value);
1260 g_object_unref(conn);
1265 #ifdef APPFW_EVENT_SYSTEM_EARLIER_FEATURE
1266 static int __eventsystem_request_earlier_data(const char *event_name,
1267 eventsystem_cb callback, void *user_data)
1270 GDBusConnection *conn = NULL;
1271 GError *error = NULL;
1272 GDBusProxy *proxy = NULL;
1273 GVariant *param = NULL;
1275 bundle_raw *raw = NULL;
1278 if (!_initialized) {
1282 if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, NULL) < 0) {
1283 _E("getting gdbus-connetion error");
1288 proxy = g_dbus_proxy_new_sync(conn,
1289 G_DBUS_PROXY_FLAGS_NONE, NULL,
1290 ESD_BUS_NAME, ESD_OBJECT_PATH, ESD_INTERFACE_NAME,
1293 if (proxy == NULL) {
1294 _E("failed to create new proxy, error(%s)", error->message);
1295 g_error_free(error);
1300 param = g_variant_new("(s)", event_name);
1301 GVariant *value = g_dbus_proxy_call_sync(proxy, "GetEarlierData", param,
1302 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1303 if (error != NULL) {
1304 _E("proxy call sync error(%s)", error->message);
1305 g_error_free(error);
1310 g_variant_get(value, "(iis)", &result, &len, &raw);
1311 g_variant_unref(value);
1313 _D("result(%d), len(%d)", result, len);
1315 if (!result && raw && len > 0) {
1316 callback(event_name, raw, len, user_data);
1317 bundle_free_encoded_rawdata(&raw);
1323 g_variant_unref(value);
1326 g_object_unref(conn);
1333 int eventsystem_register_application_event(const char *event_name, unsigned int *reg_id,
1334 int *event_type, eventsystem_cb callback, void *user_data)
1337 char *interface_name = NULL;
1338 char *object_path = NULL;
1339 char *member_name = NULL;
1340 char *sender_name = NULL;
1341 GDBusSignalCallback filter;
1343 guint subscription_id = 0;
1345 GDBusConnection *conn = NULL;
1347 if (!_initialized) {
1351 if (__check_eventname_validation_system((char *)event_name)) {
1352 *event_type = ES_TYPE_SYSTEM;
1353 } else if (__check_eventname_validation_user((char *)event_name)) {
1354 *event_type = ES_TYPE_USER;
1356 *event_type = ES_TYPE_UNKNOWN;
1357 _E("unknown type event(%s)", event_name);
1361 if (*event_type == ES_TYPE_SYSTEM) {
1362 interface_name = strdup(SYS_EVENT_NAME_PREFIX);
1363 if (interface_name == NULL) {
1364 _E("out of memory");
1367 if (!g_dbus_is_interface_name(interface_name)) {
1368 _E("invalid interface_name(%s)", interface_name);
1369 FREE_AND_NULL(interface_name);
1372 member_name = __get_member_name_from_eventname((char *)event_name);
1373 if (member_name == NULL) {
1374 _E("member_name is NULL(%s)", event_name);
1375 FREE_AND_NULL(interface_name);
1378 if (!g_dbus_is_member_name(member_name)) {
1379 _E("Invalid member_name(%s)", member_name);
1380 FREE_AND_NULL(interface_name);
1381 FREE_AND_NULL(member_name);
1384 filter = __eventsystem_filter_sysevent_for_application;
1385 bus_type = G_BUS_TYPE_SYSTEM;
1387 interface_name = __get_encoded_interface_name((char *)event_name);
1388 if (!interface_name) {
1389 _E("interface_name is NULL");
1392 if (!g_dbus_is_interface_name(interface_name)) {
1393 _E("invalid interface_name(%s)", interface_name);
1394 FREE_AND_NULL(interface_name);
1397 member_name = strdup(EVENT_SYSTEM_MEMBER);
1399 _E("out_of_memory");
1400 FREE_AND_NULL(interface_name);
1403 filter = __eventsystem_filter_userevent_for_application;
1404 bus_type = G_BUS_TYPE_SESSION;
1407 object_path = __get_object_path(interface_name);
1409 _E("failed get object_path");
1410 FREE_AND_NULL(interface_name);
1411 FREE_AND_NULL(member_name);
1416 _D("interface_name(%s), object_path(%s)", interface_name, object_path);
1417 _D(" member_name(%s), sender_name(%s), type(%d), bus_type(%d)",
1418 member_name, sender_name, *event_type, bus_type);
1420 if (__get_gdbus_shared_connection(&conn, bus_type, interface_name) < 0) {
1421 _E("getting gdbus-connetion error");
1422 FREE_AND_NULL(interface_name);
1423 FREE_AND_NULL(object_path);
1424 FREE_AND_NULL(member_name);
1428 #ifdef APPFW_EVENT_SYSTEM_EARLIER_FEATURE
1429 __eventsystem_request_earlier_data(event_name, callback, user_data);
1432 subscription_id = g_dbus_connection_signal_subscribe(conn,
1433 sender_name, /* sender */
1435 member_name, /* member */
1436 object_path, /* object_path */
1438 G_DBUS_SIGNAL_FLAGS_NONE,
1441 NULL); /* user_data_free_func */
1443 _D("event_name(%s), subscription_id(%d)", event_name, subscription_id);
1445 if (subscription_id != 0) {
1446 em = calloc(1, sizeof(eventmap_s));
1448 _E("memory alloc failed");
1451 em->interface_name = strdup(interface_name);
1452 em->member_name = strdup(member_name);
1453 em->event_name = strdup(event_name);
1454 em->es_cb = callback;
1455 em->bus_type = bus_type;
1456 em->reg_id = subscription_id;
1457 em->event_type = *event_type;
1459 if (!em->interface_name || !em->member_name ||
1461 _E("out_of_memory");
1462 FREE_AND_NULL(em->interface_name);
1463 FREE_AND_NULL(em->member_name);
1464 FREE_AND_NULL(em->event_name);
1469 g_list_append(system_event_list, em);
1470 *reg_id = subscription_id;
1475 _D("dbus subscribe: error(%d)", subscription_id);
1479 FREE_AND_NULL(interface_name);
1480 FREE_AND_NULL(object_path);
1481 FREE_AND_NULL(member_name);
1483 g_object_unref(conn);
1489 int eventsystem_unregister_application_event(unsigned int reg_id)
1492 eventmap_s *em_data = NULL;
1494 GList *cb_list = NULL;
1495 GDBusConnection *conn = NULL;
1497 retvm_if(reg_id == 0, ES_R_EINVAL, "Invalid argument : reg_id");
1499 if (!_initialized) {
1504 cb_list = g_list_find_custom(system_event_list, &em,
1505 (GCompareFunc)__event_compare_reg_id_cb);
1507 em_data = (eventmap_s *)cb_list->data;
1509 bus_type = em_data->bus_type;
1511 _D("unsubscribe: reg_id(%d), bus_type(%d)", reg_id, bus_type);
1513 if (__get_gdbus_shared_connection(&conn, bus_type, em_data->interface_name) < 0) {
1514 _E("getting gdbus-connetion error");
1517 g_dbus_connection_signal_unsubscribe(conn, reg_id);
1519 system_event_list = g_list_remove(system_event_list, cb_list->data);
1521 FREE_AND_NULL(em_data->interface_name);
1522 FREE_AND_NULL(em_data->member_name);
1523 FREE_AND_NULL(em_data->event_name);
1524 FREE_AND_NULL(em_data);
1525 g_object_unref(conn);
1527 _E("not found matched item");
1534 int eventsystem_application_finalize(void)
1536 gpointer key, value;
1538 _D("release all resouces");
1540 if (system_event_list) {
1541 g_list_free(system_event_list);
1545 GHashTableIter iter;
1547 g_hash_table_iter_init(&iter, filter_tbl);
1549 while (g_hash_table_iter_next(&iter, &key, &value)) {
1550 char *val_item = (char *)value;
1554 _E("filter_tbl, val_item is NULL");
1556 g_hash_table_iter_remove(&iter);
1558 g_hash_table_unref(filter_tbl);
1562 GHashTableIter iter;
1564 g_hash_table_iter_init(&iter, check_tbl);
1566 while (g_hash_table_iter_next(&iter, &key, &value)) {
1567 char *val_item = (char *)value;
1571 _E("check_tbl, val_item is NULL");
1573 g_hash_table_iter_remove(&iter);
1575 g_hash_table_unref(check_tbl);