4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
24 #include <dbus/dbus-glib-lowlevel.h>
26 #include "app_signal.h"
28 #include "simple_util.h"
32 static int (*_app_dead_handler) (int pid, void *data);
33 static void *_app_dead_data;
35 static int (*_app_launch_handler) (int pid, void *data);
36 static void *_app_launch_data;
38 static int (*_booting_done_handler) (int pid, void *data);
39 static void *_booting_done_data;
41 static int (*_status_handler) (int pid, int status, void *data);
42 static void *_status_data;
44 static int (*_cooldown_handler) (const char *cooldown_status, void *data);
45 static void *_cooldown_data;
47 static DBusConnection *bus;
48 static int app_dbus_signal_handler_initialized = 0;
51 DBusConnection* conn = NULL;
53 static DBusHandlerResult
54 __app_dbus_signal_filter(DBusConnection *conn, DBusMessage *message,
58 const char *interface;
59 const char *cooldown_status;
64 dbus_error_init(&error);
66 sender = dbus_message_get_sender(message);
68 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
70 /*if (dbus_bus_get_unix_user(conn, sender, &error) != 0) {
71 _E("reject by security issue - no allowed sender\n");
72 dbus_error_free(&error);
73 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
76 interface = dbus_message_get_interface(message);
77 if (interface == NULL) {
78 _E("reject by security issue - no interface\n");
79 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
82 if (dbus_message_is_signal(
83 message, interface, AUL_DBUS_APPDEAD_SIGNAL)) {
84 if (dbus_message_get_args(message, &error, DBUS_TYPE_UINT32,
85 &pid, DBUS_TYPE_INVALID) == FALSE) {
86 _E("Failed to get data: %s", error.message);
87 dbus_error_free(&error);
88 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
90 if (_app_dead_handler)
91 _app_dead_handler(pid, _app_dead_data);
92 } else if (dbus_message_is_signal(
93 message, interface, AUL_DBUS_APPLAUNCH_SIGNAL)) {
94 if (dbus_message_get_args(message, &error, DBUS_TYPE_UINT32,
95 &pid, DBUS_TYPE_INVALID) == FALSE) {
96 _E("Failed to get data: %s", error.message);
97 dbus_error_free(&error);
98 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
100 if (_app_launch_handler)
101 _app_launch_handler(pid, _app_launch_data);
102 } else if (dbus_message_is_signal(
103 message, interface, SYSTEM_SIGNAL_BOOTING_DONE)) {
104 if (_booting_done_handler)
105 _booting_done_handler(pid, _booting_done_data);
106 } else if (dbus_message_is_signal(
107 message, interface, RESOURCED_SIGNAL_PROCESS_STATUS)) {
108 if (dbus_message_get_args(message, &error, DBUS_TYPE_INT32,&status,
109 DBUS_TYPE_INT32,&pid, DBUS_TYPE_INVALID) == FALSE) {
110 _E("Failed to get data: %s", error.message);
111 dbus_error_free(&error);
112 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
115 _status_handler(pid, status, _status_data);
116 } else if (dbus_message_is_signal(
117 message, interface, SYSTEM_SIGNAL_COOLDOWN_CHANGED)) {
118 if (dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &cooldown_status,
119 DBUS_TYPE_INVALID) == FALSE) {
120 _E("Failed to get data: %s", error.message);
121 dbus_error_free(&error);
122 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
124 if (_cooldown_handler)
125 _cooldown_handler(cooldown_status, _cooldown_data);
128 return DBUS_HANDLER_RESULT_HANDLED;
131 static int __app_dbus_signal_handler_init_with_param(const char* path, const char* interface)
134 char rule[MAX_LOCAL_BUFSZ];
136 dbus_error_init(&error);
137 bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
139 _E("Failed to connect to the D-BUS daemon: %s", error.message);
140 dbus_error_free(&error);
143 dbus_connection_setup_with_g_main(bus, NULL);
145 snprintf(rule, MAX_LOCAL_BUFSZ,
146 "path='%s',type='signal',interface='%s'", path, interface);
147 /* listening to messages */
148 dbus_bus_add_match(bus, rule, &error);
149 if (dbus_error_is_set(&error)) {
150 _E("Fail to rule set: %s", error.message);
151 dbus_error_free(&error);
155 if (dbus_connection_add_filter(bus,
156 __app_dbus_signal_filter, NULL, NULL) == FALSE) {
157 _E("add filter fail");
161 _D("app signal initialized");
166 static int __app_dbus_signal_handler_init(void)
170 if (app_dbus_signal_handler_initialized)
173 ret = __app_dbus_signal_handler_init_with_param(AUL_DBUS_PATH, AUL_DBUS_SIGNAL_INTERFACE);
175 app_dbus_signal_handler_initialized = 1;
180 static int __app_dbus_signal_handler_fini_with_param(const char* path, const char* interface)
183 char rule[MAX_LOCAL_BUFSZ];
186 dbus_error_init(&error);
188 dbus_connection_remove_filter(bus, __app_dbus_signal_filter, NULL);
190 snprintf(rule, MAX_LOCAL_BUFSZ,
191 "path='%s',type='signal',interface='%s'", path, interface);
192 dbus_bus_remove_match(bus, rule, &error);
193 if (dbus_error_is_set(&error)) {
194 _E("Fail to rule unset: %s", error.message);
195 dbus_error_free(&error);
199 dbus_connection_close(bus);
200 dbus_connection_unref(bus);
202 _D("app signal finialized");
207 static int __app_dbus_signal_handler_fini(void)
211 if (!app_dbus_signal_handler_initialized)
214 ret = __app_dbus_signal_handler_fini_with_param(AUL_DBUS_PATH, AUL_DBUS_SIGNAL_INTERFACE);
216 app_dbus_signal_handler_initialized = 0;
221 SLPAPI int aul_listen_app_dead_signal(int (*func) (int, void *), void *data)
224 if (__app_dbus_signal_handler_init() < 0) {
225 _E("error app signal init");
228 } else if (_app_launch_handler == NULL) {
229 if (__app_dbus_signal_handler_fini() < 0) {
230 _E("error app signal fini");
234 _app_dead_handler = func;
235 _app_dead_data = data;
240 SLPAPI int aul_listen_app_launch_signal(int (*func) (int, void *), void *data)
243 if (__app_dbus_signal_handler_init() < 0) {
244 _E("error app signal init");
247 } else if (_app_dead_handler == NULL) {
248 if (__app_dbus_signal_handler_fini() < 0) {
249 _E("error app signal fini");
253 _app_launch_handler = func;
254 _app_launch_data = data;
259 SLPAPI int aul_listen_booting_done_signal(int (*func) (int, void *), void *data)
262 if (__app_dbus_signal_handler_init_with_param(SYSTEM_PATH_CORE, SYSTEM_INTERFACE_CORE) < 0) {
263 _E("error app signal init");
266 } else if (_booting_done_handler == NULL) {
267 if (__app_dbus_signal_handler_fini_with_param(SYSTEM_PATH_CORE, SYSTEM_INTERFACE_CORE) < 0) {
268 _E("error app signal fini");
272 _booting_done_handler = func;
273 _booting_done_data = data;
279 SLPAPI int aul_listen_cooldown_signal(int (*func) (const char *, void *), void *data)
282 if (__app_dbus_signal_handler_init_with_param(SYSTEM_PATH_SYSNOTI, SYSTEM_INTERFACE_SYSNOTI) < 0) {
283 _E("error app signal init");
286 } else if (_cooldown_handler == NULL) {
287 if (__app_dbus_signal_handler_fini_with_param(SYSTEM_PATH_SYSNOTI, SYSTEM_INTERFACE_SYSNOTI) < 0) {
288 _E("error app signal fini");
292 _cooldown_handler = func;
293 _cooldown_data = data;
299 SLPAPI int aul_listen_e17_status_signal(int (*func) (int, int, void *), void *data)
302 if (__app_dbus_signal_handler_init_with_param(RESOURCED_PATH_CORE, RESOURCED_INTERFACE_CORE) < 0) {
303 _E("error app signal init");
307 _status_handler = func;
313 SLPAPI int aul_update_freezer_status(int pid, const char* type)
316 DBusConnection* conn = NULL;
317 DBusMessage* msg = NULL;
318 dbus_uint32_t serial = 0;
322 dbus_error_init(&err);
324 _W("send_update_freezer_status, pid: %d, type: %s", pid, type);
326 conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
328 _E("Fail to dbus_bus_get : %s", err.message);
332 msg = dbus_message_new_signal(RESOURCED_PROC_OBJECT,
333 RESOURCED_PROC_INTERFACE,
334 RESOURCED_PROC_METHOD);
336 _E("Could not create DBus Message.");
341 if (!dbus_message_append_args(msg,
342 DBUS_TYPE_STRING, &type,
343 DBUS_TYPE_INT32, &pid,
344 DBUS_TYPE_INVALID)) {
345 _E("Failed to append a D-Bus Message.");
349 if (!dbus_connection_send(conn, msg, &serial)) {
350 _E("Failed to send a D-Bus Message.");
354 dbus_connection_flush(conn);
357 dbus_error_free(&err);
360 dbus_message_unref(msg);
364 dbus_connection_unref(conn);
371 int __app_status_dbus_init(void)
378 dbus_error_init(&err);
379 conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
384 SLPAPI int aul_send_app_launch_request_signal(int pid, const char* appid, const char* pkgid, const char* type)
386 DBusMessage* msg = NULL;
387 dbus_uint32_t serial = 0;
391 __app_status_dbus_init();
393 _W("send_app_launch_signal, pid: %d, appid: %s", pid, appid);
395 msg = dbus_message_new_signal(AUL_APP_STATUS_DBUS_PATH,
396 AUL_APP_STATUS_DBUS_SIGNAL_INTERFACE,
397 AUL_APP_STATUS_DBUS_LAUNCH_REQUEST);
399 _E("Could not create DBus Message.");
404 if (!dbus_message_append_args(msg,
405 DBUS_TYPE_INT32, &pid,
406 DBUS_TYPE_STRING, &appid,
407 DBUS_TYPE_STRING, &pkgid,
408 DBUS_TYPE_STRING, &type,
409 DBUS_TYPE_INVALID)) {
410 _E("Failed to append a D-Bus Message.");
414 if (!dbus_connection_send(conn, msg, &serial)) {
415 _E("Failed to send a D-Bus Message.");
419 dbus_connection_flush(conn);
423 dbus_message_unref(msg);
428 SLPAPI int aul_send_app_resume_request_signal(int pid, const char* appid, const char* pkgid, const char* type)
430 DBusMessage* msg = NULL;
431 dbus_uint32_t serial = 0;
432 const char *empty_string = "";
436 __app_status_dbus_init();
438 _W("send_app_resume_signal, pid: %d, appid: %s", pid, appid);
440 msg = dbus_message_new_signal(AUL_APP_STATUS_DBUS_PATH,
441 AUL_APP_STATUS_DBUS_SIGNAL_INTERFACE,
442 AUL_APP_STATUS_DBUS_RESUME_REQUEST);
444 _E("Could not create DBus Message.");
450 if (!dbus_message_append_args(msg,
451 DBUS_TYPE_INT32, &pid,
452 DBUS_TYPE_STRING, &appid,
453 DBUS_TYPE_STRING, &pkgid,
454 DBUS_TYPE_STRING, &type,
455 DBUS_TYPE_INVALID)) {
456 _E("Failed to append a D-Bus Message.");
460 if (!dbus_message_append_args(msg,
461 DBUS_TYPE_INT32, &pid,
462 DBUS_TYPE_STRING, &empty_string,
463 DBUS_TYPE_STRING, &empty_string,
464 DBUS_TYPE_STRING, &empty_string,
465 DBUS_TYPE_INVALID)) {
466 _E("Failed to append a D-Bus Message.");
471 if (!dbus_connection_send(conn, msg, &serial)) {
472 _E("Failed to send a D-Bus Message.");
476 dbus_connection_flush(conn);
480 dbus_message_unref(msg);
486 SLPAPI int aul_send_app_terminate_request_signal(int pid, const char* appid, const char* pkgid, const char *type)
488 DBusMessage* msg = NULL;
489 dbus_uint32_t serial = 0;
490 const char *empty_string = "";
494 __app_status_dbus_init();
496 msg = dbus_message_new_signal(AUL_APP_STATUS_DBUS_PATH,
497 AUL_APP_STATUS_DBUS_SIGNAL_INTERFACE,
498 AUL_APP_STATUS_DBUS_TERMINATE_REQUEST);
500 _E("Could not create DBus Message.");
506 if (!dbus_message_append_args(msg,
507 DBUS_TYPE_INT32, &pid,
508 DBUS_TYPE_STRING, &appid,
509 DBUS_TYPE_STRING, &pkgid,
510 DBUS_TYPE_STRING, &type,
511 DBUS_TYPE_INVALID)) {
512 _E("Failed to append a D-Bus Message.");
516 if (!dbus_message_append_args(msg,
517 DBUS_TYPE_INT32, &pid,
518 DBUS_TYPE_STRING, &empty_string,
519 DBUS_TYPE_STRING, &empty_string,
520 DBUS_TYPE_STRING, &empty_string,
521 DBUS_TYPE_INVALID)) {
522 _E("Failed to append a D-Bus Message.");
527 if (!dbus_connection_send(conn, msg, &serial)) {
528 _E("Failed to send a D-Bus Message.");
532 dbus_connection_flush(conn);
536 dbus_message_unref(msg);
543 SLPAPI int aul_send_app_status_change_signal(int pid, const char* appid, const char* pkgid, const char* status, const char *type)
545 DBusMessage* msg = NULL;
546 dbus_uint32_t serial = 0;
547 const char *empty_string = "";
551 _W("send_app_status_change_signal, pid: %d, appid: %s, status: %s", pid, appid, status);
553 __app_status_dbus_init();
555 msg = dbus_message_new_signal(AUL_APP_STATUS_DBUS_PATH,
556 AUL_APP_STATUS_DBUS_SIGNAL_INTERFACE,
557 AUL_APP_STATUS_DBUS_STATUS_CHANGE);
559 _E("Could not create DBus Message.");
565 if (!dbus_message_append_args(msg,
566 DBUS_TYPE_INT32, &pid,
567 DBUS_TYPE_STRING, &appid,
568 DBUS_TYPE_STRING, &pkgid,
569 DBUS_TYPE_STRING, &status,
570 DBUS_TYPE_STRING, &type,
571 DBUS_TYPE_INVALID)) {
572 _E("Failed to append a D-Bus Message.");
576 if (!dbus_message_append_args(msg,
577 DBUS_TYPE_INT32, &pid,
578 DBUS_TYPE_STRING, &empty_string,
579 DBUS_TYPE_STRING, &empty_string,
580 DBUS_TYPE_STRING, &status,
581 DBUS_TYPE_STRING, &type,
582 DBUS_TYPE_INVALID)) {
583 _E("Failed to append a D-Bus Message.");
588 if (!dbus_connection_send(conn, msg, &serial)) {
589 _E("Failed to send a D-Bus Message.");
593 dbus_connection_flush(conn);
597 dbus_message_unref(msg);
603 SLPAPI int aul_send_app_terminated_signal(int pid)
605 DBusMessage* msg = NULL;
606 dbus_uint32_t serial = 0;
610 __app_status_dbus_init();
612 msg = dbus_message_new_signal(AUL_APP_STATUS_DBUS_PATH,
613 AUL_APP_STATUS_DBUS_SIGNAL_INTERFACE,
614 AUL_APP_STATUS_DBUS_TERMINATED);
616 _E("Could not create DBus Message.");
621 if (!dbus_message_append_args(msg,
622 DBUS_TYPE_INT32, &pid,
623 DBUS_TYPE_INVALID)) {
624 _E("Failed to append a D-Bus Message.");
628 if (!dbus_connection_send(conn, msg, &serial)) {
629 _E("Failed to send a D-Bus Message.");
633 dbus_connection_flush(conn);
637 dbus_message_unref(msg);
642 SLPAPI int aul_send_app_group_signal(int owner_pid, int child_pid, const char *child_pkgid)
644 DBusMessage* msg = NULL;
645 dbus_uint32_t serial = 0;
646 const char *empty_string = "";
650 _W("send_app_group_signal, owner: %d, child: %d", owner_pid, child_pid);
652 __app_status_dbus_init();
654 msg = dbus_message_new_signal(AUL_APP_STATUS_DBUS_PATH,
655 AUL_APP_STATUS_DBUS_SIGNAL_INTERFACE,
656 AUL_APP_STATUS_DBUS_GROUP);
658 _E("Could not create DBus Message.");
664 if (!dbus_message_append_args(msg,
665 DBUS_TYPE_INT32, &owner_pid,
666 DBUS_TYPE_INT32, &child_pid,
667 DBUS_TYPE_STRING, &child_pkgid,
668 DBUS_TYPE_INVALID)) {
669 _E("Failed to append a D-Bus Message.");
673 if (!dbus_message_append_args(msg,
674 DBUS_TYPE_INT32, &owner_pid,
675 DBUS_TYPE_INT32, &child_pid,
676 DBUS_TYPE_STRING, &empty_string,
677 DBUS_TYPE_INVALID)) {
678 _E("Failed to append a D-Bus Message.");
683 if (!dbus_connection_send(conn, msg, &serial)) {
684 _E("Failed to send a D-Bus Message.");
688 dbus_connection_flush(conn);
692 dbus_message_unref(msg);