Add pm_listener/talker for sharing state with other deviced services. 80/14680/1
authorsh.pi <sh.pi@samsung.com>
Wed, 3 Apr 2013 05:01:07 +0000 (14:01 +0900)
committerKrzysztof Sasiak <k.sasiak@samsung.com>
Thu, 9 Jan 2014 16:02:22 +0000 (17:02 +0100)
Change-Id: I18852b32b6a538de2c57df28541a89bb66d03033
Signed-off-by: Krzysztof Sasiak <k.sasiak@samsung.com>
display/core.c
display/core.h

index 3c4f2c4..0bccc5e 100644 (file)
@@ -261,6 +261,99 @@ static Eina_Bool del_sleep_cond(void *data)
        return EINA_FALSE;
 }
 
+struct pm_listener {
+       enum pm_status status;
+       int (*func)(void *data);
+};
+
+Eina_List *pm_listener_list;
+
+int pm_add_listener(enum pm_status status, int (*func)(void *data))
+{
+       Eina_List *n;
+       struct pm_listener *data, *listener;
+
+       LOGINFO("%d, %x", status, func);
+
+       if (!func) {
+               LOGERR("invalid func address!");
+               return -1;
+       }
+
+       EINA_LIST_FOREACH(pm_listener_list, n, data)
+               if (status == data->status && func == (data->func)) {
+                       LOGERR("function is already registered! [%d, %x]",
+                           status, func);
+                       return -1;
+               }
+
+       listener = malloc(sizeof(struct pm_listener));
+       if (!listener) {
+               LOGERR("Fail to malloc for listener!");
+               return -1;
+       }
+
+       listener->status = status;
+       listener->func = func;
+
+       pm_listener_list = eina_list_append(pm_listener_list, listener);
+
+       return 0;
+}
+
+int pm_del_listener(enum pm_status status, int (*func)(void *data))
+{
+       Eina_List *n, *next;
+       struct pm_listener *listener;
+
+       if (!func) {
+               LOGERR("invalid func address!");
+               return -1;
+       }
+
+       EINA_LIST_FOREACH_SAFE(pm_listener_list, n, next, listener)
+               if (status == listener->status && func == (listener->func)) {
+                       LOGINFO("[%d, %x]", status, func);
+                       free(listener);
+                       pm_listener_list = eina_list_remove_list(
+                                           pm_listener_list, n);
+               }
+
+       return 0;
+}
+
+static void pm_del_listener_all(void)
+{
+       Eina_List *n, *next;
+       struct pm_listener *listener;
+
+       EINA_LIST_FOREACH_SAFE(pm_listener_list, n, next, listener)
+               if (listener) {
+                       free(listener);
+                       pm_listener_list = eina_list_remove_list(pm_listener_list, n);
+               }
+
+       LOGINFO("all deleted!");
+}
+
+void pm_talker(enum pm_status status, void *data)
+{
+       Eina_List *n;
+       struct pm_listener *listener;
+       int cnt = 0;
+
+       EINA_LIST_FOREACH(pm_listener_list, n, listener) {
+               if (status == listener->status) {
+                       if (listener->func) {
+                               listener->func(data);
+                               cnt++;
+                       }
+               }
+       }
+
+       LOGINFO("cb is called! status:%d, cnt:%d ", status, cnt);
+}
+
 /* update transition condition for application requrements */
 static int proc_condition(PMMsg *data)
 {
@@ -776,6 +869,7 @@ static int default_action(int timeout)
 
        if (pm_cur_state != pm_old_state && pm_cur_state != S_SLEEP) {
                set_setting_pmstate(pm_cur_state);
+               pm_talker(PM_STATUS_LCD, pm_cur_state);
        }
        switch (pm_cur_state) {
        case S_NORMAL:
@@ -1522,6 +1616,8 @@ void end_pm_main(void)
        int i;
 
        end_battinfo_gathering();
+       pm_del_listener_all();
+
        for (i = i - 1; i >= INIT_SETTING; i--) {
                switch (i) {
                case INIT_SETTING:
index 6ebd444..0995cfe 100644 (file)
@@ -99,6 +99,15 @@ struct state {
        int timeout;
 } states[S_END];
 
+enum pm_status {
+       PM_STATUS_LCD,
+       PM_STATUS_MAX
+};
+
+int pm_add_listener(enum pm_status status, int (*func)(void *data));
+int pm_del_listener(enum pm_status status, int (*func)(void *data));
+void pm_talker(enum pm_status status, void *value);
+
 /* If the bit in a condition variable is set,
  *  we cannot transit the state until clear this bit. */
 int trans_condition;