Add D-bus interface for pm lock/unlock. 05/14305/3
authorjy910.yun <jy910.yun@samsung.com>
Fri, 21 Jun 2013 10:10:37 +0000 (19:10 +0900)
committerKrzysztof Sasiak <k.sasiak@samsung.com>
Tue, 7 Jan 2014 12:45:42 +0000 (13:45 +0100)
Change-Id: I34868d5c786abdbd15386d67edbeb26611aab8ce
Signed-off-by: Krzysztof Sasiak <k.sasiak@samsung.com>
display/poll.c
display/poll.h
src/core/device-change-handler.c
src/core/predefine.c
src/core/sig-handler.c
src/ta/ta-handler.c
src/time/time-handler.c
src/usb/usb-handler.c

index 33fb824..127a41e 100644 (file)
@@ -281,7 +281,7 @@ int init_pm_poll_input(int (*pm_callback)(int , PMMsg * ), const char *path)
        return 0;
 }
 
-int pm_lock_internal(int s_bits, int flag, int timeout)
+int pm_lock_internal(pid_t pid, int s_bits, int flag, int timeout)
 {
        if (!g_pm_callback)
                return -1;
@@ -298,7 +298,7 @@ int pm_lock_internal(int s_bits, int flag, int timeout)
                /* if the flag is true, go to the locking state directly */
                s_bits = s_bits | (s_bits << SHIFT_CHANGE_STATE);
 
-       recv_data.pid = getpid();
+       recv_data.pid = pid;
        recv_data.cond = s_bits;
        recv_data.timeout = timeout;
 
@@ -307,7 +307,7 @@ int pm_lock_internal(int s_bits, int flag, int timeout)
        return 0;
 }
 
-int pm_unlock_internal(int s_bits, int flag)
+int pm_unlock_internal(pid_t pid, int s_bits, int flag)
 {
        if (!g_pm_callback)
                return -1;
@@ -324,7 +324,7 @@ int pm_unlock_internal(int s_bits, int flag)
        s_bits = (s_bits << SHIFT_UNLOCK);
        s_bits = (s_bits | (flag << SHIFT_UNLOCK_PARAMETER));
 
-       recv_data.pid = getpid();
+       recv_data.pid = pid;
        recv_data.cond = s_bits;
 
        (*g_pm_callback)(PM_CONTROL_EVENT, &recv_data);
@@ -332,7 +332,7 @@ int pm_unlock_internal(int s_bits, int flag)
        return 0;
 }
 
-int pm_change_internal(int s_bits)
+int pm_change_internal(pid_t pid, int s_bits)
 {
        if (!g_pm_callback)
                return -1;
@@ -346,10 +346,73 @@ int pm_change_internal(int s_bits)
                return -1;
        }
 
-       recv_data.pid = getpid();
+       recv_data.pid = pid;
        recv_data.cond = s_bits << SHIFT_CHANGE_STATE;
 
        (*g_pm_callback)(PM_CONTROL_EVENT, &recv_data);
 
        return 0;
 }
+
+void lcd_control_edbus_signal_handler(void *data, DBusMessage *msg)
+{
+       DBusError err;
+       int pid = -1;
+       char *lock_str = NULL;
+       char *state_str = NULL;
+       int state = -1;
+       int timeout = -1;
+
+       if (dbus_message_is_signal(msg, INTERFACE_NAME, SIGNAL_NAME_LCD_CONTROL) == 0) {
+               LOGERR("there is lcd control signal");
+               return;
+       }
+
+       dbus_error_init(&err);
+
+       if (dbus_message_get_args(msg, &err,
+                   DBUS_TYPE_INT32, &pid,
+                   DBUS_TYPE_STRING, &lock_str,
+                   DBUS_TYPE_STRING, &state_str,
+                   DBUS_TYPE_INT32, &timeout, DBUS_TYPE_INVALID) == 0) {
+               LOGERR("there is no message");
+               return;
+       }
+
+       if (pid == -1 || !lock_str || !state_str) {
+               LOGERR("message is invalid!!");
+               return;
+       }
+
+       if (kill(pid, 0) == -1) {
+               LOGERR("%d process does not exist, dbus ignored!", pid);
+               return;
+       }
+
+       if (!strcmp(state_str, PM_LCDON_STR))
+               state = LCD_NORMAL;
+       else if (!strcmp(state_str, PM_LCDDIM_STR))
+               state = LCD_DIM;
+       else if (!strcmp(state_str, PM_LCDOFF_STR))
+               state = LCD_OFF;
+       else {
+               LOGERR("%d process does not exist, dbus ignored!", pid);
+               return;
+       }
+
+       if (!strcmp(lock_str, PM_LOCK_STR)) {
+               if (timeout < 0) {
+                       LOGERR("pm_lock timeout is invalid! %d", timeout);
+                       return;
+               }
+               pm_lock_internal(pid, state, STAY_CUR_STATE, timeout);
+       } else if (!strcmp(lock_str, PM_UNLOCK_STR)) {
+               pm_unlock_internal(pid, state, PM_SLEEP_MARGIN);
+       } else if (!strcmp(lock_str, PM_CHANGE_STR)) {
+               pm_change_internal(pid, state);
+       } else {
+               LOGERR("%s process does not exist, dbus ignored!", pid);
+               return;
+       }
+       LOGINFO("dbus call success from %d\n", pid);
+}
index cf0dd09..7e74eb6 100644 (file)
@@ -30,6 +30,7 @@
 #define __PM_POLL_H__
 
 #include <Ecore.h>
+#include "core/edbus-handler.h"
 /**
  * @addtogroup POWER_MANAGER
  * @{
@@ -43,6 +44,7 @@ enum {
 };
 
 #define SOCK_PATH "/tmp/pm_sock"
+#define SIGNAL_NAME_LCD_CONTROL                "lcdcontol"
 
 #define LCD_NORMAL     0x1             /**< NORMAL state */
 #define LCD_DIM                0x2             /**< LCD dimming state */
@@ -56,6 +58,14 @@ enum {
 #define PM_RESET_TIMER 0x1     /**< reset timer for unlock */
 #define PM_KEEP_TIMER          0x2     /**< keep timer for unlock */
 
+#define PM_LOCK_STR    "lock"
+#define PM_UNLOCK_STR  "unlock"
+#define PM_CHANGE_STR  "change"
+
+#define PM_LCDOFF_STR  "lcdoff"
+#define PM_LCDDIM_STR  "lcddim"
+#define PM_LCDON_STR   "lcdon"
+
 typedef struct {
        pid_t pid;
        unsigned int cond;
@@ -78,9 +88,11 @@ extern int init_pm_poll(int (*pm_callback) (int, PMMsg *));
 extern int exit_pm_poll();
 extern int init_pm_poll_input(int (*pm_callback)(int , PMMsg * ), const char *path);
 
-extern int pm_lock_internal(int s_bits, int flag, int timeout);
-extern int pm_unlock_internal(int s_bits, int flag);
-extern int pm_change_internal(int s_bits);
+extern int pm_lock_internal(pid_t pid, int s_bits, int flag, int timeout);
+extern int pm_unlock_internal(pid_t pid, int s_bits, int flag);
+extern int pm_change_internal(pid_t pid, int s_bits);
+
+extern void lcd_control_edbus_signal_handler(void *data, DBusMessage *msg);
 
 /**
  * @}
index 87f5970..daa3c99 100755 (executable)
@@ -199,9 +199,9 @@ static void ta_chgdet_cb(struct ss_main_data *ad)
                check_lowbat_charge_device(val);
                vconf_set_int(VCONFKEY_SYSMAN_CHARGER_STATUS, val);
                if (val == 0) {
-                       pm_unlock_internal(LCD_OFF, STAY_CUR_STATE);
+                       pm_unlock_internal(getpid(), LCD_OFF, STAY_CUR_STATE);
                } else {
-                       pm_lock_internal(LCD_OFF, STAY_CUR_STATE, 0);
+                       pm_lock_internal(getpid(), LCD_OFF, STAY_CUR_STATE, 0);
                        snprintf(params, sizeof(params), "%d", CB_NOTI_BATT_CHARGE);
                        ss_launch_if_noexist("/usr/bin/sys_device_noti", params);
                        _D("ta device notification");
@@ -229,7 +229,7 @@ static void earkey_chgdet_cb(struct ss_main_data *ad)
 static void tvout_chgdet_cb(struct ss_main_data *ad)
 {
        _D("jack - tvout changed\n");
-       pm_change_internal(LCD_NORMAL);
+       pm_change_internal(getpid(), LCD_NORMAL);
 }
 
 static void hdmi_chgdet_cb(struct ss_main_data *ad)
@@ -237,7 +237,7 @@ static void hdmi_chgdet_cb(struct ss_main_data *ad)
        int val;
        int ret = -1;
 
-       pm_change_internal(LCD_NORMAL);
+       pm_change_internal(getpid(), LCD_NORMAL);
        if (device_get_property(DEVICE_TYPE_EXTCON, PROP_EXTCON_HDMI_SUPPORT, &val) == 0) {
                if (val!=1) {
                        _E("target is not support HDMI");
@@ -249,9 +249,9 @@ static void hdmi_chgdet_cb(struct ss_main_data *ad)
                _D("jack - hdmi changed %d",val);
                vconf_set_int(VCONFKEY_SYSMAN_HDMI,val);
                if(val == 1)
-                       pm_lock_internal(LCD_NORMAL, GOTO_STATE_NOW, 0);
+                       pm_lock_internal(getpid(), LCD_NORMAL, GOTO_STATE_NOW, 0);
                else
-                       pm_unlock_internal(LCD_NORMAL, PM_SLEEP_MARGIN);
+                       pm_unlock_internal(getpid(), LCD_NORMAL, PM_SLEEP_MARGIN);
        } else {
                _E("failed to get hdmi_online status");
        }
@@ -603,7 +603,7 @@ static void pci_keyboard_add_cb(struct ss_main_data *ad)
 {
        char params[BUFF_MAX];
        _D("pci- keyboard inserted\n");
-       pm_change_internal(LCD_NORMAL);
+       pm_change_internal(getpid(), LCD_NORMAL);
 
        snprintf(params, sizeof(params), "%d", CB_NOTI_PCI_INSERTED);
        ss_launch_if_noexist("/usr/bin/sys_pci_noti", params);
@@ -613,7 +613,7 @@ static void pci_keyboard_remove_cb(struct ss_main_data *ad)
 {
        char params[BUFF_MAX];
        _D("pci- keyboard removed\n");
-       pm_change_internal(LCD_NORMAL);
+       pm_change_internal(getpid(), LCD_NORMAL);
 
        snprintf(params, sizeof(params), "%d", CB_NOTI_PCI_REMOVED);
        ss_launch_if_noexist("/usr/bin/sys_pci_noti", params);
index 78ccf3a..797aca1 100644 (file)
@@ -290,7 +290,7 @@ int usbcon_def_predefine_action(int argc, char **argv)
                if (val == 0) {
                        vconf_set_int(VCONFKEY_SYSMAN_USB_STATUS,
                                      VCONFKEY_SYSMAN_USB_DISCONNECTED);
-                       pm_unlock_internal(LCD_OFF, STAY_CUR_STATE);
+                       pm_unlock_internal(getpid(), LCD_OFF, STAY_CUR_STATE);
                        return 0;
                }
 
@@ -299,7 +299,7 @@ int usbcon_def_predefine_action(int argc, char **argv)
 
                vconf_set_int(VCONFKEY_SYSMAN_USB_STATUS,
                              VCONFKEY_SYSMAN_USB_AVAILABLE);
-               pm_lock_internal(LCD_OFF, STAY_CUR_STATE, 0);
+               pm_lock_internal(getpid(), LCD_OFF, STAY_CUR_STATE, 0);
                pid = ss_launch_if_noexist(USBCON_EXEC_PATH, NULL);
                if (pid < 0) {
                        _E("usb predefine action failed\n");
@@ -406,7 +406,7 @@ int predefine_control_launch(char *name, bundle *b)
 
 void predefine_pm_change_state(unsigned int s_bits)
 {
-       pm_change_internal(s_bits);
+       pm_change_internal(getpid(), s_bits);
 }
 
 int lowbat_def_predefine_action(int argc, char **argv)
@@ -614,14 +614,14 @@ int entersleep_def_predefine_action(int argc, char **argv)
 {
        int ret;
 
-       pm_change_internal(LCD_NORMAL);
+       pm_change_internal(getpid(), LCD_NORMAL);
        sync();
 
        ret = tel_set_flight_mode(tapi_handle, TAPI_POWER_FLIGHT_MODE_ENTER, enter_flight_mode_cb, NULL);
        _E("request for changing into flight mode : %d\n", ret);
 
        system("/etc/rc.d/rc.entersleep");
-       pm_change_internal(POWER_OFF);
+       pm_change_internal(getpid(), POWER_OFF);
 
        return 0;
 }
@@ -630,7 +630,7 @@ int leavesleep_def_predefine_action(int argc, char **argv)
 {
        int ret;
 
-       pm_change_internal(LCD_NORMAL);
+       pm_change_internal(getpid(), LCD_NORMAL);
        sync();
 
        ret = tel_set_flight_mode(tapi_handle, TAPI_POWER_FLIGHT_MODE_LEAVE, leave_flight_mode_cb, NULL);
@@ -728,7 +728,7 @@ int restart_def_predefine_action(int argc, char **argv)
        int ret;
 
        heynoti_publish(POWEROFF_NOTI_NAME);
-       pm_change_internal(LCD_NORMAL);
+       pm_change_internal(getpid(), LCD_NORMAL);
        system(LIBPATH"/system-server/shutdown.sh &");
        sync();
 
index 1d8a92e..f99596d 100644 (file)
@@ -20,7 +20,8 @@
 #include <sys/wait.h>
 #include <vconf.h>
 #include "core.h"
-#include "edbus-handler.h"
+#include "core/edbus-handler.h"
+#include "display/poll.h"
 
 #define _E(format, args...) do { \
        char buf[255];\
@@ -106,5 +107,9 @@ void ss_signal_init(void)
        sig_act.sa_flags = SA_SIGINFO;
        sigemptyset(&sig_act.sa_mask);
        sigaction(SIGPIPE, &sig_act, &sig_pipe_old_act);
-       register_edbus_signal_handler(SIGNAL_NAME_POWEROFF_POPUP, (void *)poweroff_popup_edbus_signal_handler);
+       register_edbus_signal_handler(SIGNAL_NAME_POWEROFF_POPUP,
+                   (void *)poweroff_popup_edbus_signal_handler);
+       register_edbus_signal_handler(SIGNAL_NAME_LCD_CONTROL,
+                   (void *)lcd_control_edbus_signal_handler);
+
 }
index 3a378f5..f8e6229 100644 (file)
@@ -35,7 +35,7 @@ int ss_ta_init()
                        vconf_set_int(VCONFKEY_SYSMAN_CHARGER_STATUS,
                                        VCONFKEY_SYSMAN_CHARGER_CONNECTED);
                        while (i < RETRY
-                              && pm_lock_internal(LCD_OFF, STAY_CUR_STATE,
+                              && pm_lock_internal(getpid(), LCD_OFF, STAY_CUR_STATE,
                                                0) == -1) {
                                i++;
                                sleep(1);
index 11e92b5..62d6491 100644 (file)
@@ -148,9 +148,9 @@ int set_datetime_action(int argc, char **argv)
        else
                pm_state = 0x4;
 
-       pm_lock_internal(pm_state, STAY_CUR_STATE, 0);
+       pm_lock_internal(getpid(), pm_state, STAY_CUR_STATE, 0);
        ret = handle_date(argv[0]);
-       pm_unlock_internal(pm_state, STAY_CUR_STATE);
+       pm_unlock_internal(getpid(), pm_state, STAY_CUR_STATE);
        return ret;
 }
 
@@ -169,9 +169,9 @@ int set_timezone_action(int argc, char **argv)
        else
                pm_state = 0x4;
 
-       pm_lock_internal(pm_state, STAY_CUR_STATE, 0);
+       pm_lock_internal(getpid(), pm_state, STAY_CUR_STATE, 0);
        ret = handle_timezone(argv[0]);
-       pm_unlock_internal(pm_state, STAY_CUR_STATE);
+       pm_unlock_internal(getpid(), pm_state, STAY_CUR_STATE);
        return ret;
 }
 
index b8ef20e..815156d 100644 (file)
@@ -36,7 +36,7 @@ int ss_usb_init()
                        vconf_set_int(VCONFKEY_SYSMAN_USB_STATUS,
                                        VCONFKEY_SYSMAN_USB_AVAILABLE);
                        while (i < RETRY
-                                       && pm_lock_internal(LCD_OFF, STAY_CUR_STATE, 0) == -1) {
+                                       && pm_lock_internal(getpid(), LCD_OFF, STAY_CUR_STATE, 0) == -1) {
                                i++;
                                sleep(1);
                        }