1 /*
2 *
3 * XASTIR, Amateur Station Tracking and Information Reporting
4 * Copyright (C) 1999,2000 Frank Giannandrea
5 * Copyright (C) 2000-2019 The Xastir Group
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 *
21 * Look at the README for more information on the program.
22 */
23
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif // HAVE_CONFIG_H
27
28 #include "snprintf.h"
29
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <sys/stat.h>
33 #include <pwd.h>
34 #include <unistd.h>
35 #include <Xm/XmAll.h>
36
37 #include "xastir.h"
38 #include "main.h"
39 #include "lang.h"
40 #include "objects.h"
41 #include "popup.h"
42 #include "fetch_remote.h"
43 #include "util.h"
44 #include "xa_config.h"
45
46 // Must be last include file
47 #include "leak_detection.h"
48
49
50 extern XmFontList fontlist1; // Menu/System fontlist
51
52 Widget track_station_dialog = (Widget)NULL;
53 Widget track_station_data = (Widget)NULL;
54 Widget download_findu_dialog = (Widget)NULL;
55
56 static xastir_mutex track_station_dialog_lock;
57 static xastir_mutex download_findu_dialog_lock;
58
59 // track values
60 Widget track_case_data, track_match_data;
61
62 // Download findu values
63 Widget download_trail_station_data;
64 Widget posit_start_value;
65 Widget posit_length_value;
66
67 int fetching_findu_trail_now = 0;
68
69 int track_station_on = 0; /* used for tracking stations */
70 int track_me;
71 int track_case; /* used for tracking stations */
72 int track_match; /* used for tracking stations */
73 char tracking_station_call[30]; /* Tracking station callsign */
74 char download_trail_station_call[30]; /* Trail station callsign */
75 //N0VH
76 #define MAX_FINDU_DURATION 120
77 #define MAX_FINDU_START_TIME 336
78 // Make these two match, as that will be the most desired case: Snag
79 // the track for as far back as possible up to the present in one
80 // shot...
81 int posit_start = MAX_FINDU_DURATION;
82 int posit_length = MAX_FINDU_DURATION;
83
84
85
86
87
track_gui_init(void)88 void track_gui_init(void)
89 {
90 init_critical_section( &track_station_dialog_lock );
91 init_critical_section( &download_findu_dialog_lock );
92
93 if (temp_tracking_station_call[0] != '\0')
94 {
95 xastir_snprintf(tracking_station_call,
96 sizeof(tracking_station_call),
97 "%s",
98 temp_tracking_station_call);
99 track_station_on = 1;
100 }
101 else
102 {
103 tracking_station_call[0] = '\0';
104 }
105 }
106
107
108
109
110
111 /**** Track STATION ******/
112
113
track_station_destroy_shell(Widget UNUSED (widget),XtPointer clientData,XtPointer UNUSED (callData))114 void track_station_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
115 {
116 Widget shell = (Widget) clientData;
117 XtPopdown(shell);
118
119 begin_critical_section(&track_station_dialog_lock, "track_gui.c:track_station_destroy_shell" );
120
121 XtDestroyWidget(shell);
122 track_station_dialog = (Widget)NULL;
123
124 end_critical_section(&track_station_dialog_lock, "track_gui.c:track_station_destroy_shell" );
125
126 }
127
128
129
130
131
Track_station_clear(Widget w,XtPointer clientData,XtPointer callData)132 void Track_station_clear(Widget w, XtPointer clientData, XtPointer callData)
133 {
134
135 /* clear station */
136 track_station_on=0;
137 //track_station_data=NULL;
138 //tracking_station_call[0] = '\0';
139
140 // Clear the TrackMe button as well
141 XmToggleButtonSetState(trackme_button,FALSE,TRUE);
142
143 track_station_destroy_shell(w, clientData, callData);
144 display_zoom_status();
145 }
146
147
148
149
150
Track_station_now(Widget w,XtPointer clientData,XtPointer callData)151 void Track_station_now(Widget w, XtPointer clientData, XtPointer callData)
152 {
153 char temp[MAX_CALLSIGN+1];
154 char temp2[200];
155 int found = 0;
156 char *temp_ptr;
157
158
159 temp_ptr = XmTextFieldGetString(track_station_data);
160 xastir_snprintf(temp,
161 sizeof(temp),
162 "%s",
163 temp_ptr);
164 XtFree(temp_ptr);
165
166 (void)remove_trailing_spaces(temp);
167 (void)remove_trailing_dash_zero(temp);
168
169 xastir_snprintf(tracking_station_call,
170 sizeof(tracking_station_call),
171 "%s",
172 temp);
173 track_case = (int)XmToggleButtonGetState(track_case_data);
174 track_match = (int)XmToggleButtonGetState(track_match_data);
175 found = locate_station(da, temp, track_case, track_match, 0);
176
177 if ( valid_object(tracking_station_call) // Name of object is legal
178 || valid_call(tracking_station_call)
179 || valid_item(tracking_station_call ) )
180 {
181 track_station_on = 1; // Track it whether we've seen it yet or not
182 if (!found)
183 {
184 xastir_snprintf(temp2, sizeof(temp2), langcode("POPEM00026"), temp);
185 popup_message_always(langcode("POPEM00025"),temp2);
186 }
187 // Check for exact match, includes SSID
188 if ( track_me & !is_my_call( tracking_station_call, 1) )
189 {
190 XmToggleButtonSetState( trackme_button, FALSE, FALSE );
191 track_me = 0;
192 }
193 }
194 else
195 {
196 tracking_station_call[0] = '\0'; // Empty it out again
197 track_station_on = 0;
198 xastir_snprintf(temp2, sizeof(temp2), langcode("POPEM00002"), temp);
199 popup_message_always(langcode("POPEM00003"),temp2);
200 }
201
202 track_station_destroy_shell(w, clientData, callData);
203 display_zoom_status();
204 }
205
206
207
208
209
Track_station(Widget UNUSED (w),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))210 void Track_station( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
211 {
212 static Widget pane, scrollwindow, my_form, button_ok, button_close, button_clear, call, sep;
213 Atom delw;
214
215 if (!track_station_dialog)
216 {
217
218 begin_critical_section(&track_station_dialog_lock, "track_gui.c:Track_station" );
219
220 track_station_dialog = XtVaCreatePopupShell(langcode("WPUPTSP001"),
221 xmDialogShellWidgetClass, appshell,
222 XmNdeleteResponse, XmDESTROY,
223 XmNdefaultPosition, FALSE,
224 XmNfontList, fontlist1,
225 NULL);
226
227 pane = XtVaCreateWidget("Track_station pane",
228 xmPanedWindowWidgetClass,
229 track_station_dialog,
230 MY_FOREGROUND_COLOR,
231 MY_BACKGROUND_COLOR,
232 NULL);
233
234 scrollwindow = XtVaCreateManagedWidget("scrollwindow",
235 xmScrolledWindowWidgetClass,
236 pane,
237 XmNscrollingPolicy, XmAUTOMATIC,
238 NULL);
239
240 my_form = XtVaCreateWidget("Track_station my_form",
241 xmFormWidgetClass,
242 scrollwindow,
243 XmNfractionBase, 3,
244 XmNautoUnmanage, FALSE,
245 XmNshadowThickness, 1,
246 MY_FOREGROUND_COLOR,
247 MY_BACKGROUND_COLOR,
248 NULL);
249
250 call = XtVaCreateManagedWidget(langcode("WPUPTSP002"),
251 xmLabelWidgetClass,
252 my_form,
253 XmNtopAttachment, XmATTACH_FORM,
254 XmNtopOffset, 10,
255 XmNbottomAttachment, XmATTACH_NONE,
256 XmNleftAttachment, XmATTACH_FORM,
257 XmNleftOffset, 10,
258 XmNrightAttachment, XmATTACH_NONE,
259 MY_FOREGROUND_COLOR,
260 MY_BACKGROUND_COLOR,
261 XmNfontList, fontlist1,
262 NULL);
263
264 track_station_data = XtVaCreateManagedWidget("Track_station track locate data",
265 xmTextFieldWidgetClass,
266 my_form,
267 XmNeditable, TRUE,
268 XmNcursorPositionVisible, TRUE,
269 XmNsensitive, TRUE,
270 XmNshadowThickness, 1,
271 XmNcolumns, 15,
272 XmNwidth, ((15*7)+2),
273 XmNmaxLength, 15,
274 XmNbackground, colors[0x0f],
275 XmNtopAttachment,XmATTACH_FORM,
276 XmNtopOffset, 5,
277 XmNbottomAttachment,XmATTACH_NONE,
278 XmNleftAttachment, XmATTACH_WIDGET,
279 XmNleftWidget, call,
280 XmNleftOffset, 10,
281 XmNrightAttachment,XmATTACH_NONE,
282 XmNnavigationType, XmTAB_GROUP,
283 XmNtraversalOn, TRUE,
284 XmNfontList, fontlist1,
285 NULL);
286
287 track_case_data = XtVaCreateManagedWidget(langcode("WPUPTSP003"),
288 xmToggleButtonWidgetClass,
289 my_form,
290 XmNtopAttachment, XmATTACH_WIDGET,
291 XmNtopWidget, call,
292 XmNtopOffset, 20,
293 XmNbottomAttachment, XmATTACH_NONE,
294 XmNleftAttachment, XmATTACH_FORM,
295 XmNleftOffset,10,
296 XmNrightAttachment, XmATTACH_NONE,
297 XmNnavigationType, XmTAB_GROUP,
298 XmNtraversalOn, TRUE,
299 MY_FOREGROUND_COLOR,
300 MY_BACKGROUND_COLOR,
301 XmNfontList, fontlist1,
302 NULL);
303
304 track_match_data = XtVaCreateManagedWidget(langcode("WPUPTSP004"),
305 xmToggleButtonWidgetClass,
306 my_form,
307 XmNtopAttachment, XmATTACH_WIDGET,
308 XmNtopWidget, call,
309 XmNtopOffset, 20,
310 XmNbottomAttachment, XmATTACH_NONE,
311 XmNleftAttachment, XmATTACH_WIDGET,
312 XmNleftWidget,track_case_data,
313 XmNrightOffset,20,
314 XmNrightAttachment, XmATTACH_NONE,
315 XmNnavigationType, XmTAB_GROUP,
316 XmNtraversalOn, TRUE,
317 MY_FOREGROUND_COLOR,
318 MY_BACKGROUND_COLOR,
319 XmNfontList, fontlist1,
320 NULL);
321
322 sep = XtVaCreateManagedWidget("Track_station sep",
323 xmSeparatorGadgetClass,
324 my_form,
325 XmNorientation, XmHORIZONTAL,
326 XmNtopAttachment,XmATTACH_WIDGET,
327 XmNtopWidget,track_case_data,
328 XmNtopOffset, 10,
329 XmNbottomAttachment,XmATTACH_NONE,
330 XmNleftAttachment, XmATTACH_FORM,
331 XmNrightAttachment,XmATTACH_FORM,
332 MY_FOREGROUND_COLOR,
333 MY_BACKGROUND_COLOR,
334 XmNfontList, fontlist1,
335 NULL);
336
337 button_ok = XtVaCreateManagedWidget(langcode("WPUPTSP005"),
338 xmPushButtonGadgetClass,
339 my_form,
340 XmNtopAttachment, XmATTACH_WIDGET,
341 XmNtopWidget, sep,
342 XmNtopOffset, 5,
343 XmNbottomAttachment, XmATTACH_FORM,
344 XmNbottomOffset, 5,
345 XmNleftAttachment, XmATTACH_POSITION,
346 XmNleftPosition, 0,
347 XmNleftOffset, 5,
348 XmNrightAttachment, XmATTACH_POSITION,
349 XmNrightPosition, 1,
350 XmNnavigationType, XmTAB_GROUP,
351 XmNtraversalOn, TRUE,
352 MY_FOREGROUND_COLOR,
353 MY_BACKGROUND_COLOR,
354 XmNfontList, fontlist1,
355 NULL);
356
357 button_clear = XtVaCreateManagedWidget(langcode("WPUPTSP006"),
358 xmPushButtonGadgetClass,
359 my_form,
360 XmNtopAttachment, XmATTACH_WIDGET,
361 XmNtopWidget, sep,
362 XmNtopOffset, 5,
363 XmNbottomAttachment, XmATTACH_FORM,
364 XmNbottomOffset, 5,
365 XmNleftAttachment, XmATTACH_POSITION,
366 XmNleftPosition, 1,
367 XmNrightAttachment, XmATTACH_POSITION,
368 XmNrightPosition, 2,
369 XmNnavigationType, XmTAB_GROUP,
370 XmNtraversalOn, TRUE,
371 MY_FOREGROUND_COLOR,
372 MY_BACKGROUND_COLOR,
373 XmNfontList, fontlist1,
374 NULL);
375
376 button_close = XtVaCreateManagedWidget(langcode("UNIOP00003"),
377 xmPushButtonGadgetClass,
378 my_form,
379 XmNtopAttachment, XmATTACH_WIDGET,
380 XmNtopWidget, sep,
381 XmNtopOffset, 5,
382 XmNbottomAttachment, XmATTACH_FORM,
383 XmNbottomOffset, 5,
384 XmNleftAttachment, XmATTACH_POSITION,
385 XmNleftPosition, 2,
386 XmNrightAttachment, XmATTACH_POSITION,
387 XmNrightPosition, 3,
388 XmNrightOffset, 5,
389 XmNnavigationType, XmTAB_GROUP,
390 XmNtraversalOn, TRUE,
391 MY_FOREGROUND_COLOR,
392 MY_BACKGROUND_COLOR,
393 XmNfontList, fontlist1,
394 NULL);
395
396 XtAddCallback(button_ok, XmNactivateCallback, Track_station_now, track_station_dialog);
397 XtAddCallback(button_close, XmNactivateCallback, track_station_destroy_shell, track_station_dialog);
398 XtAddCallback(button_clear, XmNactivateCallback, Track_station_clear, track_station_dialog);
399
400 XmToggleButtonSetState(track_case_data,FALSE,FALSE);
401 XmToggleButtonSetState(track_match_data,TRUE,FALSE);
402
403 pos_dialog(track_station_dialog);
404
405 delw = XmInternAtom(XtDisplay(track_station_dialog),"WM_DELETE_WINDOW", FALSE);
406 XmAddWMProtocolCallback(track_station_dialog, delw, track_station_destroy_shell, (XtPointer)track_station_dialog);
407
408 // if (track_station_on==1)
409 XmTextFieldSetString(track_station_data,tracking_station_call);
410
411 XtManageChild(my_form);
412 XtManageChild(pane);
413
414 resize_dialog(my_form, track_station_dialog);
415
416 end_critical_section(&track_station_dialog_lock, "track_gui.c:Track_station" );
417
418 XtPopup(track_station_dialog,XtGrabNone);
419
420 // Move focus to the Cancel button. This appears to highlight the
421 // button fine, but we're not able to hit the <Enter> key to
422 // have that default function happen. Note: We _can_ hit the
423 // <SPACE> key, and that activates the option.
424 // XmUpdateDisplay(track_station_dialog);
425 XmProcessTraversal(button_close, XmTRAVERSE_CURRENT);
426
427 }
428 else
429 {
430 (void)XRaiseWindow(XtDisplay(track_station_dialog), XtWindow(track_station_dialog));
431 }
432 }
433
434
435
436
437
438 /***** DOWNLOAD FINDU TRAILS *****/
439
440
441
442 // Struct used for passing two parameters to findu_transfer_thread
443 typedef struct
444 {
445 char *download_client_ptrs[2];
446 } track_ptrs_struct;
447 track_ptrs_struct track_ptrs;
448
449
450
451 // This is the separate execution thread that fetches the track from
452 // findu. The thread is started up by the Download_trail_now()
453 // function below.
454 //
findu_transfer_thread(void * arg)455 static void* findu_transfer_thread(void *arg)
456 {
457 char *fileimg;
458 char *log_filename;
459 // char log_filename_tmp[210];
460 char **ptrs;
461 char sys_cmd[128];
462
463
464 // Get fileimg and log_filename from parameters
465 ptrs = arg;
466 log_filename = ptrs[0];
467 fileimg = ptrs[1];
468
469 // Set global "busy" variable
470 fetching_findu_trail_now = 1;
471
472 if (fetch_remote_file(fileimg, log_filename))
473 {
474
475 // Had trouble getting the file. Abort.
476
477 // We may not be able to do any GUI stuff from multiple
478 // threads/processes at the same time. If that is found to be the
479 // case we can write to STDERR instead.
480
481 // Dump a message to STDERR
482 // fprintf(stderr,
483 // "%s %s\n",
484 // langcode("POPEM00035"),
485 // langcode("POPEM00044"));
486
487 // Fetch Findu Trail: Failed
488 popup_message_always(langcode("POPEM00035"),
489 langcode("POPEM00044"));
490
491 // Reset global "busy" variable
492 fetching_findu_trail_now = 0;
493
494 // End the thread
495 return(NULL);
496 }
497
498 // We need to move this message up to the main thread if possible so
499 // that we don't have multiple threads writing to the GUI. This
500 // sort of operation can cause segfaults. In practice I haven't
501 // seen any segfaults due to this particular popup though.
502
503 // Fetch Findu Trail: Complete
504 popup_message_always(langcode("POPEM00036"),
505 langcode("POPEM00045"));
506
507 // Set permissions on the file so that any user can overwrite it.
508 chmod(log_filename, 0666);
509
510 #if defined(HAVE_SED)
511 // Add three spaces before each "<br>" and axe the "<br>". This
512 // is so that Base-91 compressed packets with no comment and no
513 // speed/course/altitude will get decoded ok. Otherwise the
514 // spaces that are critical to the Base-91 packets won't be
515 // there due to findu.com filtering them out.
516 //
517 // "sed -i -e \"s/<br>/ <br>/\" %s",
518 sprintf(sys_cmd,
519 "%s -i -e \"s/<br>/ /\" %s",
520 SED_PATH,
521 log_filename);
522 if (system(sys_cmd))
523 {
524 fprintf(stderr,"Couldn't execute command: %s\n", sys_cmd);
525 }
526
527 // Greater-than symbol '>'
528 sprintf(sys_cmd,
529 "%s -i -e \"s/>/>/\" %s",
530 SED_PATH,
531 log_filename);
532 if (system(sys_cmd))
533 {
534 fprintf(stderr,"Couldn't execute command: %s\n", sys_cmd);
535 }
536
537 // Less-than symbol '<'
538 sprintf(sys_cmd,
539 "%s -i -e \"s/</</\" %s",
540 SED_PATH,
541 log_filename);
542 if (system(sys_cmd))
543 {
544 fprintf(stderr,"Couldn't execute command: %s\n", sys_cmd);
545 }
546
547 // Ampersand '&' (A difficult character to escape from the shell!)
548 sprintf(sys_cmd,
549 "%s -i -e \"s/&/\\&/\" %s",
550 SED_PATH,
551 log_filename);
552 if (system(sys_cmd))
553 {
554 fprintf(stderr,"Couldn't execute command: %s\n", sys_cmd);
555 }
556
557 // Double-quote symbol '"'
558 sprintf(sys_cmd,
559 "%s -i -e \"s/"/""/\" %s",
560 SED_PATH,
561 log_filename);
562 if (system(sys_cmd))
563 {
564 fprintf(stderr,"Couldn't execute command: %s\n", sys_cmd);
565 }
566
567 // Remove whitespace at the start of a line
568 // sed 's/^[ \t]*//'
569 sprintf(sys_cmd,
570 "%s -i -e \"s/^[ \t]*//\" %s",
571 SED_PATH,
572 log_filename);
573 if (system(sys_cmd))
574 {
575 fprintf(stderr,"Couldn't execute command: %s\n", sys_cmd);
576 }
577
578 // Remove any lines that start with '<'
579 sprintf(sys_cmd,
580 "%s -i -e \"s/^<.*$//\" %s",
581 SED_PATH,
582 log_filename);
583 if (system(sys_cmd))
584 {
585 fprintf(stderr,"Couldn't execute command: %s\n", sys_cmd);
586 }
587
588 // Remove any lines that start with '"http'
589 sprintf(sys_cmd,
590 "%s -i -e \"/^\\\"http.*$/d\" %s",
591 SED_PATH,
592 log_filename);
593 if (system(sys_cmd))
594 {
595 fprintf(stderr,"Couldn't execute command: %s\n", sys_cmd);
596 }
597
598 // Remove any blank lines from the file
599 // sed '/^$/d'
600 sprintf(sys_cmd,
601 "%s -i -e \"/^$/d\" %s",
602 SED_PATH,
603 log_filename);
604 if (system(sys_cmd))
605 {
606 fprintf(stderr,"Couldn't execute command: %s\n", sys_cmd);
607 }
608
609 #endif // HAVE_SED
610
611 /*
612 #ifdef HAVE_HTML2TEXT
613 // Create temp filename
614 xastir_snprintf(log_filename_tmp, sizeof(log_filename_tmp), "%s%s",
615 log_filename,
616 ".tmp");
617 // Create html2text command
618 sprintf(sys_cmd,
619 "%s -width 300 -o %s %s",
620 HTML2TEXT_PATH,
621 log_filename_tmp,
622 log_filename);
623 // Convert the newly-downloaded file from html to text format
624 (void)system(sys_cmd);
625 // Rename the file so that we can keep the static char* name
626 // pointing to it, needed for the read_file_ptr code in the main
627 // thread.
628 #if defined(HAVE_MV)
629 sprintf(sys_cmd,
630 "%s %s %s",
631 MV_PATH,
632 log_filename_tmp,
633 log_filename);
634 (void)system(sys_cmd);
635 #endif // HAVE_MV
636 #endif // HAVE_HTML2TEXT
637 */
638
639 // Here we do the findu stuff, if the findu_flag is set. Else we do an imagemap.
640 // We have the log data we're interested in within the log_filename file.
641 // Cause that file to be read by the "File->Open Log File" routine. HTML
642 // tags will be ignored just fine.
643 read_file_ptr = fopen(log_filename, "r");
644
645 if (read_file_ptr != NULL)
646 {
647 read_file = 1;
648 }
649 else
650 {
651 fprintf(stderr,"Couldn't open file: %s\n", log_filename);
652 }
653
654 // Reset global "busy" variable
655 fetching_findu_trail_now = 0;
656
657 // End the thread
658 return(NULL);
659 }
660
661
662
663
664
Download_trail_destroy_shell(Widget UNUSED (widget),XtPointer clientData,XtPointer UNUSED (callData))665 void Download_trail_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
666 {
667 Widget shell = (Widget) clientData;
668 XtPopdown(shell);
669
670 begin_critical_section(&download_findu_dialog_lock, "track_gui.c:Download_trail_destroy_shell" );
671
672 XtDestroyWidget(shell);
673 download_findu_dialog = (Widget)NULL;
674
675 end_critical_section(&download_findu_dialog_lock, "track_gui.c:Download_trail_destroy_shell" );
676 }
677
678
679
680
681
Download_trail_now(Widget w,XtPointer clientData,XtPointer callData)682 void Download_trail_now(Widget w, XtPointer clientData, XtPointer callData)
683 {
684 char temp[MAX_CALLSIGN+1];
685 static char fileimg[400];
686 static char log_filename[200];
687 char *temp_ptr;
688 pthread_t download_trail_thread;
689 static XtPointer download_client_data = NULL;
690
691 char tmp_base_dir[MAX_VALUE];
692
693 get_user_base_dir("tmp",tmp_base_dir, sizeof(tmp_base_dir));
694
695 // If we're already fetching a trail, we shouldn't be calling
696 // this callback function. Get out.
697 if (fetching_findu_trail_now)
698 {
699 return;
700 }
701
702 // Pass two parameters to findu_transfer_thread via a struct
703 track_ptrs.download_client_ptrs[0] = log_filename;
704 track_ptrs.download_client_ptrs[1] = fileimg;
705 download_client_data = &track_ptrs;
706
707 // Check whether it's ok to do a download currently.
708 if (read_file)
709 {
710 // No, we're already in the middle of reading in some file.
711 // Skip trying to download yet another file.
712
713 fprintf(stderr,"Processing another file. Wait a bit, then try again\n");
714
715 popup_message_always(langcode("POPEM00035"),
716 langcode("POPEM00041"));
717
718 return;
719 }
720
721 // busy_cursor(appshell);
722
723 strcpy(log_filename, tmp_base_dir);
724 log_filename[sizeof(log_filename)-1] = '\0'; // Terminate string
725 strcat(log_filename, "/map.log");
726 log_filename[sizeof(log_filename)-1] = '\0'; // Terminate string
727
728 // Erase any previously existing local file by the same name.
729 // This avoids the problem of having an old tracklog here and
730 // the code trying to display it when the download fails.
731 unlink( log_filename );
732
733
734 XmScaleGetValue(posit_start_value, &posit_start);
735 XmScaleGetValue(posit_length_value, &posit_length);
736
737 temp_ptr = XmTextFieldGetString(download_trail_station_data);
738 xastir_snprintf(temp,
739 sizeof(temp),
740 "%s",
741 temp_ptr);
742 XtFree(temp_ptr);
743
744 (void)remove_trailing_spaces(temp);
745 (void)remove_trailing_dash_zero(temp);
746
747 xastir_snprintf(download_trail_station_call,
748 sizeof(download_trail_station_call),
749 "%s",
750 temp);
751 //Download_trail_destroy_shell(w, clientData, callData);
752
753
754 // New URL's for findu. The second one looks very promising.
755 //http://www.findu.com/cgi-bin/raw.cgi?call=k4hg-8&time=1
756 //http://www.findu.com/cgi-bin/rawposit.cgi?call=k4hg-8&time=1
757 //
758 // The last adds this to the beginning of the line:
759 //
760 // "20030619235323,"
761 //
762 // which is a date/timestamp. We'll need to do some extra stuff
763 // here in order to actually use that date/timestamp though.
764 // Setting the read_file_ptr to the downloaded file won't do it.
765
766
767
768 // "http://www.findu.com/cgi-bin/rawposit.cgi?call=%s&start=%d&length=%d&time=1", // New, with timestamp
769 xastir_snprintf(fileimg, sizeof(fileimg),
770 //
771 // Posits only:
772 // "http://www.findu.com/cgi-bin/rawposit.cgi?call=%s&start=%d&length=%d",
773 //
774 // Posits plus timestamps (we can't handle timestamps yet):
775 // "http://www.findu.com/cgi-bin/rawposit.cgi?call=%s&start=%d&length=%d&time=1", // New, with timestamp
776 //
777 // Download all packets, not just posits:
778 "http://www.findu.com/cgi-bin/raw.cgi?call=%s&start=%d&length=%d",
779 //
780 download_trail_station_call,posit_start,posit_length);
781
782 if (debug_level & 1024)
783 {
784 fprintf(stderr, "%s\n", fileimg);
785 }
786
787
788 //----- Start New Thread -----
789
790 if (pthread_create(&download_trail_thread,
791 NULL,
792 findu_transfer_thread,
793 download_client_data))
794 {
795
796 fprintf(stderr,"Error creating findu transfer thread\n");
797 }
798 else
799 {
800 // We're off and running with the new thread!
801 }
802
803 display_zoom_status();
804
805 Download_trail_destroy_shell(w, clientData, callData);
806 }
807
808
809
810
811
Reset_posit_length_max(Widget UNUSED (w),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))812 void Reset_posit_length_max(Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
813 {
814
815 XmScaleGetValue(posit_length_value, &posit_length);
816 XmScaleGetValue(posit_start_value, &posit_start);
817
818 // Check whether start hours is greater than max findu allows
819 // for duration
820 //
821 if (posit_start > MAX_FINDU_DURATION) // Set the duration slider to
822 {
823 // findu's max duration hours
824
825 XtVaSetValues(posit_length_value,
826 XmNvalue, MAX_FINDU_DURATION,
827 NULL);
828 posit_length = MAX_FINDU_DURATION;
829 }
830 else // Not near the max, so set the duration slider to match
831 {
832 // the start hours
833
834 XtVaSetValues(posit_length_value,
835 XmNvalue, posit_start,
836 NULL);
837 posit_length = posit_start;
838 }
839 }
840
841
842
843
844
Download_findu_trail(Widget UNUSED (w),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))845 void Download_findu_trail( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
846 {
847 static Widget pane, scrollwindow, my_form, button_ok, button_cancel, call, sep;
848 Atom delw;
849 XmString x_str;
850
851
852 if (!download_findu_dialog)
853 {
854
855 begin_critical_section(&download_findu_dialog_lock, "track_gui.c:Download_findu_trail" );
856
857 download_findu_dialog = XtVaCreatePopupShell(langcode("WPUPTSP007"),
858 xmDialogShellWidgetClass, appshell,
859 XmNdeleteResponse,XmDESTROY,
860 XmNdefaultPosition, FALSE,
861 XmNfontList, fontlist1,
862 NULL);
863
864 pane = XtVaCreateWidget("Download_findu_trail pane",
865 xmPanedWindowWidgetClass,
866 download_findu_dialog,
867 MY_FOREGROUND_COLOR,
868 MY_BACKGROUND_COLOR,
869 NULL);
870
871 scrollwindow = XtVaCreateManagedWidget("scrollwindow",
872 xmScrolledWindowWidgetClass,
873 pane,
874 XmNscrollingPolicy, XmAUTOMATIC,
875 NULL);
876
877 my_form = XtVaCreateWidget("Download_findu_trail my_form",
878 xmFormWidgetClass,
879 scrollwindow,
880 XmNfractionBase, 2,
881 XmNautoUnmanage, FALSE,
882 XmNshadowThickness, 1,
883 MY_FOREGROUND_COLOR,
884 MY_BACKGROUND_COLOR,
885 NULL);
886
887 call = XtVaCreateManagedWidget(langcode("WPUPTSP008"),
888 xmLabelWidgetClass,
889 my_form,
890 XmNtopAttachment, XmATTACH_FORM,
891 XmNtopOffset, 10,
892 XmNbottomAttachment, XmATTACH_NONE,
893 XmNleftAttachment, XmATTACH_FORM,
894 XmNleftOffset, 10,
895 XmNrightAttachment, XmATTACH_NONE,
896 MY_FOREGROUND_COLOR,
897 MY_BACKGROUND_COLOR,
898 XmNfontList, fontlist1,
899 NULL);
900
901 download_trail_station_data = XtVaCreateManagedWidget("download_trail_station_data",
902 xmTextFieldWidgetClass,
903 my_form,
904 XmNeditable, TRUE,
905 XmNcursorPositionVisible, TRUE,
906 XmNsensitive, TRUE,
907 XmNshadowThickness, 1,
908 XmNcolumns, 15,
909 XmNwidth, ((15*7)+2),
910 XmNmaxLength, 15,
911 XmNbackground, colors[0x0f],
912 XmNtopAttachment,XmATTACH_FORM,
913 XmNtopOffset, 5,
914 XmNbottomAttachment,XmATTACH_NONE,
915 XmNleftAttachment, XmATTACH_WIDGET,
916 XmNleftWidget, call,
917 XmNleftOffset, 10,
918 XmNrightAttachment,XmATTACH_NONE,
919 XmNnavigationType, XmTAB_GROUP,
920 XmNtraversalOn, TRUE,
921 XmNfontList, fontlist1,
922 NULL);
923
924 x_str = XmStringCreateLocalized(langcode("WPUPTSP009"));
925 posit_start_value = XtVaCreateManagedWidget("Start of Trail (hrs ago)",
926 xmScaleWidgetClass,
927 my_form,
928 XmNtopAttachment,XmATTACH_WIDGET,
929 XmNtopWidget, call,
930 XmNtopOffset, 15,
931 XmNbottomAttachment,XmATTACH_NONE,
932 XmNleftAttachment, XmATTACH_FORM,
933 XmNleftOffset, 10,
934 XmNrightAttachment,XmATTACH_NONE,
935 XmNnavigationType, XmTAB_GROUP,
936 XmNtraversalOn, TRUE,
937 //XmNwidth, 190,
938 XmNrightAttachment, XmATTACH_FORM,
939 XmNrightOffset, 10,
940 XmNsensitive, TRUE,
941 XmNorientation, XmHORIZONTAL,
942 XmNborderWidth, 1,
943 XmNminimum, 1,
944 XmNmaximum, MAX_FINDU_START_TIME,
945 XmNshowValue, TRUE,
946 XmNvalue, posit_start,
947 // Note: Some versions of OpenMotif (distributed with Fedora,
948 // perhaps others) don't work properly with XtVaTypedArg() as used
949 // here, instead showing blank labels for the Scale widgets.
950 // XtVaTypedArg, XmNtitleString, XmRString, langcode("WPUPTSP009"), 22,
951 XmNtitleString, x_str,
952 MY_FOREGROUND_COLOR,
953 MY_BACKGROUND_COLOR,
954 XmNfontList, fontlist1,
955 NULL);
956 XmStringFree(x_str);
957
958 x_str = XmStringCreateLocalized(langcode("WPUPTSP010"));
959 posit_length_value = XtVaCreateManagedWidget("Length of trail (hrs)",
960 xmScaleWidgetClass,
961 my_form,
962 XmNtopAttachment,XmATTACH_WIDGET,
963 XmNtopWidget, posit_start_value,
964 XmNtopOffset, 15,
965 XmNbottomAttachment,XmATTACH_NONE,
966 XmNleftAttachment, XmATTACH_FORM,
967 XmNleftOffset, 10,
968 XmNrightAttachment,XmATTACH_NONE,
969 XmNnavigationType, XmTAB_GROUP,
970 XmNtraversalOn, TRUE,
971 //XmNwidth, 190,
972 XmNrightAttachment, XmATTACH_FORM,
973 XmNrightOffset, 10,
974 XmNsensitive, TRUE,
975 XmNorientation, XmHORIZONTAL,
976 XmNborderWidth, 1,
977 XmNminimum, 1,
978 XmNmaximum, MAX_FINDU_DURATION,
979 XmNshowValue, TRUE,
980 XmNvalue, posit_length,
981 // Note: Some versions of OpenMotif (distributed with Fedora,
982 // perhaps others) don't work properly with XtVaTypedArg() as used
983 // here, instead showing blank labels for the Scale widgets.
984 // XtVaTypedArg, XmNtitleString, XmRString, langcode("WPUPTSP010"), 19,
985 XmNtitleString, x_str,
986 MY_FOREGROUND_COLOR,
987 MY_BACKGROUND_COLOR,
988 XmNfontList, fontlist1,
989 NULL);
990 XmStringFree(x_str);
991
992 sep = XtVaCreateManagedWidget("Download_findu_trail sep",
993 xmSeparatorGadgetClass,
994 my_form,
995 XmNorientation, XmHORIZONTAL,
996 XmNtopAttachment,XmATTACH_WIDGET,
997 XmNtopWidget,posit_length_value,
998 XmNtopOffset, 10,
999 XmNbottomAttachment,XmATTACH_NONE,
1000 XmNleftAttachment, XmATTACH_FORM,
1001 XmNrightAttachment,XmATTACH_FORM,
1002 MY_FOREGROUND_COLOR,
1003 MY_BACKGROUND_COLOR,
1004 XmNfontList, fontlist1,
1005 NULL);
1006
1007 button_ok = XtVaCreateManagedWidget(langcode("WPUPTSP007"),
1008 xmPushButtonGadgetClass,
1009 my_form,
1010 XmNtopAttachment, XmATTACH_WIDGET,
1011 XmNtopWidget, sep,
1012 XmNtopOffset, 5,
1013 XmNbottomAttachment, XmATTACH_FORM,
1014 XmNbottomOffset, 5,
1015 XmNleftAttachment, XmATTACH_POSITION,
1016 XmNleftPosition, 0,
1017 XmNleftOffset, 5,
1018 XmNrightAttachment, XmATTACH_POSITION,
1019 XmNrightPosition, 1,
1020 XmNnavigationType, XmTAB_GROUP,
1021 XmNtraversalOn, TRUE,
1022 MY_FOREGROUND_COLOR,
1023 MY_BACKGROUND_COLOR,
1024 XmNfontList, fontlist1,
1025 NULL);
1026 if (fetching_findu_trail_now)
1027 {
1028 XtSetSensitive(button_ok, FALSE);
1029 }
1030
1031 button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00002"),
1032 xmPushButtonGadgetClass,
1033 my_form,
1034 XmNtopAttachment, XmATTACH_WIDGET,
1035 XmNtopWidget, sep,
1036 XmNtopOffset, 5,
1037 XmNbottomAttachment, XmATTACH_FORM,
1038 XmNbottomOffset, 5,
1039 XmNleftAttachment, XmATTACH_POSITION,
1040 XmNleftPosition, 1,
1041 XmNrightAttachment, XmATTACH_POSITION,
1042 XmNrightPosition, 2,
1043 XmNrightOffset, 5,
1044 XmNnavigationType, XmTAB_GROUP,
1045 XmNtraversalOn, TRUE,
1046 MY_FOREGROUND_COLOR,
1047 MY_BACKGROUND_COLOR,
1048 XmNfontList, fontlist1,
1049 NULL);
1050
1051 XtAddCallback(button_ok, XmNactivateCallback, Download_trail_now, download_findu_dialog);
1052 XtAddCallback(button_cancel, XmNactivateCallback, Download_trail_destroy_shell, download_findu_dialog);
1053 XtAddCallback(posit_start_value, XmNvalueChangedCallback, Reset_posit_length_max, download_findu_dialog);
1054
1055 pos_dialog(download_findu_dialog);
1056
1057 delw = XmInternAtom(XtDisplay(download_findu_dialog),"WM_DELETE_WINDOW", FALSE);
1058 XmAddWMProtocolCallback(download_findu_dialog, delw, Download_trail_destroy_shell, (XtPointer)download_findu_dialog);
1059
1060 XmTextFieldSetString(download_trail_station_data,download_trail_station_call);
1061
1062 XtManageChild(my_form);
1063 XtManageChild(pane);
1064
1065 resize_dialog(my_form, download_findu_dialog);
1066
1067 end_critical_section(&download_findu_dialog_lock, "track_gui.c:Download_trail" );
1068
1069 XtPopup(download_findu_dialog,XtGrabNone);
1070
1071 // Move focus to the Cancel button. This appears to highlight the
1072 // button fine, but we're not able to hit the <Enter> key to
1073 // have that default function happen. Note: We _can_ hit the
1074 // <SPACE> key, and that activates the option.
1075 // XmUpdateDisplay(download_findu_dialog);
1076 XmProcessTraversal(button_cancel, XmTRAVERSE_CURRENT);
1077
1078 }
1079 else
1080 {
1081 (void)XRaiseWindow(XtDisplay(download_findu_dialog), XtWindow(download_findu_dialog));
1082 }
1083 }
1084
1085
1086