static void
trg_torrent_add_url_response_cb(TrgTorrentAddUrlDialog * dlg, gint res_id,
                                gpointer data)
{
    TrgTorrentAddUrlDialogPrivate *priv =
        TRG_TORRENT_ADD_URL_DIALOG_GET_PRIVATE(dlg);

    if (res_id == GTK_RESPONSE_ACCEPT) {
        JsonNode *request;
        const gchar *entryText =
            gtk_entry_get_text(GTK_ENTRY(priv->urlEntry));

        if (g_str_has_prefix(entryText, "magnet:")
            && !has_dht_support(dlg))
            show_dht_not_enabled_warning(dlg);

        request =
            torrent_add_url(entryText,
                            gtk_toggle_button_get_active
                            (GTK_TOGGLE_BUTTON(priv->startCheck)));
        dispatch_async(priv->client, request,
                       on_generic_interactive_action_response, data);
    }

    gtk_widget_destroy(GTK_WIDGET(dlg));
}
static gboolean has_dht_support(TrgTorrentAddUrlDialog * dlg)
{
    TrgTorrentAddUrlDialogPrivate *priv =
        TRG_TORRENT_ADD_URL_DIALOG_GET_PRIVATE(dlg);
    JsonObject *session = trg_client_get_session(priv->client);
    return session_get_dht_enabled(session);
}
TrgTorrentAddUrlDialog *trg_torrent_add_url_dialog_new(TrgMainWindow * win,
                                                       TrgClient * client)
{
    GObject *obj = g_object_new(TRG_TYPE_TORRENT_ADD_URL_DIALOG, NULL);
    TrgTorrentAddUrlDialogPrivate *priv =
        TRG_TORRENT_ADD_URL_DIALOG_GET_PRIVATE(obj);

    priv->client = client;
    priv->win = win;

    gtk_window_set_transient_for(GTK_WINDOW(obj), GTK_WINDOW(win));
    g_signal_connect(G_OBJECT(obj),
                     "response",
                     G_CALLBACK(trg_torrent_add_url_response_cb), win);

    return TRG_TORRENT_ADD_URL_DIALOG(obj);
}
static void trg_torrent_add_url_dialog_init(TrgTorrentAddUrlDialog * self)
{
    TrgTorrentAddUrlDialogPrivate *priv =
        TRG_TORRENT_ADD_URL_DIALOG_GET_PRIVATE(self);
    GtkWidget *w, *t, *contentvbox;
    guint row = 0;

    contentvbox = gtk_dialog_get_content_area(GTK_DIALOG(self));

    t = hig_workarea_create();

    w = priv->urlEntry = gtk_entry_new();
    g_signal_connect(w, "changed", G_CALLBACK(url_entry_changed), self);
    hig_workarea_add_row(t, &row, _("URL:"), w, NULL);

    priv->startCheck =
        hig_workarea_add_wide_checkbutton(t, &row, _("Start Paused"),
                                          FALSE);

    gtk_window_set_title(GTK_WINDOW(self), _("Add torrent from URL"));
    gtk_window_set_destroy_with_parent(GTK_WINDOW(self), TRUE);

    gtk_dialog_add_button(GTK_DIALOG(self), GTK_STOCK_CLOSE,
                          GTK_RESPONSE_CANCEL);
    priv->addButton =
        gtk_dialog_add_button(GTK_DIALOG(self), GTK_STOCK_ADD,
                              GTK_RESPONSE_ACCEPT);
    gtk_widget_set_sensitive(priv->addButton, FALSE);

    gtk_container_set_border_width(GTK_CONTAINER(self), GUI_PAD);

    gtk_dialog_set_default_response(GTK_DIALOG(self), GTK_RESPONSE_ACCEPT);

    gtk_dialog_set_alternative_button_order(GTK_DIALOG(self),
                                            GTK_RESPONSE_ACCEPT,
                                            GTK_RESPONSE_CANCEL, -1);

    gtk_container_set_border_width(GTK_CONTAINER(t), GUI_PAD);

    gtk_box_pack_start(GTK_BOX(contentvbox), t, TRUE, TRUE, 0);
}