Increase the session timeout value
[platform/core/connectivity/bluetooth-frwk.git] / bt-service-adaptation / services / bt-service-battery-monitor.c
index 5133774..16bd835 100644 (file)
 #define VCONFKEY_BATTERY_MONITOR_STATUS "db/bluetooth/bmstatus"
 #endif
 
+/* 20 minutes */
+#define BT_BM_SESSION_TIMEOUT 1200
+
 static struct timeval scan_start;
 static struct timeval connect_start;
 static struct timeval app_scan_base;
 static int scan_cnt = 0;
 static int connect_cnt = 0;
 static gboolean is_session_started = FALSE;
+static guint session_timer = 0;
 
 static GSList *scan_app_list = NULL;
 
@@ -57,6 +61,8 @@ _bt_battery_data_t *current_session_data = NULL;
 
 static void __bt_bm_add_prev_time(uint32_t scan_time);
 static int __bt_start_session_time(void);
+static void __bt_stop_session_time(void);
+static bool __bt_bm_session_timeout_cb(void);
 
 uint32_t static __bt_dm_time_diff_msec(struct timeval prev, struct timeval cur)
 {
@@ -148,11 +154,9 @@ int _bt_bm_read_data(_bt_battery_data_t *data)
 
        gettimeofday(&app_scan_base, 0);
 
-       data->atm_list = current_session_data->atm_list;
-       if (data->atm_list == NULL) {
-               BT_DBG("No data transaction in this session");
-               return BLUETOOTH_ERROR_NONE;
-       }
+       /* Note that this is a "shallow" copy. The pointers are copied but the actual data isn't. */
+       data->atm_list = g_slist_copy(current_session_data->atm_list);
+       current_session_data->atm_list = NULL;
 
        BT_DBG("App-wise data transaction details");
        for (GSList *l = data->atm_list; l != NULL; l = g_slist_next(l)) {
@@ -160,7 +164,13 @@ int _bt_bm_read_data(_bt_battery_data_t *data)
                BT_DBG("%ld %ld %d %d %u", (long int)(t->uid), (long int)(t->pid), t->rx_bytes, t->tx_bytes, t->time);
        }
 
-       current_session_data->atm_list = NULL;
+       /* Reset the session timer */
+       if (session_timer)
+               g_source_remove(session_timer);
+
+       session_timer = g_timeout_add_seconds(BT_BM_SESSION_TIMEOUT,
+                               (GSourceFunc)__bt_bm_session_timeout_cb, NULL);
+
        return BLUETOOTH_ERROR_NONE;
 }
 
@@ -216,6 +226,16 @@ void _bt_bm_add_transaction_details(uid_t uid, pid_t pid, int value, data_transa
        }
 }
 
+static bool __bt_bm_session_timeout_cb(void)
+{
+       BT_INFO("No data read calls during the time.");
+
+       __bt_stop_session_time();
+
+       return FALSE;
+}
+
+
 static int __bt_start_session_time(void)
 {
        int state = 0;
@@ -247,26 +267,40 @@ static int __bt_start_session_time(void)
        current_session_data->session_scan_time = 0;
        current_session_data->atm_list = NULL;
 
+       /* After starting session if there is no read data call during the specific time,
+        * stop the session time to avoid the exceed of session data.
+       */
+       if (session_timer)
+               g_source_remove(session_timer);
+
+       session_timer = g_timeout_add_seconds(BT_BM_SESSION_TIMEOUT,
+                               (GSourceFunc)__bt_bm_session_timeout_cb, NULL);
+
        return BLUETOOTH_ERROR_NONE;
 }
 
-void _bt_stop_session_time(void)
+static void __bt_stop_session_time(void)
 {
+       if (session_timer) {
+               g_source_remove(session_timer);
+               session_timer = 0;
+       }
+
        if (is_session_started == FALSE) {
                BT_DBG("BT session not in progress... Returning");
                return;
        }
 
+       __bt_display_session_data();
+
        BT_DBG("Bt session ending...");
        is_session_started = FALSE;
 
-       if (current_session_data == NULL) {
-               BT_ERR("Session in progress but data structure is not initialized");
-               return;
+       if (current_session_data != NULL) {
+               g_slist_free_full(current_session_data->atm_list, g_free);
+               g_free(current_session_data);
+               current_session_data = NULL;
        }
-
-       current_session_data->session_end_time = time(NULL);
-       __bt_display_session_data();
 }
 
 /* 1 app can operate the regacy and ble scan at the same time */
@@ -509,40 +543,42 @@ static void __bt_notify_battery_data(void)
 
        if (result != BLUETOOTH_ERROR_NONE) {
                BT_ERR("Battery data not collected");
+               g_free(data);
+               return;
        }
-       else {
-               bt_battery_dbus_data_t dbus_data;
-               memset(&dbus_data, 0, sizeof(bt_battery_dbus_data_t));
-               dbus_data.session_start_time = data->session_start_time;
-               dbus_data.session_end_time = data->session_end_time;
-               dbus_data.session_scan_time = data->session_scan_time;
-               dbus_data.session_connected_time = data->session_connected_time;
-               dbus_data.tx_time = data->tx_time;
-               dbus_data.rx_time = data->rx_time;
-               dbus_data.idle_time = data->idle_time;
-
-               /*Populating app data*/
-               int n = 0;
-               for (GSList *l = data->atm_list; l != NULL; l = g_slist_next(l)) {
-                       bt_battery_app_data *t = (bt_battery_app_data *)(l->data);
-                       memcpy(&dbus_data.app_data[n], t, sizeof(bt_battery_app_data));
-                       n++;
-               }
-               dbus_data.num_app = n;
 
-               info = g_array_new(FALSE, FALSE, sizeof(gchar));
-               g_array_append_vals(info, &dbus_data, sizeof(bt_battery_dbus_data_t));
+       bt_battery_dbus_data_t dbus_data;
+       memset(&dbus_data, 0, sizeof(bt_battery_dbus_data_t));
+       dbus_data.session_start_time = data->session_start_time;
+       dbus_data.session_end_time = data->session_end_time;
+       dbus_data.session_scan_time = data->session_scan_time;
+       dbus_data.session_connected_time = data->session_connected_time;
+       dbus_data.tx_time = data->tx_time;
+       dbus_data.rx_time = data->rx_time;
+       dbus_data.idle_time = data->idle_time;
 
-               out_var = g_variant_new_from_data((const GVariantType *)"ay",
-                               info->data, info->len,
-                               TRUE, NULL, NULL);
+       /*Populating app data*/
+       int n = 0;
+       for (GSList *l = data->atm_list; l != NULL; l = g_slist_next(l)) {
+               bt_battery_app_data *t = (bt_battery_app_data *)(l->data);
+               memcpy(&dbus_data.app_data[n], t, sizeof(bt_battery_app_data));
+               n++;
        }
+       dbus_data.num_app = n;
+
+       info = g_array_new(FALSE, FALSE, sizeof(gchar));
+       g_array_append_vals(info, &dbus_data, sizeof(bt_battery_dbus_data_t));
+
+       out_var = g_variant_new_from_data((const GVariantType *)"ay",
+                       info->data, info->len,
+                       TRUE, NULL, NULL);
+
        param = g_variant_new("(iv)", result, out_var);
        _bt_send_event(BT_ADAPTER_EVENT,
                BLUETOOTH_EVENT_DISABLED_BATTERY_DATA,
                param);
 
-       g_slist_free(data->atm_list);
+       g_slist_free_full(data->atm_list, g_free);
        g_free(data);
        g_array_free(info, TRUE);
        BT_INFO("-");
@@ -562,8 +598,8 @@ void _bt_bm_event_handler(gpointer data)
        case OAL_EVENT_ADAPTER_DISABLED:
                BT_DBG("Handling Adapter Disabled");
                if (is_session_started == TRUE) {
-                       _bt_stop_session_time();
                        __bt_notify_battery_data();
+                       __bt_stop_session_time();
                }
                break;
        case OAL_EVENT_ADAPTER_INQUIRY_STARTED: