diff options
Diffstat (limited to 'src/gns/gnunet-gns-gtk.c')
-rw-r--r-- | src/gns/gnunet-gns-gtk.c | 206 |
1 files changed, 134 insertions, 72 deletions
diff --git a/src/gns/gnunet-gns-gtk.c b/src/gns/gnunet-gns-gtk.c index c7b47363..f7d8e42b 100644 --- a/src/gns/gnunet-gns-gtk.c +++ b/src/gns/gnunet-gns-gtk.c | |||
@@ -73,6 +73,54 @@ get_object (const char *name) | |||
73 | } | 73 | } |
74 | 74 | ||
75 | 75 | ||
76 | void pseu_change_cont (void *cls, | ||
77 | int32_t success, | ||
78 | const char *emsg) | ||
79 | { | ||
80 | GNUNET_break (0); | ||
81 | } | ||
82 | |||
83 | |||
84 | /** | ||
85 | * Task run on shutdown. | ||
86 | * | ||
87 | * @param cls unused | ||
88 | * @param tc scheduler context, unused | ||
89 | */ | ||
90 | static void | ||
91 | shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | ||
92 | { | ||
93 | |||
94 | struct GNUNET_GNS_Context *gns = cls; | ||
95 | GNUNET_assert (gns != NULL); | ||
96 | if (NULL != gns->ns) | ||
97 | { | ||
98 | GNUNET_NAMESTORE_disconnect (gns->ns, GNUNET_NO); | ||
99 | gns->ns = NULL; | ||
100 | } | ||
101 | if (NULL != gns->pkey) | ||
102 | { | ||
103 | GNUNET_CRYPTO_rsa_key_free (gns->pkey); | ||
104 | gns->pkey = NULL; | ||
105 | } | ||
106 | if (NULL != zonekey_directory) | ||
107 | { | ||
108 | GNUNET_free (zonekey_directory); | ||
109 | zonekey_directory = NULL; | ||
110 | } | ||
111 | GNUNET_free (gns); | ||
112 | } | ||
113 | |||
114 | |||
115 | void | ||
116 | GNUNET_GNS_GTK_shutdown (void *user_data) | ||
117 | { | ||
118 | GNUNET_GTK_tray_icon_destroy (); | ||
119 | GNUNET_GTK_main_loop_quit (ml); | ||
120 | GNUNET_SCHEDULER_add_now (&shutdown_task, user_data); | ||
121 | } | ||
122 | |||
123 | |||
76 | /** | 124 | /** |
77 | * The user edited the preferred name (PSEU) of this namespace. | 125 | * The user edited the preferred name (PSEU) of this namespace. |
78 | * Push the update to the namestore. | 126 | * Push the update to the namestore. |
@@ -84,9 +132,22 @@ void | |||
84 | GNUNET_GNS_GTK_pseu_entry_changed_cb (GtkEditable *editable, | 132 | GNUNET_GNS_GTK_pseu_entry_changed_cb (GtkEditable *editable, |
85 | gpointer user_data) | 133 | gpointer user_data) |
86 | { | 134 | { |
87 | GNUNET_break (0); // FIXME, not implemented | 135 | struct GNUNET_GNS_Context *gns = user_data; |
88 | } | 136 | struct GNUNET_NAMESTORE_RecordData rd; |
137 | const gchar * pseu; | ||
89 | 138 | ||
139 | pseu = gtk_entry_get_text (GTK_ENTRY(editable)); | ||
140 | if ((pseu != NULL) && (0 != strcmp ("", pseu))) | ||
141 | { | ||
142 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "New Pseudonym is `%s'\n", pseu); | ||
143 | rd.flags = GNUNET_NAMESTORE_TYPE_PSEU; | ||
144 | rd.expiration = GNUNET_TIME_absolute_get_forever(); | ||
145 | rd.flags = GNUNET_NAMESTORE_RF_AUTHORITY; | ||
146 | rd.data_size = strlen (pseu) + 1; | ||
147 | rd.data = strdup (pseu); | ||
148 | GNUNET_NAMESTORE_record_create(gns->ns, gns->pkey, "+", &rd, pseu_change_cont, gns); | ||
149 | } | ||
150 | } | ||
90 | 151 | ||
91 | /** | 152 | /** |
92 | * The user toggled the 'autoshort' option. Update the configuration. | 153 | * The user toggled the 'autoshort' option. Update the configuration. |
@@ -129,7 +190,8 @@ GNUNET_GNS_GTK_zone_open_dialog_response_cb (GtkDialog * dialog, | |||
129 | gint response_id, | 190 | gint response_id, |
130 | gpointer user_data) | 191 | gpointer user_data) |
131 | { | 192 | { |
132 | GtkBuilder *builder = user_data; | 193 | struct GNUNET_GNS_Context *gns = user_data; |
194 | GtkBuilder *builder = gns->builder; | ||
133 | char *filename; | 195 | char *filename; |
134 | 196 | ||
135 | if (GTK_RESPONSE_OK != response_id) | 197 | if (GTK_RESPONSE_OK != response_id) |
@@ -213,36 +275,6 @@ GNUNET_GNS_GTK_public_key_copy_button_clicked_cb (GtkButton *button, | |||
213 | } | 275 | } |
214 | 276 | ||
215 | 277 | ||
216 | /** | ||
217 | * Task run on shutdown. | ||
218 | * | ||
219 | * @param cls unused | ||
220 | * @param tc scheduler context, unused | ||
221 | */ | ||
222 | static void | ||
223 | shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | ||
224 | { | ||
225 | |||
226 | struct GNUNET_GNS_Context *gns = cls; | ||
227 | GNUNET_assert (gns != NULL); | ||
228 | if (NULL != gns->ns) | ||
229 | { | ||
230 | GNUNET_NAMESTORE_disconnect (gns->ns, GNUNET_NO); | ||
231 | gns->ns = NULL; | ||
232 | } | ||
233 | if (NULL != gns->pkey) | ||
234 | { | ||
235 | GNUNET_CRYPTO_rsa_key_free (gns->pkey); | ||
236 | gns->pkey = NULL; | ||
237 | } | ||
238 | if (NULL != zonekey_directory) | ||
239 | { | ||
240 | GNUNET_free (zonekey_directory); | ||
241 | zonekey_directory = NULL; | ||
242 | } | ||
243 | GNUNET_free (gns); | ||
244 | } | ||
245 | |||
246 | 278 | ||
247 | /** | 279 | /** |
248 | * Callback invoked if the application is supposed to exit (via menu). | 280 | * Callback invoked if the application is supposed to exit (via menu). |
@@ -277,6 +309,74 @@ GNUNET_GNS_GTK_main_window_delete_event_cb (GtkWidget *widget, | |||
277 | GNUNET_SCHEDULER_add_now (&shutdown_task, user_data); | 309 | GNUNET_SCHEDULER_add_now (&shutdown_task, user_data); |
278 | } | 310 | } |
279 | 311 | ||
312 | |||
313 | void | ||
314 | close_error_box (GtkDialog *dialog, | ||
315 | gint response_id, | ||
316 | gpointer user_data) | ||
317 | { | ||
318 | struct GNUNET_GNS_Context *gns = user_data; | ||
319 | GNUNET_GNS_GTK_shutdown (gns); | ||
320 | } | ||
321 | |||
322 | static void | ||
323 | namestore_service_check (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | ||
324 | { | ||
325 | struct GNUNET_GNS_Context *gns = cls; | ||
326 | struct GNUNET_CRYPTO_ShortHashAsciiEncoded shenc; | ||
327 | char *label; | ||
328 | |||
329 | if ((tc->reason & GNUNET_SCHEDULER_REASON_TIMEOUT) != 0) | ||
330 | { | ||
331 | char * message = _("Namestore service is not running!\n"); | ||
332 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
333 | message); | ||
334 | GtkWidget *dialog, *label, *content_area; | ||
335 | dialog = gtk_dialog_new_with_buttons (_("ERROR"), | ||
336 | GTK_WINDOW (main_window), | ||
337 | GTK_DIALOG_DESTROY_WITH_PARENT, | ||
338 | GTK_STOCK_OK, | ||
339 | GTK_RESPONSE_NONE, | ||
340 | NULL); | ||
341 | content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); | ||
342 | label = gtk_label_new (message); | ||
343 | /* Ensure that the dialog box is destroyed when the user responds. */ | ||
344 | g_signal_connect_swapped (dialog, | ||
345 | "response", | ||
346 | G_CALLBACK(close_error_box), | ||
347 | gns); | ||
348 | /* Add the label, and show everything we've added to the dialog. */ | ||
349 | gtk_container_add (GTK_CONTAINER (content_area), label); | ||
350 | gtk_widget_show_all (dialog); | ||
351 | return; | ||
352 | } | ||
353 | |||
354 | GNUNET_CRYPTO_short_hash_to_enc(&gns->zone, &shenc); | ||
355 | zone_as_string = GNUNET_strdup ((char *) &shenc); | ||
356 | label = g_markup_printf_escaped (_("<b>Editing zone %s</b>"), | ||
357 | zone_as_string); | ||
358 | gtk_label_set_markup (GTK_LABEL (get_object ("GNUNET_GNS_GTK_zone_label")), | ||
359 | label); | ||
360 | g_free (label); | ||
361 | |||
362 | GNUNET_GTK_set_icon_search_path (); | ||
363 | GNUNET_GTK_setup_nls (); | ||
364 | /* setup main window */ | ||
365 | main_window = GTK_WIDGET (get_object ("GNUNET_GNS_GTK_main_window")); | ||
366 | //gtk_window_maximize (GTK_WINDOW (main_window)); | ||
367 | GNUNET_GTK_tray_icon_create (GTK_WINDOW (main_window), | ||
368 | "gnunet-gtk" /* FIXME: different icon? */ , | ||
369 | "gnunet-gns-gtk"); | ||
370 | |||
371 | /* make GUI visible */ | ||
372 | if (!tray_only) | ||
373 | { | ||
374 | gtk_widget_show (main_window); | ||
375 | gtk_window_present (GTK_WINDOW (main_window)); | ||
376 | } | ||
377 | } | ||
378 | |||
379 | |||
280 | /** | 380 | /** |
281 | * Actual main function run right after GNUnet's scheduler | 381 | * Actual main function run right after GNUnet's scheduler |
282 | * is initialized. Initializes up GTK and Glade. | 382 | * is initialized. Initializes up GTK and Glade. |
@@ -288,24 +388,9 @@ static void | |||
288 | run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | 388 | run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) |
289 | { | 389 | { |
290 | struct GNUNET_GNS_Context *gns = GNUNET_malloc (sizeof (struct GNUNET_GNS_Context)); | 390 | struct GNUNET_GNS_Context *gns = GNUNET_malloc (sizeof (struct GNUNET_GNS_Context)); |
291 | struct GNUNET_CRYPTO_ShortHashAsciiEncoded shenc; | ||
292 | char *keyfile; | 391 | char *keyfile; |
293 | char *label; | ||
294 | 392 | ||
295 | ml = cls; | 393 | ml = cls; |
296 | /* | ||
297 | if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (get_configuration (), | ||
298 | "gns", | ||
299 | "ZONEKEY_DIRECTORY", | ||
300 | &zonekey_direc struct GNUNET_CRYPTO_ShortHashAsciiEncoded shenc; | ||
301 | GNUNET_CRYPTO_short_hash_to_enc(&zc_ctx->zone, &shenc);tory)) | ||
302 | { | ||
303 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
304 | _("Option `%s' missing in section `%s'\n"), | ||
305 | "ZONEKEY_DIRECTORY", "namestore"); | ||
306 | return; | ||
307 | }*/ | ||
308 | |||
309 | if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (get_configuration (), | 394 | if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (get_configuration (), |
310 | "gns", | 395 | "gns", |
311 | "ZONEKEY", | 396 | "ZONEKEY", |
@@ -352,30 +437,7 @@ run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
352 | gns->ls = GTK_LIST_STORE (gtk_builder_get_object (gns->builder, "GNUNET_GNS_GTK_type_liststore")); | 437 | gns->ls = GTK_LIST_STORE (gtk_builder_get_object (gns->builder, "GNUNET_GNS_GTK_type_liststore")); |
353 | GNUNET_assert (NULL != gns->ts); | 438 | GNUNET_assert (NULL != gns->ts); |
354 | 439 | ||
355 | GNUNET_CRYPTO_short_hash_to_enc(&gns->zone, &shenc); | 440 | GNUNET_CLIENT_service_test("namestore", get_configuration(), GNUNET_TIME_UNIT_SECONDS, &namestore_service_check, gns); |
356 | zone_as_string = GNUNET_strdup ((char *) &shenc); | ||
357 | label = g_markup_printf_escaped (_("<b>Editing zone %s</b>"), | ||
358 | zone_as_string); | ||
359 | gtk_label_set_markup (GTK_LABEL (get_object ("GNUNET_GNS_GTK_zone_label")), | ||
360 | label); | ||
361 | g_free (label); | ||
362 | |||
363 | GNUNET_GTK_set_icon_search_path (); | ||
364 | GNUNET_GTK_setup_nls (); | ||
365 | /* setup main window */ | ||
366 | main_window = GTK_WIDGET (get_object ("GNUNET_GNS_GTK_main_window")); | ||
367 | //gtk_window_maximize (GTK_WINDOW (main_window)); | ||
368 | GNUNET_GTK_tray_icon_create (GTK_WINDOW (main_window), | ||
369 | "gnunet-gtk" /* FIXME: different icon? */ , | ||
370 | "gnunet-gns-gtk"); | ||
371 | |||
372 | /* make GUI visible */ | ||
373 | if (!tray_only) | ||
374 | { | ||
375 | gtk_widget_show (main_window); | ||
376 | gtk_window_present (GTK_WINDOW (main_window)); | ||
377 | } | ||
378 | |||
379 | } | 441 | } |
380 | 442 | ||
381 | 443 | ||