~foxtrotgps-team/foxtrotgps/trunk

« back to all changes in this revision

Viewing changes to src/geo_photos.c

  • Committer: Joshua Judson Rosen
  • Date: 2009-09-26 02:35:15 UTC
  • Revision ID: rozzin@geekspace.com-20090926023515-yxl5sg1a45gupuc8
Imported from tangogps-0.9.7 tarball.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
#ifdef HAVE_CONFIG_H
 
3
#  include <config.h>
 
4
#endif
 
5
 
 
6
#include "globals.h"
 
7
#include "geo_photos.h"
 
8
#include "converter.h"
 
9
#include "util.h"
 
10
#include "support.h"
 
11
#include "interface.h"
 
12
#include "exif.h"
 
13
#include "tracks.h"
 
14
#include "tile_management.h"
 
15
 
 
16
#include <glib.h>
 
17
#include <gio/gio.h>
 
18
#include <glib/gprintf.h>
 
19
#include <stdio.h>
 
20
#include <sqlite3.h>
 
21
#include <stdlib.h>
 
22
#include <libexif/exif-data.h>
 
23
#include <time.h>
 
24
 
 
25
 
 
26
#define PHOTO_DB "geophoto.db"
 
27
 
 
28
GList *geocode_photo_list;
 
29
GtkWidget *dialog_image_data = NULL;
 
30
GtkWidget *dialog_photo_correlate = NULL;
 
31
GtkWidget *dialog_geocode_result = NULL;
 
32
 
 
33
char *geocode_photodir  = NULL;
 
34
char *geocode_trackname = NULL;
 
35
int geocode_correction = 0;
 
36
int geocode_timezone = 0;
 
37
gboolean add_to_database = TRUE;
 
38
struct tm tm_photo;
 
39
 
 
40
 
 
41
void geocode_set_photodir (char *dirname,   GtkWidget *widget);
 
42
void geocode_set_trackname(char *trackname, GtkWidget *widget);
 
43
 
 
44
char     *get_basename(char *file);
 
45
GList   *get_entries_from_dir(char *dirname);
 
46
gboolean  file_type_test(const char *file, char *type);
 
47
 
 
48
void update_gps_time_label();
 
49
gpointer geocode_thread(gpointer user_data);
 
50
void prepare_perl();
 
51
 
 
52
 
 
53
 
 
54
 
 
55
 
 
56
static int
 
57
sql_cb__photo(void *unused, int colc, char **colv, char **col_names)
 
58
{
 
59
        photo_t *photo = g_new0(photo_t,1);
 
60
 
 
61
        printf("*** %s(): \n",__PRETTY_FUNCTION__);
 
62
 
 
63
        photo->filename = g_strdup(colv[0]);
 
64
        photo->name     = g_strdup(colv[1]);
 
65
        photo->lat      = atof(colv[2]);
 
66
        photo->lon      = atof(colv[3]);
 
67
        photo->desc     = g_strdup(colv[4]);
 
68
        
 
69
        photo_list = g_slist_prepend(photo_list, photo);
 
70
 
 
71
        return 0;
 
72
}
 
73
 
 
74
 
 
75
 
 
76
 
 
77
 
 
78
 
 
79
 
 
80
void
 
81
paint_photos()
 
82
{
 
83
        
 
84
        
 
85
        int pixel_x, pixel_y, x, y;
 
86
        float lat, lon;
 
87
        GSList *list;
 
88
        GdkColor color;
 
89
        GError  *error = NULL;
 
90
        static GdkPixbuf *photo_icon = NULL;
 
91
        static GdkGC *gc;
 
92
        
 
93
        printf("*** %s(): \n",__PRETTY_FUNCTION__);
 
94
 
 
95
 
 
96
        
 
97
        if (!gc)
 
98
                gc = gdk_gc_new(pixmap); 
 
99
        color.green = 0;
 
100
        color.blue = 60000;
 
101
        color.red = 0;
 
102
        gdk_gc_set_rgb_fg_color(gc, &color);
 
103
        
 
104
 
 
105
        if(!photo_icon)
 
106
        {
 
107
                photo_icon = gdk_pixbuf_new_from_file_at_size (
 
108
                        PACKAGE_PIXMAPS_DIR "/tangogps-photo.png", 24,24,
 
109
                        &error);
 
110
        }
 
111
 
 
112
        if(global_show_photos)
 
113
        {
 
114
                get_photos();
 
115
                
 
116
                for(list = photo_list; list != NULL; list = list->next)
 
117
                {
 
118
                        photo_t *p = list->data;
 
119
                        GdkPixbuf *thumb = NULL, *pixbuf_ptr;
 
120
                
 
121
                        lat = deg2rad(p->lat);
 
122
                        lon = deg2rad(p->lon);
 
123
                        
 
124
                        
 
125
                        
 
126
                        pixel_x = lon2pixel(global_zoom, lon);
 
127
                        pixel_y = lat2pixel(global_zoom, lat);
 
128
                        
 
129
                        x = pixel_x - global_x;
 
130
                        y = pixel_y - global_y;
 
131
                        
 
132
                        p->screen_x = x;
 
133
                        p->screen_y = y;
 
134
                        
 
135
                        
 
136
                        
 
137
                        if(global_zoom >= 17)
 
138
                        {
 
139
                                thumb = gdk_pixbuf_new_from_file_at_scale (p->filename, 48, 48, FALSE, &error);
 
140
                                if(!thumb)
 
141
                                        printf("could not open %s \n", p->filename);
 
142
                                else
 
143
                                        printf("loading thumb %s okay \n", p->filename);
 
144
                        }
 
145
                        
 
146
                        if(!photo_icon && !thumb)
 
147
                        {
 
148
                                gdk_draw_arc (
 
149
                                        pixmap,
 
150
                                        
 
151
                                        gc,
 
152
                                        TRUE,                   
 
153
                                        x-4, y-4,               
 
154
                                        8,8,                    
 
155
                                        0,23040);               
 
156
                        }
 
157
                        else
 
158
                        {
 
159
                                int icon_size;
 
160
                                
 
161
                                if(global_zoom >= 17 && thumb)
 
162
                                {
 
163
                                        pixbuf_ptr = thumb;
 
164
                                        icon_size = 48;
 
165
                                }       
 
166
                                else
 
167
                                {
 
168
                                        pixbuf_ptr = photo_icon;
 
169
                                        icon_size = 24;
 
170
                                }
 
171
                                gdk_draw_pixbuf (
 
172
                                        pixmap,
 
173
                                        NULL,
 
174
                                        pixbuf_ptr,
 
175
                                        0,0,
 
176
                                        x-icon_size/2,y-icon_size/2,
 
177
                                        icon_size,icon_size,
 
178
                                        GDK_RGB_DITHER_NONE, 0, 0);
 
179
                                
 
180
                        }
 
181
                        
 
182
                        gtk_widget_queue_draw_area (
 
183
                                        map_drawable, 
 
184
                                        x-18, y-18,
 
185
                                        36,36);
 
186
                        
 
187
                        printf("PHOTO: %s lat %f - lon %f\n",p->name,p->lat, p->lon);
 
188
                }       
 
189
        }
 
190
}
 
191
 
 
192
 
 
193
void
 
194
get_photos()
 
195
{
 
196
        char *sql, *db;
 
197
        bbox_t bbox = get_bbox_deg();
 
198
        
 
199
        db = g_strconcat(tangogps_dir,"/", PHOTO_DB, NULL);
 
200
        
 
201
        
 
202
        
 
203
        if(photo_list)
 
204
                g_slist_free(photo_list);
 
205
        photo_list = NULL;
 
206
        
 
207
        
 
208
        
 
209
        sql = g_strdup_printf(  
 
210
                        "SELECT * FROM photo "
 
211
                        "WHERE lat<%f AND lat>%f AND lon>%f AND lon<%f "
 
212
                        "LIMIT 500;",
 
213
                        bbox.lat1,bbox.lat2,
 
214
                        bbox.lon1, bbox.lon2    );
 
215
printf("%s \n",sql);
 
216
        
 
217
        sql_execute(db, sql, sql_cb__photo);    
 
218
        
 
219
        
 
220
        
 
221
}
 
222
 
 
223
void
 
224
geo_photos_open_dialog_photo_correlate()
 
225
{               
 
226
        GtkWidget *label1, *label2;
 
227
        char *label_txt;
 
228
        int tmp;
 
229
printf("%s\n",__PRETTY_FUNCTION__);     
 
230
        if(!dialog_photo_correlate)
 
231
        {
 
232
                dialog_photo_correlate = create_dialog_geocode();
 
233
                
 
234
                
 
235
                tmp   = gconf_client_get_int(global_gconfclient, GCONF"/geocode_timezone", NULL);
 
236
                geocode_timezone = (tmp) ? tmp - 13 : 0 ;
 
237
                geocode_correction = gconf_client_get_int(global_gconfclient, GCONF"/geocode_correction", NULL);
 
238
                
 
239
                
 
240
                label1 = lookup_widget(dialog_photo_correlate, "label172");
 
241
                label2 = lookup_widget(dialog_photo_correlate, "label174");
 
242
                
 
243
                label_txt = g_strdup_printf("  %d seconds", geocode_correction);
 
244
                gtk_label_set_label(GTK_LABEL(label2), label_txt);
 
245
                
 
246
                label_txt = g_strdup_printf("  %d:00h", geocode_timezone);
 
247
                gtk_label_set_label(GTK_LABEL(label1), label_txt);
 
248
                
 
249
        }
 
250
 
 
251
        gtk_widget_show(dialog_photo_correlate);
 
252
 
 
253
}
 
254
 
 
255
void
 
256
geo_photos_open_dialog_image_data()
 
257
{
 
258
        GtkWidget *combobox, *entry;
 
259
 
 
260
        if(!dialog_image_data)
 
261
        {
 
262
                dialog_image_data = create_dialog_image_data();
 
263
                gtk_widget_show(dialog_image_data);
 
264
                
 
265
                combobox = lookup_widget(dialog_image_data, "combobox7");
 
266
                gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), geocode_timezone + 12);
 
267
                entry = lookup_widget(dialog_image_data, "entry28");
 
268
                gtk_entry_set_text(GTK_ENTRY(entry), g_strdup_printf("%d", geocode_correction));
 
269
 
 
270
                geo_photo_dialog_image_data_next(dialog_image_data, NULL, GEOPHOTO_FIRST);
 
271
        }
 
272
        
 
273
        gtk_widget_show(dialog_image_data);
 
274
        gtk_widget_hide(dialog_photo_correlate);
 
275
}
 
276
 
 
277
        
 
278
 
 
279
void
 
280
geo_photos_geocode_track_select_dialog (GtkButton       *button,
 
281
                                        gpointer         user_data)
 
282
{
 
283
        GtkWidget *widget;
 
284
        GtkFileFilter *filter;
 
285
 
 
286
 
 
287
 
 
288
        
 
289
        widget = gtk_file_chooser_dialog_new (
 
290
                        "Select a GPS track log",
 
291
                        NULL,
 
292
                        GTK_FILE_CHOOSER_ACTION_OPEN,
 
293
                        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 
294
                        GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
 
295
                        NULL);
 
296
 
 
297
        
 
298
        gtk_file_chooser_set_action (GTK_FILE_CHOOSER(widget), GTK_FILE_CHOOSER_ACTION_OPEN );  
 
299
        gtk_file_chooser_set_select_multiple  (GTK_FILE_CHOOSER(widget), FALSE);
 
300
        gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(widget),global_track_dir);
 
301
        
 
302
        
 
303
        filter = gtk_file_filter_new ();
 
304
        gtk_file_filter_add_pattern (filter, "*.gpx");
 
305
        gtk_file_filter_add_pattern (filter, "*.GPX");
 
306
        gtk_file_filter_set_name (filter, "GPX trace log files (*.gpx)");
 
307
        gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(widget), filter);
 
308
        
 
309
 
 
310
        filter = gtk_file_filter_new ();
 
311
        gtk_file_filter_add_pattern (filter, "*.log");
 
312
        gtk_file_filter_set_name (filter, "tangoGPS log files (*.log)");
 
313
        gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(widget), filter);
 
314
 
 
315
        gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(widget), filter);
 
316
 
 
317
 
 
318
        
 
319
        if (gtk_dialog_run (GTK_DIALOG (widget)) == GTK_RESPONSE_ACCEPT)
 
320
        {
 
321
                char *filename;
 
322
                
 
323
                filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
 
324
                printf ("%s \n",filename);
 
325
                
 
326
                
 
327
                geocode_set_trackname(filename, GTK_WIDGET(button));
 
328
                
 
329
                if(file_type_test(filename, "log"))
 
330
                        tracks_on_file_button_release_event(NULL, NULL, filename);
 
331
                else
 
332
                        printf("There is no GPX importer yet :-( \n");
 
333
                
 
334
                g_free (filename);
 
335
        }
 
336
        else
 
337
                printf("%s(): file dialog cancelled \n", __PRETTY_FUNCTION__);
 
338
        
 
339
        gtk_widget_destroy (widget);
 
340
        
 
341
}
 
342
 
 
343
 
 
344
void
 
345
geo_photos_geocode_dir_select_dialog (GtkButton       *button,
 
346
                                   gpointer         user_data)
 
347
{
 
348
        GtkWidget *widget;
 
349
 
 
350
 
 
351
        
 
352
        widget = gtk_file_chooser_dialog_new (
 
353
                        "Choose the directory containing your photos",
 
354
                        NULL,
 
355
                        GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, 
 
356
                        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 
357
                        GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
 
358
                        NULL);
 
359
 
 
360
        
 
361
        gtk_file_chooser_set_select_multiple  (GTK_FILE_CHOOSER(widget), FALSE);
 
362
        
 
363
 
 
364
 
 
365
        
 
366
        if (gtk_dialog_run (GTK_DIALOG (widget)) == GTK_RESPONSE_ACCEPT)
 
367
        {
 
368
                char *filename;
 
369
                
 
370
                filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
 
371
                printf ("%s \n",filename);
 
372
                
 
373
                
 
374
                geocode_set_photodir(filename, GTK_WIDGET(button));
 
375
                
 
376
                g_free (filename);
 
377
        }
 
378
        else
 
379
                printf("%s(): file dialog cancelled \n", __PRETTY_FUNCTION__);
 
380
        
 
381
        gtk_widget_destroy (widget);
 
382
}
 
383
 
 
384
 
 
385
 
 
386
void
 
387
geocode_set_trackname(char *trackname, GtkWidget *widget)
 
388
{
 
389
        GtkWidget *label, *image, *button;
 
390
        
 
391
        geocode_trackname = g_strdup(trackname);
 
392
        
 
393
        image = gtk_image_new_from_stock("gtk-open", GTK_ICON_SIZE_BUTTON);
 
394
        gtk_button_set_image(GTK_BUTTON(widget), image);
 
395
        label = lookup_widget(widget, "label154");
 
396
        gtk_label_set_label(GTK_LABEL(label), "<span color=\"#090\"><b>ok</b></span>");
 
397
        gtk_button_set_label(GTK_BUTTON(widget), get_basename(geocode_trackname));
 
398
        
 
399
        button = lookup_widget(widget, "okbutton8");
 
400
        if(geocode_photodir)
 
401
                gtk_widget_set_sensitive(button, TRUE);
 
402
}
 
403
 
 
404
 
 
405
void
 
406
geocode_set_photodir(char *photodir, GtkWidget *widget)
 
407
{
 
408
        GtkWidget *label, *image, *button;
 
409
        
 
410
        geocode_photodir = g_strdup(photodir);
 
411
        
 
412
        if(geocode_photo_list)
 
413
        {
 
414
                g_list_free(geocode_photo_list);
 
415
                geocode_photo_list = NULL;
 
416
                gtk_widget_destroy(dialog_image_data);
 
417
                dialog_image_data = NULL;
 
418
        }
 
419
        
 
420
        geocode_photo_list = get_entries_from_dir(geocode_photodir);
 
421
        
 
422
        image = gtk_image_new_from_stock("gtk-open", GTK_ICON_SIZE_BUTTON);
 
423
        gtk_button_set_image(GTK_BUTTON(widget), image);
 
424
        label = lookup_widget(widget, "label155");
 
425
        gtk_label_set_label(GTK_LABEL(label), "<span color=\"#090\"><b>ok</b></span>");
 
426
        gtk_button_set_label(GTK_BUTTON(widget), get_basename(geocode_photodir));
 
427
        
 
428
        button = lookup_widget(widget, "button44");
 
429
        gtk_widget_set_sensitive(button, TRUE);
 
430
                
 
431
        
 
432
        button = lookup_widget(widget, "okbutton8");
 
433
        if(geocode_trackname)
 
434
                gtk_widget_set_sensitive(button, TRUE);
 
435
 
 
436
                
 
437
 
 
438
}
 
439
 
 
440
 
 
441
void
 
442
geo_photos_dialog_image_data_next()
 
443
{
 
444
        
 
445
}
 
446
 
 
447
char *
 
448
get_basename(char *file)
 
449
{
 
450
        char **array;
 
451
        char *basename;
 
452
        int i = 0;
 
453
        
 
454
        array = g_strsplit(file, "/", -1);
 
455
        while (array[i]) i++;
 
456
                
 
457
        basename = g_strdup(array[i-1]);
 
458
        g_strfreev(array);
 
459
        
 
460
        return basename;
 
461
}
 
462
 
 
463
GList *
 
464
get_entries_from_dir(char *dirname)
 
465
{
 
466
        GDir *dir;
 
467
        const char *file;
 
468
        GList *list = NULL;
 
469
        gboolean isfile;
 
470
        GError *error;
 
471
        
 
472
        dir = g_dir_open(dirname, 0, &error);
 
473
        if(!dir)
 
474
                return NULL;
 
475
        
 
476
        file = g_dir_read_name(dir);
 
477
        
 
478
        while (file)
 
479
        {
 
480
                char *fullfile = g_strconcat(dirname,"/",file,NULL);
 
481
                
 
482
                isfile = g_file_test(fullfile, G_FILE_TEST_IS_REGULAR);
 
483
                if(isfile &&
 
484
                   (file_type_test(fullfile,"jpg") || file_type_test(fullfile,"JPG") ||
 
485
                    file_type_test(fullfile,"jpeg")  || file_type_test(fullfile,"JPEG"))        
 
486
                )
 
487
                {               
 
488
                        printf("pic: %s/%s \n", dirname, file);
 
489
                        list = g_list_insert_sorted(list, g_strconcat(dirname, "/", file, NULL), (GCompareFunc)g_strcmp0);
 
490
                }
 
491
                file = g_dir_read_name(dir);
 
492
        }
 
493
        
 
494
        g_dir_close(dir);
 
495
 
 
496
        return list;
 
497
}
 
498
 
 
499
 
 
500
gboolean
 
501
file_type_test(const char *file, char *type)
 
502
{
 
503
        char **arr;
 
504
        int i = 0;
 
505
        
 
506
        arr = g_strsplit(file, ".", -1);
 
507
        while (arr[i]) i++;
 
508
        
 
509
        if (g_strcmp0(arr[i-1], type))
 
510
                return FALSE;
 
511
        
 
512
        return TRUE;
 
513
}
 
514
 
 
515
 
 
516
 
 
517
 
 
518
void
 
519
geo_photo_dialog_image_data_next(GtkWidget *widget, gpointer user_data, geo_photo_move_e move)
 
520
{
 
521
        GtkWidget *image, *viewport, *label, *forward_button, *back_button, *first_button, *last_button, *zoom_button;
 
522
        static GdkPixbuf *pixbuf = NULL;
 
523
        GError *err = NULL;
 
524
        int height, img_width;
 
525
        gboolean fullsize = FALSE;
 
526
        char *datetime;
 
527
        ExifData *ed;
 
528
        
 
529
        image = lookup_widget(widget, "image5");
 
530
        viewport = lookup_widget(widget, "viewport8");
 
531
        label = lookup_widget(widget, "label163");
 
532
        forward_button = lookup_widget(widget, "button46");
 
533
        back_button = lookup_widget(widget, "button45");
 
534
        first_button = lookup_widget(widget, "button47");
 
535
        last_button = lookup_widget(widget, "button48");
 
536
        zoom_button = lookup_widget(widget, "button50");
 
537
        
 
538
 
 
539
        printf("%s: viewport h,w: %d %d \n", __PRETTY_FUNCTION__, viewport->allocation.height, viewport->allocation.width);
 
540
        height = viewport->allocation.height;
 
541
        
 
542
        switch (move)
 
543
        {       
 
544
          case  GEOPHOTO_NEXT:
 
545
                if(geocode_photo_list->next)
 
546
                {
 
547
                        geocode_photo_list = geocode_photo_list->next;
 
548
                        gtk_widget_set_sensitive (back_button, TRUE);
 
549
                        gtk_widget_set_sensitive (first_button, TRUE);
 
550
                }
 
551
                if(!geocode_photo_list->next)
 
552
                {
 
553
                        gtk_widget_set_sensitive (forward_button, FALSE);
 
554
                        gtk_widget_set_sensitive (last_button, FALSE);
 
555
                }
 
556
                gtk_widget_set_sensitive(zoom_button, TRUE);
 
557
                break;
 
558
          case  GEOPHOTO_PREV:
 
559
                if(geocode_photo_list->prev)
 
560
                {
 
561
                        geocode_photo_list = geocode_photo_list->prev;
 
562
                        gtk_widget_set_sensitive (forward_button, TRUE);
 
563
                        gtk_widget_set_sensitive (last_button, TRUE);
 
564
                }
 
565
                if(!geocode_photo_list->prev)
 
566
                {
 
567
                        gtk_widget_set_sensitive (back_button, FALSE);
 
568
                        gtk_widget_set_sensitive (first_button, FALSE);
 
569
                }
 
570
                gtk_widget_set_sensitive(zoom_button, TRUE);
 
571
                break;
 
572
          case  GEOPHOTO_FIRST:
 
573
                geocode_photo_list = g_list_first(geocode_photo_list);
 
574
                gtk_widget_set_sensitive (forward_button, TRUE);
 
575
                gtk_widget_set_sensitive (last_button, TRUE);
 
576
                gtk_widget_set_sensitive (back_button, FALSE);
 
577
                gtk_widget_set_sensitive (first_button, FALSE);
 
578
                gtk_widget_set_sensitive(zoom_button, TRUE);
 
579
                break;
 
580
          case  GEOPHOTO_LAST:
 
581
                geocode_photo_list = g_list_last(geocode_photo_list);
 
582
                gtk_widget_set_sensitive (back_button, TRUE);
 
583
                gtk_widget_set_sensitive (first_button, TRUE);
 
584
                gtk_widget_set_sensitive (forward_button, FALSE);
 
585
                gtk_widget_set_sensitive (last_button, FALSE);
 
586
                gtk_widget_set_sensitive(zoom_button, TRUE);
 
587
                break;
 
588
          case  GEOPHOTO_FULLSIZE:
 
589
                fullsize = TRUE;
 
590
        }
 
591
 
 
592
        if (pixbuf)
 
593
                g_object_unref (pixbuf);
 
594
        
 
595
        if(!fullsize)
 
596
        {
 
597
                pixbuf = gdk_pixbuf_new_from_file_at_scale((const gchar *) geocode_photo_list->data, -1, height, TRUE, &err);
 
598
                if(!pixbuf)
 
599
                        printf("%s loading pixbuf failed - actually this should not happen\n", __PRETTY_FUNCTION__);
 
600
                
 
601
                gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
 
602
        }
 
603
        else
 
604
        {
 
605
                gtk_image_set_from_file(GTK_IMAGE(image), (const gchar *) geocode_photo_list->data);
 
606
                img_width = gdk_pixbuf_get_width(gtk_image_get_pixbuf(GTK_IMAGE(image)));
 
607
        }
 
608
                
 
609
        ed = exif_data_new_from_file((const gchar *) geocode_photo_list->data);
 
610
        if (!ed) {
 
611
                printf("File not readable or no EXIF data in file %s\n", (const gchar *) geocode_photo_list->data);
 
612
                return;
 
613
        }
 
614
 
 
615
        datetime = show_tag(ed, EXIF_IFD_0, EXIF_TAG_DATE_TIME);
 
616
        strptime(datetime, "%Y:%m:%d %H:%M:%S", &tm_photo);
 
617
        
 
618
        gtk_label_set_label(GTK_LABEL(label), datetime);
 
619
        update_gps_time_label();
 
620
        
 
621
        gtk_widget_show (image);
 
622
}
 
623
 
 
624
 
 
625
void
 
626
geo_photo_close_dialog_image_data()
 
627
{
 
628
        GtkWidget *entry, *label1, *label2, *combobox;
 
629
        const char *txt;
 
630
        char *label_txt;
 
631
        
 
632
        entry = lookup_widget(dialog_image_data, "entry28");
 
633
        combobox = lookup_widget(dialog_image_data, "combobox7");
 
634
        
 
635
        geocode_timezone = gtk_combo_box_get_active(GTK_COMBO_BOX(combobox))-12;
 
636
        
 
637
        label1 = lookup_widget(dialog_photo_correlate, "label172");
 
638
        label2 = lookup_widget(dialog_photo_correlate, "label174");
 
639
        
 
640
        txt = gtk_entry_get_text(GTK_ENTRY(entry));
 
641
        geocode_correction = atoi(txt);
 
642
        
 
643
        label_txt = g_strdup_printf("  %d seconds", geocode_correction);
 
644
        gtk_label_set_label(GTK_LABEL(label2), label_txt);
 
645
        
 
646
        label_txt = g_strdup_printf("  %d:00h", geocode_timezone);
 
647
        gtk_label_set_label(GTK_LABEL(label1), label_txt);
 
648
        
 
649
        gconf_client_set_int(global_gconfclient, GCONF"/geocode_correction", geocode_correction, NULL);
 
650
        gconf_client_set_int(global_gconfclient, GCONF"/geocode_timezone", geocode_timezone+13, NULL);
 
651
        
 
652
        gtk_widget_hide(dialog_image_data);
 
653
        gtk_widget_show(dialog_photo_correlate);
 
654
}
 
655
 
 
656
void
 
657
geo_photo_cancel_dialog_image_data()
 
658
{
 
659
        gtk_widget_hide(dialog_image_data);
 
660
        gtk_widget_show(dialog_photo_correlate);        
 
661
}
 
662
 
 
663
 
 
664
void
 
665
geo_photo_cancel_dialog_photo_correlate()
 
666
{
 
667
        gtk_widget_hide(dialog_photo_correlate);
 
668
}
 
669
 
 
670
void
 
671
geo_photo_set_timezone(GtkComboBox *combobox)
 
672
{
 
673
        geocode_timezone = gtk_combo_box_get_active(combobox)-12;
 
674
        update_gps_time_label();
 
675
}
 
676
 
 
677
void
 
678
geo_photo_set_add_to_database(GtkToggleButton *togglebutton)
 
679
{
 
680
        add_to_database = gtk_toggle_button_get_active(togglebutton);
 
681
        printf("add_to_database: %d\n", add_to_database);
 
682
}
 
683
 
 
684
void
 
685
geo_photo_close_dialog_photo_correlate()
 
686
{
 
687
        gchar *command_line;
 
688
 
 
689
        prepare_perl();
 
690
        
 
691
        dialog_geocode_result = create_dialog_geocode_result();
 
692
 
 
693
        gtk_widget_show(dialog_geocode_result);
 
694
        gtk_widget_hide(dialog_photo_correlate);
 
695
 
 
696
        command_line = g_strdup_printf("/tmp/tangogps_geocode.pl '%s' '%s' '%d' '%d' '%d'", 
 
697
                                        geocode_trackname, 
 
698
                                        geocode_photodir,
 
699
                                        geocode_timezone,
 
700
                                        geocode_correction,
 
701
                                        add_to_database);
 
702
printf("commandline out thread: %s\n", command_line);   
 
703
        
 
704
        g_thread_create(geocode_thread, command_line, FALSE, NULL);
 
705
        
 
706
}
 
707
 
 
708
 
 
709
 
 
710
 
 
711
void
 
712
geo_photo_correction_entry_cb(GtkEditable *editable)
 
713
{
 
714
        update_gps_time_label();
 
715
}
 
716
 
 
717
void
 
718
update_gps_time_label()
 
719
{
 
720
        GtkWidget *label, *entry, *combobox;
 
721
        int correction;
 
722
        int timezone;
 
723
        time_t time;
 
724
        struct tm *tm_gps;
 
725
        char buf[1024];
 
726
        
 
727
        
 
728
        label = lookup_widget(dialog_image_data, "label171");
 
729
        entry = lookup_widget(dialog_image_data, "entry28");
 
730
        combobox = lookup_widget(dialog_image_data, "combobox7");
 
731
        
 
732
        correction = atoi(gtk_entry_get_text(GTK_ENTRY(entry)));
 
733
        timezone = gtk_combo_box_get_active(GTK_COMBO_BOX(combobox))-12;
 
734
 
 
735
        time = mktime(&tm_photo) + correction - timezone*3600;
 
736
 
 
737
        tm_gps = localtime(&time);
 
738
        printf("timezone: %d\n", timezone);     
 
739
 
 
740
        strftime(buf, sizeof(buf), "<span color=\"#009\">%a %Y-%m-%d %H:%M:%S</span>", tm_gps);
 
741
        
 
742
        gtk_label_set_label(GTK_LABEL(label), buf);
 
743
}
 
744
 
 
745
 
 
746
 
 
747
 
 
748
 
 
749
 
 
750
 
 
751
gpointer
 
752
geocode_thread(gpointer user_data)
 
753
{
 
754
        GtkWidget *label, *item;
 
755
        gchar *standard_output;
 
756
        gchar *standard_error;
 
757
        gint exit_status;
 
758
        GError *err = NULL;
 
759
        char *command_line = (char *) user_data;
 
760
        gboolean res;
 
761
 
 
762
printf("commandline in thread: %s\n", command_line);    
 
763
        
 
764
        res = g_spawn_command_line_sync  (
 
765
                                command_line, 
 
766
                                &standard_output, 
 
767
                                &standard_error,
 
768
                                &exit_status,
 
769
                                &err);
 
770
        
 
771
        if(!res)
 
772
        {
 
773
                fprintf (stderr, "Error running tangogps_geocode.pl: %s\n", err->message);
 
774
                g_error_free (err);
 
775
        }
 
776
        
 
777
        printf ("%s(): STDERR \n%s \nRET: %d \n", __PRETTY_FUNCTION__, standard_error, exit_status);
 
778
        
 
779
        gdk_threads_enter();
 
780
        
 
781
        label = lookup_widget(dialog_geocode_result, "label177");
 
782
        gtk_label_set_text(GTK_LABEL(label), g_strdup(standard_output));
 
783
        
 
784
        if(add_to_database)
 
785
        {
 
786
                item = lookup_widget(menu1, "item9");
 
787
                gtk_menu_item_activate (GTK_MENU_ITEM(item));
 
788
        }
 
789
        
 
790
        gdk_threads_leave();
 
791
        
 
792
        g_free(command_line);
 
793
 
 
794
        return NULL;
 
795
}
 
796
 
 
797
 
 
798
void
 
799
prepare_perl()
 
800
{
 
801
char *command;
 
802
FILE *fp;
 
803
 
 
804
{
 
805
        printf("* %s\n", __PRETTY_FUNCTION__);
 
806
 
 
807
        
 
808
        
 
809
        
 
810
        
 
811
        
 
812
        
 
813
        
 
814
command = g_strdup(
 
815
"#!/usr/bin/perl\n"
 
816
"\n"
 
817
"# (C)2008 Marcus Bauer, License: GPLv2, marus.bauer@gmail.com\n"
 
818
"\n"
 
819
"#\n"
 
820
"# helper for tangoGPS to geocode photos\n"
 
821
"#\n"
 
822
"\n"
 
823
"# needs: gpscorrelate, sqlite3, jhead\n"
 
824
"\n"
 
825
"# input:\n"
 
826
"# - .log or .gpx file\n"
 
827
"# - photo list\n"
 
828
"# - timezone\n"
 
829
"# - correction\n"
 
830
"# - do_insert2db\n"
 
831
"\n"
 
832
"# logic:\n"
 
833
"# - convert to gpx\n"
 
834
"# - correlate\n"
 
835
"# - in2db tangogps\n"
 
836
"\n"
 
837
"# gpscorrelate -g foo.gpx -z timezone --max-dist 120 --photooffset 5 p1.jpg ...\n"
 
838
"\n"
 
839
"$geocode_track = $ARGV[0];\n"
 
840
"$geocode_dir   = $ARGV[1];\n"
 
841
"$timezone      = $ARGV[2];\n"
 
842
"$correction    = $ARGV[3];\n"
 
843
"$do_insert2db  = $ARGV[4];\n"
 
844
"\n"
 
845
"$db = \"~/.tangogps/geophoto.db\";\n"
 
846
"\n"
 
847
"#===================  MAIN  ====================\n"
 
848
"\n"
 
849
"print STDERR \"\n"
 
850
"VARS: \n"
 
851
"  geocode_track = $ARGV[0];\n"
 
852
"  geocode_dir   = $ARGV[1];\n"
 
853
"  timezone      = $ARGV[2];\n"
 
854
"  correction    = $ARGV[3];\n"
 
855
"  do_insert2db  = $ARGV[4];\n"
 
856
"\";\n"
 
857
"\n"
 
858
"&test_for_helper_programs();\n"
 
859
"&get_photos_from_dir();\n"
 
860
"\n"
 
861
"&convert2gpx();\n"
 
862
"&correlate();\n"
 
863
"&insert2db();\n"
 
864
"\n"
 
865
"#==================  END MAIN  ==================\n"
 
866
"\n"
 
867
"sub test_for_helper_programs()\n"
 
868
"{\n"
 
869
"       # jhead, sqlite3, gpscorrelate\n"
 
870
"\n"
 
871
"       $missing_prog = 0;\n"
 
872
"\n"
 
873
"       if(system(\"jhead -h >/dev/null\") == -1){ $install .= \" jhead,\";     $missing_prog = 1;};\n"
 
874
"       if(system(\"sqlite3\") == -1)            { $install .= \" sqlite3, \";  $missing_prog = 1;};\n"
 
875
"       if(system(\"gpscorrelate -h >/dev/null\")  == -1)        { $install .= \" gpscorrelate\";       $missing_prog = 1;};\n"
 
876
"\n"
 
877
"       $error_msg =    \"Hello, I couldn\'t find the following helper programs: \\n\\n\" .\n"
 
878
"                       \"   $install \\n\\n\" .\n"
 
879
"                       \"-> You can find them in your Linux distribution.\\n\\n\" .\n"
 
880
"                       \"Please install them first and try again.\\n\";\n"
 
881
"\n"
 
882
"       if($missing_prog) {print STDOUT $error_msg;\n"
 
883
"       exit;}\n"
 
884
"}\n"
 
885
"\n"
 
886
"sub get_photos_from_dir()\n"
 
887
"{\n"
 
888
"       opendir(DIR, $geocode_dir) || die(\"Cannot open directory\");\n"
 
889
"       @photos= readdir(DIR);\n"
 
890
"       closedir(DIR);\n"
 
891
"}\n"
 
892
"\n"
 
893
"sub convert2gpx\n"
 
894
"{\n"
 
895
"       # test if *.log \n"
 
896
"       if($geocode_track =~ /\\.log$/)\n"
 
897
"       {\n"
 
898
"               &do_convert2gpx();\n"
 
899
"       }\n"
 
900
"}\n"
 
901
"\n"
 
902
"\n"
 
903
"sub correlate\n"
 
904
"{\n"
 
905
"       #\n"
 
906
"       # construct command line\n"
 
907
"       #\n"
 
908
"\n"
 
909
"       chdir($geocode_dir);\n"
 
910
"\n"
 
911
"       foreach(@photos)\n"
 
912
"       {\n"
 
913
"               if(     -f \"$_\"   && \n"
 
914
"                       ( ( $_ =~ /\\.jpg$/i ) ||\n"
 
915
"                         ( $_ =~ /\\.jpeg$/i)\n"
 
916
"                       )\n"
 
917
"                 )\n"
 
918
"               {\n"
 
919
"                       $photo_list .= \" \'$_\'\";\n"
 
920
"               }\n"
 
921
"               else { print STDERR \"not a file: $_ \\n\"; }\n"
 
922
"       }\n"
 
923
"\n"
 
924
"       # gpscorrelate ... \n"
 
925
"       $command_line =  \"gpscorrelate \"\n"
 
926
"                       .\"-g \'$geocode_track\' \"\n"
 
927
"                       .\"-z $timezone \"\n"
 
928
"                       .\"--max-dist 120 \"\n"
 
929
"                       .\"--photooffset $correction\"\n"
 
930
"                       . $photo_list;\n"
 
931
"\n"
 
932
"       print STDERR \"$command_line\\n\";\n"
 
933
"\n"
 
934
"       $output = `$command_line`;\n"
 
935
"\n"
 
936
"       print STDOUT \"$output \\n\";\n"
 
937
"\n"
 
938
"}\n"
 
939
"\n"
 
940
"\n"
 
941
"sub insert2db()\n"
 
942
"{\n"
 
943
"       if($do_insert2db)\n"
 
944
"       {\n"
 
945
"               &do_insert2db();\n"
 
946
"       }\n"
 
947
"       else\n"
 
948
"       {\n"
 
949
"               print STDERR \"Not adding to tangoGPS database\\n\";\n"
 
950
"       }\n"
 
951
"\n"
 
952
"}\n"
 
953
"\n"
 
954
"\n"
 
955
"#=========== END MAIN FUCTIONS, START HELPER FUNCTIONS ===========\n"
 
956
"\n"
 
957
"\n"
 
958
"sub do_convert2gpx\n"
 
959
"{\n"
 
960
"       \n"
 
961
"#---  open track logfile ---\n"
 
962
"       \n"
 
963
"open (INFILE, $geocode_track) or die $!;\n"
 
964
"open (OUTFILE, \">/tmp/$$.gpx\") or die $!;\n"
 
965
"\n"
 
966
"\n"
 
967
"       \n"
 
968
"#--- start GPX ---\n"
 
969
"\n"
 
970
"$gpx = <<EOT\n"
 
971
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
 
972
"<gpx   version=\"1.0\"\n"
 
973
"       creator=\"convert2gpx.pl http://www.tangogps.org\"\n"
 
974
"       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
 
975
"       xmlns=\"http://www.topografix.com/GPX/1/0\"\n"
 
976
"       xsi:schemaLocation=\"http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd\">\n"
 
977
"\n"
 
978
"<trk>\n"
 
979
"<trkseg>\n"
 
980
"EOT\n"
 
981
";\n"
 
982
"\n"
 
983
"\n"
 
984
"while (<INFILE>)\n"
 
985
"{\n"
 
986
"\n"
 
987
"@arr = split(\',\',$_);\n"
 
988
"chop @arr[6];\n"
 
989
"\n"
 
990
"$gpx .= <<EOT\n"
 
991
"<trkpt lat=\"@arr[0]\" lon=\"@arr[1]\">\n"
 
992
"  <ele>@arr[2]</ele>\n"
 
993
"  <speed>@arr[3]</speed>\n"
 
994
"  <course>@arr[4]</course>\n"
 
995
"  <fix>3d</fix>\n"
 
996
"  <hdop>@arr[5]</hdop>\n"
 
997
"  <time>@arr[6]</time>\n"
 
998
"</trkpt>\n"
 
999
"EOT\n"
 
1000
";\n"
 
1001
"\n"
 
1002
"} #end while()\n"
 
1003
"\n"
 
1004
"\n"
 
1005
"$gpx .= <<EOT\n"
 
1006
"</trkseg>\n"
 
1007
"</trk>\n"
 
1008
"</gpx>\n"
 
1009
"EOT\n"
 
1010
";\n"
 
1011
"\n"
 
1012
"\n"
 
1013
"\n"
 
1014
"# write .gpx to /tmp/$$\n"
 
1015
"print OUTFILE $gpx;\n"
 
1016
"\n"
 
1017
"# set geocode_track to filename\n"
 
1018
"$geocode_track = \"/tmp/$$.gpx\";\n"
 
1019
"\n"
 
1020
"print STDERR \"track: $geocode_track\\n\"\n"
 
1021
"}\n"
 
1022
"\n"
 
1023
"\n"
 
1024
"#------------------------------------------------------------\n"
 
1025
"\n"
 
1026
"#---------------------------------------------\n"
 
1027
"# get exif info from photo and put into db\n"
 
1028
"#---------------------------------------------\n"
 
1029
"\n"
 
1030
"sub exif2db\n"
 
1031
"{\n"
 
1032
"\n"
 
1033
"local($photo) = @_;\n"
 
1034
"\n"
 
1035
"# ------------------\n"
 
1036
"# extract exif info\n"
 
1037
"# ------------------\n"
 
1038
"$lat_string = `jhead $photo | grep \"GPS Latitude\" `;\n"
 
1039
"$lon_string = `jhead $photo | grep \"GPS Longitude\" `;\n"
 
1040
"\n"
 
1041
"\n"
 
1042
"($lat_half, $lat_deg, $lat_min, $lat_sec) =\n"
 
1043
"       $lat_string =~ /^GPS Latitude : (N|S) +(\\d+)d (\\d+)m +(\\d+\\.\\d+)s$/;\n"
 
1044
"\n"
 
1045
"($lon_half, $lon_deg, $lon_min, $lon_sec) =\n"
 
1046
"       $lon_string =~ /^GPS Longitude: (E|W) +(\\d+)d (\\d+)m +(\\d+\\.\\d+)s$/;\n"
 
1047
"\n"
 
1048
"$lat = $lat_deg + $lat_min/60 + $lat_sec/3600;\n"
 
1049
"$lat = ($lat_half eq \"N\") ? $lat : -$lat;\n"
 
1050
"\n"
 
1051
"$lon = $lon_deg + $lon_min/60 + $lon_sec/3600;\n"
 
1052
"$lon = ($lon_half eq \"E\") ? $lon : -$lon;\n"
 
1053
"\n"
 
1054
"\n"
 
1055
"#----------------------------\n"
 
1056
"# extract filename from path \n"
 
1057
"#----------------------------\n"
 
1058
"$filename = \"\\\"\" . $photo . \"\\\"\";\n"
 
1059
"$file =  `basename $filename` ;\n"
 
1060
"chop $file;\n"
 
1061
"$file = \"\\\"\" . $file . \"\\\"\";\n"
 
1062
"$desc = \"\\\"unset\\\"\";\n"
 
1063
"\n"
 
1064
"\n"
 
1065
"\n"
 
1066
"print STDERR \"$file $lat - $lon\\n\";\n"
 
1067
"\n"
 
1068
"\n"
 
1069
"#-----------------------\n"
 
1070
"# insert into sqlite db\n"
 
1071
"#-----------------------\n"
 
1072
"\n"
 
1073
"if ($lat !=0 && $lon !=0)\n"
 
1074
"{\n"
 
1075
"       $res = `sqlite3 $db \'INSERT INTO photo VALUES (\"$geocode_dir/$photo\",$file,$lat,$lon,$desc)\'`;\n"
 
1076
"\n"
 
1077
"       print STDERR $res;\n"
 
1078
"}\n"
 
1079
"\n"
 
1080
"}\n"
 
1081
"\n"
 
1082
"\n"
 
1083
"sub do_insert2db \n"
 
1084
"{\n"
 
1085
"\n"
 
1086
"#-------------------------------------------\n"
 
1087
"# create database if it does not yet exist\n"
 
1088
"#-------------------------------------------\n"
 
1089
"$sql = \"\n"
 
1090
"CREATE TABLE \n"
 
1091
"       photo (\n"
 
1092
"               filename TEXT primary key, \n"
 
1093
"               name TEXT, \n"
 
1094
"               lat REAL, \n"
 
1095
"               lon REAL, \n"
 
1096
"               desc TEXT\n"
 
1097
"       )\n"
 
1098
"\";\n"
 
1099
"$res = `sqlite3 $db \'$sql\'`;\n"
 
1100
"\n"
 
1101
"print STDERR $res;\n"
 
1102
"\n"
 
1103
"\n"
 
1104
"#-----------------------\n"
 
1105
"# insert photos into db\n"
 
1106
"#----------------------\n"
 
1107
"foreach(@photos)\n"
 
1108
"{\n"
 
1109
"       #\n"
 
1110
"       # check if jpeg file\n"
 
1111
"       #\n"
 
1112
"       if(     -f \"$_\"   && \n"
 
1113
"               ( ( $_ =~ /\\.jpg$/i ) ||\n"
 
1114
"                 ( $_ =~ /\\.jpeg$/i)\n"
 
1115
"               )\n"
 
1116
"         )\n"
 
1117
"       {\n"
 
1118
"               &exif2db(\"$_\");\n"
 
1119
"       }\n"
 
1120
"}\n"
 
1121
"\n"
 
1122
"\n"
 
1123
"}\n"
 
1124
);
 
1125
}
 
1126
 
 
1127
 
 
1128
fp = fopen("/tmp/tangogps_geocode.pl", "w+");
 
1129
if (fp==0) 
 
1130
        printf("could not open tmp\n"); 
 
1131
 
 
1132
fprintf(fp, "%s", command);
 
1133
fclose(fp);
 
1134
 
 
1135
system ("chmod 700 /tmp/tangogps_geocode.pl");
 
1136
 
 
1137
}