Moved application ground status monitor to plugin.
[platform/core/connectivity/stc-manager.git] / plugin / stc-plugin.c
index 13f0306..a566388 100755 (executable)
 #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)
@@ -95,11 +213,29 @@ static int __stc_send_restriction_message_to_net_popup(const char *content,
        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
 };