X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fs_indi_main.c;h=3a2c6dbeb2bbf8c60c9f2c17b2bd263172a7df68;hb=HEAD;hp=08740df4b7158510d4f7aba0afdfbcbc209279bc;hpb=cb6b79a9ca43e01c5fbd2af174ab8dc201a7dfd4;p=platform%2Fcore%2Ftelephony%2Ftel-plugin-indicator.git diff --git a/src/s_indi_main.c b/src/s_indi_main.c index 08740df..3a2c6db 100644 --- a/src/s_indi_main.c +++ b/src/s_indi_main.c @@ -24,36 +24,33 @@ #include #include -#include -#include #include #include -#include #include #include -#include #include #include #include #include #include -#include #include "s_indi_main.h" #include "s_indi_util.h" #include "s_indi_log.h" #define S_INDI_UPDATE_INTERVAL 1 -#define S_INDI_NO_RX_PKT_TIMEOUT 60 #define S_INDI_PROC_FILE "/proc/net/dev" -#define S_INDI_DB_STORAGE_NAME "database" -#define S_INDI_DB_STORAGE_PATH "/opt/dbspace/.dnet.db" -#define S_INDI_VCONF_STORAGE_NAME "vconf" +#define S_INDI_VCONF_STORAGE_NAME "vconf" #define S_INDI_ALLOC_USER_DATA(data, plugin, cp) \ do { \ data = s_indi_malloc0(sizeof(__s_indi_cb_user_data)); \ + if (data == NULL) { \ + err("Memory allocation failed!!"); \ + s_indi_free(cp); \ + return FALSE; \ + } \ data->indi_plugin = plugin; \ data->cp_name = cp; \ } while (0) @@ -70,9 +67,6 @@ typedef struct { } __s_indi_cb_user_data; typedef struct { - struct global_data msg_id; - gboolean b_pm_lock; - GHashTable *state_info; /* HashTable of s_indi_cp_state_info_type with key = cp_name */ GHashTable *vconf_info; /* Mapping of enum tcore_storage_key to cp_name */ @@ -80,19 +74,17 @@ typedef struct { /***************** HOOKS *****************/ static enum tcore_hook_return s_indi_on_hook_modem_plugin_removed(Server *server, CoreObject *source, - enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data); + enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data); static enum tcore_hook_return s_indi_on_hook_modem_plugin_added(Server *server, CoreObject *source, - enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data); + enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data); static enum tcore_hook_return s_indi_on_hook_voice_call_status(Server *server, CoreObject *source, - enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data); -static enum tcore_hook_return s_indi_on_hook_sim_init(Server *server, CoreObject *source, - enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data); + enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data); static enum tcore_hook_return s_indi_on_hook_net_register(Server *server, CoreObject *source, - enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data); + enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data); static enum tcore_hook_return s_indi_on_hook_ps_call_status(Server *server, CoreObject *source, - enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data); + enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data); static enum tcore_hook_return s_indi_on_hook_modem_power(Server *server, CoreObject *source, - enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data); + enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data); /***************** VCONF Callbacks *****************/ static void s_indi_storage_key_callback(enum tcore_storage_key key, void *value, void *user_data); @@ -105,7 +97,6 @@ static void __s_indi_dev_info_value_destroy_notification(gpointer data); static inline s_indi_private_info *__s_indi_get_priv_info(TcorePlugin *plugin); static gboolean __s_indi_start_updater(TcorePlugin *indi_plugin, gchar *cp_name); static gboolean __s_indi_update_callback(__s_indi_cb_user_data *data); -static void __s_indi_set_dormancy_value(Server *server, s_indi_dormancy_info_type *dormancy_info, enum tcore_storage_key key_fd); static void __s_indi_refresh_modems(TcorePlugin *indi_plugin); static s_indi_cp_state_info_type *__s_indi_alloc_state_info(CoreObject *co_ps); static s_indi_dev_state_info_type *__s_indi_alloc_device_state(CoreObject *ps_context, s_indi_cp_state_info_type *parent); @@ -115,47 +106,18 @@ static void __s_indi_add_modem_plugin(TcorePlugin *indi_plugin, TcorePlugin *mod static void __s_indi_remove_modem_plugin(TcorePlugin *indi_plugin, TcorePlugin *modem_plugin); static void __s_indi_register_vconf_key(enum tcore_storage_key key, TcorePlugin *indi_plugin, const char *cp_name); static void __s_indi_unregister_vconf_key(enum tcore_storage_key key, TcorePlugin *indi_plugin, const char *cp_name); -static void __s_indi_process_fast_dormancy(s_indi_cp_state_info_type *state_info, GVariant *value); -static gboolean __s_indi_cancel_pm_lock(gboolean b_pm_lock); static gboolean __s_indi_handle_voice_call_status(Server *server, CoreObject *source, enum tcore_notification_command command, const char *cp_name, s_indi_cp_state_info_type *state_info); -static void __s_indi_deactivate_ps_context (gpointer key, gpointer value, gpointer user_data); -static gboolean __s_indi_check_fast_dormancy(TcorePlugin *indi_plugin, CoreObject *co_ps, s_indi_dormancy_info_type *dormancy_info, gboolean b_pm_lock); - -void __s_indi_process_fast_dormancy(s_indi_cp_state_info_type *state_info, GVariant *value) -{ - gboolean fd_set = FALSE; - int on_timeout = S_INDI_ZERO; - int off_timeout = S_INDI_ZERO; - - if (!g_variant_is_of_type(value, G_VARIANT_TYPE_INT32)) { - err("wrong variant data type"); - return; - } - - state_info->dormant_info.b_vconf_checker = TRUE; - - fd_set = g_variant_get_int32(value); - dbg("fast dormancy set (%s)", fd_set ? "TRUE" : "FALSE"); - - if (fd_set) { - on_timeout = S_INDI_FIVE; - off_timeout = S_INDI_FIVE; - } else { - on_timeout = S_INDI_MINUS_ONE; - off_timeout = S_INDI_MINUS_ONE; - } - state_info->dormant_info.lcd_on_timeout = on_timeout; - state_info->dormant_info.lcd_off_timeout = off_timeout; - state_info->dormant_info.is_dormant_set = fd_set; -} - void __s_indi_register_vconf_key(enum tcore_storage_key key, TcorePlugin *indi_plugin, const char *cp_name) { s_indi_private_info *priv_info = __s_indi_get_priv_info(indi_plugin); Storage *strg_vconf = tcore_server_find_storage(tcore_plugin_ref_server(indi_plugin), S_INDI_VCONF_STORAGE_NAME); + if (priv_info == NULL) { + err("priv_info is NULL!!!"); + return; + } s_indi_assert(NULL != strg_vconf); /** NULL cp_name: subscription independent vconf key */ @@ -168,6 +130,10 @@ void __s_indi_unregister_vconf_key(enum tcore_storage_key key, TcorePlugin *indi { s_indi_private_info *priv_info = __s_indi_get_priv_info(indi_plugin); Storage *strg_vconf = tcore_server_find_storage(tcore_plugin_ref_server(indi_plugin), S_INDI_VCONF_STORAGE_NAME); + if (priv_info == NULL) { + err("priv_info is NULL!!!"); + return; + } s_indi_assert(NULL != strg_vconf); /** NULL cp_name: subscription independent vconf key */ @@ -179,8 +145,11 @@ void __s_indi_unregister_vconf_key(enum tcore_storage_key key, TcorePlugin *indi void __s_indi_add_modem_plugin(TcorePlugin *indi_plugin, TcorePlugin *modem_plugin) { gchar *cp_name = NULL; - enum tcore_storage_key vconf_key; s_indi_private_info *priv_info = __s_indi_get_priv_info(indi_plugin); + if (priv_info == NULL) { + err("priv_info is NULL!!!"); + return; + } /** @todo: It may be possible to use cp_name without duping as well */ cp_name = s_indi_strdup(tcore_server_get_cp_name_by_plugin(modem_plugin)); @@ -189,40 +158,23 @@ void __s_indi_add_modem_plugin(TcorePlugin *indi_plugin, TcorePlugin *modem_plug /** @todo: Check if key-value replacement is the intended behavior */ g_hash_table_insert(priv_info->state_info, cp_name, __s_indi_alloc_state_info(__s_indi_fetch_ps_co(modem_plugin))); - - if (s_indi_str_has_suffix(cp_name, "0")) { - vconf_key = STORAGE_KEY_TESTMODE_FAST_DORMANCY; - } else if (s_indi_str_has_suffix(cp_name, "1")) { - vconf_key = STORAGE_KEY_TESTMODE_FAST_DORMANCY2; - } else { - s_indi_assert_not_reached(); - } - - __s_indi_register_vconf_key(vconf_key, indi_plugin, cp_name); } void __s_indi_remove_modem_plugin(TcorePlugin *indi_plugin, TcorePlugin *modem_plugin) { const char *cp_name = NULL; - enum tcore_storage_key vconf_key; s_indi_private_info *priv_info = __s_indi_get_priv_info(indi_plugin); + if (priv_info == NULL) { + err("priv_info is NULL!!!"); + return; + } + s_indi_assert(NULL != priv_info->state_info); cp_name = tcore_server_get_cp_name_by_plugin(modem_plugin); s_indi_assert(NULL != cp_name); - s_indi_assert(NULL != priv_info->state_info); if (g_hash_table_remove(priv_info->state_info, cp_name)) s_indi_log_ex(cp_name, "Removed"); - - if (s_indi_str_has_suffix(cp_name, "0")) { - vconf_key = STORAGE_KEY_TESTMODE_FAST_DORMANCY; - } else if (s_indi_str_has_suffix(cp_name, "1")) { - vconf_key = STORAGE_KEY_TESTMODE_FAST_DORMANCY2; - } else { - s_indi_assert_not_reached(); - } - - __s_indi_unregister_vconf_key(vconf_key, indi_plugin, cp_name); } CoreObject *__s_indi_fetch_ps_co(TcorePlugin *plugin) @@ -242,24 +194,32 @@ CoreObject *__s_indi_fetch_ps_co(TcorePlugin *plugin) s_indi_cp_state_info_type *__s_indi_alloc_state_info(CoreObject *co_ps) { s_indi_cp_state_info_type *state_info = s_indi_malloc0(sizeof(s_indi_cp_state_info_type)); + if (!state_info) { + err("Memory allocation failed!!"); + return NULL; + } state_info->co_ps = co_ps; state_info->ps_state = S_INDI_CELLULAR_UNKNOWN; state_info->cp_trans_state = S_INDI_TRANSFER_UNKNOWN; state_info->dormant_info.lcd_state = S_INDI_LCD_UNKNOWN; - state_info->dormant_info.lcd_on_timeout = S_INDI_MINUS_ONE; - state_info->dormant_info.lcd_off_timeout = S_INDI_MINUS_ONE; state_info->rx_total = S_INDI_ZERO; state_info->tx_total = S_INDI_ZERO; state_info->dormant_info.parent = state_info; /* tcore_context_get_ipv4_devname uses glib allocator so key should be freed using g_free() */ - state_info->device_info = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, __s_indi_dev_info_value_destroy_notification); + state_info->device_info = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, __s_indi_dev_info_value_destroy_notification); return state_info; } s_indi_dev_state_info_type *__s_indi_alloc_device_state(CoreObject *ps_context, s_indi_cp_state_info_type *parent) { s_indi_dev_state_info_type *dev_state = s_indi_malloc0(sizeof(s_indi_dev_state_info_type)); + if (dev_state == NULL) { + err("Memory allocation failed!!"); + return NULL; + } + dev_state->ps_context = ps_context; dev_state->parent = parent; return dev_state; @@ -277,6 +237,10 @@ gboolean __s_indi_start_updater(TcorePlugin *indi_plugin, gchar *cp_name) __s_indi_cb_user_data *cb_data = NULL; s_indi_cp_state_info_type *state_info = NULL; s_indi_private_info *priv_info = __s_indi_get_priv_info(indi_plugin); + if (priv_info == NULL) { + err("priv_info is NULL!!!"); + return FALSE; + } if ((state_info = g_hash_table_lookup(priv_info->state_info, cp_name)) == NULL) { warn("CP [%s] Not Present", cp_name); @@ -301,18 +265,6 @@ gboolean __s_indi_start_updater(TcorePlugin *indi_plugin, gchar *cp_name) return TRUE; } -gboolean __s_indi_cancel_pm_lock(gboolean b_pm_lock) -{ - /* Cancel power lock */ - if (b_pm_lock) { - int rv = S_INDI_ZERO; - rv = display_unlock_state(LCD_OFF, PM_RESET_TIMER); - dbg("display_unlock_state: rv(%d)", rv); - } - - return FALSE; -} - gboolean __s_indi_update_callback(__s_indi_cb_user_data *data) { #define INDICATOR_BUFF_SIZE 4096 @@ -325,12 +277,17 @@ gboolean __s_indi_update_callback(__s_indi_cb_user_data *data) FILE *pf = NULL; gchar *rv = NULL; unsigned long long rx_curr_total = S_INDI_ZERO, tx_curr_total = S_INDI_ZERO, rx_prev_total = S_INDI_ZERO, tx_prev_total = S_INDI_ZERO; - unsigned long rx_changes_total = S_INDI_ZERO, tx_changes_total = S_INDI_ZERO; + unsigned long long rx_changes_total = S_INDI_ZERO, tx_changes_total = S_INDI_ZERO; s_indi_transfer_state cp_state = S_INDI_TRANSFER_NORMAL; /* Assume no activity */ enum tcore_storage_key key_last_rcv, key_last_snt, key_total_rcv, key_total_snt, key_service_state; s_indi_private_info *priv_info = __s_indi_get_priv_info(indi_plugin); Storage *strg_vconf = NULL; + if (priv_info == NULL) { + err("priv_info is NULL!!!"); + return G_SOURCE_REMOVE; + } + /* VCONF Mapper */ if (s_indi_str_has_suffix(cp_name, "0")) { key_last_rcv = STORAGE_KEY_CELLULAR_PKT_LAST_RCV; @@ -396,13 +353,15 @@ gboolean __s_indi_update_callback(__s_indi_cb_user_data *data) /* Terminate to read ifname */ entry = strrchr(ifname, ':'); + if (entry == NULL) + goto EXIT; *entry++ = '\0'; /* Read device_info */ /* Takes care of the fix: Fix the PLM p131003-03182. Sha-ID: 65544f0be8e60ae3f964921755a1e83fa8e71441*/ if ((dev_state = g_hash_table_lookup(state_info->device_info, ifname)) != NULL) { gint result = S_INDI_ZERO; - unsigned long rx_pkt = S_INDI_ZERO, tx_pkt = S_INDI_ZERO; + unsigned long long rx_pkt = S_INDI_ZERO, tx_pkt = S_INDI_ZERO; /************************************************************************ Sample Input of S_INDI_PROC_FILE ************************************************************************ @@ -412,7 +371,7 @@ gboolean __s_indi_update_callback(__s_indi_cb_user_data *data) eth0: 2714004148 6475059 0 0 0 0 0 0 72595891 8726308 0 0 0 0 0 0 ************************************************************************/ s_indi_log_v("Reading stats of interface %s", ifname); - result = sscanf(entry, "%lu %*s %*s %*s %*s %*s %*s %*s %lu %*s %*s %*s %*s %*s %*s %*s", &rx_pkt, &tx_pkt); + result = sscanf(entry, "%llu %*s %*s %*s %*s %*s %*s %*s %llu %*s %*s %*s %*s %*s %*s %*s", &rx_pkt, &tx_pkt); if (result <= S_INDI_ZERO) { err("stats fail to get proc field => %d", result); goto EXIT; /** @todo: REMOVE or CONTINUE ? */ @@ -432,34 +391,18 @@ gboolean __s_indi_update_callback(__s_indi_cb_user_data *data) } } - rx_changes_total = rx_curr_total - rx_prev_total; - tx_changes_total = tx_curr_total - tx_prev_total; + rx_changes_total = ((rx_curr_total > rx_prev_total) ? (rx_curr_total - rx_prev_total) : S_INDI_ZERO); + tx_changes_total = ((tx_curr_total > tx_prev_total) ? (tx_curr_total - tx_prev_total) : S_INDI_ZERO); - if (rx_changes_total) { + if (rx_changes_total) cp_state |= S_INDI_TRANSFER_RX; - } - if (tx_changes_total) { - cp_state |= S_INDI_TRANSFER_TX; - } - /* todo: reduce the number of conditions */ - if (cp_state == S_INDI_TRANSFER_TX) { - state_info->no_rx_pckt++; - } - else if (cp_state == S_INDI_TRANSFER_NORMAL) { - /* todo: why check against 5 */ - if (state_info->no_rx_pckt > 5) { - state_info->no_rx_pckt++; - } - state_info->dormant_info.dormant_cnt++; - }else { - state_info->dormant_info.dormant_cnt = 0; - state_info->dormant_info.is_dormant = FALSE; - } + if (tx_changes_total) + cp_state |= S_INDI_TRANSFER_TX; - if (cp_state) { - s_indi_log_txrx(modem_id, "Transfer State:[%d] rx_cnt:[%d] RX: [%10lu] TX: [%10lu]", cp_state, state_info->no_rx_pckt, rx_changes_total, tx_changes_total); - } + if (cp_state > 0) + s_indi_log_txrx(modem_id, "Transfer State:[%d] RX: [%llu / %llu] TX: [%llu / %llu]", + cp_state, rx_changes_total, rx_curr_total, tx_changes_total, tx_curr_total); if (state_info->dormant_info.lcd_state < S_INDI_LCD_OFF) { if (state_info->cp_trans_state != cp_state) { /* New Transfer State */ @@ -469,21 +412,15 @@ gboolean __s_indi_update_callback(__s_indi_cb_user_data *data) state_info->cp_trans_state = cp_state; tcore_storage_set_int(strg_vconf, STORAGE_KEY_PACKET_INDICATOR_STATE, cp_state); if (cp_state != S_INDI_TRANSFER_NORMAL) { /* Data activity */ - s_indi_log_txrx(modem_id, "pkt_state[%d] rx_changes [%lu] tx_changes [%lu]", - cp_state, rx_changes_total, tx_changes_total); - tcore_storage_set_int(strg_vconf, key_last_rcv, rx_curr_total/1000); - tcore_storage_set_int(strg_vconf, key_last_snt, tx_curr_total/1000); + /** @todo: VCONF needs upgrade to support llu */ + tcore_storage_set_int(strg_vconf, key_last_rcv, (int)(rx_curr_total/1000ULL)); + tcore_storage_set_int(strg_vconf, key_last_snt, (int)(tx_curr_total/1000ULL)); + + s_indi_log_txrx(modem_id, "VCONF LAST- RX: [%d] TX: [%d]", (int)(rx_curr_total/1000ULL), (int)(tx_curr_total/1000ULL)); } } } - if (state_info->no_rx_pckt >= S_INDI_NO_RX_PKT_TIMEOUT) { - state_info->no_rx_pckt = S_INDI_ZERO; - dbg("request to disconnect all ps context"); - g_hash_table_foreach(state_info->device_info, __s_indi_deactivate_ps_context, state_info->co_ps); - } - - priv_info->b_pm_lock = __s_indi_check_fast_dormancy(indi_plugin, state_info->co_ps, &state_info->dormant_info, priv_info->b_pm_lock); fclose(pf); return G_SOURCE_CONTINUE; /* Revisit after S_INDI_UPDATE_INTERVAL */ @@ -508,8 +445,12 @@ EXIT: tcore_storage_set_int(strg_vconf, key_total_rcv, tcore_storage_get_int(strg_vconf, key_total_rcv) + state_info->rx_total); tcore_storage_set_int(strg_vconf, key_total_snt, tcore_storage_get_int(strg_vconf, key_total_snt) + state_info->tx_total); + /* After updating total vconf key, last vconf key needs to be reset */ + tcore_storage_set_int(strg_vconf, key_last_rcv, 0); + tcore_storage_set_int(strg_vconf, key_last_snt, 0); + /** @todo: VCONF needs upgrade to support llu */ - s_indi_log_txrx(modem_id, "RX-TOTAL[%d] TX-TOTAL[%d]", + s_indi_log_txrx(modem_id, "VCONF TOTAL- RX: [%d] TX: [%d]", tcore_storage_get_int(strg_vconf, key_total_rcv), tcore_storage_get_int(strg_vconf, key_total_snt)); state_info->rx_total = S_INDI_ZERO; state_info->tx_total = S_INDI_ZERO; @@ -519,31 +460,13 @@ EXIT: return G_SOURCE_REMOVE; } -static void __s_indi_deactivate_ps_context (gpointer key, gpointer value, gpointer user_data) -{ -#if 1 - dbg("Temp Fix: stopping deactivation from indicator "); - key = key; - value = value; - user_data = user_data; -#else - gchar *ifname = key; - s_indi_dev_state_info_type *dev_state = value; - - if(dev_state->ps_context && user_data){ - dbg("Deactivating PS context [%p] which is associated with interface %s", dev_state->ps_context, ifname); - tcore_ps_deactivate_context(user_data, dev_state->ps_context, NULL); - } -#endif - return; -} - void __s_indi_state_info_value_destroy_notification(gpointer data) { s_indi_cp_state_info_type *state_info = data; const char *cp_name = NULL; Storage *strg_vconf = NULL; - enum tcore_storage_key key_total_rcv, key_total_snt; + enum tcore_storage_key key_last_rcv, key_last_snt, key_total_rcv, key_total_snt; + unsigned int modem_id; s_indi_assert(NULL != state_info); s_indi_assert(NULL != state_info->co_ps); @@ -553,11 +476,17 @@ void __s_indi_state_info_value_destroy_notification(gpointer data) /* VCONF Mapper */ if (s_indi_str_has_suffix(cp_name, "0")) { + key_last_rcv = STORAGE_KEY_CELLULAR_PKT_LAST_RCV; + key_last_snt = STORAGE_KEY_CELLULAR_PKT_LAST_SNT; key_total_rcv = STORAGE_KEY_CELLULAR_PKT_TOTAL_RCV; key_total_snt = STORAGE_KEY_CELLULAR_PKT_TOTAL_SNT; + modem_id = MODEM_ID_PRIMARY; } else if (s_indi_str_has_suffix(cp_name, "1")) { + key_last_rcv = STORAGE_KEY_CELLULAR_PKT_LAST_RCV2; + key_last_snt = STORAGE_KEY_CELLULAR_PKT_LAST_SNT2; key_total_rcv = STORAGE_KEY_CELLULAR_PKT_TOTAL_RCV2; key_total_snt = STORAGE_KEY_CELLULAR_PKT_TOTAL_SNT2; + modem_id = MODEM_ID_SECONDARY; } else { err("Unhandled CP Name %s", cp_name); s_indi_assert_not_reached(); @@ -572,11 +501,15 @@ void __s_indi_state_info_value_destroy_notification(gpointer data) /* Update VCONF before dying */ tcore_storage_set_int(strg_vconf, key_total_rcv, tcore_storage_get_int(strg_vconf, key_total_rcv) + state_info->rx_total); tcore_storage_set_int(strg_vconf, key_total_snt, tcore_storage_get_int(strg_vconf, key_total_snt) + state_info->tx_total); - dbg("CP[%s] RX-TOTAL[%10llu] TX-TOTAL[%10llu]", cp_name, + + /* After updating total vconf key, last vconf key needs to be reset */ + tcore_storage_set_int(strg_vconf, key_last_rcv, 0); + tcore_storage_set_int(strg_vconf, key_last_snt, 0); + + s_indi_log_txrx(modem_id, "VCONF TOTAL -RX: [%d] TX: [%d]", tcore_storage_get_int(strg_vconf, key_total_rcv), tcore_storage_get_int(strg_vconf, key_total_snt)); OUT: - s_indi_free(state_info->dormant_info.mccmnc); s_indi_free(data); } @@ -589,11 +522,11 @@ void __s_indi_dev_info_value_destroy_notification(gpointer data) s_indi_assert(NULL != state_info); /* Update parent before dying */ - state_info->rx_total += dev_state->curr_rx/1000; - state_info->tx_total += dev_state->curr_tx/1000; + state_info->rx_total += dev_state->curr_rx/1000ULL; + state_info->tx_total += dev_state->curr_tx/1000ULL; - s_indi_log_v("DYING after contributing [RX: %lu][TX: %lu] OUT OF [RX: %llu][TX: %llu]", - dev_state->curr_rx/1000, dev_state->curr_tx/1000, + dbg("DYING after contributing [RX: %llu][TX: %llu] OUT OF [RX: %llu][TX: %llu]", + dev_state->curr_rx/1000ULL, dev_state->curr_tx/1000ULL, state_info->rx_total, state_info->tx_total); s_indi_free(data); @@ -602,231 +535,57 @@ void __s_indi_dev_info_value_destroy_notification(gpointer data) void __s_indi_refresh_modems(TcorePlugin *indi_plugin) { GSList *mp_list = tcore_server_get_modem_plugin_list(tcore_plugin_ref_server(indi_plugin)); - s_indi_log_v("Processing %u present modems", g_slist_length(mp_list)); + GSList *tmp; + dbg("Processing %u present modems", g_slist_length(mp_list)); - while (mp_list) { - __s_indi_add_modem_plugin(indi_plugin, mp_list->data); - mp_list = mp_list->next; - } + for (tmp = mp_list; tmp; tmp = tmp->next) + __s_indi_add_modem_plugin(indi_plugin, tmp->data); g_slist_free(mp_list); } -void __s_indi_set_dormancy_value(Server *server, s_indi_dormancy_info_type *dormancy_info, enum tcore_storage_key key_fd) +void s_indi_storage_key_callback(enum tcore_storage_key key, void *value, void *user_data) { - if (dormancy_info->b_vconf_checker) { - Storage *strg_vconf = tcore_server_find_storage(server, S_INDI_VCONF_STORAGE_NAME); - gboolean b_fd_force = tcore_storage_get_bool(strg_vconf, key_fd); - - s_indi_assert(NULL != strg_vconf); - - if (b_fd_force) { - dbg("forcely enable fast dormancy "); - dormancy_info->lcd_on_timeout = S_INDI_FIVE; - dormancy_info->lcd_off_timeout = S_INDI_FIVE; - } else { - dbg("forcely disable fast dormancy "); - dormancy_info->lcd_on_timeout = S_INDI_MINUS_ONE; - dormancy_info->lcd_off_timeout = S_INDI_MINUS_ONE; - } - } - - if (!dormancy_info->mccmnc) { - dbg("mccmnc is null"); + s_indi_cp_state_info_type *state_info = NULL; + GVariant *tmp = value; + s_indi_private_info *priv_info = __s_indi_get_priv_info(user_data); + if (priv_info == NULL) { + err("priv_info is NULL!!!"); return; } - /** @todo: Make List of blocked mccmnc and use that */ - /* - * Fast dormancy values are updated currently only for SKT and KT operators in DB.Revisit. - * - */ - if ((g_strcmp0((const char *)dormancy_info->mccmnc, "00101") == S_INDI_ZERO) - || (g_strcmp0((const char *)dormancy_info->mccmnc, "99999") == S_INDI_ZERO)) { - dormancy_info->lcd_on_timeout = S_INDI_ZERO; - dormancy_info->lcd_off_timeout = S_INDI_ZERO; - dbg("FD does not work in testsim"); - } - else { -#define szQUERY_SIZE 5000 - Storage *strg_db; - void *db_handle; - char szQuery[szQUERY_SIZE]; - GHashTableIter iter; - gpointer key, value; - GHashTable *in_param, *out_param; + s_indi_assert(NULL != tmp); + switch (key) { + case STORAGE_KEY_PM_STATE: { + GHashTableIter iter; + gpointer key_info, value_info; + gint pm_state = S_INDI_ZERO; - /* Initialize Storage */ - strg_db = tcore_server_find_storage(server, S_INDI_DB_STORAGE_NAME); - db_handle = tcore_storage_create_handle(strg_db, S_INDI_DB_STORAGE_PATH); - if (db_handle == NULL) { - err("Failed to get Storage handle"); + if (!g_variant_is_of_type(tmp, G_VARIANT_TYPE_INT32)) { + err("Wrong variant data type"); return; } - /* Initialize parameters */ - in_param = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); - g_hash_table_insert(in_param, "1", g_strdup(dormancy_info->mccmnc)); - - out_param = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, (GDestroyNotify)g_hash_table_destroy); - - memset(szQuery, '\0', szQUERY_SIZE); - strcpy(szQuery, "select"); - strcat(szQuery, " a.dormant_id, a.network_info_id, a.lcd_on_timeout, a.lcd_off_timeout"); //0,1,2,3 - strcat(szQuery, " from fast_dormancy a, network_info b"); - strcat(szQuery, " where b.mccmnc= ? and a.network_info_id = b.network_info_id "); - - tcore_storage_read_query_database(strg_db, db_handle, szQuery, in_param, out_param, 4); - - dbg("Get dormancy value"); - g_hash_table_iter_init(&iter, out_param); - while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) { - GHashTableIter iter2; - gpointer key2, value2; - - if (value) { - g_hash_table_iter_init(&iter2, (GHashTable *)value); - while (g_hash_table_iter_next(&iter2, &key2, &value2) == TRUE) { - if (g_str_equal(key2, "2") == TRUE) { - dormancy_info->lcd_on_timeout = atoi((const char*)value2); - dbg("lcd on timeout(%d)", dormancy_info->lcd_on_timeout); - } - else if (g_str_equal(key2, "3") == TRUE) { - dormancy_info->lcd_off_timeout = atoi((const char*)value2); - dbg("lcd off timeout(%d)", dormancy_info->lcd_off_timeout); - } - } - break; - } - } - - /* Free resources */ - g_hash_table_destroy(in_param); - g_hash_table_destroy(out_param); - - if(dormancy_info->lcd_on_timeout > 0 || dormancy_info->lcd_off_timeout > 0) { - dormancy_info->is_dormant_set = TRUE; - } - - /* De-initialize Storage */ - tcore_storage_remove_handle(strg_db, db_handle); - } -} - -static gboolean __s_indi_check_fast_dormancy(TcorePlugin *indi_plugin, CoreObject *co_ps, s_indi_dormancy_info_type *dormancy_info, gboolean b_pm_lock) -{ - int rv =0; - - S_INDI_NOT_USED(indi_plugin); - S_INDI_NOT_USED(co_ps); - - if(!dormancy_info->is_dormant_set){ - dormancy_info->dormant_cnt = 0; - dormancy_info->is_dormant = FALSE; - - //cancle pm lock - b_pm_lock = __s_indi_cancel_pm_lock(b_pm_lock); - return b_pm_lock; - } - - if(dormancy_info->is_dormant){ - dormancy_info->dormant_cnt = 0; - return b_pm_lock; - } - - if(dormancy_info->lcd_state < 3 && dormancy_info->lcd_on_timeout > 0){ //on 1 && dim 2 - - //satisfy with fd condition, set fd and cancle the pm lock - if(dormancy_info->dormant_cnt >= dormancy_info->lcd_on_timeout){ - dbg("set lcd on fast dormancy"); - dormancy_info->dormant_cnt = 0; - dormancy_info->is_dormant = TRUE; - } + pm_state = g_variant_get_int32(tmp); - } - else if(dormancy_info->lcd_state < 3 && dormancy_info->lcd_on_timeout <= 0){ - dormancy_info->dormant_cnt = 0; - } - else if(dormancy_info->lcd_state == 3 && dormancy_info->lcd_off_timeout > 0){ //off 3 + dbg("PM state Value:[%d]", pm_state); - //call the pm lock state if pkt exist and not dormant state - if(dormancy_info->dormant_cnt < dormancy_info->lcd_off_timeout){ - b_pm_lock = __s_indi_cancel_pm_lock(b_pm_lock); - return b_pm_lock; - } - else if(dormancy_info->dormant_cnt >= dormancy_info->lcd_off_timeout){ - dbg("set lcd off fast dormancy"); - dormancy_info->dormant_cnt = 0; - dormancy_info->is_dormant = TRUE; + g_hash_table_iter_init(&iter, priv_info->state_info); + while (g_hash_table_iter_next(&iter, &key_info, &value_info)) { + state_info = value_info; + state_info->dormant_info.lcd_state = pm_state; } } - else if(dormancy_info->lcd_state == 3 && dormancy_info->lcd_off_timeout <= 0){ //off 3 - dormancy_info->dormant_cnt = 0; - } - - //pm unlock - if(b_pm_lock){ - rv = display_unlock_state(LCD_OFF, PM_RESET_TIMER); - b_pm_lock = FALSE; - dbg("display_unlock_state: rv(%d)", rv); - } - - return b_pm_lock; -} - -void s_indi_storage_key_callback(enum tcore_storage_key key, void *value, void *user_data) -{ - s_indi_cp_state_info_type *state_info = NULL; - GVariant *tmp = value; - s_indi_private_info *priv_info = __s_indi_get_priv_info(user_data); + break; - s_indi_assert(NULL != tmp); - - switch (key) { - case STORAGE_KEY_TESTMODE_FAST_DORMANCY: /* Fall Through */ - case STORAGE_KEY_TESTMODE_FAST_DORMANCY2: - { - const gchar *cp_name = NULL; - if ((cp_name = g_hash_table_lookup(priv_info->vconf_info, GUINT_TO_POINTER(key))) != NULL) - if ((state_info = g_hash_table_lookup(priv_info->state_info, cp_name)) != NULL) { - s_indi_log_ex(cp_name, "Processing Fast Dormancy"); - - /*TODO: Currently testmodem fast dormancy is not enabled.so process fast dormancy will not happen */ - - __s_indi_process_fast_dormancy(state_info, tmp); - } - } break; - - case STORAGE_KEY_PM_STATE: - { - GHashTableIter iter; - gpointer key, value; - gint pm_state = S_INDI_ZERO; - - if (!g_variant_is_of_type(tmp, G_VARIANT_TYPE_INT32)) { - err("Wrong variant data type"); - return; - } - - pm_state = g_variant_get_int32(tmp); - - dbg("PM state Value:[%d]", pm_state); - - g_hash_table_iter_init(&iter, priv_info->state_info); - while (g_hash_table_iter_next (&iter, &key, &value)) { - state_info = value; - state_info->dormant_info.lcd_state = pm_state; - } - } break; - - default: - s_indi_assert_not_reached(); + default: + s_indi_assert_not_reached(); } } enum tcore_hook_return s_indi_on_hook_modem_power(Server *server, CoreObject *source, - enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data) + enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data) { struct tnoti_modem_power *modem_power = data; s_indi_assert(modem_power != NULL); @@ -842,6 +601,10 @@ enum tcore_hook_return s_indi_on_hook_modem_power(Server *server, CoreObject *so const char *cp_name = NULL; s_indi_cp_state_info_type *state_info = NULL; s_indi_private_info *priv_info = __s_indi_get_priv_info(indi_plugin); + if (priv_info == NULL) { + err("priv_info is NULL!!!"); + return TCORE_HOOK_RETURN_CONTINUE; + } cp_name = tcore_server_get_cp_name_by_plugin(tcore_object_ref_plugin(source)); s_indi_assert(NULL != cp_name); @@ -854,31 +617,23 @@ enum tcore_hook_return s_indi_on_hook_modem_power(Server *server, CoreObject *so /* Remove all device states since PS releasing all contexts */ g_hash_table_remove_all(state_info->device_info); - - /* Free MCC/MNC. It will be received again */ - s_indi_free(state_info->dormant_info.mccmnc); - state_info->dormant_info.mccmnc = NULL; - - /* Reset Dormant Information @todo: Why is this required? */ - state_info->dormant_info.lcd_on_timeout = S_INDI_ZERO; - state_info->dormant_info.lcd_off_timeout = S_INDI_ZERO; - priv_info->b_pm_lock = __s_indi_cancel_pm_lock(priv_info->b_pm_lock); } return TCORE_HOOK_RETURN_CONTINUE; } enum tcore_hook_return s_indi_on_hook_ps_call_status(Server *server, CoreObject *source, - enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data) + enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data) { struct tnoti_ps_call_status *cstatus = data; TcorePlugin *indi_plugin = user_data; const char *cp_name = NULL; s_indi_cp_state_info_type *state_info = NULL; - GHashTableIter iter; - gpointer cp_name_key, cp_state = NULL; - unsigned char active_pdp_count = S_INDI_ZERO; s_indi_private_info *priv_info = __s_indi_get_priv_info(indi_plugin); + if (priv_info == NULL) { + err("priv_info is NULL!!!"); + return TCORE_HOOK_RETURN_CONTINUE; + } s_indi_assert(cstatus != NULL); @@ -893,8 +648,10 @@ enum tcore_hook_return s_indi_on_hook_ps_call_status(Server *server, CoreObject s_indi_log_ex(cp_name, "cid(%d) state(%d) reason(%d)", cstatus->context_id, cstatus->state, cstatus->result); - if (cstatus->state == S_INDI_PS_CALL_OK) + if (cstatus->state == S_INDI_PS_CALL_OK) { + s_indi_log_ex(cp_name, "PS Call state - [PS_CALL_OK]"); return TCORE_HOOK_RETURN_CONTINUE; + } if ((state_info = g_hash_table_lookup(priv_info->state_info, cp_name)) == NULL) { warn("BAILING OUT: [%s] not found", cp_name); @@ -908,12 +665,14 @@ enum tcore_hook_return s_indi_on_hook_ps_call_status(Server *server, CoreObject CoreObject *co_context = NULL; gchar *dev_name = NULL; s_indi_dev_state_info_type *dev_state = NULL; - enum tcore_storage_key key_service_state, key_fd; + enum tcore_storage_key key_service_state; Storage *strg_vconf = NULL; int role = CONTEXT_ROLE_UNKNOWN; gboolean data_allowed = FALSE; gboolean roaming_allowed = FALSE; + s_indi_log_ex(cp_name, "PS Call state - [PS_CALL_CONNECT]"); + /* Fetch context with internet/tethering role */ l_context = tcore_ps_ref_context_by_id(source, cstatus->context_id); while (l_context) { @@ -944,10 +703,8 @@ enum tcore_hook_return s_indi_on_hook_ps_call_status(Server *server, CoreObject /* Update Cellular State */ if (s_indi_str_has_suffix(cp_name, "0")) { key_service_state = STORAGE_KEY_PACKET_SERVICE_STATE; - key_fd = STORAGE_KEY_TESTMODE_FAST_DORMANCY; } else if (s_indi_str_has_suffix(cp_name, "1")) { key_service_state = STORAGE_KEY_PACKET_SERVICE_STATE2; - key_fd = STORAGE_KEY_TESTMODE_FAST_DORMANCY2; } else { err("Un-handled CP"); g_free(dev_name); @@ -971,7 +728,7 @@ enum tcore_hook_return s_indi_on_hook_ps_call_status(Server *server, CoreObject if (role == CONTEXT_ROLE_INTERNET || role == CONTEXT_ROLE_TETHERING) { state_info->ps_state = S_INDI_CELLULAR_CONNECTED; tcore_storage_set_int(strg_vconf, key_service_state, S_INDI_CELLULAR_CONNECTED); - }else if(role == CONTEXT_ROLE_MMS){ + } else if (role == CONTEXT_ROLE_MMS) { state_info->ps_state = S_INDI_CELLULAR_MMS_CONNECTED; tcore_storage_set_int(strg_vconf, key_service_state, S_INDI_CELLULAR_MMS_CONNECTED); } @@ -980,25 +737,19 @@ enum tcore_hook_return s_indi_on_hook_ps_call_status(Server *server, CoreObject tcore_storage_set_int(strg_vconf, STORAGE_KEY_PACKET_INDICATOR_STATE, S_INDI_TRANSFER_NORMAL); state_info->cp_trans_state = S_INDI_TRANSFER_NORMAL; - s_indi_log_ex(cp_name, "PS Call status - [CONNECTED]"); - /* Create new dev state */ dev_state = __s_indi_alloc_device_state(co_context, state_info); g_hash_table_insert(state_info->device_info, dev_name, dev_state); - key_fd = key_fd; - - /* Read & Update dormancy values */ - __s_indi_set_dormancy_value(server, &state_info->dormant_info, key_fd); - /* Start Updater */ __s_indi_start_updater(indi_plugin, s_indi_strdup(cp_name)); - } - else if (cstatus->state == S_INDI_PS_CALL_NO_CARRIER) { + } else if (cstatus->state == S_INDI_PS_CALL_NO_CARRIER) { gchar *dev_name = NULL; GSList *l_context = tcore_ps_ref_context_by_id(source, cstatus->context_id); + s_indi_log_ex(cp_name, "PS Call state - [PS_CALL_NO_CARRIER]"); + /* Remove all related contexts */ while (l_context) { dev_name = tcore_context_get_ipv4_devname(l_context->data); @@ -1008,21 +759,6 @@ enum tcore_hook_return s_indi_on_hook_ps_call_status(Server *server, CoreObject } l_context = l_context->next; } - - g_hash_table_iter_init(&iter, (GHashTable *)priv_info->state_info); - while (g_hash_table_iter_next(&iter, &cp_name_key, &cp_state) == TRUE) { - s_indi_log_ex(cp_name_key, "State: [0x%x]", cp_state); - if (g_hash_table_size(((s_indi_cp_state_info_type *)cp_state)->device_info) != S_INDI_ZERO) { - active_pdp_count++; - break; - } - } - - /* Cancel PM Lock if there doens't exist any active PDP connection */ - if (active_pdp_count == S_INDI_ZERO) { - dbg("No Active PDP context. Resetting 'PM Lock' status"); - priv_info->b_pm_lock = __s_indi_cancel_pm_lock(priv_info->b_pm_lock); - } } return TCORE_HOOK_RETURN_CONTINUE; @@ -1043,6 +779,10 @@ enum tcore_hook_return s_indi_on_hook_net_register(Server *server, CoreObject *s S_INDI_NOT_USED(command); S_INDI_NOT_USED(data_len); CORE_OBJECT_CHECK_RETURN(source, CORE_OBJECT_TYPE_NETWORK, TCORE_HOOK_RETURN_CONTINUE); + if (priv_info == NULL) { + err("priv_info is NULL!!!"); + return TCORE_HOOK_RETURN_CONTINUE; + } cp_name = tcore_server_get_cp_name_by_plugin(tcore_object_ref_plugin(source)); s_indi_assert(NULL != cp_name); @@ -1097,12 +837,16 @@ enum tcore_hook_return s_indi_on_hook_net_register(Server *server, CoreObject *s * Set Cellular state OFF. */ if (state_info->ps_state != S_INDI_CELLULAR_OFF && !roaming_allowed && roaming_status) { - tcore_storage_set_int(strg_vconf, key_service_state, S_INDI_CELLULAR_OFF); /* Set Cellular State OFF */ - - /* Indicator need not know worry about roaming status. packet service plugin should take care of de-activating the contexts - when roaming is enabled and network enters roaming. When all the contexts associated with that network is de-activated. Indicator - plugin will automatically ps status for that CP to S_INDI_CELLULAR_OFF - */ + /* Set Cellular State OFF */ + tcore_storage_set_int(strg_vconf, key_service_state, S_INDI_CELLULAR_OFF); + + /* + * Indicator need not know worry about roaming status. packet service plugin + * should take care of de-activating the contexts when roaming is enabled and + * network enters roaming. When all the contexts associated with that network + * is de-activated. Indicator plugin will automatically ps status for that + * CP to S_INDI_CELLULAR_OFF + */ state_info->ps_state = S_INDI_CELLULAR_OFF; /* Update cache */ s_indi_log_ex(cp_name, "PS Call status - [DISCONNECTED]"); @@ -1138,59 +882,8 @@ enum tcore_hook_return s_indi_on_hook_net_register(Server *server, CoreObject *s return TCORE_HOOK_RETURN_CONTINUE; } -enum tcore_hook_return s_indi_on_hook_sim_init(Server *server, CoreObject *source, - enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data) -{ - struct tnoti_sim_status *sim_data = data; - enum tcore_storage_key fd_key; - s_indi_assert(NULL != sim_data); - - S_INDI_NOT_USED(command); - S_INDI_NOT_USED(data_len); - - CORE_OBJECT_CHECK_RETURN(source, CORE_OBJECT_TYPE_SIM, TCORE_HOOK_RETURN_CONTINUE); - - if (sim_data->sim_status == SIM_STATUS_INIT_COMPLETED) { - struct tel_sim_imsi *sim_imsi = NULL; - const char *cp_name = NULL; - s_indi_cp_state_info_type *state_info = NULL; - TcorePlugin *indi_plugin = user_data; - s_indi_private_info *priv_info = __s_indi_get_priv_info(indi_plugin); - - cp_name = tcore_server_get_cp_name_by_plugin(tcore_object_ref_plugin(source)); - s_indi_assert(NULL != cp_name); - s_indi_log_ex(cp_name, "SIM_STATUS_INIT_COMPLETED"); - - if ((state_info = g_hash_table_lookup(priv_info->state_info, cp_name)) == NULL) { - warn("BAILING OUT: [%s] not found", cp_name); - return TCORE_HOOK_RETURN_CONTINUE; - } - - sim_imsi = tcore_sim_get_imsi(source); - s_indi_assert(NULL != sim_imsi); - state_info->dormant_info.mccmnc = s_indi_strdup((gchar *)sim_imsi->plmn); - free(sim_imsi); /* libc allocator */ - - /* Update Cellular State */ - if (s_indi_str_has_suffix(cp_name, "0")) { - fd_key = STORAGE_KEY_TESTMODE_FAST_DORMANCY; - } else if (s_indi_str_has_suffix(cp_name, "1")) { - fd_key = STORAGE_KEY_TESTMODE_FAST_DORMANCY2; - } else { - err("Un-handled CP"); - return TCORE_HOOK_RETURN_CONTINUE; - } - - /* Caching the lcdontimer and lcdofftimer dormant values for different network from db */ - __s_indi_set_dormancy_value(server, &(state_info->dormant_info), fd_key); - } - - return TCORE_HOOK_RETURN_CONTINUE; -} - gboolean __s_indi_handle_voice_call_status(Server *server, CoreObject *source, - enum tcore_notification_command command, const char *cp_name, - s_indi_cp_state_info_type *state_info) + enum tcore_notification_command command, const char *cp_name, s_indi_cp_state_info_type *state_info) { CoreObject *co_network = NULL; enum tcore_storage_key vconf_key; @@ -1228,20 +921,20 @@ gboolean __s_indi_handle_voice_call_status(Server *server, CoreObject *source, tcore_network_get_service_type(co_network, &svc_type); switch (svc_type) { - case NETWORK_SERVICE_TYPE_2G: - case NETWORK_SERVICE_TYPE_2_5G: - case NETWORK_SERVICE_TYPE_2_5G_EDGE: + case NETWORK_SERVICE_TYPE_2G: + case NETWORK_SERVICE_TYPE_2_5G: + case NETWORK_SERVICE_TYPE_2_5G_EDGE: + show_icon = FALSE; + break; + + case NETWORK_SERVICE_TYPE_3G: + case NETWORK_SERVICE_TYPE_HSDPA: + if (tcore_object_ref_plugin(co_network) != tcore_object_ref_plugin(source)) show_icon = FALSE; - break; - - case NETWORK_SERVICE_TYPE_3G: - case NETWORK_SERVICE_TYPE_HSDPA: - if (tcore_object_ref_plugin(co_network) != tcore_object_ref_plugin(source)) - show_icon = FALSE; - break; + break; - default: - break; + default: + break; } s_indi_log_ex(cp_name, "RAT: [0x%x], ps_state: [0x%x], show_icon[%d]", @@ -1255,28 +948,30 @@ gboolean __s_indi_handle_voice_call_status(Server *server, CoreObject *source, return TRUE; } - switch(command) { - case TNOTI_CALL_STATUS_IDLE: { - int total_call_cnt = S_INDI_ZERO; - total_call_cnt = tcore_call_object_total_length(source); - if (total_call_cnt > S_INDI_ONE) { - s_indi_log_ex(cp_name, "Call is still connected"); - return TRUE; - } - state_info->ps_state = S_INDI_CELLULAR_CONNECTED; - } break; - - case TNOTI_CALL_STATUS_DIALING: - case TNOTI_CALL_STATUS_INCOMING: - case TNOTI_CALL_STATUS_ACTIVE: { - state_info->ps_state = S_INDI_CELLULAR_OFF; - } break; - - default: { - s_indi_log_ex(cp_name, "Unexpected command: [0x%x]", command); - s_indi_assert_not_reached(); + switch (command) { + case TNOTI_CALL_STATUS_IDLE: { + int total_call_cnt = S_INDI_ZERO; + total_call_cnt = tcore_call_object_total_length(source); + if (total_call_cnt > S_INDI_ONE) { + s_indi_log_ex(cp_name, "Call is still connected"); return TRUE; } + state_info->ps_state = S_INDI_CELLULAR_CONNECTED; + } + break; + + case TNOTI_CALL_STATUS_DIALING: + case TNOTI_CALL_STATUS_INCOMING: + case TNOTI_CALL_STATUS_ACTIVE: { + state_info->ps_state = S_INDI_CELLULAR_OFF; + } + break; + + default: { + s_indi_log_ex(cp_name, "Unexpected command: [0x%x]", command); + s_indi_assert_not_reached(); + return TRUE; + } } OUT: @@ -1284,16 +979,17 @@ OUT: strg_vconf = tcore_server_find_storage(server, S_INDI_VCONF_STORAGE_NAME); if (state_info->ps_state != tcore_storage_get_int(strg_vconf, vconf_key)) { tcore_storage_set_int(strg_vconf, vconf_key, state_info->ps_state); - s_indi_log_ex(cp_name, "PS Call status - [%s]", (state_info->ps_state == S_INDI_CELLULAR_CONNECTED ? "CONNECTED" - : (state_info->ps_state == S_INDI_CELLULAR_OFF ? "DISCONNECTED" - : (state_info->ps_state == S_INDI_CELLULAR_USING ? "IN USE" : "UNKNOWN")))); + s_indi_log_ex(cp_name, "PS Call status - [%s]", + (state_info->ps_state == S_INDI_CELLULAR_CONNECTED ? "CONNECTED" + : (state_info->ps_state == S_INDI_CELLULAR_OFF ? "DISCONNECTED" + : (state_info->ps_state == S_INDI_CELLULAR_USING ? "IN USE" : "UNKNOWN")))); } return TRUE; } enum tcore_hook_return s_indi_on_hook_voice_call_status(Server *server, CoreObject *source, - enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data) + enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data) { TcorePlugin *indi_plugin = user_data; s_indi_private_info *priv_info = __s_indi_get_priv_info(indi_plugin); @@ -1307,10 +1003,14 @@ enum tcore_hook_return s_indi_on_hook_voice_call_status(Server *server, CoreObje S_INDI_NOT_USED(data); CORE_OBJECT_CHECK_RETURN(source, CORE_OBJECT_TYPE_CALL, TCORE_HOOK_RETURN_CONTINUE); + if (priv_info == NULL) { + err("priv_info is NULL!!!"); + return TCORE_HOOK_RETURN_CONTINUE; + } /* Update all modem states */ g_hash_table_iter_init(&iter, priv_info->state_info); - while (g_hash_table_iter_next (&iter, &key, &value)) { + while (g_hash_table_iter_next(&iter, &key, &value)) { cp_name = key; state_info = value; @@ -1322,7 +1022,7 @@ enum tcore_hook_return s_indi_on_hook_voice_call_status(Server *server, CoreObje } enum tcore_hook_return s_indi_on_hook_modem_plugin_added(Server *server, CoreObject *source, - enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data) + enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data) { s_indi_assert(NULL != data); s_indi_assert(NULL != user_data); @@ -1338,7 +1038,7 @@ enum tcore_hook_return s_indi_on_hook_modem_plugin_added(Server *server, CoreObj } enum tcore_hook_return s_indi_on_hook_modem_plugin_removed(Server *server, CoreObject *source, - enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data) + enum tcore_notification_command command, unsigned int data_len, void *data, void *user_data) { s_indi_assert(NULL != data); s_indi_assert(NULL != user_data); @@ -1359,6 +1059,10 @@ gboolean s_indi_init(TcorePlugin *plugin) s_indi_private_info *priv_info = NULL; priv_info = s_indi_malloc0(sizeof(*priv_info)); + if (priv_info == NULL) { + err("Memory allocation failed!!"); + return FALSE; + } if (tcore_plugin_link_user_data(plugin, priv_info) != TCORE_RETURN_SUCCESS) { err("Failed to link private data"); s_indi_free(priv_info); @@ -1367,25 +1071,18 @@ gboolean s_indi_init(TcorePlugin *plugin) server = tcore_plugin_ref_server(plugin); - /* Initialize SIPC counter */ - priv_info->msg_id.id_current = S_INDI_SIPC_ITER_START - S_INDI_ONE; - priv_info->msg_id.id_start = S_INDI_SIPC_ITER_START; - priv_info->msg_id.id_end = S_INDI_SIPC_ITER_END; - /* Initialize VCONF => CP_NAME mapping */ priv_info->vconf_info = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, s_indi_free_func); /* Initialize State Information */ - priv_info->state_info = g_hash_table_new_full(g_str_hash, g_str_equal, s_indi_free_func, __s_indi_state_info_value_destroy_notification); - + priv_info->state_info = g_hash_table_new_full(g_str_hash, g_str_equal, + s_indi_free_func, __s_indi_state_info_value_destroy_notification); if (priv_info->state_info == NULL || priv_info->vconf_info == NULL) { err("Memory allocation problem! Bailing Out"); goto OUT; } - priv_info->b_pm_lock = FALSE; - /* Register vconf key callbacks */ __s_indi_register_vconf_key(STORAGE_KEY_PM_STATE, plugin, NULL); @@ -1393,7 +1090,6 @@ gboolean s_indi_init(TcorePlugin *plugin) tcore_server_add_notification_hook(server, TNOTI_MODEM_POWER, s_indi_on_hook_modem_power, plugin); tcore_server_add_notification_hook(server, TNOTI_PS_CALL_STATUS, s_indi_on_hook_ps_call_status, plugin); tcore_server_add_notification_hook(server, TNOTI_NETWORK_REGISTRATION_STATUS, s_indi_on_hook_net_register, plugin); - tcore_server_add_notification_hook(server, TNOTI_SIM_STATUS, s_indi_on_hook_sim_init, plugin); /* For 2G PS suspend/resume */ tcore_server_add_notification_hook(server, TNOTI_CALL_STATUS_IDLE, s_indi_on_hook_voice_call_status, plugin); @@ -1428,7 +1124,6 @@ void s_indi_deinit(TcorePlugin *plugin) tcore_server_remove_notification_hook(server, s_indi_on_hook_modem_power); tcore_server_remove_notification_hook(server, s_indi_on_hook_ps_call_status); tcore_server_remove_notification_hook(server, s_indi_on_hook_net_register); - tcore_server_remove_notification_hook(server, s_indi_on_hook_sim_init); tcore_server_remove_notification_hook(server, s_indi_on_hook_voice_call_status); tcore_server_remove_notification_hook(server, s_indi_on_hook_modem_plugin_added); tcore_server_remove_notification_hook(server, s_indi_on_hook_modem_plugin_removed); @@ -1437,6 +1132,10 @@ void s_indi_deinit(TcorePlugin *plugin) __s_indi_unregister_vconf_key(STORAGE_KEY_PM_STATE, plugin, NULL); /* Destroy all watched modems */ + if (priv_info == NULL) { + err("priv_info is NULL!!!"); + return; + } iter = g_hash_table_get_values(priv_info->state_info); while (iter) { state_info = iter->data;