diff options
Diffstat (limited to 'src/identity/gnunet-identity-gtk_advertise.c')
-rw-r--r-- | src/identity/gnunet-identity-gtk_advertise.c | 1312 |
1 files changed, 252 insertions, 1060 deletions
diff --git a/src/identity/gnunet-identity-gtk_advertise.c b/src/identity/gnunet-identity-gtk_advertise.c index e7974ce1..07ab09fd 100644 --- a/src/identity/gnunet-identity-gtk_advertise.c +++ b/src/identity/gnunet-identity-gtk_advertise.c | |||
@@ -26,10 +26,15 @@ | |||
26 | #include "gnunet-identity-gtk_advertise.h" | 26 | #include "gnunet-identity-gtk_advertise.h" |
27 | #include <gnunet/gnunet_fs_service.h> | 27 | #include <gnunet/gnunet_fs_service.h> |
28 | 28 | ||
29 | |||
30 | #define NEW_KEYWORD_TEXT "<add>" | ||
31 | |||
32 | |||
29 | /** | 33 | /** |
30 | * Types of metadata we offer for namespaces. | 34 | * Types of metadata we offer for namespaces. |
31 | */ | 35 | */ |
32 | static gint types[] = { | 36 | static gint types[] = |
37 | { | ||
33 | EXTRACTOR_METATYPE_TITLE, | 38 | EXTRACTOR_METATYPE_TITLE, |
34 | EXTRACTOR_METATYPE_KEYWORDS, | 39 | EXTRACTOR_METATYPE_KEYWORDS, |
35 | EXTRACTOR_METATYPE_SUBJECT, | 40 | EXTRACTOR_METATYPE_SUBJECT, |
@@ -47,56 +52,57 @@ static gint types[] = { | |||
47 | * Columns in the metadata list store. | 52 | * Columns in the metadata list store. |
48 | */ | 53 | */ |
49 | enum METADATA_ModelColumns | 54 | enum METADATA_ModelColumns |
50 | { | 55 | { |
51 | /** | ||
52 | * A guint | ||
53 | */ | ||
54 | METADATA_MC_TYPE_AS_ENUM = 0, | ||
55 | |||
56 | /** | ||
57 | * A gchararray | ||
58 | */ | ||
59 | METADATA_MC_TYPE_AS_STRING = 1, | ||
60 | 56 | ||
61 | /** | 57 | /** |
62 | * A gchararray | 58 | * A guint |
63 | */ | 59 | */ |
64 | METADATA_MC_VALUE = 2 | 60 | METADATA_MC_TYPE_AS_ENUM = 0, |
61 | |||
62 | /** | ||
63 | * A gchararray | ||
64 | */ | ||
65 | METADATA_MC_TYPE_AS_STRING = 1, | ||
65 | 66 | ||
66 | }; | 67 | /** |
68 | * A gchararray | ||
69 | */ | ||
70 | METADATA_MC_VALUE = 2 | ||
71 | |||
72 | }; | ||
67 | 73 | ||
68 | 74 | ||
69 | /** | 75 | /** |
70 | * Columns in the keyword list tree store. | 76 | * Columns in the keyword list tree store. |
71 | */ | 77 | */ |
72 | enum KEYWORDS_ModelColumns | 78 | enum KEYWORDS_ModelColumns |
73 | { | 79 | { |
74 | 80 | ||
75 | /** | 81 | /** |
76 | * A gchararray | 82 | * A gchararray |
77 | */ | 83 | */ |
78 | KEYWORDS_MC_KEYWORD = 0 | 84 | KEYWORDS_MC_KEYWORD = 0 |
79 | 85 | ||
80 | }; | 86 | }; |
81 | 87 | ||
82 | 88 | ||
83 | /** | 89 | /** |
84 | * Columns in the meta types list tree store. | 90 | * Columns in the meta types list tree store. |
85 | */ | 91 | */ |
86 | enum METATYPES_ModelColumns | 92 | enum METATYPES_ModelColumns |
87 | { | 93 | { |
88 | |||
89 | /** | ||
90 | * A gchararray | ||
91 | */ | ||
92 | METATYPES_MC_TYPE_AS_STRING = 0, | ||
93 | |||
94 | /** | ||
95 | * A guint | ||
96 | */ | ||
97 | METATYPES_MC_TYPE_AS_ENUM = 1 | ||
98 | 94 | ||
99 | }; | 95 | /** |
96 | * A gchararray | ||
97 | */ | ||
98 | METATYPES_MC_TYPE_AS_STRING = 0, | ||
99 | |||
100 | /** | ||
101 | * A guint | ||
102 | */ | ||
103 | METATYPES_MC_TYPE_AS_ENUM = 1 | ||
104 | |||
105 | }; | ||
100 | 106 | ||
101 | 107 | ||
102 | /** | 108 | /** |
@@ -134,9 +140,15 @@ struct AdvertiseContext | |||
134 | */ | 140 | */ |
135 | GtkListStore *meta_types; | 141 | GtkListStore *meta_types; |
136 | 142 | ||
143 | /** | ||
144 | * Number of keywords in the view. | ||
145 | */ | ||
146 | unsigned int num_keywords; | ||
147 | |||
137 | }; | 148 | }; |
138 | 149 | ||
139 | 150 | ||
151 | |||
140 | /** | 152 | /** |
141 | * The user terminated the dialog. Perform the appropriate action. | 153 | * The user terminated the dialog. Perform the appropriate action. |
142 | * | 154 | * |
@@ -161,1115 +173,295 @@ GNUNET_GTK_identity_advertise_dialog_response_cb (GtkDialog *dialog, | |||
161 | GNUNET_free (ac); | 173 | GNUNET_free (ac); |
162 | } | 174 | } |
163 | 175 | ||
164 | |||
165 | /** | ||
166 | * FIXME: do we need this event? If so, what do we do? | ||
167 | */ | ||
168 | void | ||
169 | GNUNET_GTK_identity_advertise_keywords_column_clicked_cb () | ||
170 | { | ||
171 | GNUNET_break (0); | ||
172 | } | ||
173 | |||
174 | 176 | ||
175 | /** | 177 | /** |
176 | * User edited keywords in the keyword tree view. Update | 178 | * User edited keywords in the keyword tree view. Update |
177 | * the model accordingly. | 179 | * the model accordingly. |
178 | */ | ||
179 | void | ||
180 | GNUNET_GTK_identity_advertise_keywords_text_edited_cb () | ||
181 | { | ||
182 | GNUNET_break (0); | ||
183 | } | ||
184 | |||
185 | |||
186 | /** | ||
187 | * User pushed a key in the metadata tree view. Check if it was | ||
188 | * "DEL" and if so, remove the selected values. | ||
189 | */ | ||
190 | void | ||
191 | GNUNET_GTK_identity_advertise_metadata_treeview_key_press_event_cb () | ||
192 | { | ||
193 | GNUNET_break (0); | ||
194 | } | ||
195 | |||
196 | |||
197 | /** | ||
198 | * FIXME: how is this event triggered exactly? | ||
199 | */ | ||
200 | void | ||
201 | GNUNET_GTK_identity_advertise_metadata_treeview_delete_event_cb () | ||
202 | { | ||
203 | GNUNET_break (0); | ||
204 | } | ||
205 | |||
206 | |||
207 | /** | ||
208 | * User edited metadata value. Update sensitivity of the 'add' button. | ||
209 | */ | ||
210 | void | ||
211 | GNUNET_GTK_identity_advertise_metadata_value_text_edited_cb () | ||
212 | { | ||
213 | GNUNET_break (0); | ||
214 | } | ||
215 | |||
216 | |||
217 | /** | ||
218 | * User edited metadata type. Not sure we need to do something here... | ||
219 | */ | ||
220 | void | ||
221 | GNUNET_GTK_identity_advertise_metadata_type_text_edited_cb () | ||
222 | { | ||
223 | GNUNET_break (0); | ||
224 | } | ||
225 | |||
226 | |||
227 | /** | ||
228 | * User clicked the 'add' button, get the type and value and update | ||
229 | * the metadata model. | ||
230 | */ | ||
231 | void | ||
232 | GNUNET_GTK_identity_advertise_metadata_add_button_clicked_cb () | ||
233 | { | ||
234 | GNUNET_break (0); | ||
235 | } | ||
236 | |||
237 | |||
238 | /** | ||
239 | * Run the dialog for advertising a namespace. | ||
240 | * | 180 | * |
241 | * @param priv private key of the namespace to advertise | 181 | * @param renderer the object that created the signal |
242 | */ | 182 | * @param path the path identifying the edited cell |
183 | * @param new_text the new text | ||
184 | * @param user_data the 'struct AdvertiseContext' | ||
185 | */ | ||
243 | void | 186 | void |
244 | GIG_advertise_dialog_start_ (const struct GNUNET_CRYPTO_EccPrivateKey *priv) | 187 | GNUNET_GTK_identity_advertise_keywords_text_edited_cb (GtkCellRendererText *renderer, |
188 | gchar *path, | ||
189 | gchar *new_text, | ||
190 | gpointer user_data) | ||
245 | { | 191 | { |
246 | struct AdvertiseContext *ac; | 192 | struct AdvertiseContext *ac = user_data; |
247 | gint i; | 193 | GtkTreePath *tree_path; |
248 | GtkTreeIter iter; | 194 | GtkTreeIter iter; |
195 | char *old_text; | ||
249 | 196 | ||
250 | ac = GNUNET_new (struct AdvertiseContext); | 197 | tree_path = gtk_tree_path_new_from_string (path); |
251 | ac->priv = *priv; | 198 | if (NULL == tree_path) |
252 | ac->builder = | ||
253 | GNUNET_GTK_get_new_builder ("gnunet_identity_gtk_advertise_dialog.glade", | ||
254 | ac); | ||
255 | if (NULL == ac->builder) | ||
256 | { | 199 | { |
257 | GNUNET_break (0); | 200 | GNUNET_break (0); |
258 | GNUNET_free (ac); | ||
259 | return; | 201 | return; |
260 | } | 202 | } |
261 | ac->dialog = GTK_WIDGET (gtk_builder_get_object | 203 | if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (ac->keywords), |
262 | (ac->builder, "GNUNET_GTK_identity_advertise_dialog")); | 204 | &iter, tree_path)) |
263 | ac->keywords = GTK_LIST_STORE (gtk_builder_get_object | ||
264 | (ac->builder, "GNUNET_GTK_identity_advertise_keywords_liststore")); | ||
265 | ac->metadata = GTK_LIST_STORE (gtk_builder_get_object | ||
266 | (ac->builder, "GNUNET_GTK_identity_advertise_metadata_liststore")); | ||
267 | ac->meta_types = GTK_LIST_STORE (gtk_builder_get_object | ||
268 | (ac->builder, "GNUNET_GTK_identity_metadata_types_liststore")); | ||
269 | for (i = 0; EXTRACTOR_METATYPE_RESERVED != types[i]; i++) | ||
270 | gtk_list_store_insert_with_values (ac->meta_types, | ||
271 | &iter, G_MAXINT, | ||
272 | METATYPES_MC_TYPE_AS_STRING, | ||
273 | EXTRACTOR_metatype_to_string (types[i]), | ||
274 | METATYPES_MC_TYPE_AS_ENUM, | ||
275 | types[i], | ||
276 | -1); | ||
277 | gtk_window_present (GTK_WINDOW (ac->dialog)); | ||
278 | } | ||
279 | |||
280 | |||
281 | #if 0 | ||
282 | |||
283 | static void | ||
284 | sort_order_list (struct GNUNET_GTK_NamespaceManagerContext *ctx, | ||
285 | int sort_column) | ||
286 | { | ||
287 | int sorted = GNUNET_NO; | ||
288 | GtkTreeIter iter; | ||
289 | gint i; | ||
290 | gint row_count; | ||
291 | gint *row_indices, *row_ints; | ||
292 | gchar **row_strings; | ||
293 | |||
294 | ctx->sort_direction = ctx->sort_direction <= 0 ? 1 : 0; | ||
295 | |||
296 | row_count = gtk_tree_model_iter_n_children (GTK_TREE_MODEL ( | ||
297 | ctx->ns_order_store), NULL); | ||
298 | if (! gtk_tree_model_get_iter_first (GTK_TREE_MODEL ( | ||
299 | ctx->ns_order_store), &iter)) | ||
300 | return; | ||
301 | |||
302 | row_indices = g_new0 (gint, row_count); | ||
303 | row_ints = g_new0 (gint, row_count); | ||
304 | row_strings = g_new0 (gchar *, row_count); | ||
305 | |||
306 | for (i = 0; i < row_count; i++) | ||
307 | { | 205 | { |
308 | int an_int; | 206 | GNUNET_break (0); |
309 | char *a_string; | 207 | gtk_tree_path_free (tree_path); |
310 | row_indices[i] = i; | ||
311 | switch (sort_column) | ||
312 | { | ||
313 | case GNUNET_GTK_NAMESPACE_ORDER_RANK_COLUMN: | ||
314 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->ns_order_store), &iter, | ||
315 | sort_column, &an_int, -1); | ||
316 | row_ints[i] = an_int; | ||
317 | row_strings[i] = NULL; | ||
318 | break; | ||
319 | case GNUNET_GTK_NAMESPACE_ORDER_NAME_COLUMN: | ||
320 | case GNUNET_GTK_NAMESPACE_ORDER_IDENTIFIER_COLUMN: | ||
321 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->ns_order_store), &iter, | ||
322 | sort_column, &a_string, -1); | ||
323 | row_strings[i] = a_string; | ||
324 | break; | ||
325 | default: | ||
326 | row_strings[i] = NULL; | ||
327 | break; | ||
328 | } | ||
329 | if (TRUE != gtk_tree_model_iter_next (GTK_TREE_MODEL ( | ||
330 | ctx->ns_order_store), &iter)) | ||
331 | break; | ||
332 | } | ||
333 | |||
334 | while (sorted != GNUNET_YES) | ||
335 | { | ||
336 | sorted = GNUNET_YES; | ||
337 | for (i = 0; i < row_count - 1; i++) | ||
338 | { | ||
339 | int cmp_result; | ||
340 | |||
341 | switch (sort_column) | ||
342 | { | ||
343 | case GNUNET_GTK_NAMESPACE_ORDER_RANK_COLUMN: | ||
344 | cmp_result = row_ints[i] <= row_ints[i + 1] ? 0 : 1; | ||
345 | break; | ||
346 | case GNUNET_GTK_NAMESPACE_ORDER_NAME_COLUMN: | ||
347 | case GNUNET_GTK_NAMESPACE_ORDER_IDENTIFIER_COLUMN: | ||
348 | /* FIXME: name can be UTF-8-encoded, use UTF-8-aware comparison func */ | ||
349 | cmp_result = strcmp (row_strings[i], row_strings[i + 1]); | ||
350 | break; | ||
351 | default: | ||
352 | GNUNET_break (0); | ||
353 | cmp_result = 0; | ||
354 | break; | ||
355 | } | ||
356 | |||
357 | if (((ctx->sort_direction <= 0) && (cmp_result <= 0)) || | ||
358 | ((ctx->sort_direction > 0) && (cmp_result > 0))) | ||
359 | { | ||
360 | int tmp_int, tmp_index; | ||
361 | char *tmp_string; | ||
362 | tmp_index = row_indices[i]; | ||
363 | tmp_int = row_ints[i]; | ||
364 | tmp_string = row_strings[i]; | ||
365 | row_indices[i] = row_indices[i + 1]; | ||
366 | row_ints[i] = row_ints[i + 1]; | ||
367 | row_strings[i] = row_strings[i + 1]; | ||
368 | row_ints[i + 1] = tmp_int; | ||
369 | row_strings[i + 1] = tmp_string; | ||
370 | row_indices[i + 1] = tmp_index; | ||
371 | sorted = GNUNET_NO; | ||
372 | } | ||
373 | } | ||
374 | } | ||
375 | |||
376 | gtk_list_store_reorder (ctx->ns_order_store, row_indices); | ||
377 | |||
378 | g_free (row_indices); | ||
379 | for (i = 0; i < row_count; i++) | ||
380 | g_free (row_strings[i]); | ||
381 | g_free (row_strings); | ||
382 | g_free (row_ints); | ||
383 | } | ||
384 | |||
385 | |||
386 | void | ||
387 | GNUNET_GTK_namespace_manager_namespace_order_column_clicked_cb ( | ||
388 | GtkTreeViewColumn *treeviewcolumn, gpointer user_data) | ||
389 | { | ||
390 | struct GNUNET_GTK_NamespaceManagerContext *ctx = user_data; | ||
391 | if (treeviewcolumn == ctx->order_rank) | ||
392 | { | ||
393 | sort_order_list (ctx, GNUNET_GTK_NAMESPACE_ORDER_RANK_COLUMN); | ||
394 | } | ||
395 | else if (treeviewcolumn == ctx->order_name) | ||
396 | { | ||
397 | sort_order_list (ctx, GNUNET_GTK_NAMESPACE_ORDER_NAME_COLUMN); | ||
398 | } | ||
399 | else if (treeviewcolumn == ctx->order_id) | ||
400 | { | ||
401 | sort_order_list (ctx, GNUNET_GTK_NAMESPACE_ORDER_IDENTIFIER_COLUMN); | ||
402 | } | ||
403 | } | ||
404 | |||
405 | |||
406 | void | ||
407 | GNUNET_GTK_namespace_manager_known_namespaces_delete_button_clicked_cb ( | ||
408 | GtkButton *button, gpointer user_data) | ||
409 | { | ||
410 | struct GNUNET_GTK_NamespaceManagerContext *ctx = user_data; | ||
411 | GtkTreeIter iter; | ||
412 | struct GNUNET_FS_PseudonymIdentifier *nsid; | ||
413 | GtkTreeRowReference *order_row, *known_row; | ||
414 | struct GNUNET_CONTAINER_MetaData *md; | ||
415 | |||
416 | if (FALSE == gtk_tree_selection_get_selected (ctx->known_ns_sel, NULL, &iter)) | ||
417 | return; | 208 | return; |
418 | 209 | } | |
419 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->known_ns_store), &iter, | 210 | gtk_tree_path_free (tree_path); |
420 | GNUNET_GTK_KNOWN_NAMESPACES_IDENTIFIER_BIN_COLUMN, &nsid, | 211 | gtk_tree_model_get (GTK_TREE_MODEL (ac->keywords), &iter, |
421 | GNUNET_GTK_KNOWN_NAMESPACES_ORDER_ROW_REFERENCE_COLUMN, &order_row, | 212 | KEYWORDS_MC_KEYWORD, &old_text, |
422 | GNUNET_GTK_KNOWN_NAMESPACES_METADATA_COLUMN, &md, | 213 | -1); |
423 | -1); | 214 | if (0 == strcmp (NEW_KEYWORD_TEXT, old_text)) |
424 | /* Make sure the store does not contain references to freed objects */ | ||
425 | gtk_list_store_set (ctx->known_ns_store, &iter, | ||
426 | GNUNET_GTK_KNOWN_NAMESPACES_IDENTIFIER_BIN_COLUMN, NULL, | ||
427 | GNUNET_GTK_KNOWN_NAMESPACES_ORDER_ROW_REFERENCE_COLUMN, NULL, | ||
428 | GNUNET_GTK_KNOWN_NAMESPACES_METADATA_COLUMN, NULL, | ||
429 | -1); | ||
430 | GNUNET_CONTAINER_meta_data_destroy (md); | ||
431 | if (order_row != NULL) | ||
432 | { | 215 | { |
433 | if (GNUNET_OK == GNUNET_GTK_get_iter_from_reference (order_row, &iter)) | 216 | if ( (NULL != new_text) && |
217 | (0 != strlen (new_text)) ) | ||
434 | { | 218 | { |
435 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->ns_order_store), &iter, | 219 | gtk_list_store_insert_with_values (ac->keywords, &iter, -1, |
436 | GNUNET_GTK_NAMESPACE_ORDER_KNOWN_ROW_REFERENCE_COLUMN, &known_row, -1); | 220 | KEYWORDS_MC_KEYWORD, new_text, |
437 | gtk_list_store_set (ctx->ns_order_store, &iter, | 221 | -1); |
438 | GNUNET_GTK_NAMESPACE_ORDER_KNOWN_ROW_REFERENCE_COLUMN, NULL, -1); | 222 | ac->num_keywords++; |
439 | if (known_row != NULL) | ||
440 | gtk_tree_row_reference_free (known_row); | ||
441 | gtk_list_store_remove (ctx->ns_order_store, &iter); | ||
442 | } | 223 | } |
443 | gtk_tree_row_reference_free (order_row); | ||
444 | } | 224 | } |
445 | ctx->deleted_namespaces = g_list_prepend (ctx->deleted_namespaces, nsid); | ||
446 | gtk_list_store_remove (ctx->known_ns_store, &iter); | ||
447 | |||
448 | gtk_list_store_clear (ctx->ns_details_store); | ||
449 | GNUNET_CONTAINER_meta_data_destroy (ctx->uneditable_md); | ||
450 | ctx->uneditable_md = NULL; | ||
451 | } | ||
452 | |||
453 | |||
454 | void | ||
455 | GNUNET_GTK_namespace_manager_known_namespaces_swap_rank_button_clicked_cb ( | ||
456 | GtkButton *button, gpointer user_data) | ||
457 | { | ||
458 | struct GNUNET_GTK_NamespaceManagerContext *ctx = user_data; | ||
459 | GtkTreeIter known_iter, order_iter; | ||
460 | struct GNUNET_CRYPTO_EccPublicKey *nsid; | ||
461 | int32_t old_rank, new_rank; | ||
462 | GtkTreeRowReference *order_row, *known_row; | ||
463 | |||
464 | if (FALSE == gtk_tree_selection_get_selected (ctx->known_ns_sel, NULL, &known_iter)) | ||
465 | return; | ||
466 | |||
467 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->known_ns_store), &known_iter, | ||
468 | GNUNET_GTK_KNOWN_NAMESPACES_IDENTIFIER_BIN_COLUMN, &nsid, | ||
469 | GNUNET_GTK_KNOWN_NAMESPACES_RANK_COLUMN, &old_rank, | ||
470 | GNUNET_GTK_KNOWN_NAMESPACES_ORDER_ROW_REFERENCE_COLUMN, &order_row, | ||
471 | -1); | ||
472 | |||
473 | if (old_rank == 0) | ||
474 | new_rank = -1; | ||
475 | else | 225 | else |
476 | new_rank = -old_rank; | ||
477 | |||
478 | gtk_list_store_set (ctx->known_ns_store, &known_iter, | ||
479 | GNUNET_GTK_KNOWN_NAMESPACES_RANK_COLUMN, new_rank, | ||
480 | GNUNET_GTK_KNOWN_NAMESPACES_ORDER_ROW_REFERENCE_COLUMN, NULL, | ||
481 | -1); | ||
482 | |||
483 | if (order_row != NULL) | ||
484 | { | 226 | { |
485 | if (new_rank < 0) | 227 | if ( (NULL != new_text) && |
228 | (0 != strlen (new_text)) ) | ||
486 | { | 229 | { |
487 | if (GNUNET_OK == GNUNET_GTK_get_iter_from_reference (order_row, &order_iter)) | 230 | gtk_list_store_set (ac->keywords, &iter, |
488 | { | 231 | KEYWORDS_MC_KEYWORD, new_text, |
489 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->ns_order_store), &order_iter, | 232 | -1); |
490 | GNUNET_GTK_NAMESPACE_ORDER_KNOWN_ROW_REFERENCE_COLUMN, &known_row, -1); | ||
491 | gtk_list_store_remove (ctx->ns_order_store, &order_iter); | ||
492 | if (known_row != NULL) | ||
493 | gtk_tree_row_reference_free (known_row); | ||
494 | } | ||
495 | } | 233 | } |
496 | gtk_tree_row_reference_free (order_row); | 234 | else |
497 | } | ||
498 | if (new_rank >= 0) | ||
499 | { | ||
500 | char *name, *identifier; | ||
501 | if (order_row != NULL) | ||
502 | { | 235 | { |
503 | /* This should not happen */ | 236 | gtk_list_store_remove (ac->keywords, &iter); |
504 | GNUNET_break (0); | 237 | ac->num_keywords--; |
505 | } | 238 | } |
506 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->known_ns_store), &known_iter, | ||
507 | GNUNET_GTK_KNOWN_NAMESPACES_NAME_COLUMN, &name, | ||
508 | GNUNET_GTK_KNOWN_NAMESPACES_IDENTIFIER_COLUMN, &identifier, | ||
509 | -1); | ||
510 | known_row = GNUNET_GTK_get_reference_from_iter (GTK_TREE_MODEL ( | ||
511 | ctx->known_ns_store), &known_iter); | ||
512 | gtk_list_store_insert_with_values (ctx->ns_order_store, &order_iter, G_MAXINT, | ||
513 | GNUNET_GTK_NAMESPACE_ORDER_RANK_COLUMN, new_rank, | ||
514 | GNUNET_GTK_NAMESPACE_ORDER_NAME_COLUMN, name, | ||
515 | GNUNET_GTK_NAMESPACE_ORDER_IDENTIFIER_COLUMN, identifier, | ||
516 | GNUNET_GTK_NAMESPACE_ORDER_IDENTIFIER_BIN_COLUMN, nsid, | ||
517 | GNUNET_GTK_NAMESPACE_ORDER_KNOWN_ROW_REFERENCE_COLUMN, known_row, | ||
518 | -1); | ||
519 | g_free (name); | ||
520 | g_free (identifier); | ||
521 | order_row = GNUNET_GTK_get_reference_from_iter (GTK_TREE_MODEL (ctx->ns_order_store), | ||
522 | &order_iter); | ||
523 | gtk_list_store_set (ctx->known_ns_store, &known_iter, | ||
524 | GNUNET_GTK_KNOWN_NAMESPACES_ORDER_ROW_REFERENCE_COLUMN, order_row, -1); | ||
525 | } | 239 | } |
240 | g_free (old_text); | ||
241 | gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object | ||
242 | (ac->builder, | ||
243 | "GNUNET_GTK_identity_advertise_ok_button")), | ||
244 | 0 != ac->num_keywords); | ||
526 | } | 245 | } |
527 | 246 | ||
528 | 247 | ||
529 | void | 248 | /** |
530 | GNUNET_GTK_namespace_manager_namespace_order_apply_clicked_cb ( | 249 | * User pushed a key in the metadata tree view. Check if it was |
531 | GtkButton *button, gpointer user_data) | 250 | * "DEL" and if so, remove the selected values. |
251 | * | ||
252 | * @param widget widget creating the signal | ||
253 | * @param event the event to process | ||
254 | * @param user_data the 'struct AdvertiseContext' | ||
255 | * @return TRUE if we handled the event, FALSE if not | ||
256 | */ | ||
257 | gboolean | ||
258 | GNUNET_GTK_identity_advertise_metadata_treeview_key_press_event_cb (GtkWidget *widget, | ||
259 | GdkEventKey *event, | ||
260 | gpointer user_data) | ||
532 | { | 261 | { |
533 | struct GNUNET_GTK_NamespaceManagerContext *ctx = user_data; | 262 | struct AdvertiseContext *ac = user_data; |
263 | GtkTreeSelection *sel; | ||
264 | GtkTreeModel *model; | ||
534 | GtkTreeIter iter; | 265 | GtkTreeIter iter; |
535 | gint i; | ||
536 | gint row_count; | ||
537 | GtkTreeRowReference *known_row; | ||
538 | 266 | ||
539 | row_count = gtk_tree_model_iter_n_children (GTK_TREE_MODEL ( | 267 | if (event->keyval != GDK_KEY_Delete) |
540 | ctx->ns_order_store), NULL); | 268 | return FALSE; |
541 | if (! gtk_tree_model_get_iter_first (GTK_TREE_MODEL ( | 269 | sel = gtk_tree_view_get_selection (GTK_TREE_VIEW |
542 | ctx->ns_order_store), &iter)) | 270 | (gtk_builder_get_object |
543 | return; | 271 | (ac->builder, |
544 | 272 | "GNUNET_GTK_identity_advertise_metadata_treeview"))); | |
545 | for (i = 0; i < row_count; i++) | 273 | if (! gtk_tree_selection_get_selected (sel, |
546 | { | 274 | &model, |
547 | gtk_list_store_set (ctx->ns_order_store, &iter, | 275 | &iter)) |
548 | GNUNET_GTK_NAMESPACE_ORDER_RANK_COLUMN, i, -1); | ||
549 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->ns_order_store), &iter, | ||
550 | GNUNET_GTK_NAMESPACE_ORDER_KNOWN_ROW_REFERENCE_COLUMN, &known_row, -1); | ||
551 | if (known_row == NULL) | ||
552 | { | ||
553 | /* This is not supposed to happen. What to do? */ | ||
554 | GNUNET_break (0); | ||
555 | } | ||
556 | else | ||
557 | { | 276 | { |
558 | GtkTreeIter known_iter; | 277 | gdk_beep (); |
559 | if (GNUNET_OK == GNUNET_GTK_get_iter_from_reference (known_row, &known_iter)) | 278 | return TRUE; |
560 | { | ||
561 | gtk_list_store_set (ctx->known_ns_store, &known_iter, | ||
562 | GNUNET_GTK_KNOWN_NAMESPACES_RANK_COLUMN, i, | ||
563 | -1); | ||
564 | } | ||
565 | } | 279 | } |
566 | if (TRUE != gtk_tree_model_iter_next (GTK_TREE_MODEL ( | 280 | gtk_list_store_remove (ac->metadata, |
567 | ctx->ns_order_store), &iter)) | 281 | &iter); |
568 | break; | 282 | return TRUE; |
569 | } | ||
570 | } | ||
571 | |||
572 | |||
573 | void | ||
574 | GNUNET_GTK_namespace_manager_namespace_details_add_button_clicked_cb ( | ||
575 | GtkButton *button, gpointer user_data) | ||
576 | { | ||
577 | /* FIXME: add a row to the details list. Disabled at the moment, since | ||
578 | * metadata type selection is not implemented. | ||
579 | */ | ||
580 | } | 283 | } |
581 | 284 | ||
582 | 285 | ||
286 | /** | ||
287 | * User edited metadata value in the tree view. Update the model. | ||
288 | * | ||
289 | * @param renderer the object that created the signal | ||
290 | * @param path the path identifying the edited cell | ||
291 | * @param new_text the new text, if empty, remove the line | ||
292 | * @param user_data the 'struct AdvertiseContext' | ||
293 | */ | ||
583 | void | 294 | void |
584 | GNUNET_GTK_namespace_manager_namespace_details_delete_button_clicked_cb ( | 295 | GNUNET_GTK_identity_advertise_metadata_value_text_edited_cb (GtkCellRendererText *renderer, |
585 | GtkButton *button, gpointer user_data) | 296 | gchar *path, |
297 | gchar *new_text, | ||
298 | gpointer user_data) | ||
586 | { | 299 | { |
587 | struct GNUNET_GTK_NamespaceManagerContext *ctx = user_data; | 300 | struct AdvertiseContext *ac = user_data; |
301 | GtkTreePath *tree_path; | ||
588 | GtkTreeIter iter; | 302 | GtkTreeIter iter; |
589 | 303 | ||
590 | if (FALSE == gtk_tree_selection_get_selected (ctx->ns_details_sel, NULL, &iter)) | 304 | tree_path = gtk_tree_path_new_from_string (path); |
591 | return; | 305 | if (NULL == tree_path) |
592 | |||
593 | gtk_list_store_remove (ctx->ns_details_store, &iter); | ||
594 | gtk_widget_set_sensitive (ctx->details_apply_button, TRUE); | ||
595 | } | ||
596 | |||
597 | |||
598 | void | ||
599 | GNUNET_GTK_namespace_manager_namespace_details_apply_button_clicked_cb ( | ||
600 | GtkButton *button, gpointer user_data) | ||
601 | { | ||
602 | struct GNUNET_GTK_NamespaceManagerContext *ctx = user_data; | ||
603 | GtkTreeIter iter, known_iter; | ||
604 | gint i; | ||
605 | gint row_count; | ||
606 | struct GNUNET_CONTAINER_MetaData *md, *old_md; | ||
607 | char *plugin_name; | ||
608 | int type; | ||
609 | char *type_name; | ||
610 | int format; | ||
611 | char *data_mime_type; | ||
612 | char *data; | ||
613 | |||
614 | row_count = gtk_tree_model_iter_n_children (GTK_TREE_MODEL ( | ||
615 | ctx->ns_details_store), NULL); | ||
616 | if ((row_count > 0) && (! gtk_tree_model_get_iter_first ( | ||
617 | GTK_TREE_MODEL (ctx->ns_details_store), &iter))) | ||
618 | { | 306 | { |
619 | /* This should not happen */ | 307 | GNUNET_break (0); |
620 | return; | 308 | return; |
621 | } | 309 | } |
622 | 310 | if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (ac->metadata), | |
623 | if (FALSE == gtk_tree_selection_get_selected (ctx->known_ns_sel, NULL, | 311 | &iter, tree_path)) |
624 | &known_iter)) | ||
625 | { | 312 | { |
626 | /* This should not happen */ | 313 | GNUNET_break (0); |
314 | gtk_tree_path_free (tree_path); | ||
627 | return; | 315 | return; |
628 | } | 316 | } |
629 | 317 | gtk_tree_path_free (tree_path); | |
630 | md = GNUNET_CONTAINER_meta_data_create (); | 318 | if ( (NULL != new_text) && |
631 | 319 | (0 != strlen (new_text)) ) | |
632 | for (i = 0; i < row_count; i++) | 320 | gtk_list_store_set (ac->metadata, &iter, |
633 | { | 321 | METADATA_MC_VALUE, new_text, |
634 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->ns_details_store), &iter, | 322 | -1); |
635 | GNUNET_GTK_NAMESPACE_DETAILS_PLUGIN_NAME_COLUMN, &plugin_name, | 323 | else |
636 | GNUNET_GTK_NAMESPACE_DETAILS_TYPE_BIN_COLUMN, &type, | 324 | gtk_list_store_remove (ac->metadata, &iter); |
637 | GNUNET_GTK_NAMESPACE_DETAILS_TYPE_COLUMN, &type_name, | ||
638 | GNUNET_GTK_NAMESPACE_DETAILS_FORMAT_COLUMN, &format, | ||
639 | GNUNET_GTK_NAMESPACE_DETAILS_DATA_MIME_COLUMN, &data_mime_type, | ||
640 | GNUNET_GTK_NAMESPACE_DETAILS_VALUE_COLUMN, &data, | ||
641 | -1); | ||
642 | GNUNET_CONTAINER_meta_data_insert (md, plugin_name, | ||
643 | type, format, data_mime_type, data, strlen (data) + 1); | ||
644 | g_free (plugin_name); | ||
645 | g_free (type_name); | ||
646 | g_free (data_mime_type); | ||
647 | g_free (data); | ||
648 | if (TRUE != gtk_tree_model_iter_next (GTK_TREE_MODEL ( | ||
649 | ctx->ns_details_store), &iter)) | ||
650 | break; | ||
651 | } | ||
652 | GNUNET_CONTAINER_meta_data_merge (md, | ||
653 | (const struct GNUNET_CONTAINER_MetaData *) ctx->uneditable_md); | ||
654 | |||
655 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->known_ns_store), &known_iter, | ||
656 | GNUNET_GTK_KNOWN_NAMESPACES_METADATA_COLUMN, &old_md, | ||
657 | -1); | ||
658 | GNUNET_CONTAINER_meta_data_destroy (old_md); | ||
659 | gtk_list_store_set (ctx->known_ns_store, &known_iter, | ||
660 | GNUNET_GTK_KNOWN_NAMESPACES_METADATA_COLUMN, md, | ||
661 | -1); | ||
662 | gtk_widget_set_sensitive (ctx->details_apply_button, FALSE); | ||
663 | } | 325 | } |
664 | 326 | ||
665 | 327 | ||
328 | /** | ||
329 | * User edited the 'value' field for inserting meta data. Update | ||
330 | * sensitivity of the 'add' button accordingly. | ||
331 | * | ||
332 | * @param editable the widget that was edited | ||
333 | * @param user_data the 'struct AdvertiseContext' | ||
334 | */ | ||
666 | void | 335 | void |
667 | GNUNET_GTK_namespace_manager_name_text_editing_started_cb ( | 336 | GNUNET_GTK_identity_advertise_metadata_value_entry_changed_cb (GtkEditable *editable, |
668 | GtkCellRenderer *renderer, GtkCellEditable *editable, gchar *path, | 337 | gpointer user_data) |
669 | gpointer user_data) | ||
670 | { | 338 | { |
671 | struct GNUNET_GTK_NamespaceManagerContext *ctx = user_data; | 339 | struct AdvertiseContext *ac = user_data; |
672 | 340 | const char *value; | |
673 | if (GTK_IS_ENTRY (editable)) | 341 | GtkEntry *value_entry; |
342 | GtkWidget * add_button; | ||
343 | |||
344 | value_entry = GTK_ENTRY (gtk_builder_get_object (ac->builder, | ||
345 | "GNUNET_GTK_identity_advertise_metadata_value_entry")); | ||
346 | value = gtk_entry_get_text (value_entry); | ||
347 | add_button = GTK_WIDGET (gtk_builder_get_object (ac->builder, | ||
348 | "GNUNET_GTK_identity_advertise_metadata_add_button")); | ||
349 | if ( (NULL == value) || | ||
350 | (0 == strlen (value)) ) | ||
674 | { | 351 | { |
675 | GtkTreePath *tree_path; | 352 | gtk_widget_set_sensitive (add_button, |
676 | GtkTreeIter iter; | 353 | FALSE); |
677 | char *non_unique_name = NULL; | ||
678 | GtkEntry *entry = GTK_ENTRY (editable); | ||
679 | |||
680 | tree_path = gtk_tree_path_new_from_string (path); | ||
681 | if (tree_path != NULL) | ||
682 | { | ||
683 | if (gtk_tree_model_get_iter (GTK_TREE_MODEL (ctx->known_ns_store), | ||
684 | &iter, tree_path)) | ||
685 | { | ||
686 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->known_ns_store), &iter, | ||
687 | GNUNET_GTK_KNOWN_NAMESPACES_NON_UNIQUE_NAME_COLUMN, &non_unique_name, | ||
688 | -1); | ||
689 | } | ||
690 | gtk_tree_path_free (tree_path); | ||
691 | } | ||
692 | if (non_unique_name == NULL) | ||
693 | { | ||
694 | gtk_cell_editable_editing_done (editable); | ||
695 | return; | ||
696 | } | ||
697 | gtk_entry_set_text (entry, non_unique_name); | ||
698 | g_free (non_unique_name); | ||
699 | } | ||
700 | } | ||
701 | |||
702 | |||
703 | void | ||
704 | GNUNET_GTK_namespace_manager_name_text_edited_cb ( | ||
705 | GtkCellRendererText *renderer, gchar *path, gchar *new_text, | ||
706 | gpointer user_data) | ||
707 | { | ||
708 | struct GNUNET_GTK_NamespaceManagerContext *ctx = user_data; | ||
709 | char *unique_name; | ||
710 | GtkTreeRowReference *order_row; | ||
711 | |||
712 | if (strlen (new_text) == 0) | ||
713 | return; | 354 | return; |
714 | |||
715 | GtkTreePath *tree_path; | ||
716 | GtkTreeIter iter; | ||
717 | tree_path = gtk_tree_path_new_from_string (path); | ||
718 | if (tree_path != NULL) | ||
719 | { | ||
720 | if (gtk_tree_model_get_iter (GTK_TREE_MODEL (ctx->known_ns_store), | ||
721 | &iter, tree_path)) | ||
722 | { | ||
723 | struct GNUNET_CRYPTO_EccPublicKey *nsid; | ||
724 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->known_ns_store), &iter, | ||
725 | GNUNET_GTK_KNOWN_NAMESPACES_IDENTIFIER_BIN_COLUMN, &nsid, | ||
726 | GNUNET_GTK_KNOWN_NAMESPACES_ORDER_ROW_REFERENCE_COLUMN, &order_row, | ||
727 | -1); | ||
728 | |||
729 | unique_name = GNUNET_FS_pseudonym_name_uniquify ( | ||
730 | GNUNET_FS_GTK_get_configuration (), nsid, new_text, NULL); | ||
731 | |||
732 | gtk_list_store_set (ctx->known_ns_store, &iter, | ||
733 | GNUNET_GTK_KNOWN_NAMESPACES_NON_UNIQUE_NAME_COLUMN, new_text, | ||
734 | GNUNET_GTK_KNOWN_NAMESPACES_NAME_COLUMN, unique_name, | ||
735 | -1); | ||
736 | |||
737 | if (order_row != NULL) | ||
738 | { | ||
739 | GtkTreeIter order_iter; | ||
740 | if (GNUNET_OK == GNUNET_GTK_get_iter_from_reference (order_row, &order_iter)) | ||
741 | { | ||
742 | gtk_list_store_set (ctx->ns_order_store, &order_iter, | ||
743 | GNUNET_GTK_NAMESPACE_ORDER_NAME_COLUMN, unique_name, | ||
744 | -1); | ||
745 | } | ||
746 | } | ||
747 | |||
748 | GNUNET_free (unique_name); | ||
749 | } | ||
750 | gtk_tree_path_free (tree_path); | ||
751 | } | ||
752 | } | ||
753 | |||
754 | |||
755 | void | ||
756 | GNUNET_GTK_namespace_manager_namespace_details_type_text_edited_cb ( | ||
757 | GtkCellRendererText *renderer, gchar *path, gchar *new_text, | ||
758 | gpointer user_data) | ||
759 | { | ||
760 | /* Changing metadata type is more difficult than simply entering a | ||
761 | * new string, see publication editing dialog. So this is disabled | ||
762 | * for now. In fact, it's not going to be a Text renderer when it's done. | ||
763 | */ | ||
764 | /* | ||
765 | struct GNUNET_GTK_NamespaceManagerContext *ctx = cls; | ||
766 | GtkTreeIter iter; | ||
767 | if (gtk_tree_model_get_iter (GTK_TREE_MODEL (ctx->ns_details_store), | ||
768 | &iter, path)) | ||
769 | { | ||
770 | gtk_list_store_set (ctx->ns_details_store, &iter, | ||
771 | GNUNET_GTK_NAMESPACE_DETAILS_TYPE_COLUMN, new_text, | ||
772 | -1); | ||
773 | } | ||
774 | */ | ||
775 | } | ||
776 | |||
777 | |||
778 | void | ||
779 | GNUNET_GTK_namespace_manager_namespace_details_value_text_edited_cb ( | ||
780 | GtkCellRendererText *renderer, gchar *path, gchar *new_text, | ||
781 | gpointer user_data) | ||
782 | { | ||
783 | struct GNUNET_GTK_NamespaceManagerContext *ctx = user_data; | ||
784 | GtkTreePath *tree_path; | ||
785 | GtkTreeIter iter; | ||
786 | tree_path = gtk_tree_path_new_from_string (path); | ||
787 | if (tree_path != NULL) | ||
788 | { | ||
789 | if (gtk_tree_model_get_iter (GTK_TREE_MODEL (ctx->ns_details_store), | ||
790 | &iter, tree_path)) | ||
791 | { | ||
792 | char *old_text; | ||
793 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->ns_details_store), &iter, | ||
794 | GNUNET_GTK_NAMESPACE_DETAILS_VALUE_COLUMN, &old_text, | ||
795 | -1); | ||
796 | if (strcmp (old_text, new_text) != 0) | ||
797 | { | ||
798 | gtk_list_store_set (ctx->ns_details_store, &iter, | ||
799 | GNUNET_GTK_NAMESPACE_DETAILS_VALUE_COLUMN, new_text, | ||
800 | -1); | ||
801 | gtk_widget_set_sensitive (ctx->details_apply_button, TRUE); | ||
802 | } | ||
803 | g_free (old_text); | ||
804 | } | ||
805 | gtk_tree_path_free (tree_path); | ||
806 | } | 355 | } |
356 | gtk_widget_set_sensitive (add_button, | ||
357 | TRUE); | ||
807 | } | 358 | } |
808 | 359 | ||
809 | 360 | ||
810 | /** | 361 | /** |
811 | * Iterator over all known pseudonyms. | 362 | * User clicked the 'add' button, get the type and value and update |
812 | * Populate "known ns" and "ns order" lists. | 363 | * the metadata model. |
813 | * | 364 | * |
814 | * @param cls closure | 365 | * @param button the 'add' button |
815 | * @param pseudonym hash code of public key of pseudonym | 366 | * @param user_data the 'struct AdvertiseContext' |
816 | * @param md meta data known about the pseudonym | ||
817 | * @param rating the local rating of the pseudonym | ||
818 | * @return GNUNET_OK to continue iteration, GNUNET_SYSERR to abort | ||
819 | */ | 367 | */ |
820 | static int | 368 | void |
821 | populate_known_ns_list (void *cls, | 369 | GNUNET_GTK_identity_advertise_metadata_add_button_clicked_cb (GtkButton * button, |
822 | const struct GNUNET_CRYPTO_EccPublicKey *pseudonym, | 370 | gpointer user_data) |
823 | const char *name, const char *unique_name, | ||
824 | const struct GNUNET_CONTAINER_MetaData *md, | ||
825 | int rating) | ||
826 | { | ||
827 | struct GNUNET_GTK_NamespaceManagerContext *ctx = cls; | ||
828 | struct GNUNET_CRYPTO_EccPublicKey *nsid; | ||
829 | char buf[1024]; | ||
830 | char *ret; | ||
831 | GtkTreeIter known_iter, order_iter; | ||
832 | struct GNUNET_CONTAINER_MetaData *md_copy; | ||
833 | char *non_null_name, *non_null_unique_name; | ||
834 | |||
835 | nsid = GNUNET_new (struct GNUNET_CRYPTO_EccPublicKey); | ||
836 | *nsid = *pseudonym; | ||
837 | |||
838 | ret = GNUNET_STRINGS_data_to_string (nsid, | ||
839 | sizeof (struct GNUNET_CRYPTO_EccPublicKey), | ||
840 | buf, | ||
841 | sizeof (buf)); | ||
842 | GNUNET_assert (NULL != ret); | ||
843 | ret[0] = '\0'; | ||
844 | |||
845 | GNUNET_FS_pseudonym_get_info (GNUNET_FS_GTK_get_configuration (), | ||
846 | nsid, NULL, NULL, &non_null_name, NULL); | ||
847 | non_null_unique_name = GNUNET_FS_pseudonym_name_uniquify ( | ||
848 | GNUNET_FS_GTK_get_configuration (), nsid, non_null_name, NULL); | ||
849 | |||
850 | md_copy = GNUNET_CONTAINER_meta_data_duplicate (md); | ||
851 | |||
852 | gtk_list_store_insert_with_values (ctx->known_ns_store, &known_iter, G_MAXINT, | ||
853 | GNUNET_GTK_KNOWN_NAMESPACES_IS_MINE_COLUMN, FALSE, | ||
854 | GNUNET_GTK_KNOWN_NAMESPACES_RANK_COLUMN, rating, | ||
855 | GNUNET_GTK_KNOWN_NAMESPACES_NAME_COLUMN, non_null_unique_name, | ||
856 | GNUNET_GTK_KNOWN_NAMESPACES_IDENTIFIER_COLUMN, buf, | ||
857 | GNUNET_GTK_KNOWN_NAMESPACES_IDENTIFIER_BIN_COLUMN, nsid, | ||
858 | GNUNET_GTK_KNOWN_NAMESPACES_ORDER_ROW_REFERENCE_COLUMN, NULL, | ||
859 | GNUNET_GTK_KNOWN_NAMESPACES_METADATA_COLUMN, md_copy, | ||
860 | GNUNET_GTK_KNOWN_NAMESPACES_NON_UNIQUE_NAME_COLUMN, non_null_name, | ||
861 | -1); | ||
862 | |||
863 | if (rating >= 0) | ||
864 | { | ||
865 | GtkTreeRowReference *rr = GNUNET_GTK_get_reference_from_iter (GTK_TREE_MODEL ( | ||
866 | ctx->known_ns_store), &known_iter); | ||
867 | gtk_list_store_insert_with_values (ctx->ns_order_store, &order_iter, G_MAXINT, | ||
868 | GNUNET_GTK_NAMESPACE_ORDER_RANK_COLUMN, rating, | ||
869 | GNUNET_GTK_NAMESPACE_ORDER_NAME_COLUMN, non_null_unique_name, | ||
870 | GNUNET_GTK_NAMESPACE_ORDER_IDENTIFIER_COLUMN, buf, | ||
871 | GNUNET_GTK_NAMESPACE_ORDER_IDENTIFIER_BIN_COLUMN, nsid, | ||
872 | GNUNET_GTK_NAMESPACE_ORDER_KNOWN_ROW_REFERENCE_COLUMN, rr, | ||
873 | -1); | ||
874 | rr = GNUNET_GTK_get_reference_from_iter (GTK_TREE_MODEL (ctx->ns_order_store), | ||
875 | &order_iter); | ||
876 | gtk_list_store_set (ctx->known_ns_store, &known_iter, | ||
877 | GNUNET_GTK_KNOWN_NAMESPACES_ORDER_ROW_REFERENCE_COLUMN, rr, -1); | ||
878 | } | ||
879 | GNUNET_free (non_null_name); | ||
880 | GNUNET_free (non_null_unique_name); | ||
881 | |||
882 | return GNUNET_OK; | ||
883 | } | ||
884 | |||
885 | |||
886 | static void | ||
887 | apply_known_ns_changes (struct GNUNET_GTK_NamespaceManagerContext *ctx) | ||
888 | { | 371 | { |
372 | struct AdvertiseContext *ac = user_data; | ||
889 | GtkTreeIter iter; | 373 | GtkTreeIter iter; |
890 | gint i; | 374 | guint type; |
891 | gint row_count; | 375 | const char *type_as_string; |
892 | struct GNUNET_CRYPTO_EccPublicKey *nsid; | 376 | const char *value; |
893 | char *name; | 377 | GtkEntry *value_entry; |
894 | int32_t rank; | 378 | GtkComboBox *type_box; |
895 | struct GNUNET_CONTAINER_MetaData *md; | 379 | |
896 | 380 | type_box = GTK_COMBO_BOX (gtk_builder_get_object (ac->builder, | |
897 | row_count = gtk_tree_model_iter_n_children (GTK_TREE_MODEL ( | 381 | "GNUNET_GTK_identity_advertise_metadata_type_combobox")); |
898 | ctx->known_ns_store), NULL); | 382 | if (! gtk_combo_box_get_active_iter (type_box, |
899 | if (! gtk_tree_model_get_iter_first (GTK_TREE_MODEL ( | 383 | &iter)) |
900 | ctx->known_ns_store), &iter)) | ||
901 | return; | ||
902 | |||
903 | for (i = 0; i < row_count; i++) | ||
904 | { | ||
905 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->known_ns_store), &iter, | ||
906 | GNUNET_GTK_KNOWN_NAMESPACES_IDENTIFIER_BIN_COLUMN, &nsid, | ||
907 | GNUNET_GTK_KNOWN_NAMESPACES_NON_UNIQUE_NAME_COLUMN, &name, | ||
908 | GNUNET_GTK_KNOWN_NAMESPACES_METADATA_COLUMN, &md, | ||
909 | GNUNET_GTK_KNOWN_NAMESPACES_RANK_COLUMN, &rank, | ||
910 | -1); | ||
911 | GNUNET_FS_pseudonym_set_info (GNUNET_FS_GTK_get_configuration (), | ||
912 | nsid, name, md, rank); | ||
913 | g_free (name); | ||
914 | if (TRUE != gtk_tree_model_iter_next (GTK_TREE_MODEL ( | ||
915 | ctx->known_ns_store), &iter)) | ||
916 | break; | ||
917 | } | ||
918 | #if FIXME_NAMESPACE_REMOVAL | ||
919 | while (NULL != ctx->deleted_namespaces) | ||
920 | { | 384 | { |
921 | nsid = ctx->deleted_namespaces->data; | 385 | GNUNET_break (0); |
922 | if (nsid) | ||
923 | { | ||
924 | GNUNET_FS_pseudonym_remove (GNUNET_FS_GTK_get_configuration (), nsid); | ||
925 | GNUNET_free (nsid); | ||
926 | } | ||
927 | ctx->deleted_namespaces = g_list_delete_link (ctx->deleted_namespaces, ctx->deleted_namespaces); | ||
928 | } | ||
929 | #endif | ||
930 | } | ||
931 | |||
932 | |||
933 | static void | ||
934 | free_lists_contents (struct GNUNET_GTK_NamespaceManagerContext *ctx) | ||
935 | { | ||
936 | GtkTreeIter iter; | ||
937 | gint i; | ||
938 | gint row_count; | ||
939 | struct GNUNET_CRYPTO_EccPublicKey *nsid; | ||
940 | GtkTreeRowReference *order_row; | ||
941 | struct GNUNET_CONTAINER_MetaData *md; | ||
942 | |||
943 | row_count = gtk_tree_model_iter_n_children (GTK_TREE_MODEL ( | ||
944 | ctx->known_ns_store), NULL); | ||
945 | if (! gtk_tree_model_get_iter_first (GTK_TREE_MODEL ( | ||
946 | ctx->known_ns_store), &iter)) | ||
947 | return; | 386 | return; |
948 | |||
949 | for (i = 0; i < row_count; i++) | ||
950 | { | ||
951 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->known_ns_store), &iter, | ||
952 | GNUNET_GTK_KNOWN_NAMESPACES_IDENTIFIER_BIN_COLUMN, &nsid, | ||
953 | GNUNET_GTK_KNOWN_NAMESPACES_ORDER_ROW_REFERENCE_COLUMN, &order_row, | ||
954 | GNUNET_GTK_KNOWN_NAMESPACES_METADATA_COLUMN, &md, | ||
955 | -1); | ||
956 | /* Make sure the store does not contain references to freed objects */ | ||
957 | gtk_list_store_set (ctx->known_ns_store, &iter, | ||
958 | GNUNET_GTK_KNOWN_NAMESPACES_IDENTIFIER_BIN_COLUMN, NULL, | ||
959 | GNUNET_GTK_KNOWN_NAMESPACES_ORDER_ROW_REFERENCE_COLUMN, NULL, | ||
960 | GNUNET_GTK_KNOWN_NAMESPACES_METADATA_COLUMN, NULL, | ||
961 | -1); | ||
962 | if (order_row != NULL) | ||
963 | { | ||
964 | GtkTreeIter order_iter; | ||
965 | if (GNUNET_OK == GNUNET_GTK_get_iter_from_reference (order_row, &order_iter)) | ||
966 | { | ||
967 | GtkTreeRowReference *known_row; | ||
968 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->ns_order_store), &order_iter, | ||
969 | GNUNET_GTK_NAMESPACE_ORDER_KNOWN_ROW_REFERENCE_COLUMN, &known_row, | ||
970 | -1); | ||
971 | if (known_row != NULL) | ||
972 | gtk_tree_row_reference_free (known_row); | ||
973 | } | ||
974 | gtk_tree_row_reference_free (order_row); | ||
975 | } | ||
976 | GNUNET_CONTAINER_meta_data_destroy (md); | ||
977 | GNUNET_free (nsid); | ||
978 | if (TRUE != gtk_tree_model_iter_next (GTK_TREE_MODEL ( | ||
979 | ctx->known_ns_store), &iter)) | ||
980 | break; | ||
981 | } | ||
982 | |||
983 | gtk_list_store_clear (ctx->ns_order_store); | ||
984 | gtk_list_store_clear (ctx->known_ns_store); | ||
985 | gtk_list_store_clear (ctx->ns_details_store); | ||
986 | if (ctx->uneditable_md != NULL) | ||
987 | GNUNET_CONTAINER_meta_data_destroy (ctx->uneditable_md); | ||
988 | } | ||
989 | |||
990 | |||
991 | void | ||
992 | GNUNET_GTK_namespace_manager_dialog_response_cb (GtkDialog *dialog, | ||
993 | gint response_id, gpointer user_data) | ||
994 | { | ||
995 | struct GNUNET_GTK_NamespaceManagerContext *ctx = user_data; | ||
996 | switch (response_id) | ||
997 | { | ||
998 | case GTK_RESPONSE_APPLY: | ||
999 | case GTK_RESPONSE_OK: | ||
1000 | apply_known_ns_changes (ctx); | ||
1001 | GNUNET_GTK_main_window_refresh_ns_list (ctx->main_ctx); | ||
1002 | break; | ||
1003 | default: | ||
1004 | break; | ||
1005 | } | 387 | } |
1006 | switch (response_id) | 388 | gtk_tree_model_get (GTK_TREE_MODEL (ac->meta_types), |
389 | &iter, | ||
390 | METATYPES_MC_TYPE_AS_ENUM, &type, | ||
391 | -1); | ||
392 | type_as_string = EXTRACTOR_metatype_to_string (type); | ||
393 | value_entry = GTK_ENTRY (gtk_builder_get_object (ac->builder, | ||
394 | "GNUNET_GTK_identity_advertise_metadata_value_entry")); | ||
395 | value = gtk_entry_get_text (value_entry); | ||
396 | if ( (NULL == value) || | ||
397 | (0 == strlen (value)) ) | ||
1007 | { | 398 | { |
1008 | case GTK_RESPONSE_APPLY: | 399 | GNUNET_break (0); |
1009 | break; | 400 | return; |
1010 | case GTK_RESPONSE_OK: | ||
1011 | case GTK_RESPONSE_CANCEL: | ||
1012 | default: | ||
1013 | free_lists_contents (ctx); | ||
1014 | gtk_widget_destroy (GTK_WIDGET (ctx->namespace_manager)); | ||
1015 | GNUNET_free (ctx); | ||
1016 | } | 401 | } |
1017 | } | 402 | gtk_list_store_insert_with_values (ac->metadata, |
1018 | 403 | &iter, 0, | |
1019 | 404 | METADATA_MC_TYPE_AS_ENUM, type, | |
1020 | static gboolean | 405 | METADATA_MC_TYPE_AS_STRING, type_as_string, |
1021 | mark_as_mine (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, | 406 | METADATA_MC_VALUE, value, |
1022 | gpointer data) | 407 | -1); |
1023 | { | 408 | gtk_entry_set_text (value_entry, ""); |
1024 | const struct GNUNET_CRYPTO_EccPublicKey *mine_id = data; | ||
1025 | const struct GNUNET_CRYPTO_EccPublicKey *ns_id; | ||
1026 | |||
1027 | gtk_tree_model_get (model, iter, | ||
1028 | GNUNET_GTK_KNOWN_NAMESPACES_IDENTIFIER_BIN_COLUMN, &ns_id, -1); | ||
1029 | |||
1030 | if (memcmp (ns_id, mine_id, sizeof (struct GNUNET_CRYPTO_EccPublicKey)) != 0) | ||
1031 | return FALSE; | ||
1032 | |||
1033 | gtk_list_store_set (GTK_LIST_STORE (model), iter, | ||
1034 | GNUNET_GTK_KNOWN_NAMESPACES_IS_MINE_COLUMN, TRUE, -1); | ||
1035 | return TRUE; | ||
1036 | } | 409 | } |
1037 | 410 | ||
1038 | 411 | ||
1039 | /** | 412 | /** |
1040 | * Callback with information about local (!) namespaces. | 413 | * Run the dialog for advertising a namespace. |
1041 | * Contains the names of the local namespace and the global | ||
1042 | * ID. | ||
1043 | * | 414 | * |
1044 | * @param cls closure | 415 | * @param priv private key of the namespace to advertise |
1045 | * @param name human-readable identifier of the namespace | ||
1046 | * @param id hash identifier for the namespace | ||
1047 | */ | 416 | */ |
1048 | static void | 417 | void |
1049 | mark_namespaces_as_mine (void *cls, const char *name, | 418 | GIG_advertise_dialog_start_ (const struct GNUNET_CRYPTO_EccPrivateKey *priv) |
1050 | const struct GNUNET_CRYPTO_EccPublicKey *id) | ||
1051 | { | ||
1052 | struct GNUNET_GTK_NamespaceManagerContext *ctx = cls; | ||
1053 | |||
1054 | gtk_tree_model_foreach (GTK_TREE_MODEL (ctx->known_ns_store), mark_as_mine, | ||
1055 | (gpointer) id); | ||
1056 | } | ||
1057 | |||
1058 | |||
1059 | /** | ||
1060 | * Type of a function that libextractor calls for each | ||
1061 | * meta data item found. | ||
1062 | * | ||
1063 | * @param cls closure (user-defined) | ||
1064 | * @param plugin_name name of the plugin that produced this value; | ||
1065 | * special values can be used (i.e. '<zlib>' for zlib being | ||
1066 | * used in the main libextractor library and yielding | ||
1067 | * meta data). | ||
1068 | * @param type libextractor-type describing the meta data | ||
1069 | * @param format basic format information about data | ||
1070 | * @param data_mime_type mime-type of data (not of the original file); | ||
1071 | * can be NULL (if mime-type is not known) | ||
1072 | * @param data actual meta-data found | ||
1073 | * @param data_len number of bytes in data | ||
1074 | * @return 0 to continue extracting, 1 to abort | ||
1075 | */ | ||
1076 | static int | ||
1077 | populate_details_list (void *cls, const char *plugin_name, | ||
1078 | enum EXTRACTOR_MetaType type, enum EXTRACTOR_MetaFormat format, | ||
1079 | const char *data_mime_type, const char *data, size_t data_len) | ||
1080 | { | ||
1081 | struct GNUNET_GTK_NamespaceManagerContext *ctx = cls; | ||
1082 | const char *type_name; | ||
1083 | char *data_utf8; | ||
1084 | |||
1085 | if (format == EXTRACTOR_METAFORMAT_UTF8 || | ||
1086 | format == EXTRACTOR_METAFORMAT_C_STRING) | ||
1087 | { | ||
1088 | type_name = EXTRACTOR_metatype_to_string (type); | ||
1089 | /* TODO: translate type_name using dgettext? */ | ||
1090 | data_utf8 = GNUNET_FS_GTK_dubious_meta_to_utf8 (format, data, data_len); | ||
1091 | if (data != NULL) | ||
1092 | { | ||
1093 | gtk_list_store_insert_with_values (ctx->ns_details_store, NULL, G_MAXINT, | ||
1094 | GNUNET_GTK_NAMESPACE_DETAILS_PLUGIN_NAME_COLUMN, plugin_name, | ||
1095 | GNUNET_GTK_NAMESPACE_DETAILS_TYPE_BIN_COLUMN, type, | ||
1096 | GNUNET_GTK_NAMESPACE_DETAILS_TYPE_COLUMN, type_name, | ||
1097 | GNUNET_GTK_NAMESPACE_DETAILS_FORMAT_COLUMN, | ||
1098 | EXTRACTOR_METAFORMAT_UTF8, | ||
1099 | GNUNET_GTK_NAMESPACE_DETAILS_DATA_MIME_COLUMN, data_mime_type, | ||
1100 | GNUNET_GTK_NAMESPACE_DETAILS_VALUE_COLUMN, data_utf8, | ||
1101 | -1); | ||
1102 | GNUNET_free (data_utf8); | ||
1103 | return 0; | ||
1104 | } | ||
1105 | } | ||
1106 | GNUNET_CONTAINER_meta_data_insert (ctx->uneditable_md, | ||
1107 | plugin_name, type, format, data_mime_type, data, data_len); | ||
1108 | return 0; | ||
1109 | } | ||
1110 | |||
1111 | |||
1112 | static void | ||
1113 | ns_details_selection_changed (GtkTreeSelection *treeselection, | ||
1114 | gpointer user_data) | ||
1115 | { | ||
1116 | struct GNUNET_GTK_NamespaceManagerContext *ctx = user_data; | ||
1117 | GtkTreeIter iter; | ||
1118 | |||
1119 | if (FALSE == gtk_tree_selection_get_selected (ctx->ns_details_sel, NULL, &iter)) | ||
1120 | { | ||
1121 | gtk_widget_set_sensitive (ctx->details_delete_button, FALSE); | ||
1122 | return; | ||
1123 | } | ||
1124 | |||
1125 | gtk_widget_set_sensitive (ctx->details_delete_button, TRUE); | ||
1126 | } | ||
1127 | |||
1128 | |||
1129 | static void | ||
1130 | known_ns_selection_changed (GtkTreeSelection *treeselection, | ||
1131 | gpointer user_data) | ||
1132 | { | 419 | { |
1133 | struct GNUNET_GTK_NamespaceManagerContext *ctx = user_data; | 420 | struct AdvertiseContext *ac; |
421 | gint i; | ||
1134 | GtkTreeIter iter; | 422 | GtkTreeIter iter; |
1135 | const struct GNUNET_CONTAINER_MetaData *md; | ||
1136 | |||
1137 | if (FALSE == gtk_tree_selection_get_selected (ctx->known_ns_sel, NULL, &iter)) | ||
1138 | return; | ||
1139 | 423 | ||
1140 | gtk_tree_model_get (GTK_TREE_MODEL (ctx->known_ns_store), &iter, | 424 | ac = GNUNET_new (struct AdvertiseContext); |
1141 | GNUNET_GTK_KNOWN_NAMESPACES_METADATA_COLUMN, &md, | 425 | ac->priv = *priv; |
1142 | -1); | 426 | ac->builder = |
1143 | if (ctx->uneditable_md != NULL) | 427 | GNUNET_GTK_get_new_builder ("gnunet_identity_gtk_advertise_dialog.glade", |
1144 | GNUNET_CONTAINER_meta_data_clear (ctx->uneditable_md); | 428 | ac); |
1145 | else | 429 | if (NULL == ac->builder) |
1146 | ctx->uneditable_md = GNUNET_CONTAINER_meta_data_create (); | ||
1147 | gtk_list_store_clear (ctx->ns_details_store); | ||
1148 | gtk_widget_set_sensitive (ctx->details_apply_button, FALSE); | ||
1149 | if (NULL != md) | ||
1150 | GNUNET_CONTAINER_meta_data_iterate ((const struct GNUNET_CONTAINER_MetaData *) md, | ||
1151 | populate_details_list, ctx); | ||
1152 | else | ||
1153 | GNUNET_break (0); | ||
1154 | gtk_widget_set_sensitive (ctx->details_apply_button, FALSE); | ||
1155 | } | ||
1156 | |||
1157 | |||
1158 | GtkWindow * | ||
1159 | GNUNET_GTK_namespace_manager_open (struct GNUNET_GTK_MainWindowContext *main_ctx) | ||
1160 | { | ||
1161 | struct GNUNET_GTK_NamespaceManagerContext *ctx; | ||
1162 | |||
1163 | ctx = GNUNET_new (struct GNUNET_GTK_NamespaceManagerContext); | ||
1164 | ctx->builder = GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_namespace_manager.glade", ctx); | ||
1165 | if (ctx->builder == NULL) | ||
1166 | { | 430 | { |
1167 | GNUNET_break (0); | 431 | GNUNET_break (0); |
1168 | GNUNET_free (ctx); | 432 | GNUNET_free (ac); |
1169 | return NULL; | 433 | return; |
1170 | } | 434 | } |
1171 | 435 | ac->dialog = GTK_WIDGET (gtk_builder_get_object | |
1172 | ctx->main_ctx = main_ctx; | 436 | (ac->builder, "GNUNET_GTK_identity_advertise_dialog")); |
1173 | 437 | ac->keywords = GTK_LIST_STORE (gtk_builder_get_object | |
1174 | /* initialize widget references */ | 438 | (ac->builder, "GNUNET_GTK_identity_advertise_keywords_liststore")); |
1175 | ctx->known_ns = GTK_WIDGET (gtk_builder_get_object (ctx->builder, | 439 | ac->metadata = GTK_LIST_STORE (gtk_builder_get_object |
1176 | "GNUNET_GTK_namespace_manager_known_treeview")); | 440 | (ac->builder, "GNUNET_GTK_identity_advertise_metadata_liststore")); |
1177 | ctx->ns_order = GTK_WIDGET (gtk_builder_get_object (ctx->builder, | 441 | ac->meta_types = GTK_LIST_STORE (gtk_builder_get_object |
1178 | "GNUNET_GTK_namespace_manager_namespace_order_treeview")); | 442 | (ac->builder, "GNUNET_GTK_identity_metadata_types_liststore")); |
1179 | ctx->ns_details = GTK_WIDGET (gtk_builder_get_object (ctx->builder, | 443 | for (i = 0; EXTRACTOR_METATYPE_RESERVED != types[i]; i++) |
1180 | "GNUNET_GTK_namespace_manager_namespace_details_treeview")); | ||
1181 | ctx->known_ns_sel = gtk_tree_view_get_selection (GTK_TREE_VIEW ( | ||
1182 | ctx->known_ns)); | ||
1183 | ctx->ns_order_sel = gtk_tree_view_get_selection (GTK_TREE_VIEW ( | ||
1184 | ctx->ns_order)); | ||
1185 | ctx->ns_details_sel = gtk_tree_view_get_selection (GTK_TREE_VIEW ( | ||
1186 | ctx->ns_details)); | ||
1187 | ctx->ns_order_store = GTK_LIST_STORE (gtk_tree_view_get_model ( | ||
1188 | GTK_TREE_VIEW (ctx->ns_order))); | ||
1189 | ctx->known_ns_store = GTK_LIST_STORE (gtk_tree_view_get_model ( | ||
1190 | GTK_TREE_VIEW (ctx->known_ns))); | ||
1191 | ctx->ns_details_store = GTK_LIST_STORE (gtk_tree_view_get_model ( | ||
1192 | GTK_TREE_VIEW (ctx->ns_details))); | ||
1193 | ctx->namespace_manager = GTK_WINDOW (gtk_builder_get_object ( | ||
1194 | ctx->builder, "GNUNET_GTK_namespace_manager_dialog")); | ||
1195 | ctx->details_apply_button = GTK_WIDGET (gtk_builder_get_object (ctx->builder, | ||
1196 | "GNUNET_GTK_namespace_manager_namespace_details_apply_button")); | ||
1197 | ctx->details_delete_button = GTK_WIDGET (gtk_builder_get_object (ctx->builder, | ||
1198 | "GNUNET_GTK_namespace_manager_namespace_details_delete_button")); | ||
1199 | ctx->order_rank = gtk_tree_view_get_column (GTK_TREE_VIEW (ctx->ns_order), 0); | ||
1200 | ctx->order_name = gtk_tree_view_get_column (GTK_TREE_VIEW (ctx->ns_order), 1); | ||
1201 | ctx->order_id = gtk_tree_view_get_column (GTK_TREE_VIEW (ctx->ns_order), 2); | ||
1202 | |||
1203 | /* connect signals; FIXME-GTK3: these could be connected with (modern) Glade */ | ||
1204 | g_signal_connect (G_OBJECT (ctx->known_ns_sel), "changed", | ||
1205 | G_CALLBACK (known_ns_selection_changed), ctx); | ||
1206 | g_signal_connect (G_OBJECT (ctx->ns_details_sel), "changed", | ||
1207 | G_CALLBACK (ns_details_selection_changed), ctx); | ||
1208 | |||
1209 | /* populate namespace model */ | ||
1210 | (void) GNUNET_FS_pseudonym_list_all (GNUNET_FS_GTK_get_configuration (), | ||
1211 | populate_known_ns_list, ctx); | ||
1212 | |||
1213 | #if FIXME_USE_IDENTITY_SERVICE | ||
1214 | /* mark our own namespaces as such */ | ||
1215 | GNUNET_FS_namespace_list (GNUNET_FS_GTK_get_fs_handle (), | ||
1216 | &mark_namespaces_as_mine, ctx); | ||
1217 | #endif | ||
1218 | |||
1219 | /* sort namespace order list by rank (initially) */ | ||
1220 | sort_order_list (ctx, GNUNET_GTK_NAMESPACE_ORDER_RANK_COLUMN); | ||
1221 | |||
1222 | gtk_widget_set_sensitive (ctx->details_apply_button, FALSE); | ||
1223 | |||
1224 | /* show dialog */ | ||
1225 | gtk_window_present (ctx->namespace_manager); | ||
1226 | return ctx->namespace_manager; | ||
1227 | } | ||
1228 | |||
1229 | |||
1230 | static void | ||
1231 | ns_manager_deleted (GtkWindow *object, gpointer user_data) | ||
1232 | { | ||
1233 | struct GNUNET_GTK_MainWindowContext *ctx = user_data; | ||
1234 | g_signal_handler_disconnect (object, ctx->ns_manager_delete_handler_id); | ||
1235 | g_object_unref (G_OBJECT (ctx->ns_manager)); | ||
1236 | ctx->ns_manager = NULL; | ||
1237 | ctx->ns_manager_delete_handler_id = 0; | ||
1238 | return; | ||
1239 | } | ||
1240 | |||
1241 | |||
1242 | void | ||
1243 | GNUNET_GTK_open_ns_manager (struct GNUNET_GTK_MainWindowContext *ctx) | ||
1244 | { | ||
1245 | if (ctx->ns_manager != NULL) | ||
1246 | { | 444 | { |
1247 | gtk_window_present (ctx->ns_manager); | 445 | gtk_list_store_insert_with_values (ac->meta_types, |
1248 | return; | 446 | &iter, G_MAXINT, |
447 | METATYPES_MC_TYPE_AS_STRING, | ||
448 | EXTRACTOR_metatype_to_string (types[i]), | ||
449 | METATYPES_MC_TYPE_AS_ENUM, | ||
450 | types[i], | ||
451 | -1); | ||
452 | if (0 == i) | ||
453 | gtk_combo_box_set_active_iter (GTK_COMBO_BOX | ||
454 | (gtk_builder_get_object | ||
455 | (ac->builder, | ||
456 | "GNUNET_GTK_identity_advertise_metadata_type_combobox")), | ||
457 | &iter); | ||
1249 | } | 458 | } |
1250 | 459 | gtk_list_store_insert_with_values (ac->keywords, | |
1251 | ctx->ns_manager = GNUNET_GTK_namespace_manager_open (ctx); | 460 | &iter, G_MAXINT, |
1252 | if (ctx->ns_manager == NULL) | 461 | KEYWORDS_MC_KEYWORD, NEW_KEYWORD_TEXT, |
1253 | return; | 462 | -1); |
1254 | 463 | gtk_window_present (GTK_WINDOW (ac->dialog)); | |
1255 | g_object_ref (G_OBJECT (ctx->ns_manager)); | ||
1256 | ctx->ns_manager_delete_handler_id = g_signal_connect (G_OBJECT (ctx->ns_manager), "destroy", G_CALLBACK (ns_manager_deleted), ctx); | ||
1257 | } | ||
1258 | |||
1259 | |||
1260 | void | ||
1261 | GNUNET_GTK_main_menu_file_manage_pseudonyms_activate_cb (GtkMenuItem *menuitem, | ||
1262 | gpointer user_data) | ||
1263 | { | ||
1264 | GNUNET_GTK_open_ns_manager (user_data); | ||
1265 | } | 464 | } |
1266 | 465 | ||
1267 | 466 | ||
1268 | void | ||
1269 | namespace_selector_manage_namespaces_button_clicked_cb (GtkButton *button, gpointer user_data) | ||
1270 | { | ||
1271 | GNUNET_GTK_open_ns_manager (user_data); | ||
1272 | } | ||
1273 | #endif | ||
1274 | |||
1275 | /* end of gnunet-identity-gtk_advertise.c */ | 467 | /* end of gnunet-identity-gtk_advertise.c */ |