Modify the privilege for battry RX / TX function
[platform/core/connectivity/bluetooth-frwk.git] / bt-api / bt-rfcomm-client.c
index 888f562..65c983c 100644 (file)
@@ -49,6 +49,8 @@ static int privilege_token;
                        "the reply timeout expired, or the network connection " \
                        "was broken."
 
+#define BATTERY_MONITOR_RFCOMM_INTERVAL 5
+
 static GSList *rfcomm_clients;
 
 typedef struct {
@@ -68,9 +70,48 @@ typedef struct {
        unsigned int idle_id;
 } rfcomm_cb_data_t;
 
+static unsigned int rx_data = 0, tx_data = 0;
+static guint tx_tag = 0, rx_tag = 0;
+
 static void __client_connected_cb(rfcomm_cb_data_t *cb_data,
        char *dev_address, int result);
 
+static bool __rfcomm_record_tx_data(void)
+{
+       if (tx_data > 0) {
+               int ret = _bt_common_send_rfcomm_tx_details(tx_data);
+               if (ret == BLUETOOTH_ERROR_NONE) {
+                       tx_data = 0;
+                       return TRUE;
+               } else {
+                       BT_ERR("RFCOMM tx data could not be registered");
+               }
+       }
+
+       tx_data = 0;
+       tx_tag = 0;
+
+       return FALSE;
+}
+
+static bool __rfcomm_record_rx_data(void)
+{
+       if (rx_data) {
+               int ret = _bt_common_send_rfcomm_rx_details(rx_data);
+               if (ret == BLUETOOTH_ERROR_NONE) {
+                       rx_data = 0;
+                       return TRUE;
+               } else {
+                       BT_ERR("RFCOMM rx data could not be registered");
+               }
+       }
+
+       rx_data = 0;
+       rx_tag = 0;
+
+       return FALSE;
+}
+
 static void __bt_free_cb_data(rfcomm_cb_data_t *cb_data)
 {
        BT_DBG("+");
@@ -323,7 +364,6 @@ static gboolean __client_data_received_cb(GIOChannel *chan, GIOCondition cond,
        GIOStatus status = G_IO_STATUS_NORMAL;
        GError *err = NULL;
        int fd;
-       BT_DBG("");
 
        retv_if(info == NULL, FALSE);
        fd = g_io_channel_unix_get_fd(chan);
@@ -352,12 +392,16 @@ static gboolean __client_data_received_cb(GIOChannel *chan, GIOCondition cond,
                BT_ERR("IO Channel read is failed with %d", status);
 
                g_free(buffer);
-               if (err) {
-                       BT_ERR("IO Channel read error [%s]", err->message);
-                       if (status == G_IO_STATUS_ERROR &&
-                                       __is_error_by_disconnect(err)) {
+               if (err || status == G_IO_STATUS_EOF) {
+                       if (err)
+                               BT_ERR("IO Channel read error [%s]", err->message);
+                       if ((status == G_IO_STATUS_EOF) ||
+                                       (status == G_IO_STATUS_ERROR &&
+                                       __is_error_by_disconnect(err))) {
+
                                BT_ERR("cond : %d", cond);
-                               g_error_free(err);
+                               if (err)
+                                       g_error_free(err);
 
                                conn_info = __get_conn_info_from_fd(info, fd);
                                if (conn_info == NULL) {
@@ -372,7 +416,8 @@ static gboolean __client_data_received_cb(GIOChannel *chan, GIOCondition cond,
                                __rfcomm_client_disconnect(info);
                                return FALSE;
                        }
-                       g_error_free(err);
+                       if (err)
+                               g_error_free(err);
                }
                return TRUE;
        }
@@ -391,6 +436,14 @@ static gboolean __client_data_received_cb(GIOChannel *chan, GIOCondition cond,
                        result, &data_r,
                        event_info->cb, event_info->user_data);
 
+       if (bluetooth_get_battery_monitor_state()) {
+               if (rx_tag == 0) {
+                       BT_INFO("Adding rfcomm rx timeout function for battery monitor");
+                       rx_tag = g_timeout_add_seconds(BATTERY_MONITOR_RFCOMM_INTERVAL, (GSourceFunc)__rfcomm_record_rx_data, NULL);
+               }
+               rx_data += len;
+       }
+
        g_free(buffer);
        return TRUE;
 }
@@ -463,6 +516,22 @@ void _bt_rfcomm_client_disconnect_all(void)
        return;
 }
 
+void _bt_rfcomm_client_reset_timer(void)
+{
+       if (rx_tag > 0) {
+               rx_tag = 0;
+               g_source_remove(rx_tag);
+       }
+
+       if (tx_tag > 0) {
+               g_source_remove(tx_tag);
+               tx_tag = 0;
+       }
+
+       rx_data = 0;
+       tx_data = 0;
+}
+
 int new_connection(const char *path, int fd, bluetooth_device_address_t *addr)
 {
        rfcomm_cb_data_t *info;
@@ -1334,8 +1403,6 @@ BT_EXPORT_API int bluetooth_rfcomm_write(int fd, const char *buf, int length)
                return BLUETOOTH_ERROR_INVALID_PARAM;
        }
 
-       BT_DBG("FD : %d", fd);
-
        retv_if(length <= 0, BLUETOOTH_ERROR_INVALID_PARAM);
 
        switch (privilege_token) {
@@ -1366,9 +1433,23 @@ BT_EXPORT_API int bluetooth_rfcomm_write(int fd, const char *buf, int length)
        written = write(fd, buf, length);
        /*BT_DBG("Length %d, written = %d, balance(%d)",
                        length, written, length - written); */
+       if (written > 0 && bluetooth_get_battery_monitor_state()) {
+                if (tx_tag == 0) {
+                        BT_INFO("Adding rfcomm tx timeout function for battery monitor");
+                        tx_tag = g_timeout_add_seconds(BATTERY_MONITOR_RFCOMM_INTERVAL, (GSourceFunc)__rfcomm_record_tx_data, NULL);
+                }
+                tx_data += length;
+        }
        return written;
 #else
        result = __write_all(fd, buf, length);
+       if (result > 0 && bluetooth_get_battery_monitor_state()) {
+                if (tx_tag == 0) {
+                        BT_INFO("Adding rfcomm tx timeout function for battery monitor");
+                        tx_tag = g_timeout_add_seconds(BATTERY_MONITOR_RFCOMM_INTERVAL, (GSourceFunc)__rfcomm_record_tx_data, NULL);
+                }
+                tx_data += length;
+        }
        return result;
 #endif
 }