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); }