10
#include "map_management.h"
16
#include <glib/gprintf.h>
19
#include <curl/curl.h>
20
#include <curl/types.h>
21
#include <curl/easy.h>
26
on_msg_friend_clicked(GtkButton *button, gpointer user_data);
29
on_goto_friend_clicked(GtkButton *button, gpointer user_data);
32
on_msg_send_clicked(GtkButton *button, gpointer user_data);
36
thread_send_message(void *ptr);
39
create_msg_postdata(msg_t *m);
42
process_msg_replydata(postreply_t *postreply);
45
add_message(msg_t *m);
48
create_msg_box(msg_t *m);
51
on_goto_friend2_clicked(GtkButton *button, gpointer user_data);
63
cb_write_to_mem(void *ptr, size_t size, size_t nmemb, void *data)
65
size_t realsize = size * nmemb;
66
struct mem_struct *mem = (struct mem_struct *)data;
68
mem->memory = (char *)g_realloc(mem->memory, mem->size + realsize + 1);
72
memcpy(&(mem->memory[mem->size]), ptr, realsize);
73
mem->size += realsize;
74
mem->memory[mem->size] = 0;
79
static GdkPixbuf *friend_icon = NULL;
80
static GdkGC *gc_map = NULL;
81
static char *db_ts_last_request_friends = NULL;
104
label_msg = (GtkLabel *)lookup_widget(window1, "label51");
105
gtk_label_set_label(label_msg, "Connecting...");
107
if (!g_thread_create(&update_position_thread, NULL, FALSE, NULL) != 0)
108
g_warning("### can't create friend thread\n");
114
update_position_thread(void *ptr)
118
GtkEntry *nick, *pass, *email, *msg;
120
const gchar *n, *p, *e, *m;
122
static gchar lat[64], lon[64], mode[64];
123
static gchar alt[16] = "0", speed[16] = "0", head[16]="0";
126
gchar **user_data_sets;
127
long int response_code;
131
struct curl_httppost *formdata=NULL;
132
struct curl_httppost *lastptr=NULL;
134
struct mem_struct chunk;
142
label_msg = (GtkLabel *)lookup_widget(window1, "label51");
145
nick = (GtkEntry *)lookup_widget(window1, "entry7");
146
pass = (GtkEntry *)lookup_widget(window1, "entry8");
147
email = (GtkEntry *)lookup_widget(window1, "entry9");
148
msg = (GtkEntry *)lookup_widget(window1, "entry29");
150
switch (global_ff_mode) {
152
ff_mode = g_strdup("private");
155
ff_mode = g_strdup("friends");
158
ff_mode = g_strdup("fun");
161
ff_mode = g_strdup("");
164
n = gtk_entry_get_text(nick);
165
p = gtk_entry_get_text(pass);
166
e = gtk_entry_get_text(email);
167
m = gtk_entry_get_text(msg);
172
if (global_myposition.lat && global_myposition.lon)
174
g_sprintf(lat, "%f", global_myposition.lat);
175
g_sprintf(lon, "%f", global_myposition.lon);
176
g_sprintf(mode, "%s|%dx%d", "man", global_drawingarea_width, global_drawingarea_height);
178
else if (gpsdata && gpsdata->fix.latitude !=0)
180
g_sprintf(lat, "%f", gpsdata->fix.latitude);
181
g_sprintf(lon, "%f", gpsdata->fix.longitude);
182
g_sprintf(mode, "%s|%dx%d", "gps", global_drawingarea_width, global_drawingarea_height);
186
float tmplat, tmplon;
188
tmplat = rad2deg( pixel2lat(global_zoom, global_y+global_drawingarea_height/2) );
189
tmplon = rad2deg( pixel2lon(global_zoom, global_x+global_drawingarea_width/2) );
190
g_sprintf(lat, "%f", tmplat);
191
g_sprintf(lon, "%f", tmplon);
192
g_sprintf(mode, "%s|%dx%d", "atm", global_drawingarea_width, global_drawingarea_height);
198
g_snprintf(alt, 16, "%.1f", gpsdata->fix.altitude);
199
g_snprintf(head, 16, "%.1f", gpsdata->fix.heading);
200
g_snprintf(speed, 16, "%.1f", gpsdata->fix.speed);
203
curl_global_init(CURL_GLOBAL_ALL);
205
curl_formadd(&formdata,
207
CURLFORM_COPYNAME, "lat",
208
CURLFORM_COPYCONTENTS, lat,
211
curl_formadd(&formdata,
213
CURLFORM_COPYNAME, "lon",
214
CURLFORM_COPYCONTENTS, lon,
217
curl_formadd(&formdata,
219
CURLFORM_COPYNAME, "alt",
220
CURLFORM_COPYCONTENTS, alt,
223
curl_formadd(&formdata,
225
CURLFORM_COPYNAME, "head",
226
CURLFORM_COPYCONTENTS, head,
229
curl_formadd(&formdata,
231
CURLFORM_COPYNAME, "speed",
232
CURLFORM_COPYCONTENTS, speed,
235
curl_formadd(&formdata,
237
CURLFORM_COPYNAME, "mode",
238
CURLFORM_COPYCONTENTS, mode,
241
curl_formadd(&formdata,
243
CURLFORM_COPYNAME, "ff_mode",
244
CURLFORM_COPYCONTENTS, ff_mode,
247
curl_formadd(&formdata,
249
CURLFORM_COPYNAME, "nick",
250
CURLFORM_COPYCONTENTS, n,
253
curl_formadd(&formdata,
255
CURLFORM_COPYNAME, "pass",
256
CURLFORM_COPYCONTENTS, p,
259
curl_formadd(&formdata,
261
CURLFORM_COPYNAME, "msg",
262
CURLFORM_COPYCONTENTS, m,
266
curl_handle = curl_easy_init();
268
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.tangogps.org/friends/update_pos.php");
269
curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formdata);
270
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, cb_write_to_mem);
271
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
272
curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, VERSION );
274
curl_easy_perform(curl_handle);
275
curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &response_code);
278
curl_easy_cleanup(curl_handle);
287
if (response_code == 200)
294
user_data_sets = g_strsplit_set (chunk.memory, "|", -1);
298
g_slist_free(friends_list);
300
gtk_label_set_label(label_msg, user_data_sets[0]);
303
while (user_data_sets[i] && !g_str_equal(user_data_sets[i],"EOD") )
307
friend_t *friend = g_new0(friend_t,1);
309
array = g_strsplit(user_data_sets[i],"#",-1);
310
while (array[len]) len++;
318
friend->type = atoi(g_strdup(array[0]));
319
friend->nick = g_strdup(array[1]);
320
friend->lat = atof(g_strdup(array[2]));
321
friend->lon = atof(g_strdup(array[3]));
322
friend->head = atoi(g_strdup(array[4]));
323
friend->lastseen = g_strdup(array[5]);
324
friend->away_msg = g_strdup(array[6]);
326
friends_list = g_slist_append(friends_list, friend);
336
gtk_label_set_text(label_msg, "No response (200)");
350
g_free(chunk.memory);
352
curl_global_cleanup();
363
int pixel_x, pixel_y, x,y;
367
GError *error = NULL;
369
gc = gdk_gc_new(pixmap);
373
gdk_gc_set_rgb_fg_color(gc, &color);
378
friend_icon = gdk_pixbuf_new_from_file_at_size (
379
PACKAGE_PIXMAPS_DIR "/" PACKAGE "-friend.png", 24,24,
382
if (pixmap && !gc_map)
383
gc_map = gdk_gc_new(pixmap);
386
if (global_show_friends)
388
for(list = friends_list; list != NULL; list = list->next)
390
friend_t *f = list->data;
392
lat = deg2rad(f->lat);
393
lon = deg2rad(f->lon);
398
pixel_x = lon2pixel(global_zoom, lon);
399
pixel_y = lat2pixel(global_zoom, lat);
401
x = pixel_x - global_x;
402
y = pixel_y - global_y;
429
GDK_RGB_DITHER_NONE, 0, 0);
431
gtk_widget_queue_draw_area (
447
printf("*** %s(): \n",__PRETTY_FUNCTION__);
449
curl = curl_easy_init();
453
curl_easy_setopt(curl, CURLOPT_URL,
454
"127.0.0.1/friends/update_position.php?lat=1&lon=1");
455
res = curl_easy_perform(curl);
457
curl_easy_cleanup(curl);
471
label_msg = (GtkLabel *)lookup_widget(window1, "label62");
472
gtk_label_set_text(label_msg, "Connecting...");
474
printf("*** %s(): \n",__PRETTY_FUNCTION__);
476
if (!g_thread_create(®ister_nick_thread, NULL, FALSE, NULL) != 0)
477
g_warning("### can't create register_nick() thread\n");
483
register_nick_thread(void *ptr)
486
GtkEntry *nick, *pass, *email;
488
const gchar *n, *p, *e;
495
struct curl_httppost *formdata=NULL;
496
struct curl_httppost *lastptr=NULL;
498
struct mem_struct chunk;
503
printf("*** %s(): \n",__PRETTY_FUNCTION__);
508
nick = (GtkEntry *)lookup_widget(window1, "entry7");
509
pass = (GtkEntry *)lookup_widget(window1, "entry8");
510
email = (GtkEntry *)lookup_widget(window1, "entry9");
512
n = gtk_entry_get_text(nick);
513
p = gtk_entry_get_text(pass);
514
e = gtk_entry_get_text(email);
517
curl_global_init(CURL_GLOBAL_ALL);
520
curl_formadd(&formdata,
522
CURLFORM_COPYNAME, "nick",
523
CURLFORM_COPYCONTENTS, n,
526
curl_formadd(&formdata,
528
CURLFORM_COPYNAME, "pass",
529
CURLFORM_COPYCONTENTS, p,
532
curl_formadd(&formdata,
534
CURLFORM_COPYNAME, "email",
535
CURLFORM_COPYCONTENTS, e,
540
curl_handle = curl_easy_init();
542
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.tangogps.org/friends/register_nick.php");
543
curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formdata);
544
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, cb_write_to_mem);
545
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
546
curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
549
curl_easy_perform(curl_handle);
550
curl_easy_cleanup(curl_handle);
552
printf("REPLY: %s %d \n",chunk.memory, (int)chunk.size);
554
if((int)chunk.size > 0){
555
buffer = g_strdup(chunk.memory);
558
buffer = g_strdup("Oh. Some error occurred...");
561
label_msg = (GtkLabel *)lookup_widget(window1, "label62");
562
gtk_label_set_text(label_msg, buffer);
569
curl_global_cleanup();
576
create_friend_box(friend_t *f)
578
GtkWidget *hbox, *label, *vbox, *button;
581
label_txt = g_strdup_printf("<b>%s</b>\nLast seen:\n%s\n<i>%s</i>",f->nick, f->lastseen, f->away_msg);
583
hbox = gtk_hbox_new (FALSE, 2);
584
gtk_widget_show (hbox);
586
label = gtk_label_new ("");
587
gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
589
gtk_label_set_label(GTK_LABEL(label), label_txt);
591
gtk_widget_show (label);
592
gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
594
vbox = gtk_vbox_new (FALSE, 0);
595
gtk_widget_show (vbox);
596
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
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);
602
g_signal_connect ((gpointer) button, "clicked",
603
G_CALLBACK (on_msg_friend_clicked),
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);
610
g_signal_connect ((gpointer) button, "clicked",
611
G_CALLBACK (on_goto_friend_clicked),
618
on_msg_friend_clicked(GtkButton *button, gpointer user_data)
621
GtkWidget *widget, *window;
626
label_txt = g_strdup_printf("Send Message To: <b>%s</b>", to);
628
printf("* %s() %s\n", __PRETTY_FUNCTION__, label_txt);
630
widget = lookup_widget(GTK_WIDGET(button), "window8");
631
gtk_widget_destroy(widget);
633
gladexml = glade_xml_new (gladefile, "dialog9", GETTEXT_PACKAGE);
634
glade_xml_signal_autoconnect (gladexml);
635
window = glade_xml_get_widget (gladexml, "dialog9");
636
g_signal_connect_swapped (window, "destroy",
637
G_CALLBACK (g_object_unref), gladexml);
639
gtk_widget_show(window);
641
widget = lookup_widget(window, "label188");
642
gtk_label_set_label(GTK_LABEL(widget), label_txt);
644
widget = lookup_widget(window, "okbutton10");
645
g_signal_connect ((gpointer) GTK_BUTTON(widget), "clicked",
646
G_CALLBACK (on_msg_send_clicked),
652
on_goto_friend_clicked(GtkButton *button, gpointer user_data)
659
printf("btn42 clicked: %s\n", f->nick);
661
widget = lookup_widget(GTK_WIDGET(button), "window8");
662
set_current_wp(deg2rad(f->lat), deg2rad(f->lon));
663
gtk_widget_destroy(widget);
667
on_msg_send_clicked(GtkButton *button, gpointer user_data)
676
widget = lookup_widget(GTK_WIDGET(button), "entry30");
677
m->txt = g_strdup( gtk_entry_get_text(GTK_ENTRY(widget)) );
678
m->to = g_strdup(to);
679
if (global_myposition.lat && global_myposition.lon)
681
m->lat = global_myposition.lat;
682
m->lon = global_myposition.lon;
686
m->lat = gpsdata->fix.latitude;
687
m->lon = gpsdata->fix.longitude;
695
printf("* %s() %s %s %f %f\n", __PRETTY_FUNCTION__, to, m->txt, m->lat,m->lon);
698
send_message((gpointer) m);
699
widget = lookup_widget(GTK_WIDGET(button), "dialog9");
700
gtk_widget_destroy(widget);
704
send_message(gpointer user_data)
706
GSList *postdata = NULL;
711
postdata = create_msg_postdata(m);
713
if (!g_thread_create(&thread_send_message, postdata, FALSE, NULL) != 0)
714
g_warning("### can't create mission thread\n");
720
thread_send_message(void *ptr)
723
GSList *postdata = NULL;
724
postreply_t *postreply;
731
postreply = mycurl__do_http_post(MSG_SEND_URL, postdata, VERSION);
737
process_msg_replydata(postreply);
743
g_slist_free(postdata);
750
create_msg_postdata(msg_t *m)
752
GSList *postdata = NULL;
754
postdata_item_t *item;
759
n = gtk_entry_get_text((GtkEntry *)lookup_widget(window1, "entry7"));
760
p = gtk_entry_get_text((GtkEntry *)lookup_widget(window1, "entry8"));
762
item = g_new0(postdata_item_t, 1);
763
item->name=g_strdup("user");
764
item->value=g_strdup(n);
765
postdata = g_slist_append(postdata, item);
767
item = g_new0(postdata_item_t, 1);
768
item->name=g_strdup("pass");
769
item->value=g_strdup(p);
770
postdata = g_slist_append(postdata, item);
777
item = g_new0(postdata_item_t, 1);
778
item->name=g_strdup("lat");
779
item->value=g_strdup_printf("%f", m->lat);
780
postdata = g_slist_append(postdata, item);
782
item = g_new0(postdata_item_t, 1);
783
item->name=g_strdup("lon");
784
item->value=g_strdup_printf("%f", m->lon);
785
postdata = g_slist_append(postdata, item);
787
item = g_new0(postdata_item_t, 1);
788
item->name=g_strdup("txt");
789
item->value=g_strdup_printf("%s", m->txt);
790
postdata = g_slist_append(postdata, item);
792
item = g_new0(postdata_item_t, 1);
793
item->name=g_strdup("to");
794
item->value=g_strdup_printf("%s", m->to);
795
postdata = g_slist_append(postdata, item);
800
if(db_ts_last_request_friends)
802
item = g_new0(postdata_item_t, 1);
803
item->name=g_strdup("db_ts_last_request_friends");
804
item->value=g_strdup(db_ts_last_request_friends);
805
postdata = g_slist_append(postdata, item);
813
process_msg_replydata(postreply_t *postreply)
816
char **arr0 = NULL, **arr = NULL;
819
static gboolean first_call = TRUE;
823
widget = lookup_widget(window1, "label132");
828
if(postreply->status_code == 200 && postreply->size > 0)
830
arr0 = g_strsplit (postreply->data, "###", -1);
834
if (arr0[0] && strlen(arr0[0]))
838
arr = g_strsplit (arr0[0], "|", -1);
840
err_msg = g_strdup(arr[4]);
841
gtk_label_set_label(GTK_LABEL(widget), err_msg );
847
db_ts_last_request_friends = g_strdup(arr[2]);
851
GtkWidget *widget = NULL;
853
widget = lookup_widget(window1, "button35");
854
gtk_widget_show(widget);
859
global_new_msg = TRUE;
868
while (arr0[i] && strlen(arr0[i]) )
872
msg = g_new0(msg_t, 1);
875
arr = g_strsplit (arr0[i], "|||", -1);
880
msg->id = atoi(arr[1]);
881
msg->time = g_strdup(arr[2]);
882
msg->txt = g_strdup(arr[3]);
883
msg->from = g_strdup(arr[4]);
884
msg->to = g_strdup(arr[5]);
885
msg->lat = atof(arr[6]);
886
msg->lon = atof(arr[7]);
887
msg->incoming = TRUE;
899
gtk_label_set_label(GTK_LABEL(widget), g_strdup_printf("msg-code: %d",(int)postreply->status_code) );
913
add_message(msg_t *m)
915
GtkWidget *msg_box, *widget, *hseparator;
916
msg_list = g_slist_append(msg_list, m);
918
msg_box = create_msg_box(m);
920
widget = lookup_widget(window1, "vbox48");
921
gtk_box_pack_start (GTK_BOX (widget), msg_box, FALSE, FALSE, 0);
923
hseparator = gtk_hseparator_new ();
924
gtk_widget_show (hseparator);
925
gtk_box_pack_start (GTK_BOX (widget), hseparator, FALSE, FALSE, 0);
931
create_msg_box(msg_t *m)
933
GtkWidget *hbox, *label, *vbox, *button;
937
hbox = gtk_hbox_new (FALSE, 2);
938
gtk_widget_set_size_request(hbox, 340, -1);
939
gtk_widget_show (hbox);
941
label = gtk_label_new ("");
942
gtk_widget_set_size_request(label, 260, -1);
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);
950
label_txt = g_strdup_printf("<i><b>%s</b>, %s</i>\n\n%s",m->from, m->time, m->txt);
952
label_txt = g_strdup_printf("<i><small>To: </small><b>%s</b></i>\n\n%s",m->to, m->txt);
954
gtk_label_set_label(GTK_LABEL(label), label_txt);
956
gtk_widget_show (label);
957
gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
959
vbox = gtk_vbox_new (FALSE, 0);
960
gtk_widget_show (vbox);
961
gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
965
button = gtk_button_new_with_mnemonic (_("Reply"));
966
gtk_widget_show (button);
967
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 2);
969
g_signal_connect ((gpointer) button, "clicked",
970
G_CALLBACK (on_msg_friend_clicked),
973
button = gtk_button_new_with_mnemonic (_("Go To"));
974
gtk_widget_show (button);
975
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 2);
977
g_signal_connect ((gpointer) button, "clicked",
978
G_CALLBACK (on_goto_friend2_clicked),
986
on_goto_friend2_clicked(GtkButton *button, gpointer user_data)
991
printf("btn42 clicked: %s\n", m->from);
993
set_current_wp(deg2rad(m->lat), deg2rad(m->lon));
995
set_mapcenter(m->lat,m->lon, global_zoom);