Diff of /trunk/src/geotoad.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 196 by harbaum, Thu Nov 19 07:39:00 2009 UTC revision 200 by harbaum, Thu Nov 19 13:57:17 2009 UTC
# Line 23  Line 23 
23  #include <sys/types.h>  #include <sys/types.h>
24  #include <sys/wait.h>  #include <sys/wait.h>
25  #include <errno.h>  #include <errno.h>
26    #include <math.h>
27    
28    #if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR >= 5)
29    #include <hildon/hildon-entry.h>
30    #endif
31    
32  #define GEOTOAD "/usr/bin/geotoad"  #define GEOTOAD "/usr/bin/geotoad"
33    
# Line 35  Line 40 
40  typedef struct {  typedef struct {
41    appdata_t *appdata;    appdata_t *appdata;
42    
43      GtkWidget *dialog;
44    
45    char buf[BUFFER_SIZE];    char buf[BUFFER_SIZE];
46    int bused;    int bused;
47    
# Line 47  typedef struct { Line 54  typedef struct {
54      GtkWidget *view;      GtkWidget *view;
55    } log;    } log;
56    
57    GtkWidget *username, *password;    GtkWidget *username, *password, *filename;
58      GtkWidget *lat, *lon, *dst;
59    
60  } gt_context_t;  } gt_context_t;
61    
# Line 149  static gboolean child_input_cb(GIOChanne Line 157  static gboolean child_input_cb(GIOChanne
157    return TRUE;    return TRUE;
158  }  }
159    
160    static void arg_free(gpointer data, gpointer user_data) {
161      if(data) g_free(data);
162    }
163    
164    static void arg_dsp(gpointer data, gpointer user_data) {
165      gt_context_t *context = (gt_context_t*)user_data;
166    
167      if(data)
168        appendf(&context->log, COLOR_SYSTEM, "%s\n", data);
169    }
170    
171  static void run(gt_context_t *context) {  static void run(gt_context_t *context) {
172      char str[8];
173    
174    /* setup context */    /* setup context */
175    context->bused = 0;    context->bused = 0;
176    context->stdout_tag = -1;    context->stdout_tag = -1;
# Line 160  static void run(gt_context_t *context) { Line 181  static void run(gt_context_t *context) {
181    
182    /* build list of arguments to call geotoad */    /* build list of arguments to call geotoad */
183    GPtrArray *gt_argv = g_ptr_array_new();    GPtrArray *gt_argv = g_ptr_array_new();
184    g_ptr_array_add (gt_argv, GEOTOAD);    g_ptr_array_add (gt_argv, g_strdup_printf(GEOTOAD));
185    g_ptr_array_add (gt_argv, "--distanceMax=1.0");    g_ascii_dtostr(str, sizeof(str), context->appdata->gt.distance);
186    g_ptr_array_add (gt_argv, "--output=gtoad.gpx");    g_ptr_array_add (gt_argv, g_strdup_printf("--distanceMax=%s", str));
187    g_ptr_array_add (gt_argv, "--password=winterblume");    g_ptr_array_add (gt_argv, g_strdup_printf("--output=%s", context->appdata->gt.filename));
188    g_ptr_array_add (gt_argv, "--queryType=coord");    g_ptr_array_add (gt_argv, g_strdup_printf("--password=%s", context->appdata->gt.password));
189    g_ptr_array_add (gt_argv, "--user=Tantil");    g_ptr_array_add (gt_argv, g_strdup_printf("--queryType=coord"));
190      g_ptr_array_add (gt_argv, g_strdup_printf("--user=%s", context->appdata->gt.username));
191    
192    /* check if we need to add proxy config */    /* check if we need to add proxy config */
193    char *proxy = NULL;    char *proxy = NULL;
# Line 183  static void run(gt_context_t *context) { Line 205  static void run(gt_context_t *context) {
205                                context->appdata->proxy->host,                                context->appdata->proxy->host,
206                                context->appdata->proxy->port);                                context->appdata->proxy->port);
207    
     appendf(&context->log, COLOR_SYSTEM, "Using proxy: %s\n", proxy);  
208      g_ptr_array_add (gt_argv, proxy);      g_ptr_array_add (gt_argv, proxy);
209    }    }
210    
211    g_ptr_array_add (gt_argv, "N49 00.000 E008 23.000");    g_ptr_array_add (gt_argv, g_strdup_printf("N49 00.000 E008 23.000"));
212    g_ptr_array_add (gt_argv, NULL);    g_ptr_array_add (gt_argv, NULL);
213    
214      /* show all entries */
215      g_ptr_array_foreach(gt_argv, arg_dsp, context);
216    
217    GError *error=NULL;    GError *error=NULL;
218    GPid pid;    GPid pid;
219    GSource *gt_watch;    GSource *gt_watch;
# Line 205  static void run(gt_context_t *context) { Line 229  static void run(gt_context_t *context) {
229                                   &context->stdout_fd,                                   &context->stdout_fd,
230                                   &context->stderr_fd,                                   &context->stderr_fd,
231                                   &error)) {                                   &error)) {
232        g_ptr_array_foreach(gt_argv, arg_free, NULL);
233      g_ptr_array_free(gt_argv, TRUE);      g_ptr_array_free(gt_argv, TRUE);
     if(proxy) g_free(proxy);  
234      appendf(&context->log, COLOR_ERR,      appendf(&context->log, COLOR_ERR,
235              _("GeoToad failed to start!\n%s\n"), error->message);              _("GeoToad failed to start!\n%s\n"), error->message);
236      g_error_free(error);      g_error_free(error);
237      return;      return;
238    }    }
239    
240      g_ptr_array_foreach(gt_argv, arg_free, NULL);
241    g_ptr_array_free (gt_argv, TRUE);    g_ptr_array_free (gt_argv, TRUE);
   if(proxy) g_free(proxy);  
242    
243    gt_watch = g_child_watch_source_new(pid);    gt_watch = g_child_watch_source_new(pid);
244    g_source_set_callback(gt_watch, (GSourceFunc) child_state_cb, context, NULL);    g_source_set_callback(gt_watch, (GSourceFunc) child_state_cb, context, NULL);
# Line 293  static void gui_run(gt_context_t *contex Line 317  static void gui_run(gt_context_t *contex
317    gtk_widget_destroy(dialog);    gtk_widget_destroy(dialog);
318  }  }
319    
320    static void on_browse(GtkWidget *widget, gpointer data) {
321      gt_context_t *context = (gt_context_t*)data;
322    
323      printf("Browse %p\n", context->dialog);
324    
325    #ifdef USE_MAEMO
326      GtkWidget *dialog = hildon_file_chooser_dialog_new(GTK_WINDOW(context->dialog),
327                                              GTK_FILE_CHOOSER_ACTION_SAVE);
328    #else
329      GtkWidget *dialog = gtk_file_chooser_dialog_new(_("Save GPX file"),
330                                           GTK_WINDOW(context->dialog),
331                                           GTK_FILE_CHOOSER_ACTION_SAVE,
332                                           GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
333                                           GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
334                                           NULL);
335    #endif
336    
337      printf("set filename <%s>\n", context->appdata->gt.filename);
338    
339      if(!g_file_test(context->appdata->gt.filename, G_FILE_TEST_EXISTS)) {
340        char *last_sep = strrchr(context->appdata->gt.filename, '/');
341        if(last_sep) {
342          *last_sep = 0;  // seperate path from file
343    
344          /* the user just created a new document */
345          gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
346                                              context->appdata->gt.filename);
347          gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), last_sep+1);
348    
349          /* restore full filename */
350          *last_sep = '/';
351        }
352      } else
353        gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),
354                                      context->appdata->gt.filename);
355    
356      if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_FM_OK) {
357        gchar *name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
358        gtk_label_set_text(GTK_LABEL(context->filename), name);
359      }
360    
361      gtk_widget_destroy (dialog);
362    }
363    
364  static gboolean gui_setup(gt_context_t *context) {  static gboolean gui_setup(gt_context_t *context) {
365      appdata_t *appdata = context->appdata;
366    gboolean ok = FALSE;    gboolean ok = FALSE;
367    
368    GtkWidget *dialog = gtk_dialog_new_with_buttons(_("GeoToad - Setup"),    /* if no filename has been setup yet, create one */
369                            GTK_WINDOW(context->appdata->window),    if(!appdata->gt.filename && appdata->path) {
370                            GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,      printf("creating path\n");
371                            GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,      appdata->gt.filename =
372                            GTK_STOCK_OK,     GTK_RESPONSE_OK,        g_strdup_printf("%s/gtoad.gpx", appdata->path);
373                            NULL);    }
374    
375      context->dialog = gtk_dialog_new_with_buttons(_("GeoToad - Setup"),
376                            GTK_WINDOW(appdata->window),
377                            GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
378                            GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
379                            GTK_STOCK_OK,     GTK_RESPONSE_OK,
380                            NULL);
381    
382      /* ------------------- Coordinates ------------------------- */
383    GtkWidget *hbox = gtk_hbox_new(FALSE, 0);    GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
384    
385    GtkWidget *vbox = gtk_vbox_new(FALSE, 0);    GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
386    gtk_box_pack_start_defaults(GTK_BOX(vbox), gtk_label_new(_("Username:")));    gtk_box_pack_start_defaults(GTK_BOX(vbox), left_label_new(_("Position:")));
387    gtk_box_pack_start_defaults(GTK_BOX(vbox), gtk_label_new(_("Password:")));    gtk_box_pack_start_defaults(GTK_BOX(vbox), left_label_new(_("Distance:")));
388      gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
389    
390      /* setup default positions */
391      pos_t *refpos = get_pos(appdata);
392      if((isnan(appdata->gt.lat) || isnan(appdata->gt.lat)) && refpos) {
393        appdata->gt.lat = refpos->lat;
394        appdata->gt.lon = refpos->lon;
395      }
396    
397      vbox = gtk_vbox_new(FALSE, 0);
398      GtkWidget *ihbox = gtk_hbox_new(FALSE, 0);
399      context->lat = lat_entry_new(appdata->gt.lat);
400      gtk_box_pack_start_defaults(GTK_BOX(ihbox), context->lat);
401      context->lon = lon_entry_new(appdata->gt.lon);
402      gtk_box_pack_start_defaults(GTK_BOX(ihbox), context->lon);
403      gtk_box_pack_start_defaults(GTK_BOX(vbox), ihbox);
404      float dst = appdata->gt.distance;  // distance is given in kilometers
405      if(appdata->imperial) dst /= 1.609344;
406      context->dst = dist_entry_new(dst, appdata->imperial);
407      gtk_box_pack_start_defaults(GTK_BOX(vbox), context->dst);
408    gtk_box_pack_start_defaults(GTK_BOX(hbox), vbox);    gtk_box_pack_start_defaults(GTK_BOX(hbox), vbox);
409    
410      gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(context->dialog)->vbox), hbox);
411    
412      /* ------------------- file name ------------------------- */
413      hbox = gtk_hbox_new(FALSE, 0);
414    
415      context->filename = gtk_label_new(appdata->gt.filename);
416      gtk_misc_set_alignment(GTK_MISC(context->filename), 0.f, 0.5f);
417      gtk_label_set_ellipsize(GTK_LABEL(context->filename), PANGO_ELLIPSIZE_MIDDLE);
418      gtk_box_pack_start_defaults(GTK_BOX(hbox), context->filename);
419    
420      GtkWidget *button = gtk_button_new_with_label(_("Browse"));
421    #if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR == 5)
422      hildon_gtk_widget_set_theme_size(button,
423               (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH));
424    #endif
425      gtk_signal_connect(GTK_OBJECT(button), "clicked",
426                         GTK_SIGNAL_FUNC(on_browse), context);
427      gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
428    
429      gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(context->dialog)->vbox), hbox);
430    
431    
432      /* ------------------- Username/Password ------------------------- */
433      hbox = gtk_hbox_new(FALSE, 0);
434      vbox = gtk_vbox_new(FALSE, 0);
435      gtk_box_pack_start_defaults(GTK_BOX(vbox), left_label_new(_("Username:")));
436      gtk_box_pack_start_defaults(GTK_BOX(vbox), left_label_new(_("Password:")));
437      gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
438    
439    vbox = gtk_vbox_new(FALSE, 0);    vbox = gtk_vbox_new(FALSE, 0);
440  #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)  #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)
# Line 324  static gboolean gui_setup(gt_context_t * Line 451  static gboolean gui_setup(gt_context_t *
451    gtk_entry_set_visibility(GTK_ENTRY(context->password), FALSE);    gtk_entry_set_visibility(GTK_ENTRY(context->password), FALSE);
452    
453    /* set saved defaults */    /* set saved defaults */
454    if(context->appdata->gt.username)    if(appdata->gt.username)
455      gtk_entry_set_text(GTK_ENTRY(context->username),      gtk_entry_set_text(GTK_ENTRY(context->username),
456                         context->appdata->gt.username);                         appdata->gt.username);
457    
458    if(context->appdata->gt.password)    if(appdata->gt.password)
459      gtk_entry_set_text(GTK_ENTRY(context->password),      gtk_entry_set_text(GTK_ENTRY(context->password),
460                         context->appdata->gt.password);                         appdata->gt.password);
461    
462    gtk_box_pack_start_defaults(GTK_BOX(vbox), context->username);    gtk_box_pack_start_defaults(GTK_BOX(vbox), context->username);
463    gtk_box_pack_start_defaults(GTK_BOX(vbox), context->password);    gtk_box_pack_start_defaults(GTK_BOX(vbox), context->password);
464    gtk_box_pack_start_defaults(GTK_BOX(hbox), vbox);    gtk_box_pack_start_defaults(GTK_BOX(hbox), vbox);
465    
466    gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox);    gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(context->dialog)->vbox), hbox);
467    
468    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);    gtk_dialog_set_default_response(GTK_DIALOG(context->dialog), GTK_RESPONSE_OK);
469    
470    gtk_widget_show_all(dialog);    gtk_widget_show_all(context->dialog);
471    
472      if(gtk_dialog_run(GTK_DIALOG(context->dialog)) == GTK_RESPONSE_OK) {
473    
474    if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) {      /* parse coordinates */
475        /* ... */
476    
477      /* save values */      /* save values */
478      if(context->appdata->gt.username) g_free(context->appdata->gt.username);      if(appdata->gt.username) g_free(appdata->gt.username);
479      context->appdata->gt.username =      appdata->gt.username =
480        g_strdup(gtk_entry_get_text(GTK_ENTRY(context->username)));        g_strdup(gtk_entry_get_text(GTK_ENTRY(context->username)));
481    
482      if(context->appdata->gt.password) g_free(context->appdata->gt.password);      if(appdata->gt.password) g_free(appdata->gt.password);
483      context->appdata->gt.password =      appdata->gt.password =
484        g_strdup(gtk_entry_get_text(GTK_ENTRY(context->password)));        g_strdup(gtk_entry_get_text(GTK_ENTRY(context->password)));
485    
486        if(appdata->gt.filename) g_free(appdata->gt.filename);
487        appdata->gt.filename =
488          g_strdup(gtk_label_get_text(GTK_LABEL(context->filename)));
489    
490        /* get distance in kilometers */
491        appdata->gt.distance = dist_get(context->dst, FALSE);
492    
493      ok = TRUE;      ok = TRUE;
494    }    }
495    
496    gtk_widget_destroy(dialog);    gtk_widget_destroy(context->dialog);
497    
498    return ok;    return ok;
499  }  }

Legend:
Removed from v.196  
changed lines
  Added in v.200