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:
54 case EVENT_ERROR_INVALID_PARAMETER:
55 return "INVALID_PARAMETER";
56 case EVENT_ERROR_OUT_OF_MEMORY:
57 return "OUT_OF_MEMORY";
58 case EVENT_ERROR_TIMED_OUT:
60 case EVENT_ERROR_IO_ERROR:
62 case EVENT_ERROR_PERMISSION_DENIED:
63 return "PERMISSION DENIED";
69 int event_error(event_error_e error, const char *function, const char *description)
72 LOGE("[%s] %s(0x%08x) : %s", function, event_error_to_string(error),
75 LOGE("[%s] %s(0x%08x)", function, event_error_to_string(error), error);
81 static void event_do_cb(gpointer data, gpointer user_data)
83 event_handler_h handler = (event_handler_h)data;
84 event_cb_data_s *cb_data = (event_cb_data_s *)user_data;
87 handler->cb(handler->event_name,
88 cb_data->event_data, cb_data->user_data);
92 static void event_eventsystem_callback(const char *event_name,
93 bundle_raw *event_data, int len, void *user_data)
98 LOGD("event_name(%s)", event_name);
100 if (earlier_callback != NULL) {
101 b_to = bundle_decode(event_data, len);
103 LOGE("bundle_decode failed");
106 earlier_callback(event_name, b_to, user_data);
111 GList *handler_list = (GList *)g_hash_table_lookup(interested_event_table,
114 event_cb_data_s *cb_data = NULL;
115 cb_data = calloc(1, sizeof(event_cb_data_s));
116 if (cb_data == NULL) {
117 LOGE("memory alloc failed");
120 b_to = bundle_decode(event_data, len);
122 LOGE("bundle_decode failed");
126 b = bundle_dup(b_to);
129 cb_data->event_data = b;
130 cb_data->user_data = user_data;
132 g_list_foreach(handler_list, event_do_cb, cb_data);
138 int event_add_event_handler(const char *event_name, event_cb callback, void *user_data,
139 event_handler_h *event_handler)
143 unsigned int reg_id = 0;
144 event_handler_h handler = NULL;
147 if (interested_event_table == NULL) {
148 interested_event_table = g_hash_table_new(g_str_hash, g_str_equal);
149 if (interested_event_table == NULL) {
150 return event_error(EVENT_ERROR_OUT_OF_MEMORY,
157 if (event_handler == NULL || event_name == NULL || callback == NULL)
158 return event_error(EVENT_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
160 handler = calloc(1, sizeof(event_handler_s));
162 return event_error(EVENT_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
164 pthread_mutex_lock(®ister_sync_lock);
165 earlier_callback = callback;
166 ret = eventsystem_register_application_event(event_name, ®_id, &event_type,
167 (eventsystem_cb)event_eventsystem_callback, user_data);
168 earlier_callback = NULL;
169 pthread_mutex_unlock(®ister_sync_lock);
172 if (ret == ES_R_ENOTPERMITTED)
173 return event_error(EVENT_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
175 return event_error(EVENT_ERROR_IO_ERROR, __FUNCTION__, NULL);
178 handler->event_name = strdup(event_name);
179 if (handler->event_name == NULL) {
181 return event_error(EVENT_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
184 handler->reg_id = reg_id;
185 handler->event_type = event_type;
186 handler->cb = callback;
187 handler->user_data = user_data;
189 *event_handler = handler;
191 GList *handler_list = (GList *)g_hash_table_lookup(interested_event_table,
192 handler->event_name);
194 LOGD("add new handler");
195 handler_list = g_list_append(handler_list, handler);
197 LOGD("add new table item");
199 ehl = g_list_append(ehl, handler);
200 g_hash_table_insert(interested_event_table, handler->event_name, ehl);
203 return EVENT_ERROR_NONE;
206 int event_remove_event_handler(event_handler_h event_handler)
211 LOGI("handler list is not initialized");
212 return EVENT_ERROR_NONE;
215 if (event_handler == NULL)
216 return event_error(EVENT_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
218 ret = eventsystem_unregister_application_event(event_handler->reg_id);
220 return event_error(EVENT_ERROR_IO_ERROR, __FUNCTION__, NULL);
222 GList *handler_list = (GList *)g_hash_table_lookup(interested_event_table,
223 event_handler->event_name);
226 list = g_list_find(handler_list, event_handler);
228 LOGD("remove match handler");
229 handler_list = g_list_remove_all(handler_list, event_handler);
230 GList *first_list = NULL;
231 first_list = g_list_first(handler_list);
232 if (first_list == NULL) {
233 LOGD("remove table item");
234 g_hash_table_remove(interested_event_table,
235 event_handler->event_name);
240 free(event_handler->event_name);
243 return EVENT_ERROR_NONE;
246 int event_publish_app_event(const char *event_name, bundle *event_data)
248 if (event_data == NULL || event_name == NULL)
249 return event_error(EVENT_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
251 if (eventsystem_send_user_event(event_name, event_data, false) < 0)
252 return event_error(EVENT_ERROR_IO_ERROR, __FUNCTION__, NULL);
254 return EVENT_ERROR_NONE;
257 int event_publish_trusted_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);
262 if (eventsystem_send_user_event(event_name, event_data, true) < 0)
263 return event_error(EVENT_ERROR_IO_ERROR, __FUNCTION__, NULL);
265 return EVENT_ERROR_NONE;
268 int event_keep_last_event_data(const char *event_name)
272 if (event_name == NULL)
273 return event_error(EVENT_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
275 ret = eventsystem_keep_last_event_data(event_name);
277 if (ret == ES_R_ENOMEM)
278 return event_error(EVENT_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
280 return event_error(EVENT_ERROR_IO_ERROR, __FUNCTION__, NULL);
283 return EVENT_ERROR_NONE;