static transfer_info_t *__bt_create_transfer(DBusGConnection *conn,
						const char *transfer_path)
{
	transfer_info_t *transfer_info = g_new0(transfer_info_t, 1);

	transfer_info->transfer_proxy = dbus_g_proxy_new_for_name(conn,
							"org.openobex",
							transfer_path,
							"org.openobex.Transfer");
	if (NULL == transfer_info->transfer_proxy) {
		DBG("proxy faliled");
		g_free(transfer_info);
		return NULL;
	}

	dbus_g_proxy_add_signal(transfer_info->transfer_proxy,
				"Progress", G_TYPE_INT,
				G_TYPE_INT, G_TYPE_INVALID);

	dbus_g_proxy_connect_signal(transfer_info->transfer_proxy,
					"Progress",
					G_CALLBACK(__bt_transfer_progress_cb),
					transfer_info, NULL);

	transfer_info->transfer_id = __bt_get_transfer_id(transfer_path);
	DBG("Transfer ID : %d \n", transfer_info->transfer_id);

	return transfer_info;
}
static int __bt_get_transfer_properties(bt_transfer_info_t *transfer_info,
					const char *transfer_path)
{
	GHashTable *hash = NULL;
	GValue *value;
	DBusGProxy *transfer_proxy;
	char *bdaddress;

	BT_CHECK_PARAMETER(transfer_info, return);
	BT_CHECK_PARAMETER(transfer_path, return);

	transfer_proxy = __bt_get_transfer_proxy(transfer_path);

	retv_if(transfer_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);

	dbus_g_proxy_call(transfer_proxy, "GetProperties", NULL,
	                        G_TYPE_INVALID,
	                        dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE),
	                        &hash, G_TYPE_INVALID);

	if (hash == NULL) {
		g_object_unref(transfer_proxy);
		return BLUETOOTH_ERROR_INTERNAL;
	}

	value = g_hash_table_lookup(hash, "Operation");
	transfer_info->type = value ? g_strdup(g_value_get_string(value)) : NULL;
	if (!transfer_info->type)
		goto fail;

	value = g_hash_table_lookup(hash, "Filename");
	transfer_info->filename = value ? g_strdup(g_value_get_string(value)) : NULL;
	if (!transfer_info->filename)
		goto fail;

	value = g_hash_table_lookup(hash, "Size");
	transfer_info->file_size  = value ? g_value_get_uint64(value) : 0;

	transfer_info->path = g_strdup(transfer_path);
	transfer_info->transfer_id = __bt_get_transfer_id(transfer_path);

	value = g_hash_table_lookup(hash, "Address");
	bdaddress = value ? (char *)g_value_get_string(value) : NULL;
	if (!bdaddress)
		goto fail;

	transfer_info->device_name = __bt_get_remote_device_name(bdaddress);
	if (!transfer_info->device_name)
		transfer_info->device_name = g_strdup(bdaddress);

	g_hash_table_destroy(hash);
	g_object_unref(transfer_proxy);
	return BLUETOOTH_ERROR_NONE;

fail:
	g_hash_table_destroy(hash);
	g_object_unref(transfer_proxy);
	return BLUETOOTH_ERROR_INTERNAL;
}
void _bt_obex_transfer_started(const char *transfer_path)
{
	bt_transfer_info_t *transfer_info;
	request_info_t *req_info;
	GArray *out_param1 = NULL;
	GArray *out_param2 = NULL;
	int result = BLUETOOTH_ERROR_NONE;

	BT_DBG("%s", transfer_path);

	transfer_info = g_malloc0(sizeof(bt_transfer_info_t));

	if (agent_info.auth_info != NULL
	     && g_strcmp0(transfer_path, agent_info.auth_info->transfer_path) == 0) {
		transfer_info->filename = g_strdup(agent_info.auth_info->filename);
		transfer_info->file_size = agent_info.auth_info->file_size;
		transfer_info->type = g_strdup(TRANSFER_PUT);
		transfer_info->path = g_strdup(agent_info.auth_info->transfer_path);
		transfer_info->device_name = g_strdup(agent_info.auth_info->device_name);
		transfer_info->transfer_id = __bt_get_transfer_id(transfer_path);
	} else {
		if (__bt_get_transfer_properties(transfer_info, transfer_path) < 0) {
			BT_ERR("Get Properties failed");
			__bt_free_auth_info(agent_info.auth_info);
			__bt_free_transfer_info(transfer_info);
			agent_info.auth_info = NULL;
			return;
		}
		agent_info.server_type = BT_FTP_SERVER;
	}

	__bt_free_auth_info(agent_info.auth_info);
	agent_info.auth_info = NULL;

	if (agent_info.server_type == BT_CUSTOM_SERVER) {
		if (agent_info.custom_server == NULL) {
			__bt_free_transfer_info(transfer_info);
			return;
		}

		req_info = _bt_get_request_info(agent_info.accept_id);
		if (req_info == NULL || req_info->context == NULL) {
			BT_ERR("info is NULL");
			goto done;
		}

		agent_info.accept_id = 0;
		result = BLUETOOTH_ERROR_NONE;

		out_param1 = g_array_new(FALSE, FALSE, sizeof(gchar));
		out_param2 = g_array_new(FALSE, FALSE, sizeof(gchar));

		g_array_append_vals(out_param2, &result, sizeof(int));

		dbus_g_method_return(req_info->context, out_param1, out_param2);

		g_array_free(out_param1, TRUE);
		g_array_free(out_param2, TRUE);

		_bt_delete_request_list(req_info->req_id);
	}
done:
	transfers = g_slist_append(transfers, transfer_info);

	BT_DBG("Transfer id %d\n", transfer_info->transfer_id);

	_bt_send_event(BT_OPP_SERVER_EVENT,
		BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED,
		DBUS_TYPE_INT32, &result,
		DBUS_TYPE_STRING, &transfer_info->filename,
		DBUS_TYPE_STRING, &transfer_info->type,
		DBUS_TYPE_UINT64, &transfer_info->file_size,
		DBUS_TYPE_INT32, &transfer_info->transfer_id,
		DBUS_TYPE_INT32, &agent_info.server_type,
		DBUS_TYPE_INVALID);
}