2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 #include <app_event.h>
22 #include <eventsystem.h>
23 #include <app_internal.h>
29 #define LOG_TAG "CAPI_APPFW_EVENT"
31 typedef struct event_handler {
39 typedef struct event_cb_data {
44 static GHashTable *interested_event_table;
45 static int _initialized;
46 static event_cb earlier_callback;
47 static pthread_mutex_t register_sync_lock = PTHREAD_MUTEX_INITIALIZER;
49 static const char *event_error_to_string(event_error_e error)
52 case EVENT_ERROR_NONE:
55 case EVENT_ERROR_INVALID_PARAMETER:
56 return "INVALID_PARAMETER";
58 case EVENT_ERROR_OUT_OF_MEMORY:
59 return "OUT_OF_MEMORY";
61 case EVENT_ERROR_TIMED_OUT:
64 case EVENT_ERROR_IO_ERROR:
67 case EVENT_ERROR_PERMISSION_DENIED:
68 return "PERMISSION DENIED";
75 int event_error(event_error_e error, const char *function, const char *description)
78 LOGE("[%s] %s(0x%08x) : %s", function, event_error_to_string(error),
81 LOGE("[%s] %s(0x%08x)", function, event_error_to_string(error), error);
87 static void event_do_cb(gpointer data, gpointer user_data)
89 event_handler_h handler = (event_handler_h)data;
90 event_cb_data_s *cb_data = (event_cb_data_s *)user_data;
93 handler->cb(handler->event_name,
94 cb_data->event_data, cb_data->user_data);
98 static void event_eventsystem_callback(const char *event_name,
99 bundle_raw *event_data, int len, void *user_data)
104 LOGD("event_name(%s)", event_name);
106 if (earlier_callback != NULL) {
107 b_to = bundle_decode(event_data, len);
109 LOGE("bundle_decode failed");
112 earlier_callback(event_name, b_to, user_data);
117 GList *handler_list = (GList *)g_hash_table_lookup(interested_event_table,
120 event_cb_data_s *cb_data = NULL;
121 cb_data = calloc(1, sizeof(event_cb_data_s));
122 if (cb_data == NULL) {
123 LOGE("memory alloc failed");
126 b_to = bundle_decode(event_data, len);
128 LOGE("bundle_decode failed");
132 b = bundle_dup(b_to);
135 cb_data->event_data = b;
136 cb_data->user_data = user_data;
138 g_list_foreach(handler_list, event_do_cb, cb_data);
144 int event_add_event_handler(const char *event_name, event_cb callback, void *user_data,
145 event_handler_h *event_handler)
149 unsigned int reg_id = 0;
150 event_handler_h handler = NULL;
153 if (interested_event_table == NULL) {
154 interested_event_table = g_hash_table_new(g_str_hash, g_str_equal);
155 if (interested_event_table == NULL) {
156 return event_error(EVENT_ERROR_OUT_OF_MEMORY,
163 if (event_handler == NULL || event_name == NULL || callback == NULL) {
164 return event_error(EVENT_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
167 handler = calloc(1, sizeof(event_handler_s));
168 if (handler == NULL) {
169 return event_error(EVENT_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
172 pthread_mutex_lock(®ister_sync_lock);
173 earlier_callback = callback;
174 ret = eventsystem_register_application_event(event_name, ®_id, &event_type,
175 (eventsystem_cb)event_eventsystem_callback, user_data);
176 earlier_callback = NULL;
177 pthread_mutex_unlock(®ister_sync_lock);
180 if (ret == ES_R_ENOTPERMITTED) {
181 return event_error(EVENT_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
183 return event_error(EVENT_ERROR_IO_ERROR, __FUNCTION__, NULL);
187 handler->event_name = strdup(event_name);
188 if (handler->event_name == NULL) {
190 return event_error(EVENT_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
193 handler->reg_id = reg_id;
194 handler->event_type = event_type;
195 handler->cb = callback;
196 handler->user_data = user_data;
198 *event_handler = handler;
200 GList *handler_list = (GList *)g_hash_table_lookup(interested_event_table,
201 handler->event_name);
203 LOGD("add new handler");
204 handler_list = g_list_append(handler_list, handler);
206 LOGD("add new table item");
208 ehl = g_list_append(ehl, handler);
209 g_hash_table_insert(interested_event_table, handler->event_name, ehl);
212 return EVENT_ERROR_NONE;
215 int event_remove_event_handler(event_handler_h event_handler)
220 LOGI("handler list is not initialized");
221 return EVENT_ERROR_NONE;
224 if (event_handler == NULL) {
225 return event_error(EVENT_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
228 ret = eventsystem_unregister_application_event(event_handler->reg_id);
230 return event_error(EVENT_ERROR_IO_ERROR, __FUNCTION__, NULL);
233 GList *handler_list = (GList *)g_hash_table_lookup(interested_event_table,
234 event_handler->event_name);
237 list = g_list_find(handler_list, event_handler);
239 LOGD("remove match handler");
240 handler_list = g_list_remove_all(handler_list, event_handler);
241 GList *first_list = NULL;
242 first_list = g_list_first(handler_list);
243 if (first_list == NULL) {
244 LOGD("remove table item");
245 g_hash_table_remove(interested_event_table,
246 event_handler->event_name);
251 free(event_handler->event_name);
254 return EVENT_ERROR_NONE;
257 int event_publish_app_event(const char *event_name, bundle *event_data)
259 if (event_data == NULL || event_name == NULL) {
260 return event_error(EVENT_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
263 if (eventsystem_send_user_event(event_name, event_data, false) < 0) {
264 return event_error(EVENT_ERROR_IO_ERROR, __FUNCTION__, NULL);
267 return EVENT_ERROR_NONE;
270 int event_publish_trusted_app_event(const char *event_name, bundle *event_data)
272 if (event_data == NULL || event_name == NULL) {
273 return event_error(EVENT_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
276 if (eventsystem_send_user_event(event_name, event_data, true) < 0) {
277 return event_error(EVENT_ERROR_IO_ERROR, __FUNCTION__, NULL);
280 return EVENT_ERROR_NONE;