#include <bundle.h>
#include <bundle_internal.h>
#include <dlog.h>
+#include <gio/gio.h>
#include "stc-plugin.h"
+#include "stc-manager.h"
+#include "stc-manager-util.h"
-#ifdef USE_DLOG
-#include <dlog.h>
+/*
+ * AUL
+ */
+#define AUL_APP_STATUS_DBUS_PATH "/Org/Tizen/Aul/AppStatus"
+#define AUL_APP_STATUS_DBUS_SIGNAL_INTERFACE "org.tizen.aul.AppStatus"
+#define AUL_APP_STATUS_BUS_NAME AUL_APP_STATUS_DBUS_SIGNAL_INTERFACE
+
+#define AUL_APP_STATUS_DBUS_STATUS_CHANGE "AppStatusChange"
+#define AUL_APP_STATUS_DBUS_STATUS_CHANGE_TYPE "(issss)"
+
+typedef struct {
+ guint sub_id;
+ const gchar *path;
+ const gchar *interface;
+ const gchar *member;
+ const gchar *param_type;
+ GDBusSignalCallback callback;
+ gpointer user_data;
+} signal_map_s;
+
+stc_error_e(*state_changed_cb)(stc_cmd_type_e cmd, pid_t pid,
+ const gchar *app_id, const gchar *pkg_id,
+ stc_app_type_e app_type);
+
+static void __stc_gdbus_handle_aul_changestate(GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
+{
+ __STC_LOG_FUNC_ENTER__;
+ pid_t pid;
+ stc_cmd_type_e status;
+ stc_app_type_e apptype;
+ gchar *appid, *pkgid, *statstr, *pkgtype;
+
+ if (g_strcmp0(g_variant_get_type_string(parameters),
+ AUL_APP_STATUS_DBUS_STATUS_CHANGE_TYPE)) {
+ STC_LOGE("Dbus type not matching, do not process");
+ __STC_LOG_FUNC_EXIT__;
+ return;
+ }
+
+ g_variant_get(parameters, AUL_APP_STATUS_DBUS_STATUS_CHANGE_TYPE,
+ &pid, &appid, &pkgid, &statstr, &pkgtype);
+
+ if (!strncmp(statstr, "fg", 2)) {
+ status = STC_CMD_SET_FOREGRD;
+ } else if (!strncmp(statstr, "bg", 2)) {
+ status = STC_CMD_SET_BACKGRD;
+ } else {
+ __STC_LOG_FUNC_EXIT__;
+ goto out;
+ }
+
+ if (!strncmp(pkgtype, "svc", 3))
+ apptype = STC_APP_TYPE_SERVICE;
+ else if (!strncmp(pkgtype, "widget", 6))
+ apptype = STC_APP_TYPE_WIDGET;
+ else if (!strncmp(pkgtype, "watch", 5))
+ apptype = STC_APP_TYPE_WATCH;
+ else
+ apptype = STC_APP_TYPE_GUI;
+
+ if (state_changed_cb)
+ state_changed_cb(status, pid, appid, pkgid, apptype);
+
+ __STC_LOG_FUNC_EXIT__;
+out:
+ FREE(appid);
+ FREE(pkgid);
+ FREE(statstr);
+ FREE(pkgtype);
+}
-#undef LOG_TAG
-#define LOG_TAG "STC_MANAGER"
+signal_map_s signal_map[] = {
+
+ /* AMD DBUS */
+ {
+ 0,
+ AUL_APP_STATUS_DBUS_PATH,
+ AUL_APP_STATUS_DBUS_SIGNAL_INTERFACE,
+ AUL_APP_STATUS_DBUS_STATUS_CHANGE,
+ AUL_APP_STATUS_DBUS_STATUS_CHANGE_TYPE,
+ __stc_gdbus_handle_aul_changestate,
+ NULL
+ },
+ {
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ }
+};
-#define STC_LOGD(format, args...) LOGD(format, ##args)
-#define STC_LOGI(format, args...) LOGI(format, ##args)
-#define STC_LOGW(format, args...) LOGW(format, ##args)
-#define STC_LOGE(format, args...) LOGE(format, ##args)
-#define __STC_LOG_FUNC_ENTER__ LOGD("Enter")
-#define __STC_LOG_FUNC_EXIT__ LOGD("Quit")
+static stc_error_e __ground_status_monitor_init(stc_s *stc)
+{
+ guint i = 0;
+
+ ret_value_msg_if(stc == NULL, STC_ERROR_INVALID_PARAMETER, "failed to get stc data");
+
+ for (i = 0; signal_map[i].member != NULL; i++) {
+ signal_map[i].sub_id =
+ g_dbus_connection_signal_subscribe(stc->connection,
+ NULL,
+ signal_map[i].interface,
+ signal_map[i].member,
+ signal_map[i].path,
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ signal_map[i].callback,
+ signal_map[i].user_data,
+ NULL);
+ STC_LOGI("Successfully subscribed [%s] signal",
+ signal_map[i].member);
+ }
+
+ return STC_ERROR_NONE;
+}
-#else /* USE_DLOG */
+static stc_error_e __ground_status_monitor_deinit(stc_s *stc)
+{
+ guint i = 0;
-#define STC_LOGD(format, args...)
-#define STC_LOGI(format, args...)
-#define STC_LOGW(format, args...)
-#define STC_LOGE(format, args...)
+ ret_value_msg_if(stc == NULL, STC_ERROR_INVALID_PARAMETER, "failed to get stc data");
-#define __STC_LOG_FUNC_ENTER__
-#define __STC_LOG_FUNC_EXIT__
+ for (i = 0; signal_map[i].member != NULL; i++) {
+ g_dbus_connection_signal_unsubscribe(stc->connection,
+ signal_map[i].sub_id);
+ signal_map[i].sub_id = 0;
+ STC_LOGD("Successfully unsubscribed [%s] signal",
+ signal_map[i].member);
+ }
-#endif /* USE_DLOG */
+ return STC_ERROR_NONE;
+}
static int __stc_send_warn_message_to_net_popup(const char *content,
const char *type, const char *app_id, const char *iftype, const char *warn)
return ret;
}
+static int __register_state_changed_cb(stc_s *stc,
+ stc_plugin_app_state_changed_cb cb,
+ void *data)
+{
+ state_changed_cb = cb;
+ __ground_status_monitor_init(stc);
+
+ return 0;
+}
+
+int __deregister_state_changed_cb(stc_s *stc)
+{
+ state_changed_cb = NULL;
+ __ground_status_monitor_deinit(stc);
+ return 0;
+}
API stc_plugin_s stc_plugin = {
.send_warn_message_to_net_popup =
__stc_send_warn_message_to_net_popup,
.send_restriction_message_to_net_popup =
- __stc_send_restriction_message_to_net_popup
+ __stc_send_restriction_message_to_net_popup,
+ .register_state_changed_cb = __register_state_changed_cb,
+ .deregister_state_changed_cb = __deregister_state_changed_cb
};