return IN_PROGRESS error when pbap connection is on progress
[platform/core/connectivity/bluetooth-frwk.git] / bt-service / bt-service-obex-server.c
index b4c69d0..4363a7e 100644 (file)
 #define BT_OBEX_MANAGER "org.bluez.obex.AgentManager1"
 #define BT_OBEX_PATH "/org/bluez/obex"
 
+#define BT_OBEX_PATH_PREFIX "/opt/usr/media"
+#define BT_OBEX_DEFAULT_PATH "/opt/usr/home/owner/media"
+#define BT_OBEX_PATH_MAX_LENGTH 255
+
 
 typedef struct {
        char *filename;
@@ -255,7 +259,7 @@ static char *__bt_get_remote_device_name(const char *bdaddress)
        device_path = _bt_get_device_object_path((char *)bdaddress);
        retv_if(device_path == NULL, NULL);
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, NULL);
        BT_INFO("Device_path %s", device_path);
        device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
@@ -322,7 +326,7 @@ static void __bt_get_remote_device_name_authinfo(const char *bdaddress,
        device_path = _bt_get_device_object_path((char *)bdaddress);
        ret_if(device_path == NULL);
 
-       conn = _bt_get_system_gconn();
+       conn = _bt_gdbus_get_system_gconn();
        ret_if(conn == NULL);
        BT_INFO("Device_path %s", device_path);
        device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
@@ -366,7 +370,7 @@ static void __bt_get_remote_device_name_authinfo(const char *bdaddress,
                                g_variant_unref(temp_value);
                        DBG_SECURE("Name = %s", name);
                }
-               temp_value = g_variant_lookup_value (value, "IsAliasSet", G_VARIANT_TYPE_BOOLEAN);
+               temp_value = g_variant_lookup_value(value, "IsAliasSet", G_VARIANT_TYPE_BOOLEAN);
                if (temp_value) {
                        is_alias_set = g_variant_get_boolean(temp_value);
                        g_variant_unref(temp_value);
@@ -403,7 +407,7 @@ static GDBusProxy *__bt_get_transfer_proxy(const char *transfer_path)
        GDBusProxy *proxy;
        GError *err = NULL;
 
-       conn = _bt_get_session_gconn();
+       conn = _bt_gdbus_get_session_gconn();
        retv_if(conn == NULL, NULL);
 
        proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
@@ -426,7 +430,7 @@ static GDBusProxy *__bt_get_transfer_properties_proxy(const char *transfer_path)
        GDBusConnection *conn;
        GDBusProxy *proxy;
        GError *err = NULL;
-       conn = _bt_get_session_gconn();
+       conn = _bt_gdbus_get_session_gconn();
        retv_if(conn == NULL, NULL);
 
        proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
@@ -581,13 +585,12 @@ static gboolean __bt_authorize_cb(GDBusMethodInvocation *context,
                GVariant *val;
                gsize len = 0;
                while (g_variant_iter_loop(iter, "{sv}", &key, &val)) {
-                       if (g_strcmp0(key, "Name") == 0) {
+                       if (g_strcmp0(key, "Name") == 0)
                                agent_info.auth_info->filename = g_variant_dup_string(val, &len);
-                       } else if (g_strcmp0(key, "Address") == 0) {
+                       else if (g_strcmp0(key, "Address") == 0)
                                bdaddress = g_variant_dup_string(val, &len);
-                       } else if (g_strcmp0(key, "Size") == 0) {
+                       else if (g_strcmp0(key, "Size") == 0)
                                agent_info.auth_info->file_size = g_variant_get_uint64(val);
-                       }
                }
                g_variant_iter_free(iter);
        }
@@ -602,7 +605,7 @@ static gboolean __bt_authorize_cb(GDBusMethodInvocation *context,
        memcpy(agent_info.auth_info->contact_auth_info, auth_info, 5);
 
        session_info = __bt_find_session_by_path((char *)path);
-       if(NULL == session_info) {
+       if (NULL == session_info) {
                session_info = g_malloc0(sizeof(bt_session_info_t));
                session_info->path = g_strdup(path);
                session_info->address = g_strdup(bdaddress);
@@ -619,7 +622,7 @@ static gboolean __bt_authorize_cb(GDBusMethodInvocation *context,
                return TRUE;
        }
 
-       if(session_info->authorized == FALSE) {
+       if (session_info->authorized == FALSE) {
                _bt_launch_system_popup(BT_AGENT_EVENT_EXCHANGE_REQUEST, device_name,
                                        auth_info, NULL, NULL, BT_OBEX_SERVER_AGENT_PATH);
        } else {
@@ -722,7 +725,7 @@ done:
        __bt_free_auth_info(agent_info.auth_info);
        agent_info.auth_info = NULL;
 
-       g_variant_builder_unref (builder);
+       g_variant_builder_unref(builder);
 
        _bt_send_event(BT_OPP_SERVER_EVENT,
                BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED,
@@ -819,7 +822,7 @@ void _bt_obex_transfer_completed(const char *transfer_path, gboolean success)
                _bt_send_event(BT_OPP_SERVER_EVENT,
                        BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED,
                        param);
-               g_variant_builder_unref (builder);
+               g_variant_builder_unref(builder);
        }
        param = g_variant_new("(issssstii)", result,
                                transfer_info->filename,
@@ -896,7 +899,7 @@ int _bt_register_obex_server(void)
        GError *g_error = NULL;
 
        /* Get the session bus. */
-       g_conn = _bt_get_session_gconn();
+       g_conn = _bt_gdbus_get_session_gconn();
        retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        _bt_obex_agent_new(BT_OBEX_SERVER_AGENT_PATH);
@@ -912,9 +915,8 @@ int _bt_register_obex_server(void)
                                                BT_OBEX_MANAGER,
                                                NULL, &g_error);
 
-       if (manager_proxy == NULL) {
+       if (manager_proxy == NULL)
                return BLUETOOTH_ERROR_INTERNAL;
-       }
 
        result = g_dbus_proxy_call_sync(manager_proxy, "RegisterAgent",
                                g_variant_new("(o)", BT_OBEX_SERVER_AGENT_PATH),
@@ -983,35 +985,61 @@ gboolean __bt_check_folder_path(const char *dest_path)
        return TRUE;
 }
 
+char *__bt_transfer_folder_path(char *dest_path)
+{
+       char *dst_path = (char *)g_malloc0(BT_OBEX_PATH_MAX_LENGTH);
+       if (g_str_has_prefix(dest_path, BT_OBEX_PATH_PREFIX))
+               snprintf(dst_path, BT_OBEX_PATH_MAX_LENGTH, BT_OBEX_DEFAULT_PATH"%s", dest_path + strlen(BT_OBEX_PATH_PREFIX));
+       else
+               snprintf(dst_path, BT_OBEX_PATH_MAX_LENGTH, "%s", dest_path);
+
+       BT_INFO("obex transfed path : %s", dst_path);
+       return dst_path;
+}
+
 int _bt_obex_server_allocate(char *sender, const char *dest_path, int app_pid, gboolean is_native)
 {
        BT_DBG("+");
-       if (__bt_check_folder_path(dest_path) == FALSE)
+
+       char *dst_path;
+       dst_path = __bt_transfer_folder_path((char *)dest_path);
+
+       if (__bt_check_folder_path(dst_path) == FALSE) {
+               g_free(dst_path);
                return BLUETOOTH_ERROR_INVALID_PARAM;
+       }
 
        if (is_native == TRUE) {
-               retv_if(agent_info.native_server,
-                               BLUETOOTH_ERROR_DEVICE_BUSY);
+               if (agent_info.native_server) {
+                       BT_ERR("obex native server busy");
+                       g_free(dst_path);
+                       return BLUETOOTH_ERROR_DEVICE_BUSY;
+               }
 
                /* Force to change the control to native */
                agent_info.native_server = g_malloc0(sizeof(bt_server_info_t));
-               agent_info.native_server->dest_path = g_strdup(dest_path);
+               agent_info.native_server->dest_path = g_strdup(dst_path);
                agent_info.native_server->sender = g_strdup(sender);
                agent_info.native_server->app_pid = app_pid;
                agent_info.server_type = BT_NATIVE_SERVER;
                _bt_unregister_osp_server_in_agent(BT_OBEX_SERVER, NULL);
        } else {
-               retv_if(agent_info.custom_server,
-                               BLUETOOTH_ERROR_DEVICE_BUSY);
+               if (agent_info.custom_server) {
+                       BT_ERR("obex custom server busy");
+                       g_free(dst_path);
+                       return BLUETOOTH_ERROR_DEVICE_BUSY;
+               }
 
                /* Force to change the control to custom */
                agent_info.custom_server = g_malloc0(sizeof(bt_server_info_t));
-               agent_info.custom_server->dest_path = g_strdup(dest_path);
+               agent_info.custom_server->dest_path = g_strdup(dst_path);
                agent_info.custom_server->sender = g_strdup(sender);
                agent_info.custom_server->app_pid = app_pid;
                agent_info.server_type = BT_CUSTOM_SERVER;
                _bt_register_osp_server_in_agent(BT_OBEX_SERVER, NULL, NULL, -1);
        }
+
+       g_free(dst_path);
        BT_DBG("-");
        return BLUETOOTH_ERROR_NONE;
 }
@@ -1103,11 +1131,11 @@ void _bt_obex_server_reply_accept(void)
        _bt_send_event(BT_OPP_SERVER_EVENT, BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE, param);
 
        session_info = __bt_find_session_by_path(agent_info.auth_info->transfer_path);
-       if(NULL == session_info) {
+
+       if (NULL == session_info)
                BT_ERR("Couldn't get the session info from the list");
-       } else {
+       else
                session_info->authorized = TRUE;
-       }
 }
 
 int _bt_obex_server_reject_authorize(void)
@@ -1135,15 +1163,18 @@ int _bt_obex_server_set_destination_path(const char *dest_path,
                                                gboolean is_native)
 {
        bt_server_info_t *server_info;
-
        BT_CHECK_PARAMETER(dest_path, return);
 
+       char *dst_path;
+       dst_path = __bt_transfer_folder_path((char *)dest_path);
+
        DIR *dp = NULL;
 
-       dp = opendir(dest_path);
+       dp = opendir(dst_path);
 
        if (dp == NULL) {
                BT_ERR("The directory does not exist");
+               g_free(dst_path);
                return BLUETOOTH_ERROR_INVALID_PARAM;
        }
 
@@ -1154,12 +1185,16 @@ int _bt_obex_server_set_destination_path(const char *dest_path,
        else
                server_info = agent_info.custom_server;
 
-       retv_if(server_info == NULL,
-                       BLUETOOTH_ERROR_AGENT_DOES_NOT_EXIST);
+       if (!server_info) {
+               BT_ERR("obex server info is NULL");
+               g_free(dst_path);
+               return BLUETOOTH_ERROR_AGENT_DOES_NOT_EXIST;
+       }
 
        g_free(server_info->dest_path);
-       server_info->dest_path = g_strdup(dest_path);
+       server_info->dest_path = g_strdup(dst_path);
 
+       g_free(dst_path);
        return BLUETOOTH_ERROR_NONE;
 }
 
@@ -1173,19 +1208,26 @@ int _bt_obex_server_set_root(const char *root)
 
        BT_CHECK_PARAMETER(root, return);
 
-       retv_if(agent_info.proxy == NULL,
-                               BLUETOOTH_ERROR_INTERNAL);
+       char *dst_root;
+       dst_root = __bt_transfer_folder_path((char *)root);
+
+       if (!agent_info.proxy) {
+               BT_ERR("obex agent_info proxy error");
+               g_free(dst_root);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
 
-       dp = opendir(root);
+       dp = opendir(dst_root);
 
        if (dp == NULL) {
                BT_ERR("The directory does not exist");
+               g_free(dst_root);
                return BLUETOOTH_ERROR_INVALID_PARAM;
        }
 
        closedir(dp);
 
-       folder = g_variant_new_string(root);
+       folder = g_variant_new_string(dst_root);
        result = g_dbus_proxy_call_sync(agent_info.proxy, "SetProperty",
                        g_variant_new("(sv)", string, folder),
                        G_DBUS_CALL_FLAGS_NONE,
@@ -1195,12 +1237,14 @@ int _bt_obex_server_set_root(const char *root)
        if (g_error) {
                BT_ERR("SetProperty Fail: %s", g_error->message);
                g_error_free(g_error);
+               g_free(dst_root);
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
        if (result)
                g_variant_unref(result);
 
+       g_free(dst_root);
        return BLUETOOTH_ERROR_NONE;
 }
 
@@ -1255,11 +1299,10 @@ int _bt_obex_server_is_activated(gboolean *activated)
 {
        BT_CHECK_PARAMETER(activated, return);
 
-       if (agent_info.custom_server) {
+       if (agent_info.custom_server)
                *activated = TRUE;
-       } else {
+       else
                *activated = FALSE;
-       }
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -1268,11 +1311,10 @@ int _bt_obex_server_check_allocation(gboolean *allocation)
 {
        BT_CHECK_PARAMETER(allocation, return);
 
-       if (agent_info.native_server || agent_info.custom_server) {
+       if (agent_info.native_server || agent_info.custom_server)
                *allocation = TRUE;
-       } else {
+       else
                *allocation = FALSE;
-       }
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -1302,11 +1344,10 @@ int _bt_obex_server_is_receiving(gboolean *receiving)
 {
        BT_CHECK_PARAMETER(receiving, return);
 
-       if (transfers == NULL || g_slist_length(transfers) == 0) {
+       if (transfers == NULL || g_slist_length(transfers) == 0)
                *receiving = FALSE;
-       } else {
+       else
                *receiving = TRUE;
-       }
 
        return BLUETOOTH_ERROR_NONE;
 }