+ char *session_path = NULL;
+ const char *transfer_name = NULL;
+ const char *file_name = NULL;
+ int size = 0;
+ GVariantIter *iter = NULL;
+ value = g_dbus_proxy_call_finish(proxy, res, &error);
+ if (error) {
+ g_dbus_error_strip_remote_error(error);
+ BT_ERR("%s", error->message);
+ /* If Obex is not able to open a file then continue with other if any */
+ if (g_strcmp0("Unable to open file", error->message) == 0) {
+ GVariant *param = NULL;
+ gint64 size = 0;
+
+ BT_ERR("Unable to open file [%s]", sending_info->file_name_array[file_offset]);
+
+ param = g_variant_new("(issti)", BLUETOOTH_ERROR_NOT_FOUND,
+ sending_info->address,
+ sending_info->file_name_array[file_offset],
+ size,
+ sending_info->request_id);
+ _bt_send_event(BT_OPP_CLIENT_EVENT,
+ BLUETOOTH_EVENT_OPC_TRANSFER_STARTED,
+ param);
+
+ param = g_variant_new("(issti)", BLUETOOTH_ERROR_NOT_FOUND,
+ sending_info->address,
+ sending_info->file_name_array[file_offset],
+ size,
+ sending_info->request_id);
+ _bt_send_event(BT_OPP_CLIENT_EVENT,
+ BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE,
+ param);
+ g_error_free(error);
+ if (proxy)
+ g_object_unref(proxy);
+ file_offset++;
+ _bt_sending_files();
+ }
+ return;
+ }
+ if (proxy)
+ g_object_unref(proxy);
+
+ if (value) {
+ g_variant_get(value, "(oa{sv})", &session_path, &iter);
+ g_variant_unref(value);
+ }
+
+ __bt_free_transfer_info(sending_info->transfer_info);
+
+ sending_info->transfer_info = g_malloc0(sizeof(bt_transfer_info_t));
+
+ if (iter) {
+ const gchar *key;
+ GVariant *val;
+ gsize len = 0;
+ while (g_variant_iter_loop(iter, "{sv}", &key, &val)) {
+ if (g_strcmp0(key, "Name") == 0)
+ transfer_name = g_variant_dup_string(val, &len);
+ else if (g_strcmp0(key, "Filename") == 0)
+ file_name = g_variant_dup_string(val, &len);
+ else if (g_strcmp0(key, "Size") == 0)
+ size = g_variant_get_uint64(val);
+ }
+ g_variant_iter_free(iter);
+ }
+
+ sending_info->transfer_info->transfer_name = g_strdup(transfer_name);
+ sending_info->transfer_info->file_name = g_strdup(file_name);
+ sending_info->transfer_info->size = size;
+ sending_info->transfer_info->progress = 0;
+ sending_info->transfer_info->transfer_path = session_path;
+ sending_info->transfer_info->transfer_status = BT_TRANSFER_STATUS_QUEUED;
+ sending_info->result = BLUETOOTH_ERROR_NONE;
+ file_offset++;
+
+ g_free((gchar *)transfer_name);
+ g_free((gchar *)file_name);
+}
+
+void _bt_sending_files(void)
+{
+ BT_DBG("+");
+
+ GError *err = NULL;
+ GDBusConnection *g_conn;
+ GDBusProxy *client_proxy;
+ char mime_type[BT_MIME_TYPE_MAX_LEN + 1] = { 0 };
+
+ if (sending_info == NULL)
+ return;
+ if (file_offset < sending_info->file_count) {
+ /* Get the session bus. */
+ g_conn = _bt_gdbus_get_session_gconn();
+ ret_if(g_conn == NULL);
+
+ client_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
+ NULL, BT_OBEXD_DBUS_NAME,
+ sending_info->session_path,
+ BT_OBEX_OBJECT_PUSH_INTERFACE,
+ NULL, &err);
+ ret_if(client_proxy == NULL);
+ if (aul_get_mime_from_file(sending_info->file_name_array[file_offset],
+ mime_type, BT_MIME_TYPE_MAX_LEN) == AUL_R_OK) {
+ BT_DBG("MLME type = %s", mime_type);
+
+ /* For IOPT compliance, change "text/x-iMelody" to "audio/imelody"
+ * because few devices(multimedia players) reject the OPP put for text objects
+ * since they support only multimedia files exchange */
+ if (!strcasecmp(mime_type, "text/x-iMelody")) {
+ strncpy(mime_type, "audio/imelody", BT_MIME_TYPE_MAX_LEN);
+ BT_DBG("over writing mime type to = %s", mime_type);
+ }
+ if (!strcasecmp(mime_type, "text/vcard")) {
+ strncpy(mime_type, "text/x-vcard", BT_MIME_TYPE_MAX_LEN);
+ BT_DBG("over writing mime type to = %s", mime_type);
+ }
+ }
+
+ BT_DBG("Calling SendFile");
+ g_dbus_proxy_call(client_proxy, "SendFile",
+ g_variant_new("(ss)", sending_info->file_name_array[file_offset],
+ mime_type),
+ G_DBUS_CALL_FLAGS_NONE,
+ DBUS_TIEMOUT, NULL,
+ (GAsyncReadyCallback)__bt_send_file_cb,
+ sending_info);
+ if (err != NULL) {
+ BT_ERR("Calling SendFile failed: [%s]\n", err->message);
+ g_clear_error(&err);
+ return;
+ }
+
+ } else {
+ file_offset = 0;
+ __bt_sending_release();
+ }
+
+ BT_DBG("-");
+}
+
+static void __bt_create_session_cb(GDBusProxy *proxy,
+ GAsyncResult *res, gpointer user_data)
+{
+ BT_DBG("+");
+
+ GError *error = NULL;
+ GVariant *value;