Apply tizen 3.0 based product patchsets
[platform/core/connectivity/bluetooth-agent.git] / ag-agent / bluetooth-ag-agent.c
old mode 100755 (executable)
new mode 100644 (file)
index d6f9bbb..2d7e7fc
@@ -1978,6 +1978,9 @@ static void __bt_ag_close_sco(bt_ag_info_t *hs)
 
        if (hs->sco_id)
                __bt_ag_agent_remove_watch(&hs->sco_id);
+
+       if (hs->sco_incoming_id)
+               __bt_ag_agent_remove_watch(&hs->sco_incoming_id);
 }
 
 static gboolean __bt_ag_sco_server_conn_cb(GIOChannel *chan,
@@ -1994,6 +1997,9 @@ static gboolean __bt_ag_sco_server_conn_cb(GIOChannel *chan,
                if (ag_info->sco_id)
                        __bt_ag_agent_remove_watch(&ag_info->sco_id);
 
+               if (ag_info->sco_incoming_id)
+                       __bt_ag_agent_remove_watch(&ag_info->sco_incoming_id);
+
                if (ag_info->watch_id)
                        _bt_ag_set_headset_state(ag_info, HEADSET_STATE_CONNECTED);
                return FALSE;
@@ -2055,7 +2061,7 @@ static gboolean __bt_ag_sco_server_cb(GIOChannel *chan,
        }
 
        ag_info->sco = sco_io;
-       ag_info->sco_id = g_io_add_watch(sco_io, G_IO_HUP | G_IO_ERR | G_IO_NVAL,
+       ag_info->sco_incoming_id = g_io_add_watch(sco_io, G_IO_HUP | G_IO_ERR | G_IO_NVAL,
                                        __bt_ag_sco_server_conn_cb, ag_info);
 
        if (remote_dev_path)
@@ -2544,6 +2550,7 @@ static gboolean __bt_ag_event_handler(GIOChannel *channel,
        size_t available_buffer;
        int fd;
        bt_ag_info_t *bt_ag_info = (bt_ag_info_t *)user_data;
+       int err_return = 0;
 
 
        if (cond & G_IO_NVAL)
@@ -2571,7 +2578,7 @@ static gboolean __bt_ag_event_handler(GIOChannel *channel,
                goto failed;
        }
 
-       memcpy(&slconn->buffer[slconn->start], event_buf, len);
+       memcpy(&slconn->buffer[slconn->start + slconn->length], event_buf, len);
        slconn->length += len;
 
        slconn->buffer[slconn->start + slconn->length] = '\0';
@@ -2582,8 +2589,10 @@ static gboolean __bt_ag_event_handler(GIOChannel *channel,
                off_t cmd_len;
 
                get_cr = strchr(&slconn->buffer[slconn->start], '\r');
-               if (!get_cr)
+               if (!get_cr) {
+                       ERR("Broken AT command received, break");
                        break;
+               }
 
                cmd_len = 1 + (off_t) get_cr -
                        (off_t) &slconn->buffer[slconn->start];
@@ -2598,22 +2607,31 @@ static gboolean __bt_ag_event_handler(GIOChannel *channel,
                        err = 0;
                }
 
-               if (err == -EINVAL) {
-                       ERR("Unrecognized command: %s",
-                               &slconn->buffer[slconn->start]);
-                       err = _bt_ag_send_response(bt_ag_info,
-                                       HFP_STATE_MNGR_ERR_NOT_SUPPORTED);
-                       if (err < 0)
-                               goto failed;
-               } else if (err < 0)
+               if (err < 0) {
+                       switch (err) {
+                       case -EINVAL:
+                               err_return = HFP_STATE_MNGR_ERR_NOT_SUPPORTED;
+                               break;
+                       case -EACCES:
+                               err_return = HFP_STATE_MNGR_ERR_NOT_ALLOWED;
+                               break;
+                       default:
+                               err_return = HFP_STATE_MNGR_ERR_NOT_SUPPORTED;
+                               break;
+                       }
                        ERR("Error handling command %s: %s (%d)",
                                                &slconn->buffer[slconn->start],
                                                strerror(-err), -err);
+                       err = _bt_ag_send_response(bt_ag_info,
+                                       err_return);
+                       if (err < 0)
+                               goto failed;
+               }
 
                slconn->start += cmd_len;
                slconn->length -= cmd_len;
 
-               if (!slconn->length)
+               if (slconn->length <= 0)
                        slconn->start = 0;
        }
        return TRUE;
@@ -2824,7 +2842,6 @@ static gboolean __bt_ag_agent_connection_release(bt_ag_info_t *hs)
        if (hs->sco) {
                __bt_ag_close_sco(hs);
                _bt_ag_set_headset_state(hs, HEADSET_STATE_CONNECTED);
-               hs->sco = NULL;
        }
        __bt_ag_agent_remove_watch(&hs->watch_id);
 
@@ -3118,6 +3135,9 @@ static void __bt_ag_agent_method(GDBusConnection *connection,
 
                        g_free(codec);
                        g_free(nrec);
+               } else {
+                       ret = BT_HFP_AGENT_ERROR_NOT_CONNECTED;
+                       goto fail;
                }
        } else if (g_strcmp0(method_name, "Disconnect") == 0) {
                char hdset_address[18] = { 0, };
@@ -4258,7 +4278,6 @@ static void __bt_ag_agent_media_filter_cb(GDBusConnection *connection,
                                }
                        }
                        g_variant_iter_free(iter);
-                       g_variant_unref(dict_param);
                }
        } else if (strcasecmp(signal_name, "ProfileStateChanged") == 0) {
                char *profile_uuid = NULL;