aboutsummaryrefslogtreecommitdiff
path: root/src/setup/gnunet-setup.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/setup/gnunet-setup.c')
-rw-r--r--src/setup/gnunet-setup.c311
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
79static gboolean 79static gboolean
80help_click_callback (GtkWidget *widget, 80help_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 */
105static void 102static void
106update_visibility (const struct GNUNET_SETUP_OptionSpecification *os, 103update_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 */
300void 275void
301GNUNET_SETUP_quit_cb (GtkObject *object, 276GNUNET_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 */
332static void 303static void
333run (void *cls, 304run (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 */
358int 328int
359main (int argc, 329main (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;