1 // ----------------------------------------------------------------------------
2 // Copyright (C) 2014
3 // David Freese, W1HKJ
4 //
5 // This file is part of flmsg
6 //
7 // flrig is free software; you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by
9 // the Free Software Foundation; either version 3 of the License, or
10 // (at your option) any later version.
11 //
12 // flrig 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, see <http://www.gnu.org/licenses/>.
19 // ----------------------------------------------------------------------------
20
21 #include <stdlib.h>
22 #include <iostream>
23 #include <fstream>
24 #include <cstring>
25 #include <ctime>
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <stdio.h>
29 #include <errno.h>
30
31 #include <FL/Fl.H>
32 #include <FL/Enumerations.H>
33 #include <FL/Fl_Window.H>
34 #include <FL/Fl_Button.H>
35 #include <FL/Fl_Group.H>
36 #include <FL/Fl_Sys_Menu_Bar.H>
37 #include <FL/x.H>
38 #include <FL/Fl_Help_Dialog.H>
39 #include <FL/Fl_Menu_Item.H>
40 #include <FL/Fl_File_Icon.H>
41
42 #include "config.h"
43 #include "flmsg_config.h"
44
45 #include "flmsg.h"
46 #include "templates.h"
47 #include "debug.h"
48 #include "util.h"
49 #include "gettext.h"
50 #include "flmsg_dialog.h"
51 #include "flinput2.h"
52 #include "date.h"
53 #include "calendar.h"
54 #include "icons.h"
55 #include "fileselect.h"
56 #include "wrap.h"
57 #include "status.h"
58 #include "parse_xml.h"
59
60 #ifdef WIN32
61 # include "flmsgrc.h"
62 # include "compat.h"
63 # define dirent fl_dirent_no_thanks
64 #endif
65
66 #include <FL/filename.H>
67 #include "dirent-check.h"
68
69 #include <FL/x.H>
70 #include <FL/Fl_Pixmap.H>
71 #include <FL/Fl_Image.H>
72
73 using namespace std;
74
75 const char mars_precedent[] = "RPOZ";
76 const char mars_e_x[] = "EX";
77
78 string mars_daily_incident = ":md_inc:";
79 string mars_daily_de = ":md_de_:";
80 string mars_daily_nbr = ":md_nbr:";
81 string mars_daily_prec = ":md_pre:";
82 string mars_daily_dtg = ":md_dtg:";
83 string mars_daily_fm_name = ":md_fnm:";
84 string mars_daily_fm_call = ":md_fcl:";
85 string mars_daily_fm_state = ":md_fst:";
86 string mars_daily_to_pos = ":md_tps:";
87 string mars_daily_to_call = ":md_tcl:";
88 string mars_daily_to_state = ":md_tst:";
89 string mars_daily_pos1 = ":md_ps1:";
90 string mars_daily_call1 = ":md_cl1:";
91 string mars_daily_state1 = ":md_st1:";
92 string mars_daily_pos2 = ":md_ps2:";
93 string mars_daily_call2 = ":md_cl2:";
94 string mars_daily_state2 = ":md_st2:";
95 string mars_daily_pos3 = ":md_ps3:";
96 string mars_daily_call3 = ":md_cl3:";
97 string mars_daily_state3 = ":md_st3:";
98 string mars_daily_sitrep_id = ":md_sid:";
99 string mars_daily_sitrep_loc = ":md_slo:";
100 string mars_daily_24hr = ":md_22h:";
101 string mars_daily_netcall = ":md_ncl:";
102 string mars_daily_e_x = ":md_e_x:";
103 string mars_daily_dtg_active = ":md_dta:";
104 string mars_daily_dtg_deactive = ":md_dtd:";
105 string mars_daily_nbr_stations = ":md_nst:";
106 string mars_daily_details = ":md_det:";
107 string mars_daily_activations = ":md_acs:";
108 string mars_daily_agencies = ":md_agy:";
109 string mars_daily_remarks = ":md_rem:";
110
111 string s_mars_daily_incident;
112 string s_mars_daily_de;
113 string s_mars_daily_nbr;
114 string s_mars_daily_prec = "R";
115 string s_mars_daily_dtg;
116 string s_mars_daily_fm_name;
117 string s_mars_daily_fm_call;
118 string s_mars_daily_fm_state;
119 string s_mars_daily_to_pos;
120 string s_mars_daily_to_call;
121 string s_mars_daily_to_state;
122 string s_mars_daily_pos1;
123 string s_mars_daily_call1;
124 string s_mars_daily_state1;
125 string s_mars_daily_pos2;
126 string s_mars_daily_call2;
127 string s_mars_daily_state2;
128 string s_mars_daily_pos3;
129 string s_mars_daily_call3;
130 string s_mars_daily_state3;
131 string s_mars_daily_sitrep_id;
132 string s_mars_daily_sitrep_loc;
133 string s_mars_daily_24hr;
134 string s_mars_daily_netcall;
135 string s_mars_daily_e_x = "X";
136 string s_mars_daily_dtg_active;
137 string s_mars_daily_dtg_deactive;
138 string s_mars_daily_nbr_stations;
139 string s_mars_daily_details;
140 string s_mars_daily_activations;
141 string s_mars_daily_agencies;
142 string s_mars_daily_remarks;
143
144 string buffmars_daily;
145 string def_mars_daily_filename = "";
146 string base_mars_daily_filename = "";
147 string def_mars_daily_TemplateName = "";
148
149 bool using_mars_daily_template = false;
150
clear_mars_dailyfields()151 void clear_mars_dailyfields()
152 {
153 s_mars_daily_incident.clear();
154 s_mars_daily_de.clear();
155 s_mars_daily_nbr.clear();
156 s_mars_daily_prec = "R";
157 s_mars_daily_dtg.clear();
158 s_mars_daily_fm_name.clear();
159 s_mars_daily_fm_call.clear();
160 s_mars_daily_fm_state.clear();
161 s_mars_daily_to_pos.clear();
162 s_mars_daily_to_call.clear();
163 s_mars_daily_to_state.clear();
164 s_mars_daily_pos1.clear();
165 s_mars_daily_call1.clear();
166 s_mars_daily_state1.clear();
167 s_mars_daily_pos2.clear();
168 s_mars_daily_call2.clear();
169 s_mars_daily_state2.clear();
170 s_mars_daily_pos3.clear();
171 s_mars_daily_call3.clear();
172 s_mars_daily_state3.clear();
173 s_mars_daily_sitrep_id.clear();
174 s_mars_daily_sitrep_loc.clear();
175 s_mars_daily_24hr.clear();
176 s_mars_daily_netcall.clear();
177 s_mars_daily_e_x = "X";
178 s_mars_daily_dtg_active.clear();
179 s_mars_daily_dtg_deactive.clear();
180 s_mars_daily_nbr_stations.clear();
181 s_mars_daily_details.clear();
182 s_mars_daily_activations.clear();
183 s_mars_daily_agencies.clear();
184 s_mars_daily_remarks.clear();
185 }
186
check_mars_dailyfields()187 bool check_mars_dailyfields()
188 {
189 string temp;
190 if (s_mars_daily_incident != txt_mars_daily_incident->value()) return true;
191 if (s_mars_daily_de != txt_mars_daily_de->value()) return true;
192 if (s_mars_daily_nbr != txt_mars_daily_nbr->value()) return true;
193 int val = sel_mars_daily_prec->index();
194 temp.clear();
195 temp += mars_precedent[val];
196 if (s_mars_daily_prec != temp) return true;
197 if (s_mars_daily_dtg != txt_mars_daily_dtg->value()) return true;
198 if (s_mars_daily_fm_name != txt_mars_daily_fm_name->value()) return true;
199 if (s_mars_daily_fm_call != txt_mars_daily_fm_call->value()) return true;
200 if (s_mars_daily_fm_state != txt_mars_daily_fm_state->value()) return true;
201 if (s_mars_daily_to_pos != txt_mars_daily_to_pos->value()) return true;
202 if (s_mars_daily_to_call != txt_mars_daily_to_call->value()) return true;
203 if (s_mars_daily_to_state != txt_mars_daily_to_state->value()) return true;
204 if (s_mars_daily_pos1 != txt_mars_daily_pos1->value()) return true;
205 if (s_mars_daily_call1 != txt_mars_daily_call1->value()) return true;
206 if (s_mars_daily_state1 != txt_mars_daily_state1->value()) return true;
207 if (s_mars_daily_pos2 != txt_mars_daily_pos2->value()) return true;
208 if (s_mars_daily_call2 != txt_mars_daily_call2->value()) return true;
209 if (s_mars_daily_state2 != txt_mars_daily_state2->value()) return true;
210 if (s_mars_daily_pos3 != txt_mars_daily_pos3->value()) return true;
211 if (s_mars_daily_call3 != txt_mars_daily_call3->value()) return true;
212 if (s_mars_daily_state3 != txt_mars_daily_state3->value()) return true;
213 if (s_mars_daily_sitrep_id != txt_mars_daily_sitrep_id->value()) return true;
214 if (s_mars_daily_sitrep_loc != txt_mars_daily_sitrep_loc->value()) return true;
215 if (s_mars_daily_24hr != txt_mars_daily_dtg_24hr->value()) return true;
216 if (s_mars_daily_netcall != txt_mars_daily_netcall->value()) return true;
217 temp.clear();
218 temp += mars_e_x[sel_mars_daily_e_x->index()];
219 if (s_mars_daily_e_x != temp) return true;
220 if (s_mars_daily_dtg_active != txt_mars_daily_dtg_active->value()) return true;
221 if (s_mars_daily_dtg_deactive != txt_mars_daily_dtg_deactive->value()) return true;
222 if (s_mars_daily_nbr_stations != txt_mars_daily_nbr_stations->value()) return true;
223 if (s_mars_daily_details != txt_mars_daily_details->value()) return true;
224 if (s_mars_daily_activations != txt_mars_daily_activations->value()) return true;
225 if (s_mars_daily_agencies != txt_mars_daily_agencies->value()) return true;
226 if (s_mars_daily_remarks != txt_mars_daily_remarks->value()) return true;
227 return false;
228 }
229
update_mars_dailyfields()230 void update_mars_dailyfields()
231 {
232 s_mars_daily_incident = txt_mars_daily_incident->value();
233 s_mars_daily_de = txt_mars_daily_de->value();
234 s_mars_daily_nbr = txt_mars_daily_nbr->value();
235 size_t n = sel_mars_daily_prec->index();
236 if (n < 0) n = 0;
237 if (n >= strlen(mars_precedent)) n = strlen(mars_precedent) - 1;
238 s_mars_daily_prec = mars_precedent[n];
239 s_mars_daily_dtg = txt_mars_daily_dtg->value();
240 s_mars_daily_fm_name = txt_mars_daily_fm_name->value();
241 s_mars_daily_fm_call = txt_mars_daily_fm_call->value();
242 s_mars_daily_fm_state = txt_mars_daily_fm_state->value();
243 s_mars_daily_to_pos = txt_mars_daily_to_pos->value();
244 s_mars_daily_to_call = txt_mars_daily_to_call->value();
245 s_mars_daily_to_state = txt_mars_daily_to_state->value();
246 s_mars_daily_pos1 = txt_mars_daily_pos1->value();
247 s_mars_daily_call1 = txt_mars_daily_call1->value();
248 s_mars_daily_state1 = txt_mars_daily_state1->value();
249 s_mars_daily_pos2 = txt_mars_daily_pos2->value();
250 s_mars_daily_call2 = txt_mars_daily_call2->value();
251 s_mars_daily_state2 = txt_mars_daily_state2->value();
252 s_mars_daily_pos3 = txt_mars_daily_pos3->value();
253 s_mars_daily_call3 = txt_mars_daily_call3->value();
254 s_mars_daily_state3 = txt_mars_daily_state3->value();
255 s_mars_daily_sitrep_id = txt_mars_daily_sitrep_id->value();
256 s_mars_daily_sitrep_loc = txt_mars_daily_sitrep_loc->value();
257 s_mars_daily_24hr = txt_mars_daily_dtg_24hr->value();
258 s_mars_daily_netcall = txt_mars_daily_netcall->value();
259 n = sel_mars_daily_e_x->index();
260 if (n < 0) n = 0;
261 if (n >= strlen(mars_e_x)) n = strlen(mars_e_x) - 1;
262 s_mars_daily_e_x = mars_e_x[n];
263 s_mars_daily_dtg_active = txt_mars_daily_dtg_active->value();
264 s_mars_daily_dtg_deactive = txt_mars_daily_dtg_deactive->value();
265 s_mars_daily_nbr_stations = txt_mars_daily_nbr_stations->value();
266 s_mars_daily_details = txt_mars_daily_details->value();
267 s_mars_daily_activations = txt_mars_daily_activations->value();
268 s_mars_daily_agencies = txt_mars_daily_agencies->value();
269 s_mars_daily_remarks = txt_mars_daily_remarks->value();
270 }
271
update_mars_dailyform()272 void update_mars_dailyform()
273 {
274 txt_mars_daily_incident->value(s_mars_daily_incident.c_str());
275 txt_mars_daily_de->value(s_mars_daily_de.c_str());
276 txt_mars_daily_nbr->value(s_mars_daily_nbr.c_str());
277
278 size_t n = strchr(mars_precedent, s_mars_daily_prec[0]) - mars_precedent;
279 if (n < 0) n = 0;
280 if (n >= strlen(mars_precedent)) n = strlen(mars_precedent) - 1;
281 sel_mars_daily_prec->index(n);
282
283 txt_mars_daily_dtg->value(s_mars_daily_dtg.c_str());
284 txt_mars_daily_fm_name->value(s_mars_daily_fm_name.c_str());
285 txt_mars_daily_fm_call->value(s_mars_daily_fm_call.c_str());
286 txt_mars_daily_fm_state->value(s_mars_daily_fm_state.c_str());
287 txt_mars_daily_to_pos->value(s_mars_daily_to_pos.c_str());
288 txt_mars_daily_to_call->value(s_mars_daily_to_call.c_str());
289 txt_mars_daily_to_state->value(s_mars_daily_to_state.c_str());
290 txt_mars_daily_pos1->value(s_mars_daily_pos1.c_str());
291 txt_mars_daily_call1->value(s_mars_daily_call1.c_str());
292 txt_mars_daily_state1->value(s_mars_daily_state1.c_str());
293 txt_mars_daily_pos2->value(s_mars_daily_pos2.c_str());
294 txt_mars_daily_call2->value(s_mars_daily_call2.c_str());
295 txt_mars_daily_state2->value(s_mars_daily_state2.c_str());
296 txt_mars_daily_pos3->value(s_mars_daily_pos3.c_str());
297 txt_mars_daily_call3->value(s_mars_daily_call3.c_str());
298 txt_mars_daily_state3->value(s_mars_daily_state3.c_str());
299 txt_mars_daily_sitrep_id->value(s_mars_daily_sitrep_id.c_str());
300 txt_mars_daily_sitrep_loc->value(s_mars_daily_sitrep_loc.c_str());
301 txt_mars_daily_dtg_24hr->value(s_mars_daily_24hr.c_str());
302 txt_mars_daily_netcall->value(s_mars_daily_netcall.c_str());
303
304 n = strchr(mars_e_x, s_mars_daily_e_x[0]) - mars_e_x;
305 if (n < 0) n = 0;
306 if (n >= strlen(mars_e_x)) n = strlen(mars_e_x) - 1;
307 sel_mars_daily_e_x->index(n);
308
309 txt_mars_daily_dtg_active->value(s_mars_daily_dtg_active.c_str());
310 txt_mars_daily_dtg_deactive->value(s_mars_daily_dtg_deactive.c_str());
311 txt_mars_daily_nbr_stations->value(s_mars_daily_nbr_stations.c_str());
312 txt_mars_daily_details->value(s_mars_daily_details.c_str());
313 txt_mars_daily_activations->value(s_mars_daily_activations.c_str());
314 txt_mars_daily_agencies->value(s_mars_daily_agencies.c_str());
315 txt_mars_daily_remarks->value(s_mars_daily_remarks.c_str());
316 }
317
clear_mars_daily_form()318 void clear_mars_daily_form()
319 {
320 clear_mars_dailyfields();
321 txt_mars_daily_incident->value("");
322 txt_mars_daily_de->value("");
323 txt_mars_daily_nbr->value("");
324 sel_mars_daily_prec->index(0);
325 txt_mars_daily_dtg->value("");
326 txt_mars_daily_fm_name->value("");
327 txt_mars_daily_fm_call->value("");
328 txt_mars_daily_fm_state->value("");
329 txt_mars_daily_to_pos->value("");
330 txt_mars_daily_to_call->value("");
331 txt_mars_daily_to_state->value("");
332 txt_mars_daily_pos1->value("");
333 txt_mars_daily_call1->value("");
334 txt_mars_daily_state1->value("");
335 txt_mars_daily_pos2->value("");
336 txt_mars_daily_call2->value("");
337 txt_mars_daily_state2->value("");
338 txt_mars_daily_pos3->value("");
339 txt_mars_daily_call3->value("");
340 txt_mars_daily_state3->value("");
341 txt_mars_daily_sitrep_id->value("");
342 txt_mars_daily_sitrep_loc->value("");
343 txt_mars_daily_dtg_24hr->value("");
344 txt_mars_daily_netcall->value("");
345 sel_mars_daily_e_x->index(1);
346 txt_mars_daily_dtg_active->value("");
347 txt_mars_daily_dtg_deactive->value("");
348 txt_mars_daily_nbr_stations->value("");
349 txt_mars_daily_details->value("");
350 txt_mars_daily_activations->value("");
351 txt_mars_daily_agencies->value("");
352 txt_mars_daily_remarks->value("");
353 }
354
make_buffmars_daily(bool compress=false)355 void make_buffmars_daily(bool compress = false)
356 {
357 string mbuff;
358 mbuff.clear();
359 mbuff.append( lineout( mars_daily_incident, s_mars_daily_incident ) );
360 mbuff.append( lineout( mars_daily_de, s_mars_daily_de ) );
361 mbuff.append( lineout( mars_daily_nbr, s_mars_daily_nbr ) );
362 mbuff.append( lineout( mars_daily_prec, s_mars_daily_prec ) );
363 mbuff.append( lineout( mars_daily_dtg, s_mars_daily_dtg ) );
364 mbuff.append( lineout( mars_daily_fm_name, s_mars_daily_fm_name ) );
365 mbuff.append( lineout( mars_daily_fm_call, s_mars_daily_fm_call ) );
366 mbuff.append( lineout( mars_daily_fm_state, s_mars_daily_fm_state ) );
367 mbuff.append( lineout( mars_daily_to_pos, s_mars_daily_to_pos ) );
368 mbuff.append( lineout( mars_daily_to_call, s_mars_daily_to_call ) );
369 mbuff.append( lineout( mars_daily_to_state, s_mars_daily_to_state ) );
370 mbuff.append( lineout( mars_daily_pos1, s_mars_daily_pos1 ) );
371 mbuff.append( lineout( mars_daily_call1, s_mars_daily_call1 ) );
372 mbuff.append( lineout( mars_daily_state1, s_mars_daily_state1 ) );
373 mbuff.append( lineout( mars_daily_pos2, s_mars_daily_pos2 ) );
374 mbuff.append( lineout( mars_daily_call2, s_mars_daily_call2 ) );
375 mbuff.append( lineout( mars_daily_state2, s_mars_daily_state2 ) );
376 mbuff.append( lineout( mars_daily_pos3, s_mars_daily_pos3 ) );
377 mbuff.append( lineout( mars_daily_call3, s_mars_daily_call3 ) );
378 mbuff.append( lineout( mars_daily_state3, s_mars_daily_state3 ) );
379 mbuff.append( lineout( mars_daily_sitrep_id, s_mars_daily_sitrep_id ) );
380 mbuff.append( lineout( mars_daily_sitrep_loc, s_mars_daily_sitrep_loc ) );
381 mbuff.append( lineout( mars_daily_24hr, s_mars_daily_24hr ) );
382 mbuff.append( lineout( mars_daily_netcall, s_mars_daily_netcall ) );
383 mbuff.append( lineout( mars_daily_e_x, s_mars_daily_e_x ) );
384 mbuff.append( lineout( mars_daily_dtg_active, s_mars_daily_dtg_active ) );
385 mbuff.append( lineout( mars_daily_dtg_deactive,s_mars_daily_dtg_deactive ) );
386 mbuff.append( lineout( mars_daily_nbr_stations,s_mars_daily_nbr_stations ) );
387 mbuff.append( lineout( mars_daily_details, s_mars_daily_details ) );
388 mbuff.append( lineout( mars_daily_activations, s_mars_daily_activations ) );
389 mbuff.append( lineout( mars_daily_agencies, s_mars_daily_agencies ) );
390 mbuff.append( lineout( mars_daily_remarks, s_mars_daily_remarks ) );
391
392 if (compress) compress_maybe(mbuff);
393 buffmars_daily.append(mbuff);
394 }
395
read_mars_daily_buffer(string data)396 void read_mars_daily_buffer(string data)
397 {
398 clear_mars_dailyfields();
399
400 s_mars_daily_incident = findstr( data, mars_daily_incident );
401 s_mars_daily_de = findstr( data, mars_daily_de );
402 s_mars_daily_nbr = findstr( data, mars_daily_nbr );
403 s_mars_daily_prec = findstr( data, mars_daily_prec );
404 s_mars_daily_dtg = findstr( data, mars_daily_dtg );
405 s_mars_daily_fm_name = findstr( data, mars_daily_fm_name );
406 s_mars_daily_fm_call = findstr( data, mars_daily_fm_call );
407 s_mars_daily_fm_state = findstr( data, mars_daily_fm_state );
408 s_mars_daily_to_pos = findstr( data, mars_daily_to_pos );
409 s_mars_daily_to_call = findstr( data, mars_daily_to_call );
410 s_mars_daily_to_state = findstr( data, mars_daily_to_state );
411 s_mars_daily_pos1 = findstr( data, mars_daily_pos1 );
412 s_mars_daily_call1 = findstr( data, mars_daily_call1 );
413 s_mars_daily_state1 = findstr( data, mars_daily_state1 );
414 s_mars_daily_pos2 = findstr( data, mars_daily_pos2 );
415 s_mars_daily_call2 = findstr( data, mars_daily_call2 );
416 s_mars_daily_state2 = findstr( data, mars_daily_state2 );
417 s_mars_daily_pos3 = findstr( data, mars_daily_pos3 );
418 s_mars_daily_call3 = findstr( data, mars_daily_call3 );
419 s_mars_daily_state3 = findstr( data, mars_daily_state3 );
420 s_mars_daily_sitrep_id = findstr( data, mars_daily_sitrep_id );
421 s_mars_daily_sitrep_loc = findstr( data, mars_daily_sitrep_loc );
422 s_mars_daily_24hr = findstr( data, mars_daily_24hr );
423 s_mars_daily_netcall = findstr( data, mars_daily_netcall );
424 s_mars_daily_e_x = findstr( data, mars_daily_e_x );
425 s_mars_daily_dtg_active = findstr( data, mars_daily_dtg_active );
426 s_mars_daily_dtg_deactive = findstr( data, mars_daily_dtg_deactive );
427 s_mars_daily_nbr_stations = findstr( data, mars_daily_nbr_stations );
428 s_mars_daily_details = findstr( data, mars_daily_details );
429 s_mars_daily_activations = findstr( data, mars_daily_activations );
430 s_mars_daily_agencies = findstr( data, mars_daily_agencies );
431 s_mars_daily_remarks = findstr( data, mars_daily_remarks );
432
433 update_mars_dailyform();
434 }
435
cb_mars_daily_new()436 void cb_mars_daily_new()
437 {
438 if (check_mars_dailyfields()) {
439 if (fl_choice2("Form modified, save?", "No", "Yes", NULL) == 1) {
440 update_header(CHANGED);
441 cb_mars_daily_save();
442 }
443 }
444 clear_mars_daily_form();
445 def_mars_daily_filename = ICS_msg_dir;
446 def_mars_daily_filename.append("new").append(FMARSDAILY_EXT);
447 show_filename(def_mars_daily_filename);
448 using_mars_daily_template = false;
449 }
450
cb_mars_daily_import()451 void cb_mars_daily_import()
452 {
453 fl_alert2("Not implemented");
454 }
455
cb_mars_daily_export()456 void cb_mars_daily_export()
457 {
458 fl_alert2("Not implemented");
459 }
460
cb_mars_daily_wrap_import(string wrapfilename,string inpbuffer)461 void cb_mars_daily_wrap_import(string wrapfilename, string inpbuffer)
462 {
463 clear_mars_daily_form();
464 read_mars_daily_buffer(inpbuffer);
465 def_mars_daily_filename = ICS_msg_dir;
466 def_mars_daily_filename.append(wrapfilename);
467 show_filename(def_mars_daily_filename);
468 using_mars_daily_template = false;
469 }
470
eval_mars_daily_fsize()471 int eval_mars_daily_fsize()
472 {
473 Ccrc16 chksum;
474 evalstr.assign("[WRAP:beg][WRAP:lf][WRAP:fn ");
475 evalstr.append(base_mars_daily_filename).append("]");
476 update_mars_dailyfields();
477 update_header(FROM);
478 evalstr.append(header("<mars_daily>"));
479 buffmars_daily.clear();
480 make_buffmars_daily(true);
481 if (buffmars_daily.empty()) return 0;
482 compress_maybe( buffmars_daily );
483 evalstr.append( buffmars_daily );
484 evalstr.append("[WRAP:chksum ").append(chksum.scrc16(evalstr)).append("][WRAP:end]");
485 return evalstr.length();
486 }
487
cb_mars_daily_wrap_export()488 void cb_mars_daily_wrap_export()
489 {
490 if (check_mars_dailyfields()) {
491 if (fl_choice2("Form modified, save?", "No", "Yes", NULL) == 0)
492 return;
493 update_header(CHANGED);
494 }
495 update_mars_dailyfields();
496
497 if (base_mars_daily_filename == string("new").append(FMARSDAILY_EXT) ||
498 base_mars_daily_filename == string("default").append(FMARSDAILY_EXT) )
499 if (!cb_mars_daily_save_as()) return;
500
501 string wrapfilename = WRAP_send_dir;
502 wrapfilename.append(base_mars_daily_filename);
503 wrapfilename.append(".wrap");
504 const char *p = FSEL::saveas(
505 "Save as wrap file",
506 "Wrap file\t*.{wrap,WRAP}",
507 wrapfilename.c_str());
508 if (p) {
509 string pext = fl_filename_ext(p);
510 wrapfilename = p;
511 update_header(FROM);
512 buffmars_daily.assign(header("<mars_daily>"));
513 make_buffmars_daily(true);
514 export_wrapfile(base_mars_daily_filename, wrapfilename, buffmars_daily, pext != ".wrap");
515
516 buffmars_daily.assign(header("<mars_daily>"));
517 make_buffmars_daily(false);
518 write_mars_daily(def_mars_daily_filename);
519 }
520 }
521
cb_mars_daily_wrap_autosend()522 void cb_mars_daily_wrap_autosend()
523 {
524 if (check_mars_dailyfields()) {
525 if (fl_choice2("Form modified, save?", "No", "Yes", NULL) == 0)
526 return;
527 update_header(CHANGED);
528 }
529 update_mars_dailyfields();
530
531 if (base_mars_daily_filename == string("new").append(FMARSDAILY_EXT) ||
532 base_mars_daily_filename == string("default").append(FMARSDAILY_EXT) )
533 if (!cb_mars_daily_save_as()) return;
534
535 update_header(FROM);
536 buffmars_daily.assign(header("<mars_daily>"));
537 make_buffmars_daily(true);
538 xfr_via_socket(base_mars_daily_filename, buffmars_daily);
539
540 buffmars_daily.assign(header("<mars_daily>"));
541 make_buffmars_daily(false);
542 write_mars_daily(def_mars_daily_filename);
543 }
544
cb_mars_daily_load_template()545 void cb_mars_daily_load_template()
546 {
547 string def_mars_daily_filename = def_mars_daily_TemplateName;
548 const char *p = FSEL::select(
549 "Open template file",
550 string("Template file\t*").append(TMARSDAILY_EXT).c_str(),
551 def_mars_daily_filename.c_str());
552 if (p) {
553 clear_mars_daily_form();
554 read_data_file(p);
555 def_mars_daily_TemplateName = p;
556 show_filename(def_mars_daily_TemplateName);
557 using_mars_daily_template = true;
558 }
559 }
560
cb_mars_daily_save_template()561 void cb_mars_daily_save_template()
562 {
563 if (!using_mars_daily_template) {
564 cb_mars_daily_save_as_template();
565 return;
566 }
567 string def_mars_daily_filename = def_mars_daily_TemplateName;
568 const char *p = FSEL::saveas(
569 "Save template file",
570 string("Template file\t*").append(TMARSDAILY_EXT).c_str(),
571 def_mars_daily_filename.c_str());
572 if (p) {
573 update_header(CHANGED);
574 update_mars_dailyfields();
575 buffmars_daily.assign(header("<mars_daily>"));
576 make_buffmars_daily();
577 write_mars_daily(p);
578 }
579 }
580
cb_mars_daily_save_as_template()581 void cb_mars_daily_save_as_template()
582 {
583 string def_mars_daily_filename = def_mars_daily_TemplateName;
584 const char *p = FSEL::saveas(
585 "Save as template file",
586 string("Template file\t*").append(TMARSDAILY_EXT).c_str(),
587 def_mars_daily_filename.c_str());
588 if (p) {
589 const char *pext = fl_filename_ext(p);
590 def_mars_daily_TemplateName = p;
591 if (strlen(pext) == 0) def_mars_daily_TemplateName.append(TMARSDAILY_EXT);
592 remove_spaces_from_filename(def_mars_daily_TemplateName);
593
594 clear_header();
595 update_header(CHANGED);
596 update_mars_dailyfields();
597 buffmars_daily.assign(header("<mars_daily>"));
598 make_buffmars_daily();
599 write_mars_daily(def_mars_daily_TemplateName);
600
601 show_filename(def_mars_daily_TemplateName);
602 using_mars_daily_template = true;
603 }
604 }
605
cb_mars_daily_open()606 void cb_mars_daily_open()
607 {
608 const char *p = FSEL::select(
609 _("Open data file"),
610 string("ICS-mars_daily\t*").append(FMARSDAILY_EXT).c_str(),
611 def_mars_daily_filename.c_str());
612 if (!p) return;
613 if (strlen(p) == 0) return;
614 clear_mars_daily_form();
615 read_data_file(p);
616 using_mars_daily_template = false;
617 def_mars_daily_filename = p;
618 show_filename(def_mars_daily_filename);
619 }
620
write_mars_daily(string s)621 void write_mars_daily(string s)
622 {
623 FILE *filemars_daily = fopen(s.c_str(), "w");
624 if (!filemars_daily) return;
625
626 fwrite(buffmars_daily.c_str(), buffmars_daily.length(), 1, filemars_daily);
627 fclose(filemars_daily);
628 }
629
cb_mars_daily_save_as()630 bool cb_mars_daily_save_as()
631 {
632 const char *p;
633 string newfilename;
634
635 string name = named_file();
636 if (!name.empty()) {
637 name.append(FMARSDAILY_EXT);
638 newfilename = ICS_msg_dir;
639 newfilename.append(name);
640 } else
641 newfilename = def_mars_daily_filename;
642
643 p = FSEL::saveas(
644 _("Save data file"),
645 string("ICS-mars_daily\t*").append(FMARSDAILY_EXT).c_str(),
646 newfilename.c_str());
647
648 if (!p) return false;
649 if (strlen(p) == 0) return false;
650
651 if (progStatus.sernbr_fname) update_sernbr();
652
653 const char *pext = fl_filename_ext(p);
654 def_mars_daily_filename = p;
655 if (strlen(pext) == 0) def_mars_daily_filename.append(FMARSDAILY_EXT);
656
657 remove_spaces_from_filename(def_mars_daily_filename);
658
659 update_header(NEW);
660 update_mars_dailyfields();
661 buffmars_daily.assign(header("<mars_daily>"));
662 make_buffmars_daily();
663 write_mars_daily(def_mars_daily_filename);
664
665 using_mars_daily_template = false;
666 show_filename(def_mars_daily_filename);
667 return true;
668 }
669
cb_mars_daily_save()670 void cb_mars_daily_save()
671 {
672 if (base_mars_daily_filename == string("new").append(FMARSDAILY_EXT) ||
673 base_mars_daily_filename == string("default").append(FMARSDAILY_EXT) ||
674 using_mars_daily_template == true) {
675 cb_mars_daily_save_as();
676 return;
677 }
678 if (check_mars_dailyfields()) update_header(CHANGED);
679 update_mars_dailyfields();
680 buffmars_daily.assign(header("<mars_daily>"));
681 make_buffmars_daily();
682 write_mars_daily(def_mars_daily_filename);
683
684 using_mars_daily_template = false;
685 }
686
cb_mars_daily_html()687 void cb_mars_daily_html()
688 {
689 string fname_name = fl_filename_name(def_mars_daily_filename.c_str());
690 size_t p = fname_name.rfind('.');
691 if (p != string::npos) fname_name.erase(p);
692
693 string mars_daily_fname = ICS_dir;
694 mars_daily_fname.append(fname_name);
695 mars_daily_fname.append(".html");
696
697 string html_text = "";
698
699 update_mars_dailyfields();
700 string formmars_daily = mars_daily_html_template;
701
702 replacestr(formmars_daily, TITLE, fname_name);
703
704 replacestr(formmars_daily, mars_daily_incident, s_mars_daily_incident );
705 replacestr(formmars_daily, mars_daily_incident, s_mars_daily_incident );
706 replacestr(formmars_daily, mars_daily_de, s_mars_daily_de );
707 replacestr(formmars_daily, mars_daily_nbr, s_mars_daily_nbr );
708 replacestr(formmars_daily, mars_daily_prec, s_mars_daily_prec );
709 replacestr(formmars_daily, mars_daily_dtg, s_mars_daily_dtg );
710 replacestr(formmars_daily, mars_daily_fm_name, s_mars_daily_fm_name );
711 replacestr(formmars_daily, mars_daily_fm_call, s_mars_daily_fm_call );
712 replacestr(formmars_daily, mars_daily_fm_state, s_mars_daily_fm_state );
713 replacestr(formmars_daily, mars_daily_to_pos, s_mars_daily_to_pos );
714 replacestr(formmars_daily, mars_daily_to_call, s_mars_daily_to_call );
715 replacestr(formmars_daily, mars_daily_to_state, s_mars_daily_to_state );
716 replacestr(formmars_daily, mars_daily_pos1, s_mars_daily_pos1 );
717 replacestr(formmars_daily, mars_daily_call1, s_mars_daily_call1 );
718 replacestr(formmars_daily, mars_daily_state1, s_mars_daily_state1 );
719 replacestr(formmars_daily, mars_daily_pos2, s_mars_daily_pos2 );
720 replacestr(formmars_daily, mars_daily_call2, s_mars_daily_call2 );
721 replacestr(formmars_daily, mars_daily_state2, s_mars_daily_state2 );
722 replacestr(formmars_daily, mars_daily_pos3, s_mars_daily_pos3 );
723 replacestr(formmars_daily, mars_daily_call3, s_mars_daily_call3 );
724 replacestr(formmars_daily, mars_daily_state3, s_mars_daily_state3 );
725 replacestr(formmars_daily, mars_daily_sitrep_id, s_mars_daily_sitrep_id );
726 replacestr(formmars_daily, mars_daily_sitrep_loc, s_mars_daily_sitrep_loc );
727 replacestr(formmars_daily, mars_daily_24hr, s_mars_daily_24hr );
728 replacestr(formmars_daily, mars_daily_netcall, s_mars_daily_netcall );
729 replacestr(formmars_daily, mars_daily_e_x, s_mars_daily_e_x );
730 replacestr(formmars_daily, mars_daily_dtg_active, s_mars_daily_dtg_active );
731 replacestr(formmars_daily, mars_daily_dtg_deactive, s_mars_daily_dtg_deactive );
732 replacestr(formmars_daily, mars_daily_nbr_stations, s_mars_daily_nbr_stations );
733 replacestr(formmars_daily, mars_daily_details, s_mars_daily_details );
734 replacestr(formmars_daily, mars_daily_activations, s_mars_daily_activations );
735 replacestr(formmars_daily, mars_daily_agencies, s_mars_daily_agencies );
736 replacestr(formmars_daily, mars_daily_remarks, s_mars_daily_remarks );
737
738 FILE *filemars_daily = fopen(mars_daily_fname.c_str(), "w");
739 fprintf(filemars_daily,"%s", formmars_daily.c_str());
740 fclose(filemars_daily);
741
742 open_url(mars_daily_fname.c_str());
743 }
744
cb_mars_daily_msg_type()745 void cb_mars_daily_msg_type()
746 {
747 if (tabs_msg_type->value() == tab_mars_daily ) {
748 show_filename(def_mars_daily_filename);
749 } else {
750 show_filename(def_rg_filename);
751 }
752 }
753
cb_mars_daily_textout()754 void cb_mars_daily_textout()
755 {
756 string temp = "";
757 string mars_daily_fname = ICS_dir;
758 mars_daily_fname.append("mars_daily.txt");
759
760 update_mars_dailyfields();
761 string formmars_daily = mars_daily_text_template;
762
763 replacestr(formmars_daily, mars_daily_incident, s_mars_daily_incident );
764 replacestr(formmars_daily, mars_daily_incident, s_mars_daily_incident );
765 replacestr(formmars_daily, mars_daily_de, s_mars_daily_de );
766 replacestr(formmars_daily, mars_daily_nbr, s_mars_daily_nbr );
767 replacestr(formmars_daily, mars_daily_prec, s_mars_daily_prec );
768 replacestr(formmars_daily, mars_daily_dtg, s_mars_daily_dtg );
769 replacestr(formmars_daily, mars_daily_fm_name, s_mars_daily_fm_name );
770 replacestr(formmars_daily, mars_daily_fm_call, s_mars_daily_fm_call );
771 replacestr(formmars_daily, mars_daily_fm_state, s_mars_daily_fm_state );
772 replacestr(formmars_daily, mars_daily_to_pos, s_mars_daily_to_pos );
773 replacestr(formmars_daily, mars_daily_to_call, s_mars_daily_to_call );
774 replacestr(formmars_daily, mars_daily_to_state, s_mars_daily_to_state );
775 replacestr(formmars_daily, mars_daily_pos1, s_mars_daily_pos1 );
776 replacestr(formmars_daily, mars_daily_call1, s_mars_daily_call1 );
777 replacestr(formmars_daily, mars_daily_state1, s_mars_daily_state1 );
778 replacestr(formmars_daily, mars_daily_pos2, s_mars_daily_pos2 );
779 replacestr(formmars_daily, mars_daily_call2, s_mars_daily_call2 );
780 replacestr(formmars_daily, mars_daily_state2, s_mars_daily_state2 );
781 replacestr(formmars_daily, mars_daily_pos3, s_mars_daily_pos3 );
782 replacestr(formmars_daily, mars_daily_call3, s_mars_daily_call3 );
783 replacestr(formmars_daily, mars_daily_state3, s_mars_daily_state3 );
784 replacestr(formmars_daily, mars_daily_sitrep_id, s_mars_daily_sitrep_id );
785 replacestr(formmars_daily, mars_daily_sitrep_loc, s_mars_daily_sitrep_loc );
786 replacestr(formmars_daily, mars_daily_24hr, s_mars_daily_24hr );
787 replacestr(formmars_daily, mars_daily_netcall, s_mars_daily_netcall );
788 replacestr(formmars_daily, mars_daily_e_x, s_mars_daily_e_x );
789 replacestr(formmars_daily, mars_daily_dtg_active, s_mars_daily_dtg_active );
790 replacestr(formmars_daily, mars_daily_dtg_deactive, s_mars_daily_dtg_deactive );
791 replacestr(formmars_daily, mars_daily_nbr_stations, s_mars_daily_nbr_stations );
792 replacestr(formmars_daily, mars_daily_details, s_mars_daily_details );
793 replacestr(formmars_daily, mars_daily_activations, s_mars_daily_activations );
794 replacestr(formmars_daily, mars_daily_agencies, s_mars_daily_agencies );
795 replacestr(formmars_daily, mars_daily_remarks, s_mars_daily_remarks );
796
797 FILE *filemars_daily = fopen(mars_daily_fname.c_str(), "w");
798 fprintf(filemars_daily,"%s", formmars_daily.c_str());
799 fclose(filemars_daily);
800
801 open_url(mars_daily_fname.c_str());
802 }
803
804