diff options
Diffstat (limited to 'src/setup/gnunet-setup.c')
-rw-r--r-- | src/setup/gnunet-setup.c | 311 |
1 files changed, 138 insertions, 173 deletions
diff --git a/src/setup/gnunet-setup.c b/src/setup/gnunet-setup.c index 6844a076..dc8b6bcb 100644 --- a/src/setup/gnunet-setup.c +++ b/src/setup/gnunet-setup.c | |||
@@ -77,9 +77,8 @@ GNUNET_SETUP_get_object (const char *name) | |||
77 | 77 | ||
78 | 78 | ||
79 | static gboolean | 79 | static gboolean |
80 | help_click_callback (GtkWidget *widget, | 80 | help_click_callback (GtkWidget * widget, GdkEventButton * event, |
81 | GdkEventButton *event, | 81 | gpointer user_data) |
82 | gpointer user_data) | ||
83 | { | 82 | { |
84 | const struct GNUNET_SETUP_OptionSpecification *os = user_data; | 83 | const struct GNUNET_SETUP_OptionSpecification *os = user_data; |
85 | GtkLinkButton *help; | 84 | GtkLinkButton *help; |
@@ -87,10 +86,8 @@ help_click_callback (GtkWidget *widget, | |||
87 | if (event->type != GDK_BUTTON_PRESS) | 86 | if (event->type != GDK_BUTTON_PRESS) |
88 | return FALSE; | 87 | return FALSE; |
89 | help = GTK_LINK_BUTTON (GNUNET_SETUP_get_object ("GNUNET_setup_help_text")); | 88 | help = GTK_LINK_BUTTON (GNUNET_SETUP_get_object ("GNUNET_setup_help_text")); |
90 | gtk_link_button_set_uri (help, | 89 | gtk_link_button_set_uri (help, os->help_url); |
91 | os->help_url); | 90 | gtk_button_set_label (GTK_BUTTON (help), os->help_text); |
92 | gtk_button_set_label (GTK_BUTTON (help), | ||
93 | os->help_text); | ||
94 | return FALSE; | 91 | return FALSE; |
95 | } | 92 | } |
96 | 93 | ||
@@ -104,7 +101,7 @@ help_click_callback (GtkWidget *widget, | |||
104 | */ | 101 | */ |
105 | static void | 102 | static void |
106 | update_visibility (const struct GNUNET_SETUP_OptionSpecification *os, | 103 | update_visibility (const struct GNUNET_SETUP_OptionSpecification *os, |
107 | const char *value) | 104 | const char *value) |
108 | { | 105 | { |
109 | unsigned int i; | 106 | unsigned int i; |
110 | const struct GNUNET_SETUP_VisibilitySpecification *vs; | 107 | const struct GNUNET_SETUP_VisibilitySpecification *vs; |
@@ -115,51 +112,49 @@ update_visibility (const struct GNUNET_SETUP_OptionSpecification *os, | |||
115 | return; | 112 | return; |
116 | i = 0; | 113 | i = 0; |
117 | while (os->visibility[i].widget_name != NULL) | 114 | while (os->visibility[i].widget_name != NULL) |
115 | { | ||
116 | vs = &os->visibility[i]; | ||
117 | widget = GTK_WIDGET (GNUNET_SETUP_get_object (vs->widget_name)); | ||
118 | if (widget == NULL) | ||
118 | { | 119 | { |
119 | vs = &os->visibility[i]; | 120 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, _("Widget `%s' not found\n"), |
120 | widget = GTK_WIDGET (GNUNET_SETUP_get_object (vs->widget_name)); | 121 | vs->widget_name); |
121 | if (widget == NULL) | 122 | } |
122 | { | 123 | if (NULL != vs->show_value) |
123 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | 124 | { |
124 | _("Widget `%s' not found\n"), | 125 | if (0 != |
125 | vs->widget_name); | 126 | regcomp (&r, vs->show_value, REG_EXTENDED | REG_ICASE | REG_NOSUB)) |
126 | } | 127 | { |
127 | if (NULL != vs->show_value) | 128 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, |
128 | { | 129 | _("Invalid regular expression `%s'\n"), vs->show_value); |
129 | if (0 != regcomp (&r, vs->show_value, REG_EXTENDED | REG_ICASE | REG_NOSUB)) | 130 | i++; |
130 | { | 131 | continue; |
131 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | 132 | } |
132 | _("Invalid regular expression `%s'\n"), | 133 | if (0 == regexec (&r, value, 0, NULL, 0)) |
133 | vs->show_value); | 134 | gtk_widget_show (widget); |
134 | i++; | 135 | else |
135 | continue; | 136 | gtk_widget_hide (widget); |
136 | } | 137 | regfree (&r); |
137 | if (0 == regexec (&r, value, 0, NULL, 0)) | 138 | } |
138 | gtk_widget_show (widget); | 139 | if (NULL != vs->hide_value) |
139 | else | 140 | { |
140 | gtk_widget_hide (widget); | 141 | if (0 != regcomp (&r, vs->hide_value, REG_ICASE | REG_NOSUB)) |
141 | regfree (&r); | 142 | { |
142 | } | 143 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, |
143 | if (NULL != vs->hide_value) | 144 | _("Invalid regular expression `%s'\n"), vs->show_value); |
144 | { | 145 | i++; |
145 | if (0 != regcomp (&r, vs->hide_value, REG_ICASE | REG_NOSUB)) | 146 | continue; |
146 | { | 147 | } |
147 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | 148 | if (0 == regexec (&r, value, 0, NULL, 0)) |
148 | _("Invalid regular expression `%s'\n"), | 149 | gtk_widget_hide (widget); |
149 | vs->show_value); | 150 | else |
150 | i++; | 151 | gtk_widget_show (widget); |
151 | continue; | 152 | regfree (&r); |
152 | } | ||
153 | if (0 == regexec (&r, value, 0, NULL, 0)) | ||
154 | gtk_widget_hide (widget); | ||
155 | else | ||
156 | gtk_widget_show (widget); | ||
157 | regfree (&r); | ||
158 | } | ||
159 | i++; | ||
160 | } | 153 | } |
154 | i++; | ||
155 | } | ||
161 | } | 156 | } |
162 | 157 | ||
163 | 158 | ||
164 | /** | 159 | /** |
165 | * Function called whenever a widget changes its state. | 160 | * Function called whenever a widget changes its state. |
@@ -173,24 +168,18 @@ widget_state_change_callback (const struct GNUNET_SETUP_OptionSpecification *os) | |||
173 | widget = GNUNET_SETUP_get_object (os->widget_name); | 168 | widget = GNUNET_SETUP_get_object (os->widget_name); |
174 | GNUNET_assert (NULL != os->save_function); | 169 | GNUNET_assert (NULL != os->save_function); |
175 | if (GNUNET_OK != | 170 | if (GNUNET_OK != |
176 | os->save_function (os->load_save_cls, | 171 | os->save_function (os->load_save_cls, os->section, os->option, widget, |
177 | os->section, | 172 | cfg)) |
178 | os->option, | 173 | { |
179 | widget, | 174 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, |
180 | cfg)) | 175 | _("Failed to obtain option value from widget `%s'\n"), |
181 | { | 176 | os->widget_name); |
182 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | 177 | return; |
183 | _("Failed to obtain option value from widget `%s'\n"), | 178 | } |
184 | os->widget_name); | 179 | if ((os->section != NULL) && (os->option != NULL)) |
185 | return; | ||
186 | } | ||
187 | if ( (os->section != NULL) && | ||
188 | (os->option != NULL) ) | ||
189 | GNUNET_assert (GNUNET_OK == | 180 | GNUNET_assert (GNUNET_OK == |
190 | GNUNET_CONFIGURATION_get_value_string (cfg, | 181 | GNUNET_CONFIGURATION_get_value_string (cfg, os->section, |
191 | os->section, | 182 | os->option, &value)); |
192 | os->option, | ||
193 | &value)); | ||
194 | else | 183 | else |
195 | value = NULL; | 184 | value = NULL; |
196 | update_visibility (os, value); | 185 | update_visibility (os, value); |
@@ -211,85 +200,71 @@ load_options () | |||
211 | 200 | ||
212 | i = 0; | 201 | i = 0; |
213 | while (option_specifications[i].widget_name != NULL) | 202 | while (option_specifications[i].widget_name != NULL) |
203 | { | ||
204 | os = &option_specifications[i]; | ||
205 | widget = GNUNET_SETUP_get_object (os->widget_name); | ||
206 | if (NULL == widget) | ||
214 | { | 207 | { |
215 | os = &option_specifications[i]; | 208 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, _("Widget `%s' not found\n"), |
216 | widget = GNUNET_SETUP_get_object (os->widget_name); | 209 | os->widget_name); |
217 | if (NULL == widget) | ||
218 | { | ||
219 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | ||
220 | _("Widget `%s' not found\n"), | ||
221 | os->widget_name); | ||
222 | i++; | ||
223 | continue; | ||
224 | } | ||
225 | if (os->load_function != NULL) | ||
226 | { | ||
227 | if ( (NULL == os->section) || | ||
228 | (NULL == os->option) ) | ||
229 | { | ||
230 | if (GNUNET_OK != | ||
231 | os->load_function (os->load_save_cls, | ||
232 | NULL, NULL, NULL, | ||
233 | widget, | ||
234 | cfg)) | ||
235 | { | ||
236 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | ||
237 | _("Failed to initialize widget `%s'\n"), | ||
238 | os->widget_name); | ||
239 | } | ||
240 | } | ||
241 | else | ||
242 | { | ||
243 | if (GNUNET_OK != | ||
244 | GNUNET_CONFIGURATION_get_value_string (cfg, | ||
245 | os->section, | ||
246 | os->option, | ||
247 | &value)) | ||
248 | { | ||
249 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
250 | _("No default value known for option `%s' in section `%s'\n"), | ||
251 | os->option, | ||
252 | os->section); | ||
253 | } | ||
254 | else | ||
255 | { | ||
256 | if (GNUNET_OK != | ||
257 | os->load_function (os->load_save_cls, | ||
258 | os->section, os->option, | ||
259 | value, | ||
260 | widget, | ||
261 | cfg)) | ||
262 | { | ||
263 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | ||
264 | _("Failed to initialize widget `%s' with value `%s'\n"), | ||
265 | os->widget_name, | ||
266 | value); | ||
267 | } | ||
268 | else | ||
269 | { | ||
270 | update_visibility (os, value); | ||
271 | } | ||
272 | GNUNET_free (value); | ||
273 | } | ||
274 | } | ||
275 | } | ||
276 | if (os->help_text != NULL) | ||
277 | { | ||
278 | g_signal_connect (widget, | ||
279 | "button-press-event", | ||
280 | G_CALLBACK (&help_click_callback), | ||
281 | (void*) os); | ||
282 | } | ||
283 | if (os->change_signal != NULL) | ||
284 | { | ||
285 | GNUNET_assert (NULL != os->save_function); | ||
286 | g_signal_connect_swapped (widget, | ||
287 | os->change_signal, | ||
288 | G_CALLBACK (&widget_state_change_callback), | ||
289 | (void*) os); | ||
290 | } | ||
291 | i++; | 210 | i++; |
211 | continue; | ||
292 | } | 212 | } |
213 | if (os->load_function != NULL) | ||
214 | { | ||
215 | if ((NULL == os->section) || (NULL == os->option)) | ||
216 | { | ||
217 | if (GNUNET_OK != | ||
218 | os->load_function (os->load_save_cls, NULL, NULL, NULL, widget, | ||
219 | cfg)) | ||
220 | { | ||
221 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | ||
222 | _("Failed to initialize widget `%s'\n"), os->widget_name); | ||
223 | } | ||
224 | } | ||
225 | else | ||
226 | { | ||
227 | if (GNUNET_OK != | ||
228 | GNUNET_CONFIGURATION_get_value_string (cfg, os->section, os->option, | ||
229 | &value)) | ||
230 | { | ||
231 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
232 | _ | ||
233 | ("No default value known for option `%s' in section `%s'\n"), | ||
234 | os->option, os->section); | ||
235 | } | ||
236 | else | ||
237 | { | ||
238 | if (GNUNET_OK != | ||
239 | os->load_function (os->load_save_cls, os->section, os->option, | ||
240 | value, widget, cfg)) | ||
241 | { | ||
242 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | ||
243 | _("Failed to initialize widget `%s' with value `%s'\n"), | ||
244 | os->widget_name, value); | ||
245 | } | ||
246 | else | ||
247 | { | ||
248 | update_visibility (os, value); | ||
249 | } | ||
250 | GNUNET_free (value); | ||
251 | } | ||
252 | } | ||
253 | } | ||
254 | if (os->help_text != NULL) | ||
255 | { | ||
256 | g_signal_connect (widget, "button-press-event", | ||
257 | G_CALLBACK (&help_click_callback), (void *) os); | ||
258 | } | ||
259 | if (os->change_signal != NULL) | ||
260 | { | ||
261 | GNUNET_assert (NULL != os->save_function); | ||
262 | g_signal_connect_swapped (widget, os->change_signal, | ||
263 | G_CALLBACK (&widget_state_change_callback), | ||
264 | (void *) os); | ||
265 | } | ||
266 | i++; | ||
267 | } | ||
293 | 268 | ||
294 | } | 269 | } |
295 | 270 | ||
@@ -297,29 +272,25 @@ load_options () | |||
297 | /** | 272 | /** |
298 | * Callback invoked if the application is supposed to exit. | 273 | * Callback invoked if the application is supposed to exit. |
299 | */ | 274 | */ |
300 | void | 275 | void |
301 | GNUNET_SETUP_quit_cb (GtkObject *object, | 276 | GNUNET_SETUP_quit_cb (GtkObject * object, gpointer user_data) |
302 | gpointer user_data) | ||
303 | { | 277 | { |
304 | struct GNUNET_CONFIGURATION_Handle *cfgDefault; | 278 | struct GNUNET_CONFIGURATION_Handle *cfgDefault; |
305 | 279 | ||
306 | GNUNET_GTK_main_loop_quit (ml); | 280 | GNUNET_GTK_main_loop_quit (ml); |
307 | cfgDefault = GNUNET_CONFIGURATION_create (); | 281 | cfgDefault = GNUNET_CONFIGURATION_create (); |
308 | (void) GNUNET_CONFIGURATION_load (cfgDefault, NULL); /* load defaults only */ | 282 | (void) GNUNET_CONFIGURATION_load (cfgDefault, NULL); /* load defaults only */ |
309 | if (GNUNET_OK != | 283 | if (GNUNET_OK != GNUNET_CONFIGURATION_write_diffs (cfgDefault, cfg, cfgName)) |
310 | GNUNET_CONFIGURATION_write_diffs (cfgDefault, | 284 | gret = 1; |
311 | cfg, | ||
312 | cfgName)) | ||
313 | gret = 1; | ||
314 | GNUNET_CONFIGURATION_destroy (cfgDefault); | 285 | GNUNET_CONFIGURATION_destroy (cfgDefault); |
315 | GNUNET_CONFIGURATION_destroy (cfg); | 286 | GNUNET_CONFIGURATION_destroy (cfg); |
316 | cfg = NULL; | 287 | cfg = NULL; |
317 | if (NULL != resolver) | 288 | if (NULL != resolver) |
318 | { | 289 | { |
319 | GNUNET_break (0 == GNUNET_OS_process_kill (resolver, SIGTERM)); | 290 | GNUNET_break (0 == GNUNET_OS_process_kill (resolver, SIGTERM)); |
320 | GNUNET_OS_process_close (resolver); | 291 | GNUNET_OS_process_close (resolver); |
321 | resolver = NULL; | 292 | resolver = NULL; |
322 | } | 293 | } |
323 | } | 294 | } |
324 | 295 | ||
325 | 296 | ||
@@ -330,18 +301,17 @@ GNUNET_SETUP_quit_cb (GtkObject *object, | |||
330 | * @param tc scheduler context | 301 | * @param tc scheduler context |
331 | */ | 302 | */ |
332 | static void | 303 | static void |
333 | run (void *cls, | 304 | run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) |
334 | const struct GNUNET_SCHEDULER_TaskContext *tc) | ||
335 | { | 305 | { |
336 | ml = cls; | 306 | ml = cls; |
337 | GtkWidget *main_window; | 307 | GtkWidget *main_window; |
338 | 308 | ||
339 | cfg = GNUNET_CONFIGURATION_create (); | 309 | cfg = GNUNET_CONFIGURATION_create (); |
340 | (void) GNUNET_CONFIGURATION_load (cfg, cfgName); | 310 | (void) GNUNET_CONFIGURATION_load (cfg, cfgName); |
341 | main_window = GTK_WIDGET (GNUNET_SETUP_get_object ("GNUNET_setup_dialog")); | 311 | main_window = GTK_WIDGET (GNUNET_SETUP_get_object ("GNUNET_setup_dialog")); |
342 | resolver = GNUNET_OS_start_process (NULL, NULL, | 312 | resolver = |
343 | "gnunet-service-resolver", | 313 | GNUNET_OS_start_process (NULL, NULL, "gnunet-service-resolver", |
344 | "gnunet-service-resolver", NULL); | 314 | "gnunet-service-resolver", NULL); |
345 | load_options (); | 315 | load_options (); |
346 | gtk_widget_show (main_window); | 316 | gtk_widget_show (main_window); |
347 | gtk_window_present (GTK_WINDOW (main_window)); | 317 | gtk_window_present (GTK_WINDOW (main_window)); |
@@ -356,8 +326,7 @@ run (void *cls, | |||
356 | * @return 0 on success | 326 | * @return 0 on success |
357 | */ | 327 | */ |
358 | int | 328 | int |
359 | main (int argc, | 329 | main (int argc, char *const *argv) |
360 | char *const *argv) | ||
361 | { | 330 | { |
362 | struct GNUNET_GETOPT_CommandLineOption options[] = { | 331 | struct GNUNET_GETOPT_CommandLineOption options[] = { |
363 | GNUNET_GETOPT_OPTION_CFG_FILE (&cfgName), | 332 | GNUNET_GETOPT_OPTION_CFG_FILE (&cfgName), |
@@ -372,16 +341,12 @@ main (int argc, | |||
372 | loglev = GNUNET_strdup ("WARNING"); | 341 | loglev = GNUNET_strdup ("WARNING"); |
373 | 342 | ||
374 | if (GNUNET_OK == | 343 | if (GNUNET_OK == |
375 | GNUNET_GTK_main_loop_start ("gnunet-setup", | 344 | GNUNET_GTK_main_loop_start ("gnunet-setup", "guunet-setup", argc, argv, |
376 | "guunet-setup", | 345 | options, "gnunet_setup_gtk_main_window.glade", |
377 | argc, | 346 | &run)) |
378 | argv, | ||
379 | options, | ||
380 | "gnunet_setup_gtk_main_window.glade", | ||
381 | &run)) | ||
382 | ret = gret; | 347 | ret = gret; |
383 | else | 348 | else |
384 | ret = 1; | 349 | ret = 1; |
385 | GNUNET_free (cfgName); | 350 | GNUNET_free (cfgName); |
386 | GNUNET_free (loglev); | 351 | GNUNET_free (loglev); |
387 | return ret; | 352 | return ret; |