static void
do_finalize (GObject *self)
{
    NautilusFileConflictDialogDetails *details =
        NAUTILUS_FILE_CONFLICT_DIALOG (self)->details;

    g_free (details->conflict_name);

    if (details->handle != NULL) {
        nautilus_file_list_cancel_call_when_ready (details->handle);
    }

    if (details->src_handler_id) {
        g_signal_handler_disconnect (details->source, details->src_handler_id);
        nautilus_file_monitor_remove (details->source, self);
    }

    if (details->dest_handler_id) {
        g_signal_handler_disconnect (details->destination, details->dest_handler_id);
        nautilus_file_monitor_remove (details->destination, self);
    }

    nautilus_file_unref (details->source);
    nautilus_file_unref (details->destination);
    nautilus_file_unref (details->dest_dir);

    G_OBJECT_CLASS (nautilus_file_conflict_dialog_parent_class)->finalize (self);
}
static gboolean
run_file_conflict_dialog (gpointer user_data)
{
    FileConflictDialogData *data = user_data;
    int response_id;
    GList *files = NULL;

    data->source = nautilus_file_get (data->source_name);
    data->destination = nautilus_file_get (data->destination_name);
    data->destination_directory = nautilus_file_get (data->destination_directory_name);

    data->dialog = nautilus_file_conflict_dialog_new (data->parent);

    files = g_list_prepend (files, data->source);
    files = g_list_prepend (files, data->destination);
    files = g_list_prepend (files, data->destination_directory);

    nautilus_file_list_call_when_ready (files,
                                        NAUTILUS_FILE_ATTRIBUTES_FOR_ICON,
                                        &data->handle,
                                        data->on_file_list_ready,
                                        data);

    response_id = gtk_dialog_run (GTK_DIALOG (data->dialog));

    if (data->handle != NULL)
    {
        nautilus_file_list_cancel_call_when_ready (data->handle);
    }

    if (data->source_handler_id)
    {
        g_signal_handler_disconnect (data->source, data->source_handler_id);
        nautilus_file_monitor_remove (data->source, data);
    }

    if (data->destination_handler_id)
    {
        g_signal_handler_disconnect (data->destination, data->destination_handler_id);
        nautilus_file_monitor_remove (data->destination, data);
    }

    if (response_id == CONFLICT_RESPONSE_RENAME)
    {
        data->response->new_name =
            nautilus_file_conflict_dialog_get_new_name (data->dialog);
    }
    else if (response_id != GTK_RESPONSE_CANCEL ||
             response_id != GTK_RESPONSE_NONE)
    {
        data->response->apply_to_all =
            nautilus_file_conflict_dialog_get_apply_to_all (data->dialog);
    }

    data->response->id = response_id;

    gtk_widget_destroy (GTK_WIDGET (data->dialog));

    nautilus_file_unref (data->source);
    nautilus_file_unref (data->destination);
    nautilus_file_unref (data->destination_directory);
    g_list_free (files);

    return G_SOURCE_REMOVE;
}