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)
{
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:
int i;
end_battinfo_gathering();
+ pm_del_listener_all();
+
for (i = i - 1; i >= INIT_SETTING; i--) {
switch (i) {
case INIT_SETTING: