+ * Callback to select a certificate
+ */
+void select_cert(HildonButton *button, gpointer user_data)
+{
+ GtkWidget *selector = hildon_file_chooser_dialog_new (GTK_WINDOW (user_data), GTK_FILE_CHOOSER_ACTION_OPEN);
+ gtk_widget_show_all (selector);
+ if (gtk_dialog_run (GTK_DIALOG (selector)) == GTK_RESPONSE_OK)
+ {
+ gchar *file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (selector));
+ hildon_button_set_value (button, file);
+ g_free(file);
+ }
+ gtk_widget_destroy (selector);
+}
+
+/**
+ * Shows a dialog to edit the given connection (or create a new one,
+ * if conn is NULL)
+ */
+static void
+edit_connection (gpointer *parent, StrongswanConnection *conn)
+{
+ GtkWidget *dialog;
+ dialog = gtk_dialog_new_with_buttons (
+ conn ? "Edit Connection" : "New Connection",
+ GTK_WINDOW (parent),
+ GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL,
+ GTK_STOCK_SAVE,
+ GTK_RESPONSE_OK,
+ NULL);
+ GtkWidget *vbox = GTK_DIALOG (dialog)->vbox;
+ GtkSizeGroup *group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+
+ GtkWidget *name = hildon_entry_new (HILDON_SIZE_AUTO);
+ hildon_gtk_entry_set_placeholder_text (GTK_ENTRY (name), "Connection Name");
+ hildon_gtk_entry_set_input_mode (GTK_ENTRY (name),
+ HILDON_GTK_INPUT_MODE_ALPHA |
+ HILDON_GTK_INPUT_MODE_NUMERIC);
+ GtkWidget *ncap = hildon_caption_new (group,
+ "Name",
+ name,
+ NULL,
+ HILDON_CAPTION_OPTIONAL);
+ gtk_box_pack_start (GTK_BOX (vbox), ncap, TRUE, TRUE, 0);
+
+ GtkWidget *host = hildon_entry_new (HILDON_SIZE_AUTO);
+ hildon_gtk_entry_set_placeholder_text (GTK_ENTRY (host), "Hostname / IP");
+ GtkWidget *hcap = hildon_caption_new (group,
+ "Host",
+ host,
+ NULL,
+ HILDON_CAPTION_OPTIONAL);
+ gtk_box_pack_start (GTK_BOX (vbox), hcap, TRUE, TRUE, 0);
+
+ GtkWidget *cert = hildon_button_new (HILDON_SIZE_FINGER_HEIGHT |
+ HILDON_SIZE_AUTO_WIDTH,
+ HILDON_BUTTON_ARRANGEMENT_VERTICAL);
+ hildon_button_set_text (HILDON_BUTTON (cert),
+ "Host or CA Certificate",
+ "None");
+ hildon_button_set_alignment (HILDON_BUTTON (cert), 0, 0.5, 1, 1);
+ g_signal_connect (cert, "clicked", G_CALLBACK (select_cert), dialog);
+ GtkWidget *ccap = hildon_caption_new (group,
+ "Certificate",
+ cert,
+ NULL,
+ HILDON_CAPTION_OPTIONAL);
+ gtk_box_pack_start (GTK_BOX (vbox), ccap, TRUE, TRUE, 0);
+
+ GtkWidget *user = hildon_entry_new (HILDON_SIZE_AUTO);
+ hildon_gtk_entry_set_placeholder_text (GTK_ENTRY (user), "Username");
+ GtkWidget *ucap = hildon_caption_new (group,
+ "Username",
+ user,
+ NULL,
+ HILDON_CAPTION_OPTIONAL);
+ gtk_box_pack_start (GTK_BOX (vbox), ucap, TRUE, TRUE, 0);
+
+ GtkWidget *pass = hildon_entry_new (HILDON_SIZE_AUTO);
+ hildon_gtk_entry_set_placeholder_text (GTK_ENTRY (pass), "Password");
+ hildon_gtk_entry_set_input_mode (GTK_ENTRY (pass),
+ HILDON_GTK_INPUT_MODE_FULL |
+ HILDON_GTK_INPUT_MODE_INVISIBLE);
+ GtkWidget *pcap = hildon_caption_new (group,
+ "Password",
+ pass,
+ NULL,
+ HILDON_CAPTION_OPTIONAL);
+ gtk_box_pack_start (GTK_BOX (vbox), pcap, TRUE, TRUE, 0);
+
+ if (conn)
+ {
+ gchar *c_name, *c_host, *c_cert, *c_user, *c_pass;
+ g_object_get (conn,
+ "name", &c_name,
+ "host", &c_host,
+ "cert", &c_cert,
+ "user", &c_user,
+ "pass", &c_pass,
+ NULL);
+ gtk_entry_set_text (GTK_ENTRY (name), c_name);
+ gtk_entry_set_text (GTK_ENTRY (host), c_host);
+ hildon_button_set_value (HILDON_BUTTON (cert),
+ c_cert ? c_cert : "None");
+ gtk_entry_set_text (GTK_ENTRY (user), c_user);
+ gtk_entry_set_text (GTK_ENTRY (pass), c_pass);
+ g_free (c_name);
+ g_free (c_host);
+ g_free (c_cert);
+ g_free (c_user);
+ g_free (c_pass);
+ }
+
+ gtk_widget_show_all(dialog);
+
+ guint retval = gtk_dialog_run (GTK_DIALOG (dialog));
+ if (retval == GTK_RESPONSE_OK)
+ {
+ const gchar *c_name, *c_cert;
+ c_name = gtk_entry_get_text (GTK_ENTRY (name));
+ if (!conn)
+ {
+ conn = strongswan_connection_new (c_name);
+ }
+ c_cert = hildon_button_get_value (HILDON_BUTTON (cert));
+ c_cert = strcmp (c_cert, "None") ? c_cert : NULL;
+ g_object_set (conn,
+ "name", c_name,
+ "host", gtk_entry_get_text (GTK_ENTRY (host)),
+ "cert", c_cert,
+ "user", gtk_entry_get_text (GTK_ENTRY (user)),
+ "pass", gtk_entry_get_text (GTK_ENTRY (pass)),
+ NULL);
+ strongswan_connections_save_connection (ListDialog.conns, conn);
+ }
+ gtk_widget_destroy (dialog);
+}
+
+/**