+
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+static DBusHandlerResult
+__suspend_dbus_signal_filter(DBusConnection *conn, DBusMessage *message, void *user_data)
+{
+ const char *sender;
+ const char *interface;
+ int pid;
+ int state;
+ int suspend;
+
+ DBusError error;
+ dbus_error_init(&error);
+
+ sender = dbus_message_get_sender(message);
+ if (sender == NULL)
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+ interface = dbus_message_get_interface(message);
+ if (interface == NULL) {
+ _ERR("reject by security issue - no interface\n");
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ }
+
+ if (dbus_message_is_signal(message, interface, RESOURCED_FREEZER_SIGNAL)) {
+ if (dbus_message_get_args(message, &error, DBUS_TYPE_INT32, &state,
+ DBUS_TYPE_INT32, &pid, DBUS_TYPE_INVALID) == FALSE) {
+ _ERR("Failed to get data: %s", error.message);
+ dbus_error_free(&error);
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ }
+
+ if (pid == getpid() && state == 0) { //thawed
+ suspend = APPCORE_SUSPENDED_STATE_DID_EXIT_FROM_SUSPEND;
+ SECURE_LOGD("[__SUSPEND__] state: %d (0: thawed, 1: frozen), pid: %d", state, pid);
+
+ struct appcore *ac = (struct appcore *)user_data;
+ if (!ac->allowed_bg && ac->suspended_state) {
+ __remove_suspend_timer(ac);
+ __sys_do(user_data, &suspend, SE_SUSPENDED_STATE);
+ ac->suspended_state = false;
+ __add_suspend_timer(ac);
+ }
+ }
+ }
+
+ return DBUS_HANDLER_RESULT_HANDLED;
+}
+#endif
+
+int _appcore_init_suspend_dbus_handler(void *data)
+{
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+ DBusError error;
+ char rule[MAX_LOCAL_BUFSZ];
+
+ if (__suspend_dbus_handler_initialized)
+ return 0;
+
+ dbus_error_init(&error);
+ if (!bus) {
+ bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
+ if (!bus) {
+ _ERR("Failed to connect to the D-BUS daemon: %s", error.message);
+ dbus_error_free(&error);
+ return -1;
+ }
+ }
+ dbus_connection_setup_with_g_main(bus, NULL);
+
+ snprintf(rule, MAX_LOCAL_BUFSZ,
+ "path='%s',type='signal',interface='%s'", RESOURCED_FREEZER_PATH, RESOURCED_FREEZER_INTERFACE);
+ /* listening to messages */
+ dbus_bus_add_match(bus, rule, &error);
+ if (dbus_error_is_set(&error)) {
+ _ERR("Fail to rule set: %s", error.message);
+ dbus_error_free(&error);
+ return -1;
+ }
+
+ if (dbus_connection_add_filter(bus, __suspend_dbus_signal_filter, data, NULL) == FALSE) {
+ _ERR("add filter fail");
+ return -1;
+ }
+
+ __suspend_dbus_handler_initialized = 1;
+ _DBG("[__SUSPEND__] suspend signal initialized");
+#endif
+
+ return 0;
+}
+
+int _appcore_fini_suspend_dbus_handler(void* data)
+{
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+ DBusError error;
+ char rule[MAX_LOCAL_BUFSZ];
+
+ if (!__suspend_dbus_handler_initialized)
+ return 0;
+
+ dbus_error_init(&error);
+
+ dbus_connection_remove_filter(bus, __suspend_dbus_signal_filter, data);
+
+ snprintf(rule, MAX_LOCAL_BUFSZ,
+ "path='%s',type='signal',interface='%s'", RESOURCED_FREEZER_PATH, RESOURCED_FREEZER_INTERFACE);
+ dbus_bus_remove_match(bus, rule, &error);
+ if (dbus_error_is_set(&error)) {
+ _ERR("Fail to rule unset: %s", error.message);
+ dbus_error_free(&error);
+ return -1;
+ }
+
+ dbus_connection_close(bus);
+ dbus_connection_unref(bus);
+
+ bus = NULL;
+
+ __suspend_dbus_handler_initialized = 0;
+ _DBG("[__SUSPEND__] suspend signal finalized");
+#endif
+
+ return 0;
+}