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", &register_nick_thread, (gpointer) NULL) != 0)
477 #else
478 	if (!g_thread_create(&register_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