diff options
Diffstat (limited to 'src/gns/gnunet-gns-gtk.c')
-rw-r--r-- | src/gns/gnunet-gns-gtk.c | 142 |
1 files changed, 67 insertions, 75 deletions
diff --git a/src/gns/gnunet-gns-gtk.c b/src/gns/gnunet-gns-gtk.c index f7d8e42b..48b99066 100644 --- a/src/gns/gnunet-gns-gtk.c +++ b/src/gns/gnunet-gns-gtk.c | |||
@@ -92,7 +92,8 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
92 | { | 92 | { |
93 | 93 | ||
94 | struct GNUNET_GNS_Context *gns = cls; | 94 | struct GNUNET_GNS_Context *gns = cls; |
95 | GNUNET_assert (gns != NULL); | 95 | if (NULL == gns) |
96 | return; | ||
96 | if (NULL != gns->ns) | 97 | if (NULL != gns->ns) |
97 | { | 98 | { |
98 | GNUNET_NAMESTORE_disconnect (gns->ns, GNUNET_NO); | 99 | GNUNET_NAMESTORE_disconnect (gns->ns, GNUNET_NO); |
@@ -113,11 +114,11 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
113 | 114 | ||
114 | 115 | ||
115 | void | 116 | void |
116 | GNUNET_GNS_GTK_shutdown (void *user_data) | 117 | GNUNET_GNS_GTK_shutdown (struct GNUNET_GNS_Context *gns) |
117 | { | 118 | { |
118 | GNUNET_GTK_tray_icon_destroy (); | 119 | GNUNET_GTK_tray_icon_destroy (); |
119 | GNUNET_GTK_main_loop_quit (ml); | 120 | GNUNET_GTK_main_loop_quit (ml); |
120 | GNUNET_SCHEDULER_add_now (&shutdown_task, user_data); | 121 | GNUNET_SCHEDULER_add_now (&shutdown_task, gns); |
121 | } | 122 | } |
122 | 123 | ||
123 | 124 | ||
@@ -315,43 +316,84 @@ close_error_box (GtkDialog *dialog, | |||
315 | gint response_id, | 316 | gint response_id, |
316 | gpointer user_data) | 317 | gpointer user_data) |
317 | { | 318 | { |
318 | struct GNUNET_GNS_Context *gns = user_data; | 319 | gtk_widget_destroy (GTK_WIDGET(dialog)); |
319 | GNUNET_GNS_GTK_shutdown (gns); | 320 | GNUNET_GNS_GTK_shutdown (user_data); |
320 | } | 321 | } |
321 | 322 | ||
322 | static void | 323 | static void |
323 | namestore_service_check (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | 324 | namestore_service_check (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) |
324 | { | 325 | { |
325 | struct GNUNET_GNS_Context *gns = cls; | 326 | struct GNUNET_GNS_Context *gns = NULL; |
326 | struct GNUNET_CRYPTO_ShortHashAsciiEncoded shenc; | 327 | struct GNUNET_CRYPTO_ShortHashAsciiEncoded shenc; |
328 | GtkWidget *dialog; | ||
327 | char *label; | 329 | char *label; |
330 | char *keyfile; | ||
328 | 331 | ||
329 | if ((tc->reason & GNUNET_SCHEDULER_REASON_TIMEOUT) != 0) | 332 | if ((tc->reason & GNUNET_SCHEDULER_REASON_TIMEOUT) != 0) |
330 | { | 333 | { |
331 | char * message = _("Namestore service is not running!\n"); | 334 | char * message = _("Namestore service is not running!\n"); |
332 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 335 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, message); |
333 | message); | 336 | dialog = gtk_message_dialog_new (GTK_WINDOW (main_window), |
334 | GtkWidget *dialog, *label, *content_area; | 337 | GTK_DIALOG_DESTROY_WITH_PARENT, |
335 | dialog = gtk_dialog_new_with_buttons (_("ERROR"), | 338 | GTK_MESSAGE_ERROR, |
336 | GTK_WINDOW (main_window), | 339 | GTK_BUTTONS_CLOSE, |
337 | GTK_DIALOG_DESTROY_WITH_PARENT, | 340 | "%s", |
338 | GTK_STOCK_OK, | 341 | message); |
339 | GTK_RESPONSE_NONE, | 342 | |
340 | NULL); | 343 | g_signal_connect (dialog, "response", G_CALLBACK(close_error_box), gns); |
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); | 344 | gtk_widget_show_all (dialog); |
351 | return; | 345 | return; |
352 | } | 346 | } |
353 | 347 | ||
348 | /* setup crypto keys */ | ||
349 | gns = GNUNET_malloc (sizeof (struct GNUNET_GNS_Context)); | ||
350 | if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (get_configuration (), | ||
351 | "gns", | ||
352 | "ZONEKEY", | ||
353 | &keyfile)) | ||
354 | { | ||
355 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
356 | _("Option `%s' missing in section `%s'\n"), "ZONEKEY", "gns"); | ||
357 | return; | ||
358 | } | ||
359 | else | ||
360 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Using `%s'\n", keyfile); | ||
361 | gns->pkey = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile); | ||
362 | GNUNET_free (keyfile); | ||
363 | keyfile = NULL; | ||
364 | if (NULL == gns->pkey) | ||
365 | { | ||
366 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
367 | _("Failed to read or create private zone key\n")); | ||
368 | return; | ||
369 | } | ||
370 | GNUNET_CRYPTO_rsa_key_get_public (gns->pkey, &gns->pubkey); | ||
371 | GNUNET_CRYPTO_short_hash (&gns->pubkey, | ||
372 | sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), | ||
373 | &gns->zone); | ||
354 | GNUNET_CRYPTO_short_hash_to_enc(&gns->zone, &shenc); | 374 | GNUNET_CRYPTO_short_hash_to_enc(&gns->zone, &shenc); |
375 | |||
376 | /* connect to namestore */ | ||
377 | gns->ns = GNUNET_NAMESTORE_connect (get_configuration ()); | ||
378 | if (NULL == gns->ns) | ||
379 | { | ||
380 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
381 | _("Failed to connect to namestore\n")); | ||
382 | GNUNET_SCHEDULER_add_now (&shutdown_task, gns); | ||
383 | return; | ||
384 | } | ||
385 | |||
386 | /* setup gui */ | ||
387 | if (GNUNET_OK != GNUNET_GTK_main_loop_build_window (ml, gns)) | ||
388 | { | ||
389 | GNUNET_break (0); | ||
390 | GNUNET_SCHEDULER_add_now (&shutdown_task, gns); | ||
391 | return; | ||
392 | } | ||
393 | gns->builder = GNUNET_GTK_main_loop_get_builder(ml); | ||
394 | gns->ts = GTK_TREE_STORE (gtk_builder_get_object (gns->builder, "GNUNET_GNS_GTK_treestore")); | ||
395 | gns->ls = GTK_LIST_STORE (gtk_builder_get_object (gns->builder, "GNUNET_GNS_GTK_type_liststore")); | ||
396 | |||
355 | zone_as_string = GNUNET_strdup ((char *) &shenc); | 397 | zone_as_string = GNUNET_strdup ((char *) &shenc); |
356 | label = g_markup_printf_escaped (_("<b>Editing zone %s</b>"), | 398 | label = g_markup_printf_escaped (_("<b>Editing zone %s</b>"), |
357 | zone_as_string); | 399 | zone_as_string); |
@@ -363,7 +405,6 @@ namestore_service_check (void *cls, const struct GNUNET_SCHEDULER_TaskContext *t | |||
363 | GNUNET_GTK_setup_nls (); | 405 | GNUNET_GTK_setup_nls (); |
364 | /* setup main window */ | 406 | /* setup main window */ |
365 | main_window = GTK_WIDGET (get_object ("GNUNET_GNS_GTK_main_window")); | 407 | 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), | 408 | GNUNET_GTK_tray_icon_create (GTK_WINDOW (main_window), |
368 | "gnunet-gtk" /* FIXME: different icon? */ , | 409 | "gnunet-gtk" /* FIXME: different icon? */ , |
369 | "gnunet-gns-gtk"); | 410 | "gnunet-gns-gtk"); |
@@ -387,57 +428,8 @@ namestore_service_check (void *cls, const struct GNUNET_SCHEDULER_TaskContext *t | |||
387 | static void | 428 | static void |
388 | run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | 429 | run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) |
389 | { | 430 | { |
390 | struct GNUNET_GNS_Context *gns = GNUNET_malloc (sizeof (struct GNUNET_GNS_Context)); | ||
391 | char *keyfile; | ||
392 | |||
393 | ml = cls; | 431 | ml = cls; |
394 | if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (get_configuration (), | 432 | GNUNET_CLIENT_service_test("namestore", get_configuration(), GNUNET_TIME_UNIT_SECONDS, &namestore_service_check, NULL); |
395 | "gns", | ||
396 | "ZONEKEY", | ||
397 | &keyfile)) | ||
398 | { | ||
399 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
400 | _("Option `%s' missing in section `%s'\n"), | ||
401 | "ZONEKEY", "gns"); | ||
402 | return; | ||
403 | } | ||
404 | else | ||
405 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
406 | "Using `%s'\n", keyfile); | ||
407 | gns->pkey = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile); | ||
408 | GNUNET_free (keyfile); | ||
409 | keyfile = NULL; | ||
410 | if (NULL == gns->pkey) | ||
411 | { | ||
412 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
413 | _("Failed to read or create private zone key\n")); | ||
414 | return; | ||
415 | } | ||
416 | GNUNET_CRYPTO_rsa_key_get_public (gns->pkey, &gns->pubkey); | ||
417 | GNUNET_CRYPTO_short_hash (&gns->pubkey, sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), &gns->zone); | ||
418 | |||
419 | |||
420 | gns->ns = GNUNET_NAMESTORE_connect (get_configuration ()); | ||
421 | if (NULL == gns->ns) | ||
422 | { | ||
423 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
424 | _("Failed to connect to namestore\n")); | ||
425 | GNUNET_SCHEDULER_add_now (&shutdown_task, gns); | ||
426 | return; | ||
427 | } | ||
428 | |||
429 | if (GNUNET_OK != GNUNET_GTK_main_loop_build_window (ml, gns)) | ||
430 | { | ||
431 | GNUNET_break (0); | ||
432 | GNUNET_SCHEDULER_add_now (&shutdown_task, gns); | ||
433 | return; | ||
434 | } | ||
435 | gns->builder = GNUNET_GTK_main_loop_get_builder(ml); | ||
436 | gns->ts = GTK_TREE_STORE (gtk_builder_get_object (gns->builder, "GNUNET_GNS_GTK_treestore")); | ||
437 | gns->ls = GTK_LIST_STORE (gtk_builder_get_object (gns->builder, "GNUNET_GNS_GTK_type_liststore")); | ||
438 | GNUNET_assert (NULL != gns->ts); | ||
439 | |||
440 | GNUNET_CLIENT_service_test("namestore", get_configuration(), GNUNET_TIME_UNIT_SECONDS, &namestore_service_check, gns); | ||
441 | } | 433 | } |
442 | 434 | ||
443 | 435 | ||