1
2 #include "callbacks.h"
3 #include "friends.h"
4 #include "globals.h"
5 #include "converter.h"
6 #include "interface.h"
7 #include "support.h"
8 #include "wp.h"
9 #include "util.h"
10 #include "map_management.h"
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <glib.h>
16 #include <glib/gprintf.h>
17 #include <gtk/gtk.h>
18
19 #include <curl/curl.h>
20 #include <curl/easy.h>
21
22
23
24 void
25 on_msg_friend_clicked(GtkButton *button, gpointer user_data);
26
27 void
28 on_goto_friend_clicked(GtkButton *button, gpointer user_data);
29
30 void
31 on_msg_send_clicked(GtkButton *button, gpointer user_data);
32
33
34 void *
35 thread_send_message(void *ptr);
36
37 GSList*
38 create_msg_postdata(msg_t *m);
39
40 void
41 process_msg_replydata(postreply_t *postreply);
42
43 void
44 add_message(msg_t *m);
45
46 GtkWidget*
47 create_msg_box(msg_t *m);
48
49 void
50 on_goto_friend2_clicked(GtkButton *button, gpointer user_data);
51
52
53
54
55 struct mem_struct {
56 char *memory;
57 size_t size;
58 };
59
60
61 static size_t
cb_write_to_mem(void * ptr,size_t size,size_t nmemb,void * data)62 cb_write_to_mem(void *ptr, size_t size, size_t nmemb, void *data)
63 {
64 size_t realsize = size * nmemb;
65 struct mem_struct *mem = (struct mem_struct *)data;
66
67 mem->memory = (char *)g_realloc(mem->memory, mem->size + realsize + 1);
68
69 if (mem->memory)
70 {
71 memcpy(&(mem->memory[mem->size]), ptr, realsize);
72 mem->size += realsize;
73 mem->memory[mem->size] = 0;
74 }
75 return realsize;
76 }
77
78 static GdkPixbuf *friend_icon = NULL;
79 static GdkGC *gc_map = NULL;
80 static char *db_ts_last_request_friends = NULL;
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 gboolean
update_position()100 update_position()
101 {
102 GtkLabel *label_msg;
103 label_msg = (GtkLabel *)lookup_widget(window1, "label51");
104 gtk_label_set_label (label_msg, _("Connecting..."));
105
106 #if GLIB_CHECK_VERSION(2,34,0)
107 if (!g_thread_new("friends thread", &update_position_thread, (gpointer) NULL) != 0)
108 #else
109 if (!g_thread_create(&update_position_thread, NULL, FALSE, NULL) != 0)
110 #endif
111 g_warning("### can't create friend thread\n");
112
113 return TRUE;
114 }
115
116 void *
update_position_thread(void * ptr)117 update_position_thread(void *ptr)
118 {
119 int i=1;
120
121 GtkEntry *nick, *pass, *email, *msg;
122 GtkLabel *label_msg;
123 const gchar *n, *p, *e, *m;
124 gchar *ff_mode;
125 static gchar lat[64], lon[64], mode[64];
126 static gchar alt[16] = "0", speed[16] = "0", head[16]="0";
127
128
129 gchar **user_data_sets;
130 long int response_code;
131
132 CURL *curl_handle;
133
134 struct curl_httppost *formdata=NULL;
135 struct curl_httppost *lastptr=NULL;
136
137 struct mem_struct chunk;
138
139 chunk.memory=NULL;
140 chunk.size = 0;
141
142
143 gdk_threads_enter();
144
145 label_msg = (GtkLabel *)lookup_widget(window1, "label51");
146
147
148 nick = (GtkEntry *)lookup_widget(window1, "entry7");
149 pass = (GtkEntry *)lookup_widget(window1, "entry8");
150 email = (GtkEntry *)lookup_widget(window1, "entry9");
151 msg = (GtkEntry *)lookup_widget(window1, "entry29");
152
153 switch (global_ff_mode) {
154 case PRIVATE_MODE:
155 ff_mode = g_strdup("private");
156 break;
157 case FRIEND_MODE:
158 ff_mode = g_strdup("friends");
159 break;
160 case FUN_MODE:
161 ff_mode = g_strdup("fun");
162 break;
163 default:
164 ff_mode = g_strdup("");
165 }
166
167 n = gtk_entry_get_text(nick);
168 p = gtk_entry_get_text(pass);
169 e = gtk_entry_get_text(email);
170 m = gtk_entry_get_text(msg);
171
172 gdk_threads_leave();
173
174
175 if (global_myposition.lat && global_myposition.lon)
176 {
177 g_sprintf(lat, "%f", global_myposition.lat);
178 g_sprintf(lon, "%f", global_myposition.lon);
179 g_sprintf(mode, "%s|%dx%d", "man", global_drawingarea_width, global_drawingarea_height);
180 }
181 else if (gpsdata && gpsdata->fix.latitude !=0)
182 {
183 g_sprintf(lat, "%f", gpsdata->fix.latitude);
184 g_sprintf(lon, "%f", gpsdata->fix.longitude);
185 g_sprintf(mode, "%s|%dx%d", "gps", global_drawingarea_width, global_drawingarea_height);
186 }
187 else
188 {
189 float tmplat, tmplon;
190
191 tmplat = rad2deg( pixel2lat(global_zoom, global_y+global_drawingarea_height/2) );
192 tmplon = rad2deg( pixel2lon(global_zoom, global_x+global_drawingarea_width/2) );
193 g_sprintf(lat, "%f", tmplat);
194 g_sprintf(lon, "%f", tmplon);
195 g_sprintf(mode, "%s|%dx%d", "atm", global_drawingarea_width, global_drawingarea_height);
196 }
197
198
199 if(gpsdata)
200 {
201 g_snprintf(alt, 16, "%.1f", gpsdata->fix.altitude);
202 g_snprintf(head, 16, "%.1f", gpsdata->fix.heading);
203 g_snprintf(speed, 16, "%.1f", gpsdata->fix.speed);
204 }
205
206 curl_global_init(CURL_GLOBAL_ALL);
207
208 curl_formadd(&formdata,
209 &lastptr,
210 CURLFORM_COPYNAME, "lat",
211 CURLFORM_COPYCONTENTS, lat,
212 CURLFORM_END);
213
214 curl_formadd(&formdata,
215 &lastptr,
216 CURLFORM_COPYNAME, "lon",
217 CURLFORM_COPYCONTENTS, lon,
218 CURLFORM_END);
219
220 curl_formadd(&formdata,
221 &lastptr,
222 CURLFORM_COPYNAME, "alt",
223 CURLFORM_COPYCONTENTS, alt,
224 CURLFORM_END);
225
226 curl_formadd(&formdata,
227 &lastptr,
228 CURLFORM_COPYNAME, "head",
229 CURLFORM_COPYCONTENTS, head,
230 CURLFORM_END);
231
232 curl_formadd(&formdata,
233 &lastptr,
234 CURLFORM_COPYNAME, "speed",
235 CURLFORM_COPYCONTENTS, speed,
236 CURLFORM_END);
237
238 curl_formadd(&formdata,
239 &lastptr,
240 CURLFORM_COPYNAME, "mode",
241 CURLFORM_COPYCONTENTS, mode,
242 CURLFORM_END);
243
244 curl_formadd(&formdata,
245 &lastptr,
246 CURLFORM_COPYNAME, "ff_mode",
247 CURLFORM_COPYCONTENTS, ff_mode,
248 CURLFORM_END);
249
250 curl_formadd(&formdata,
251 &lastptr,
252 CURLFORM_COPYNAME, "nick",
253 CURLFORM_COPYCONTENTS, n,
254 CURLFORM_END);
255
256 curl_formadd(&formdata,
257 &lastptr,
258 CURLFORM_COPYNAME, "pass",
259 CURLFORM_COPYCONTENTS, p,
260 CURLFORM_END);
261
262 curl_formadd(&formdata,
263 &lastptr,
264 CURLFORM_COPYNAME, "msg",
265 CURLFORM_COPYCONTENTS, m,
266 CURLFORM_END);
267
268
269 curl_handle = curl_easy_init();
270
271 curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.tangogps.org/friends/update_pos.php");
272 curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formdata);
273 curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, cb_write_to_mem);
274 curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
275 curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, VERSION );
276
277 curl_easy_perform(curl_handle);
278 curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &response_code);
279
280
281 curl_easy_cleanup(curl_handle);
282
283
284
285
286
287
288
289
290 if (response_code == 200)
291 {
292
293
294
295
296
297 user_data_sets = g_strsplit_set (chunk.memory, "|", -1);
298
299
300 gdk_threads_enter();
301 g_slist_free(friends_list);
302 friends_list = NULL;
303 gtk_label_set_label(label_msg, user_data_sets[0]);
304 gdk_threads_leave();
305
306 while (user_data_sets[i] && !g_str_equal(user_data_sets[i],"EOD") )
307 {
308 gchar **array;
309 int len=0;
310 friend_t *friend = g_new0(friend_t,1);
311
312 array = g_strsplit(user_data_sets[i],"#",-1);
313 while (array[len]) len++;
314
315
316
317
318
319 if(len>=7)
320 {
321 friend->type = atoi(g_strdup(array[0]));
322 friend->nick = g_strdup(array[1]);
323 friend->lat = atof(g_strdup(array[2]));
324 friend->lon = atof(g_strdup(array[3]));
325 friend->head = atoi(g_strdup(array[4]));
326 friend->lastseen = g_strdup(array[5]);
327 friend->away_msg = g_strdup(array[6]);
328
329 friends_list = g_slist_append(friends_list, friend);
330 }
331
332
333 i++;
334 }
335 }
336 else
337 {
338 gdk_threads_enter();
339 gtk_label_set_text (label_msg, _("No response (200)"));
340 gdk_threads_leave();
341
342 }
343
344
345
346
347 gdk_threads_enter();
348 repaint_all();
349 gdk_threads_leave();
350
351
352 if(chunk.memory)
353 g_free(chunk.memory);
354
355 curl_global_cleanup();
356
357 g_free(ff_mode);
358
359 return NULL;
360 }
361
362 void
paint_friends()363 paint_friends()
364 {
365 GSList *list;
366 int pixel_x, pixel_y, x,y;
367 float lat, lon;
368 GdkColor color;
369 GdkGC *gc;
370 GError *error = NULL;
371
372 gc = gdk_gc_new(pixmap);
373 color.green = 60000;
374 color.blue = 0;
375 color.red = 10000;
376 gdk_gc_set_rgb_fg_color(gc, &color);
377
378
379 if(!friend_icon)
380 {
381 friend_icon = gdk_pixbuf_new_from_file_at_size (
382 PACKAGE_PIXMAPS_DIR "/" PACKAGE "-friend.png", 24,24,
383 &error);
384 }
385 if (pixmap && !gc_map)
386 gc_map = gdk_gc_new(pixmap);
387
388
389 if (global_show_friends)
390 {
391 for(list = friends_list; list != NULL; list = list->next)
392 {
393 friend_t *f = list->data;
394
395 lat = deg2rad(f->lat);
396 lon = deg2rad(f->lon);
397
398
399
400
401 pixel_x = lon2pixel(global_zoom, lon);
402 pixel_y = lat2pixel(global_zoom, lat);
403
404 x = pixel_x - global_x;
405 y = pixel_y - global_y;
406
407 f->screen_x = x;
408 f->screen_y = y;
409
410
411
412 if(!friend_icon)
413 {
414 gdk_draw_arc (
415 pixmap,
416
417 gc,
418 TRUE,
419 x-4, y-4,
420 8,8,
421 0,23040);
422 }
423 else
424 {
425 gdk_draw_pixbuf (
426 pixmap,
427 gc_map,
428 friend_icon,
429 0,0,
430 x-12,y-12,
431 24,24,
432 GDK_RGB_DITHER_NONE, 0, 0);
433
434 gtk_widget_queue_draw_area (
435 map_drawable,
436 x-12, y-12,
437 24,24);
438 }
439
440 }
441 }
442 }
443
444 void
update_position0()445 update_position0()
446 {
447 CURL *curl;
448 CURLcode res;
449
450 curl = curl_easy_init();
451
452 if(curl)
453 {
454 curl_easy_setopt(curl, CURLOPT_URL,
455 "127.0.0.1/friends/update_position.php?lat=1&lon=1");
456 res = curl_easy_perform(curl);
457
458 curl_easy_cleanup(curl);
459 }
460
461 }
462
463
464
465
466
467
468 int
register_nick()469 register_nick()
470 {
471 GtkLabel *label_msg;
472 label_msg = (GtkLabel *)lookup_widget(window1, "label62");
473 gtk_label_set_text (label_msg, _("Connecting..."));
474
475 #if GLIB_CHECK_VERSION(2,34,0)
476 if (!g_thread_new("register nick thread", ®ister_nick_thread, (gpointer) NULL) != 0)
477 #else
478 if (!g_thread_create(®ister_nick_thread, NULL, FALSE, NULL) != 0)
479 #endif
480 g_warning("### can't create register_nick() thread\n");
481
482 return 0;
483 }
484
485 void *
register_nick_thread(void * ptr)486 register_nick_thread(void *ptr)
487 {
488
489 GtkEntry *nick, *pass, *email;
490 GtkLabel *label_msg;
491 const gchar *n, *p, *e;
492 gchar *buffer;
493
494
495
496 CURL *curl_handle;
497
498 struct curl_httppost *formdata=NULL;
499 struct curl_httppost *lastptr=NULL;
500
501 struct mem_struct chunk;
502
503 chunk.memory=NULL;
504 chunk.size = 0;
505
506 nick = (GtkEntry *)lookup_widget(window1, "entry7");
507 pass = (GtkEntry *)lookup_widget(window1, "entry8");
508 email = (GtkEntry *)lookup_widget(window1, "entry9");
509
510 n = gtk_entry_get_text(nick);
511 p = gtk_entry_get_text(pass);
512 e = gtk_entry_get_text(email);
513
514
515 curl_global_init(CURL_GLOBAL_ALL);
516
517
518 curl_formadd(&formdata,
519 &lastptr,
520 CURLFORM_COPYNAME, "nick",
521 CURLFORM_COPYCONTENTS, n,
522 CURLFORM_END);
523
524 curl_formadd(&formdata,
525 &lastptr,
526 CURLFORM_COPYNAME, "pass",
527 CURLFORM_COPYCONTENTS, p,
528 CURLFORM_END);
529
530 curl_formadd(&formdata,
531 &lastptr,
532 CURLFORM_COPYNAME, "email",
533 CURLFORM_COPYCONTENTS, e,
534 CURLFORM_END);
535
536
537
538 curl_handle = curl_easy_init();
539
540 curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.tangogps.org/friends/register_nick.php");
541 curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formdata);
542 curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, cb_write_to_mem);
543 curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
544 curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
545
546
547 curl_easy_perform(curl_handle);
548 curl_easy_cleanup(curl_handle);
549
550 if((int)chunk.size > 0){
551 buffer = g_strdup(chunk.memory);
552 }
553 else
554 buffer = g_strdup (_("Oh. Some error occurred..."));
555
556 gdk_threads_enter();
557 label_msg = (GtkLabel *)lookup_widget(window1, "label62");
558 gtk_label_set_text(label_msg, buffer);
559 gdk_threads_leave();
560
561
562
563
564
565 curl_global_cleanup();
566
567 return NULL;
568 }
569
570
571 GtkWidget*
create_friend_box(friend_t * f)572 create_friend_box(friend_t *f)
573 {
574 GtkWidget *hbox, *label, *vbox, *button;
575 char *label_txt;
576
577 label_txt = g_strdup_printf (_("<b>%s</b>\n"
578 "Last seen:\n"
579 "%s\n"
580 "<i>%s</i>"),
581 f->nick, f->lastseen, f->away_msg);
582
583 hbox = gtk_hbox_new (FALSE, 2);
584 gtk_widget_show (hbox);
585
586 label = gtk_label_new ("");
587 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
588
589 gtk_label_set_label(GTK_LABEL(label), label_txt);
590
591 gtk_widget_show (label);
592 gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
593
594 vbox = gtk_vbox_new (FALSE, 0);
595 gtk_widget_show (vbox);
596 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
597
598 button = gtk_button_new_with_mnemonic (_("Msg"));
599 gtk_widget_show (button);
600 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 2);
601
602 g_signal_connect ((gpointer) button, "clicked",
603 G_CALLBACK (on_msg_friend_clicked),
604 (gpointer) f->nick);
605
606 button = gtk_button_new_with_mnemonic (_("Go To"));
607 gtk_widget_show (button);
608 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 2);
609
610 g_signal_connect ((gpointer) button, "clicked",
611 G_CALLBACK (on_goto_friend_clicked),
612 (gpointer) f);
613 return hbox;
614 }
615
616
617 void
on_msg_friend_clicked(GtkButton * button,gpointer user_data)618 on_msg_friend_clicked(GtkButton *button, gpointer user_data)
619 {
620 GladeXML *gladexml;
621 GtkWidget *widget, *window;
622 char *label_txt;
623 char *to;
624
625 to = user_data;
626 label_txt = g_strdup_printf (_("Send Message To: <b>%s</b>"), to);
627
628 widget = lookup_widget(GTK_WIDGET(button), "window8");
629 gtk_widget_destroy(widget);
630
631 gladexml = glade_xml_new (gladefile, "dialog9", GETTEXT_PACKAGE);
632 glade_xml_signal_autoconnect (gladexml);
633 window = glade_xml_get_widget (gladexml, "dialog9");
634 g_signal_connect_swapped (window, "destroy",
635 G_CALLBACK (g_object_unref), gladexml);
636
637 gtk_widget_show(window);
638
639 widget = lookup_widget(window, "label188");
640 gtk_label_set_label(GTK_LABEL(widget), label_txt);
641
642 widget = lookup_widget(window, "okbutton10");
643 g_signal_connect ((gpointer) GTK_BUTTON(widget), "clicked",
644 G_CALLBACK (on_msg_send_clicked),
645 (gpointer) to);
646
647 }
648
649 void
on_goto_friend_clicked(GtkButton * button,gpointer user_data)650 on_goto_friend_clicked(GtkButton *button, gpointer user_data)
651 {
652 GtkWidget *widget;
653
654 friend_t *f;
655 f = user_data;
656
657 widget = lookup_widget(GTK_WIDGET(button), "window8");
658 set_current_wp(deg2rad(f->lat), deg2rad(f->lon));
659 gtk_widget_destroy(widget);
660 }
661
662 void
on_msg_send_clicked(GtkButton * button,gpointer user_data)663 on_msg_send_clicked(GtkButton *button, gpointer user_data)
664 {
665 GtkWidget *widget;
666 char *to;
667 msg_t *m;
668
669 to = user_data;
670 m = g_new0(msg_t,1);
671
672 widget = lookup_widget(GTK_WIDGET(button), "entry30");
673 m->txt = g_strdup( gtk_entry_get_text(GTK_ENTRY(widget)) );
674 m->to = g_strdup(to);
675 if (global_myposition.lat && global_myposition.lon)
676 {
677 m->lat = global_myposition.lat;
678 m->lon = global_myposition.lon;
679 }
680 else if (gpsdata)
681 {
682 m->lat = gpsdata->fix.latitude;
683 m->lon = gpsdata->fix.longitude;
684 }
685 else
686 {
687 m->lat = 0;
688 m->lon = 0;
689 }
690
691 add_message(m);
692 send_message((gpointer) m);
693 widget = lookup_widget(GTK_WIDGET(button), "dialog9");
694 gtk_widget_destroy(widget);
695 }
696
697 gboolean
send_message(gpointer user_data)698 send_message(gpointer user_data)
699 {
700 GSList *postdata = NULL;
701 msg_t *m;
702
703 m = user_data;
704
705 postdata = create_msg_postdata(m);
706
707 #if GLIB_CHECK_VERSION(2,34,0)
708 if (!g_thread_new("Mission thread", &thread_send_message, postdata) != 0)
709 #else
710 if (!g_thread_create(&thread_send_message, postdata, FALSE, NULL) != 0)
711 #endif
712 g_warning("### can't create mission thread\n");
713
714 return TRUE;
715 }
716
717 void *
thread_send_message(void * ptr)718 thread_send_message(void *ptr)
719 {
720
721 GSList *postdata = NULL;
722 postreply_t *postreply;
723
724
725
726 postdata = ptr;
727
728
729 postreply = mycurl__do_http_post(MSG_SEND_URL, postdata, VERSION);
730
731
732
733
734 gdk_threads_enter();
735 process_msg_replydata(postreply);
736 gdk_threads_leave();
737
738
739
740
741 g_slist_free(postdata);
742 g_free(postreply);
743
744 return NULL;
745 }
746
747 GSList*
create_msg_postdata(msg_t * m)748 create_msg_postdata(msg_t *m)
749 {
750 GSList *postdata = NULL;
751 const char *n, *p;
752 postdata_item_t *item;
753
754
755
756
757 n = gtk_entry_get_text((GtkEntry *)lookup_widget(window1, "entry7"));
758 p = gtk_entry_get_text((GtkEntry *)lookup_widget(window1, "entry8"));
759
760 item = g_new0(postdata_item_t, 1);
761 item->name=g_strdup("user");
762 item->value=g_strdup(n);
763 postdata = g_slist_append(postdata, item);
764
765 item = g_new0(postdata_item_t, 1);
766 item->name=g_strdup("pass");
767 item->value=g_strdup(p);
768 postdata = g_slist_append(postdata, item);
769
770
771
772 if(m)
773 {
774
775 item = g_new0(postdata_item_t, 1);
776 item->name=g_strdup("lat");
777 item->value=g_strdup_printf("%f", m->lat);
778 postdata = g_slist_append(postdata, item);
779
780 item = g_new0(postdata_item_t, 1);
781 item->name=g_strdup("lon");
782 item->value=g_strdup_printf("%f", m->lon);
783 postdata = g_slist_append(postdata, item);
784
785 item = g_new0(postdata_item_t, 1);
786 item->name=g_strdup("txt");
787 item->value=g_strdup_printf("%s", m->txt);
788 postdata = g_slist_append(postdata, item);
789
790 item = g_new0(postdata_item_t, 1);
791 item->name=g_strdup("to");
792 item->value=g_strdup_printf("%s", m->to);
793 postdata = g_slist_append(postdata, item);
794 }
795
796
797
798 if(db_ts_last_request_friends)
799 {
800 item = g_new0(postdata_item_t, 1);
801 item->name=g_strdup("db_ts_last_request_friends");
802 item->value=g_strdup(db_ts_last_request_friends);
803 postdata = g_slist_append(postdata, item);
804 }
805
806 return postdata;
807 }
808
809
810 void
process_msg_replydata(postreply_t * postreply)811 process_msg_replydata(postreply_t *postreply)
812 {
813 GtkWidget *widget;
814 char **arr0 = NULL, **arr = NULL;
815 msg_t *msg = NULL;
816 int i = 1;
817 static gboolean first_call = TRUE;
818
819
820
821 widget = lookup_widget(window1, "label132");
822
823
824
825
826 if(postreply->status_code == 200 && postreply->size > 0)
827 {
828 arr0 = g_strsplit (postreply->data, "###", -1);
829
830
831
832 if (arr0[0] && strlen(arr0[0]))
833 {
834 char *err_msg;
835
836 arr = g_strsplit (arr0[0], "|", -1);
837
838 err_msg = g_strdup(arr[4]);
839 gtk_label_set_label(GTK_LABEL(widget), err_msg );
840
841
842 if(atoi(arr[6]) > 0)
843 {
844
845 db_ts_last_request_friends = g_strdup(arr[2]);
846
847 if(first_call)
848 {
849 GtkWidget *widget = NULL;
850
851 widget = lookup_widget(window1, "button35");
852 gtk_widget_show(widget);
853
854 first_call = FALSE;
855 }
856 else
857 global_new_msg = TRUE;
858 }
859
860
861
862 g_strfreev(arr);
863 }
864
865
866 while (arr0[i] && strlen(arr0[i]) )
867 {
868
869
870 msg = g_new0(msg_t, 1);
871
872
873 arr = g_strsplit (arr0[i], "|||", -1);
874
875
876
877
878 msg->id = atoi(arr[1]);
879 msg->time = g_strdup(arr[2]);
880 msg->txt = g_strdup(arr[3]);
881 msg->from = g_strdup(arr[4]);
882 msg->to = g_strdup(arr[5]);
883 msg->lat = atof(arr[6]);
884 msg->lon = atof(arr[7]);
885 msg->incoming = TRUE;
886
887
888 add_message(msg);
889
890 i++;
891
892 g_strfreev(arr);
893 }
894 }
895 else
896 {
897 gtk_label_set_label (GTK_LABEL(widget),
898 g_strdup_printf (_("msg-code: %d"),
899 (int)postreply->status_code));
900 }
901
902
903
904
905
906
907
908
909
910 }
911
912 void
add_message(msg_t * m)913 add_message(msg_t *m)
914 {
915 GtkWidget *msg_box, *widget, *hseparator;
916 msg_list = g_slist_append(msg_list, m);
917
918 msg_box = create_msg_box(m);
919
920 widget = lookup_widget(window1, "vbox48");
921 gtk_box_pack_start (GTK_BOX (widget), msg_box, FALSE, FALSE, 0);
922
923 hseparator = gtk_hseparator_new ();
924 gtk_widget_show (hseparator);
925 gtk_box_pack_start (GTK_BOX (widget), hseparator, FALSE, FALSE, 0);
926
927
928 }
929
930 GtkWidget*
create_msg_box(msg_t * m)931 create_msg_box(msg_t *m)
932 {
933 GtkWidget *hbox, *label, *vbox, *button;
934 char *label_txt;
935
936
937 hbox = gtk_hbox_new (FALSE, 2);
938 gtk_widget_set_size_request(hbox, 340, -1);
939 gtk_widget_show (hbox);
940
941 label = gtk_label_new ("");
942 gtk_widget_set_size_request(label, 260, -1);
943
944 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
945 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
946 gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
947 gtk_misc_set_padding (GTK_MISC (label), 5, 2);
948
949 if(m->incoming)
950 label_txt = g_strdup_printf("<i><b>%s</b>, %s</i>\n\n%s",m->from, m->time, m->txt);
951 else
952 label_txt = g_strdup_printf(_("<i><small>To: </small><b>%s</b></i>\n\n%s"),
953 m->to, m->txt);
954
955 gtk_label_set_label(GTK_LABEL(label), label_txt);
956
957 gtk_widget_show (label);
958 gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
959
960 vbox = gtk_vbox_new (FALSE, 0);
961 gtk_widget_show (vbox);
962 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
963
964 if(m->incoming)
965 {
966 button = gtk_button_new_with_mnemonic (_("Reply"));
967 gtk_widget_show (button);
968 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 2);
969
970 g_signal_connect ((gpointer) button, "clicked",
971 G_CALLBACK (on_msg_friend_clicked),
972 (gpointer) m->from);
973
974 button = gtk_button_new_with_mnemonic (_("Go To"));
975 gtk_widget_show (button);
976 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 2);
977
978 g_signal_connect ((gpointer) button, "clicked",
979 G_CALLBACK (on_goto_friend2_clicked),
980 (gpointer) m);
981 }
982
983 return hbox;
984 }
985
986 void
on_goto_friend2_clicked(GtkButton * button,gpointer user_data)987 on_goto_friend2_clicked(GtkButton *button, gpointer user_data)
988 {
989 msg_t *m;
990 m = user_data;
991
992 set_current_wp(deg2rad(m->lat), deg2rad(m->lon));
993
994 set_mapcenter(m->lat,m->lon, global_zoom);
995
996 }
997