Add D-bus interface for pm lock/unlock.
authorjy910.yun <jy910.yun@samsung.com>
Fri, 21 Jun 2013 10:10:37 +0000 (19:10 +0900)
committerjy910.yun <jy910.yun@samsung.com>
Fri, 21 Jun 2013 10:39:30 +0000 (19:39 +0900)
display/poll.c
display/poll.h
ss_device_change_handler.c
ss_predefine.c
ss_sig_handler.c
ss_ta_handler.c
ss_timemgr.c
ss_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..915c28b 100644 (file)
@@ -30,6 +30,7 @@
 #define __PM_POLL_H__
 
 #include <Ecore.h>
+#include "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 770602d..3fc9634 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", DEVICE_NOTI_BATT_CHARGE);
                        ss_launch_if_noexist("/usr/bin/sys_device_noti", params);
                        PRT_TRACE("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)
 {
        PRT_TRACE("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) {
                        PRT_TRACE_ERR("target is not support HDMI");
@@ -249,9 +249,9 @@ static void hdmi_chgdet_cb(struct ss_main_data *ad)
                PRT_TRACE("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 {
                PRT_TRACE_ERR("failed to get hdmi_online status");
        }
@@ -588,7 +588,7 @@ static void pci_keyboard_add_cb(struct ss_main_data *ad)
 {
        char params[BUFF_MAX];
        PRT_TRACE("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);
@@ -598,7 +598,7 @@ static void pci_keyboard_remove_cb(struct ss_main_data *ad)
 {
        char params[BUFF_MAX];
        PRT_TRACE("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 876586f..6a3274d 100644 (file)
@@ -293,7 +293,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;
                }
 
@@ -302,7 +302,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) {
                        PRT_TRACE_ERR("usb predefine action failed\n");
@@ -409,7 +409,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)
@@ -617,14 +617,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);
        PRT_TRACE_ERR("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;
 }
@@ -633,7 +633,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);
@@ -731,7 +731,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("/etc/rc.d/rc.shutdown &");
        sync();
 
index 4a4c1f6..1ceda17 100644 (file)
@@ -21,6 +21,7 @@
 #include <vconf.h>
 #include "ss_core.h"
 #include "edbus-handler.h"
+#include "poll.h"
 
 #define PRT_TRACE_ERR(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 b75bdb1..72ec823 100644 (file)
@@ -34,7 +34,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 485f2b8..31446a1 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 6e42a68..3961643 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);
                        }