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/&gt;/>/\" %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/&lt;/</\" %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/&amp;/\\&/\" %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/&quot;/""/\" %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