~foxtrotgps-team/foxtrotgps/trunk

« back to all changes in this revision

Viewing changes to src/friends.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
 
 
3
#include "friends.h"
 
4
#include "globals.h"
 
5
#include "converter.h"
 
6
#include "support.h"
 
7
 
 
8
#include <stdio.h>
 
9
#include <stdlib.h>
 
10
#include <string.h>
 
11
#include <glib.h>
 
12
#include <glib/gprintf.h>
 
13
#include <gtk/gtk.h>
 
14
 
 
15
#include <curl/curl.h>
 
16
#include <curl/types.h>
 
17
#include <curl/easy.h>
 
18
 
 
19
 
 
20
struct mem_struct {
 
21
        char *memory;
 
22
        size_t size;
 
23
};
 
24
 
 
25
 
 
26
static size_t
 
27
cb_write_to_mem(void *ptr, size_t size, size_t nmemb, void *data)
 
28
{
 
29
        size_t realsize = size * nmemb;
 
30
        struct mem_struct *mem = (struct mem_struct *)data;
 
31
        
 
32
        mem->memory = (char *)g_realloc(mem->memory, mem->size + realsize + 1);
 
33
        
 
34
        if (mem->memory)
 
35
        {
 
36
                memcpy(&(mem->memory[mem->size]), ptr, realsize);
 
37
                mem->size += realsize;
 
38
                mem->memory[mem->size] = 0;
 
39
        }
 
40
        return realsize;
 
41
}
 
42
 
 
43
static GdkPixbuf        *friend_icon = NULL;
 
44
static GdkGC            *gc_map = NULL;
 
45
 
 
46
 
 
47
 
 
48
 
 
49
 
 
50
 
 
51
 
 
52
 
 
53
 
 
54
 
 
55
 
 
56
 
 
57
 
 
58
 
 
59
 
 
60
 
 
61
 
 
62
 
 
63
 
 
64
 
 
65
 
 
66
 
 
67
 
 
68
 
 
69
 
 
70
 
 
71
gboolean
 
72
update_position()
 
73
{               
 
74
        GtkLabel *label_msg;
 
75
        label_msg = (GtkLabel *)lookup_widget(window1, "label51");
 
76
        gtk_label_set_label(label_msg, "Connecting...");
 
77
 
 
78
        printf("*** %s(): \n",__PRETTY_FUNCTION__);
 
79
 
 
80
        if (!g_thread_create(&update_position_thread, NULL, FALSE, NULL) != 0)
 
81
                g_warning("### can't create friend thread\n");
 
82
 
 
83
        return TRUE;    
 
84
}
 
85
        
 
86
void *
 
87
update_position_thread(void *ptr)
 
88
{
 
89
        int i=1;
 
90
        
 
91
        GtkToggleButton *v_public, *v_member, *v_friend;
 
92
        GtkToggleButton *g_public, *g_member, *g_friend;
 
93
        GtkEntry *nick, *pass, *email, *msg;
 
94
        GtkLabel *label_msg;
 
95
        const gchar *n, *p, *e, *m;     
 
96
        gchar *vp, *vm, *vf, *gp, *gm, *gf, *ff_mode;
 
97
        static gchar lat[64], lon[64], mode[64];
 
98
        static gchar alt[16] = "0", speed[16] = "0", head[16]="0";
 
99
        
 
100
        
 
101
        gchar **user_data_sets;
 
102
        long int response_code;
 
103
        
 
104
        CURL *curl_handle;
 
105
        
 
106
        struct curl_httppost *formdata=NULL;
 
107
        struct curl_httppost *lastptr=NULL;
 
108
                
 
109
        struct mem_struct chunk;
 
110
        
 
111
        chunk.memory=NULL;
 
112
        chunk.size = 0;
 
113
        
 
114
        printf("*** %s(): \n",__PRETTY_FUNCTION__);
 
115
 
 
116
 
 
117
        label_msg = (GtkLabel *)lookup_widget(window1, "label51");
 
118
 
 
119
        
 
120
        v_public = (GtkToggleButton *)lookup_widget(window1, "checkbutton3");
 
121
        v_member = (GtkToggleButton *)lookup_widget(window1, "checkbutton4");
 
122
        v_friend = (GtkToggleButton *)lookup_widget(window1, "checkbutton5");
 
123
        g_public = (GtkToggleButton *)lookup_widget(window1, "checkbutton6");
 
124
        g_member = (GtkToggleButton *)lookup_widget(window1, "checkbutton7");
 
125
        g_friend = (GtkToggleButton *)lookup_widget(window1, "checkbutton8");
 
126
        nick  = (GtkEntry *)lookup_widget(window1, "entry7");
 
127
        pass  = (GtkEntry *)lookup_widget(window1, "entry8");
 
128
        email = (GtkEntry *)lookup_widget(window1, "entry9");
 
129
        msg   = (GtkEntry *)lookup_widget(window1, "entry29");
 
130
 
 
131
        vp = (gtk_toggle_button_get_active(v_public)) ? g_strdup("y") : g_strdup("n");
 
132
        vm = (gtk_toggle_button_get_active(v_member)) ? g_strdup("y") : g_strdup("n");
 
133
        vf = (gtk_toggle_button_get_active(v_friend)) ? g_strdup("y") : g_strdup("n");
 
134
        gp = (gtk_toggle_button_get_active(g_public)) ? g_strdup("y") : g_strdup("n");
 
135
        gm = (gtk_toggle_button_get_active(g_member)) ? g_strdup("y") : g_strdup("n");
 
136
        gf = (gtk_toggle_button_get_active(g_friend)) ? g_strdup("y") : g_strdup("n");
 
137
 
 
138
        switch (global_ff_mode) {
 
139
        case PRIVATE_MODE: 
 
140
                ff_mode = g_strdup("private");
 
141
                break;
 
142
        case FRIEND_MODE:
 
143
                ff_mode = g_strdup("friends");
 
144
                break;
 
145
        case FUN_MODE:
 
146
                ff_mode = g_strdup("fun");
 
147
                break;
 
148
        default:
 
149
                ff_mode = g_strdup("");
 
150
        }
 
151
        
 
152
        n = gtk_entry_get_text(nick);
 
153
        p = gtk_entry_get_text(pass);
 
154
        e = gtk_entry_get_text(email);
 
155
        m = gtk_entry_get_text(msg);
 
156
 
 
157
        
 
158
        if (global_myposition.lat && global_myposition.lon)
 
159
        {
 
160
                g_sprintf(lat, "%f", global_myposition.lat);
 
161
                g_sprintf(lon, "%f", global_myposition.lon);
 
162
                g_sprintf(mode, "%s|%dx%d", "man", global_drawingarea_width, global_drawingarea_height);                
 
163
        }
 
164
        else if (gpsdata && gpsdata->fix.latitude !=0)
 
165
        {
 
166
                g_sprintf(lat, "%f", gpsdata->fix.latitude);
 
167
                g_sprintf(lon, "%f", gpsdata->fix.longitude);
 
168
                g_sprintf(mode, "%s|%dx%d", "gps", global_drawingarea_width, global_drawingarea_height);                
 
169
        }
 
170
        else
 
171
        {
 
172
                float tmplat, tmplon;
 
173
                
 
174
                tmplat = rad2deg( pixel2lat(global_zoom, global_y+global_drawingarea_height/2) );
 
175
                tmplon = rad2deg( pixel2lon(global_zoom, global_x+global_drawingarea_width/2) );
 
176
                g_sprintf(lat, "%f", tmplat);
 
177
                g_sprintf(lon, "%f", tmplon);
 
178
                g_sprintf(mode, "%s|%dx%d", "atm", global_drawingarea_width, global_drawingarea_height);                
 
179
 
 
180
                printf("## friends: neither fix, no manual position %f %f\n", tmplat, tmplon);
 
181
 
 
182
        }
 
183
        
 
184
        
 
185
        if(gpsdata)
 
186
        {
 
187
                g_snprintf(alt, 16, "%.1f", gpsdata->fix.altitude);
 
188
                g_snprintf(head, 16, "%.1f", gpsdata->fix.track);
 
189
                g_snprintf(speed, 16, "%.1f", gpsdata->fix.speed);
 
190
        }
 
191
        
 
192
        curl_global_init(CURL_GLOBAL_ALL);
 
193
 
 
194
        curl_formadd(&formdata,
 
195
               &lastptr,
 
196
               CURLFORM_COPYNAME, "lat",
 
197
               CURLFORM_COPYCONTENTS, lat,
 
198
               CURLFORM_END);
 
199
 
 
200
        curl_formadd(&formdata,
 
201
               &lastptr,
 
202
               CURLFORM_COPYNAME, "lon",
 
203
               CURLFORM_COPYCONTENTS, lon,
 
204
               CURLFORM_END);
 
205
        
 
206
        curl_formadd(&formdata,
 
207
               &lastptr,
 
208
               CURLFORM_COPYNAME, "alt",
 
209
               CURLFORM_COPYCONTENTS, alt,
 
210
               CURLFORM_END);
 
211
 
 
212
        curl_formadd(&formdata,
 
213
               &lastptr,
 
214
               CURLFORM_COPYNAME, "head",
 
215
               CURLFORM_COPYCONTENTS, head,
 
216
               CURLFORM_END);
 
217
 
 
218
        curl_formadd(&formdata,
 
219
               &lastptr,
 
220
               CURLFORM_COPYNAME, "speed",
 
221
               CURLFORM_COPYCONTENTS, speed,
 
222
               CURLFORM_END);
 
223
 
 
224
        curl_formadd(&formdata,
 
225
               &lastptr,
 
226
               CURLFORM_COPYNAME, "mode",
 
227
               CURLFORM_COPYCONTENTS, mode,
 
228
               CURLFORM_END);
 
229
               
 
230
        curl_formadd(&formdata,
 
231
               &lastptr,
 
232
               CURLFORM_COPYNAME, "ff_mode",
 
233
               CURLFORM_COPYCONTENTS, ff_mode,
 
234
               CURLFORM_END);
 
235
 
 
236
        curl_formadd(&formdata,
 
237
               &lastptr,
 
238
               CURLFORM_COPYNAME, "nick",
 
239
               CURLFORM_COPYCONTENTS, n,
 
240
               CURLFORM_END);
 
241
 
 
242
        curl_formadd(&formdata,
 
243
               &lastptr,
 
244
               CURLFORM_COPYNAME, "pass",
 
245
               CURLFORM_COPYCONTENTS, p,
 
246
               CURLFORM_END);
 
247
 
 
248
        curl_formadd(&formdata,
 
249
               &lastptr,
 
250
               CURLFORM_COPYNAME, "msg",
 
251
               CURLFORM_COPYCONTENTS, m,
 
252
               CURLFORM_END);
 
253
 
 
254
        curl_formadd(&formdata,
 
255
               &lastptr,
 
256
               CURLFORM_COPYNAME, "v_public",
 
257
               CURLFORM_COPYCONTENTS, vp,
 
258
               CURLFORM_END);
 
259
 
 
260
        curl_formadd(&formdata,
 
261
               &lastptr,
 
262
               CURLFORM_COPYNAME, "v_member",
 
263
               CURLFORM_COPYCONTENTS, vm,
 
264
               CURLFORM_END);
 
265
                
 
266
                
 
267
        curl_formadd(&formdata,
 
268
               &lastptr,
 
269
               CURLFORM_COPYNAME, "v_friend",
 
270
               CURLFORM_COPYCONTENTS, vf,
 
271
               CURLFORM_END);
 
272
               
 
273
               
 
274
        curl_formadd(&formdata,
 
275
               &lastptr,
 
276
               CURLFORM_COPYNAME, "g_public",
 
277
               CURLFORM_COPYCONTENTS, gp,
 
278
               CURLFORM_END);
 
279
 
 
280
        curl_formadd(&formdata,
 
281
               &lastptr,
 
282
               CURLFORM_COPYNAME, "g_member",
 
283
               CURLFORM_COPYCONTENTS, gm,
 
284
               CURLFORM_END);
 
285
                
 
286
                
 
287
        curl_formadd(&formdata,
 
288
               &lastptr,
 
289
               CURLFORM_COPYNAME, "g_friend",
 
290
               CURLFORM_COPYCONTENTS, gf,
 
291
               CURLFORM_END);
 
292
               
 
293
               
 
294
        curl_handle = curl_easy_init();
 
295
        
 
296
        curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.tangogps.org/friends/update_pos.php");
 
297
        curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formdata);
 
298
        curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, cb_write_to_mem);
 
299
        curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
 
300
        curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0 |" VERSION " | " __VERSION__);
 
301
 
 
302
 
 
303
 
 
304
        curl_easy_perform(curl_handle);
 
305
        curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &response_code);
 
306
        
 
307
        
 
308
        curl_easy_cleanup(curl_handle);
 
309
        
 
310
        printf("REPLY: %s - response: %d\n",chunk.memory, (int)response_code);
 
311
        
 
312
        
 
313
        
 
314
        
 
315
 
 
316
 
 
317
        if (response_code == 200) 
 
318
        { 
 
319
                
 
320
                
 
321
                
 
322
                
 
323
 
 
324
                user_data_sets = g_strsplit_set (chunk.memory, "|", -1);
 
325
        
 
326
                        
 
327
                gdk_threads_enter();
 
328
                g_slist_free(friends_list);
 
329
                friends_list = NULL;
 
330
                gtk_label_set_label(label_msg, user_data_sets[0]); 
 
331
                gdk_threads_leave();
 
332
                
 
333
                while (user_data_sets[i] && !g_str_equal(user_data_sets[i],"EOD") )
 
334
                {
 
335
                        gchar **array;
 
336
                        int len=0;
 
337
                        friend_t *friend = g_new0(friend_t,1);
 
338
                        
 
339
                        array = g_strsplit(user_data_sets[i],"#",-1);
 
340
                        while (array[len]) len++;
 
341
                        
 
342
                        
 
343
                        
 
344
                        
 
345
                        
 
346
                        if(len>=7)
 
347
                        {
 
348
                                friend->type = atoi(g_strdup(array[0]));
 
349
                                friend->nick  = g_strdup(array[1]);
 
350
                                friend->lat = atof(g_strdup(array[2]));printf("##%f\n",friend->lat);
 
351
                                friend->lon = atof(g_strdup(array[3]));
 
352
                                friend->head = atoi(g_strdup(array[4]));
 
353
                                friend->lastseen = g_strdup(array[5]);
 
354
                                friend->msg = g_strdup(array[6]);
 
355
                                
 
356
                                friends_list = g_slist_append(friends_list, friend);
 
357
                        }
 
358
                        
 
359
                        
 
360
                        i++;
 
361
                }
 
362
        }
 
363
        else
 
364
        {
 
365
                gdk_threads_enter();
 
366
                gtk_label_set_text(label_msg, "No response (200)"); 
 
367
                gdk_threads_leave();
 
368
                
 
369
        }
 
370
        
 
371
        
 
372
        
 
373
        
 
374
        gdk_threads_enter();
 
375
        paint_friends();
 
376
        
 
377
        gdk_threads_leave();
 
378
        
 
379
        
 
380
        if(chunk.memory)
 
381
                g_free(chunk.memory);
 
382
        
 
383
        curl_global_cleanup();
 
384
        
 
385
        g_free(vp);
 
386
        g_free(vm);
 
387
        g_free(vf);
 
388
        g_free(gp);
 
389
        g_free(gm);
 
390
        g_free(gf);
 
391
        g_free(ff_mode);
 
392
 
 
393
        return NULL;
 
394
}
 
395
 
 
396
void
 
397
paint_friends()
 
398
{       
 
399
        GSList *list;
 
400
        int pixel_x, pixel_y, x,y;
 
401
        float lat, lon;
 
402
        GdkColor color;
 
403
        GdkGC *gc;
 
404
        GError  *error = NULL;
 
405
        
 
406
        gc = gdk_gc_new(pixmap);
 
407
        color.green = 60000;
 
408
        color.blue = 0;
 
409
        color.red = 10000;
 
410
        gdk_gc_set_rgb_fg_color(gc, &color);
 
411
        
 
412
 
 
413
        if(!friend_icon)
 
414
        {
 
415
                friend_icon = gdk_pixbuf_new_from_file_at_size (
 
416
                        PACKAGE_PIXMAPS_DIR "/tangogps-friend.png", 24,24,
 
417
                        &error);
 
418
        }
 
419
        if (pixmap && !gc_map)  
 
420
                gc_map = gdk_gc_new(pixmap);
 
421
                
 
422
        
 
423
 
 
424
        printf("*** %s(): \n",__PRETTY_FUNCTION__);
 
425
 
 
426
        if (global_show_friends)
 
427
                {
 
428
                for(list = friends_list; list != NULL; list = list->next)
 
429
                {
 
430
                        friend_t *f = list->data;
 
431
                
 
432
                        lat = deg2rad(f->lat);
 
433
                        lon = deg2rad(f->lon);
 
434
                        
 
435
                        
 
436
                        
 
437
                        
 
438
                        pixel_x = lon2pixel(global_zoom, lon);
 
439
                        pixel_y = lat2pixel(global_zoom, lat);
 
440
                        
 
441
                        x = pixel_x - global_x;
 
442
                        y = pixel_y - global_y;
 
443
                        
 
444
                        f->screen_x = x;
 
445
                        f->screen_y = y;
 
446
                        
 
447
                        
 
448
                        
 
449
                        if(!friend_icon)
 
450
                        {
 
451
                                gdk_draw_arc (
 
452
                                        pixmap,
 
453
                                        
 
454
                                        gc,
 
455
                                        TRUE,                   
 
456
                                        x-4, y-4,               
 
457
                                        8,8,                    
 
458
                                        0,23040);               
 
459
                        }
 
460
                        else
 
461
                        {
 
462
                                gdk_draw_pixbuf (
 
463
                                        pixmap,
 
464
                                        gc_map,
 
465
                                        friend_icon,
 
466
                                        0,0,
 
467
                                        x-12,y-12,
 
468
                                        24,24,
 
469
                                        GDK_RGB_DITHER_NONE, 0, 0);
 
470
                                
 
471
                                gtk_widget_queue_draw_area (
 
472
                                        map_drawable, 
 
473
                                        x-12, y-12,
 
474
                                        24,24);
 
475
                        }
 
476
                        printf("FRIEND: %s lat %f - lon %f\n",f->nick,f->lat, f->lon);
 
477
                }
 
478
        }
 
479
}
 
480
 
 
481
void
 
482
update_position0()
 
483
{
 
484
        CURL *curl;
 
485
        CURLcode res;
 
486
 
 
487
        printf("*** %s(): \n",__PRETTY_FUNCTION__);
 
488
        
 
489
        curl = curl_easy_init();
 
490
        
 
491
        if(curl)
 
492
        {
 
493
                curl_easy_setopt(curl, CURLOPT_URL, 
 
494
                                "127.0.0.1/friends/update_position.php?lat=1&lon=1");
 
495
                res = curl_easy_perform(curl);
 
496
                
 
497
                curl_easy_cleanup(curl);
 
498
        }
 
499
        
 
500
}
 
501
 
 
502
 
 
503
 
 
504
 
 
505
 
 
506
 
 
507
 
 
508
 
 
509
int
 
510
register_nick()
 
511
{               
 
512
        GtkLabel *label_msg;
 
513
        label_msg = (GtkLabel *)lookup_widget(window1, "label62");
 
514
        gtk_label_set_text(label_msg, "Connecting...");
 
515
 
 
516
        printf("*** %s(): \n",__PRETTY_FUNCTION__);
 
517
 
 
518
        if (!g_thread_create(&register_nick_thread, NULL, FALSE, NULL) != 0)
 
519
                g_warning("### can't create register_nick() thread\n");
 
520
        
 
521
        return 0;
 
522
}
 
523
        
 
524
void *
 
525
register_nick_thread(void *ptr)
 
526
{
 
527
        
 
528
        GtkEntry *nick, *pass, *email;
 
529
        GtkLabel *label_msg;
 
530
        const gchar *n, *p, *e;
 
531
        gchar *buffer;
 
532
        
 
533
        
 
534
        
 
535
        CURL *curl_handle;
 
536
        
 
537
        struct curl_httppost *formdata=NULL;
 
538
        struct curl_httppost *lastptr=NULL;
 
539
                
 
540
        struct mem_struct chunk;
 
541
        
 
542
        chunk.memory=NULL;
 
543
        chunk.size = 0;
 
544
        
 
545
        printf("*** %s(): \n",__PRETTY_FUNCTION__);
 
546
 
 
547
 
 
548
 
 
549
        
 
550
        nick  = (GtkEntry *)lookup_widget(window1, "entry7");
 
551
        pass  = (GtkEntry *)lookup_widget(window1, "entry8");
 
552
        email = (GtkEntry *)lookup_widget(window1, "entry9");
 
553
 
 
554
        n = gtk_entry_get_text(nick);
 
555
        p = gtk_entry_get_text(pass);
 
556
        e = gtk_entry_get_text(email);
 
557
 
 
558
        
 
559
        curl_global_init(CURL_GLOBAL_ALL);
 
560
 
 
561
               
 
562
        curl_formadd(&formdata,
 
563
               &lastptr,
 
564
               CURLFORM_COPYNAME, "nick",
 
565
               CURLFORM_COPYCONTENTS, n,
 
566
               CURLFORM_END);
 
567
 
 
568
        curl_formadd(&formdata,
 
569
               &lastptr,
 
570
               CURLFORM_COPYNAME, "pass",
 
571
               CURLFORM_COPYCONTENTS, p,
 
572
               CURLFORM_END);
 
573
 
 
574
        curl_formadd(&formdata,
 
575
               &lastptr,
 
576
               CURLFORM_COPYNAME, "email",
 
577
               CURLFORM_COPYCONTENTS, e,
 
578
               CURLFORM_END);
 
579
 
 
580
               
 
581
               
 
582
        curl_handle = curl_easy_init();
 
583
        
 
584
        curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.tangogps.org/friends/register_nick.php");
 
585
        curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formdata);
 
586
        curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, cb_write_to_mem);
 
587
        curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
 
588
        curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
 
589
 
 
590
 
 
591
        curl_easy_perform(curl_handle);
 
592
        curl_easy_cleanup(curl_handle);
 
593
 
 
594
        printf("REPLY: %s %d \n",chunk.memory, (int)chunk.size);
 
595
 
 
596
        if((int)chunk.size > 0){
 
597
                buffer = g_strdup(chunk.memory);
 
598
        }
 
599
        else
 
600
                buffer = g_strdup("Oh. Some error occurred...");
 
601
 
 
602
        gdk_threads_enter();
 
603
        label_msg = (GtkLabel *)lookup_widget(window1, "label62");
 
604
        gtk_label_set_text(label_msg, buffer); 
 
605
        gdk_threads_leave();
 
606
        
 
607
 
 
608
        
 
609
        
 
610
        
 
611
        curl_global_cleanup();
 
612
        
 
613
        return NULL;
 
614
}