1 /*
2 
3     Transformation filter for GPS data.
4 
5     Copyright (C) 2006 Olaf Klein, o.b.klein@gpsbabel.org
6 
7     This program 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 2 of the License, or
10     (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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20 
21  */
22 
23 #include <cctype>           // for toupper
24 #include <cstdlib>          // for atoi
25 
26 #include <QtCore/QtGlobal>  // for foreach
27 
28 #include "defs.h"
29 #include "transform.h"
30 
31 
32 #if FILTERS_ENABLED
33 
34 #include <cctype>
35 
36 #define MYNAME "transform"
37 
transform_waypoints()38 void TransformFilter::transform_waypoints()
39 {
40   auto* rte = new route_head;
41   switch (current_target) {
42   case 'R':
43     route_add_head(rte);
44     break;
45   case 'T':
46     track_add_head(rte);
47     break;
48   }
49   foreach (Waypoint* wpt, *global_waypoint_list) {
50 
51     wpt = new Waypoint(*wpt);
52     switch (current_target) {
53     case 'R':
54       route_add_wpt(rte, wpt, RPT, name_digits);
55       break;
56     case 'T':
57       track_add_wpt(rte, wpt, RPT, name_digits);
58       break;
59     }
60   }
61 }
62 
transform_rte_disp_hdr_cb(const route_head * rte)63 void TransformFilter::transform_rte_disp_hdr_cb(const route_head* rte)
64 {
65   current_namepart = RPT;
66   if (!rte->rte_name.isEmpty() && use_src_name) {
67     current_namepart = rte->rte_name;
68   }
69   if (current_target == 'T') {
70     current_trk = new route_head;
71     track_add_head(current_trk);
72     if (!rte->rte_name.isEmpty()) {
73       current_trk->rte_desc = QString("Generated from route %1").arg(rte->rte_name);
74       current_trk->rte_name = rte->rte_name; /* name the new trk */
75     }
76   }
77 }
78 
transform_trk_disp_hdr_cb(const route_head * trk)79 void TransformFilter::transform_trk_disp_hdr_cb(const route_head* trk)
80 {
81   current_namepart = RPT;
82   if (!trk->rte_name.isEmpty() && use_src_name) {
83     current_namepart = trk->rte_name;
84   }
85   if (current_target == 'R') {
86     current_rte = new route_head;
87     route_add_head(current_rte);
88     if (!trk->rte_name.isEmpty()) {
89       current_rte->rte_desc = "Generated from track ";
90       current_rte->rte_desc += trk->rte_name;
91       current_rte->rte_name = trk->rte_name; /* name the new rte */
92     }
93   }
94 }
95 
transform_any_disp_wpt_cb(const Waypoint * wpt)96 void TransformFilter::transform_any_disp_wpt_cb(const Waypoint* wpt)
97 {
98   auto* temp = new Waypoint(*wpt);
99   if (current_target == 'R') {
100     route_add_wpt(current_rte, temp, current_namepart, name_digits);
101   } else if (current_target == 'T') {
102     track_add_wpt(current_trk, temp, current_namepart, name_digits);
103   } else {
104     waypt_add(temp);
105   }
106 }
107 
transform_routes()108 void TransformFilter::transform_routes()
109 {
110   WayptFunctor<TransformFilter> transform_any_disp_wpt_cb_f(this, &TransformFilter::transform_any_disp_wpt_cb);
111   RteHdFunctor<TransformFilter> transform_rte_disp_hdr_cb_f(this, &TransformFilter::transform_rte_disp_hdr_cb);
112 
113   route_disp_all(transform_rte_disp_hdr_cb_f, nullptr, transform_any_disp_wpt_cb_f);
114 }
115 
transform_tracks()116 void TransformFilter::transform_tracks()
117 {
118   WayptFunctor<TransformFilter> transform_any_disp_wpt_cb_f(this, &TransformFilter::transform_any_disp_wpt_cb);
119   RteHdFunctor<TransformFilter> transform_trk_disp_hdr_cb_f(this, &TransformFilter::transform_trk_disp_hdr_cb);
120 
121   track_disp_all(transform_trk_disp_hdr_cb_f, nullptr, transform_any_disp_wpt_cb_f);
122 }
123 
124 /*******************************************************************************
125 * %%%        global callbacks called by gpsbabel main process              %%% *
126 *******************************************************************************/
127 
process()128 void TransformFilter::process()
129 {
130   int delete_after = (opt_delete && (*opt_delete == '1')) ? 1 : 0;
131 
132   use_src_name = (opt_rpt_name && (*opt_rpt_name == '1')) ? 1 : 0;
133 
134   name_digits = 3;
135   if (rpt_name_digits && *rpt_name_digits) {
136     name_digits = atoi(rpt_name_digits);
137   }
138 
139   if (opt_waypts != nullptr) {
140     current_target = 'W';
141     switch (toupper(*opt_waypts)) {
142     case 'R':
143       transform_routes();
144       if (delete_after) {
145         route_flush_all_routes();
146       }
147       break;
148     case 'T':
149       transform_tracks();
150       if (delete_after) {
151         route_flush_all_tracks();
152       }
153       break;
154     default:
155       fatal(MYNAME ": Invalid option value (%s)!\n", opt_waypts);
156     }
157   }
158   if (opt_routes != nullptr) {
159     current_target = 'R';
160     switch (toupper(*opt_routes)) {
161     case 'W':
162       transform_waypoints();
163       if (delete_after) {
164         waypt_flush_all();
165       }
166       break;
167     case 'T':
168       transform_tracks();
169       if (delete_after) {
170         route_flush_all_tracks();
171       }
172       break;
173     default:
174       fatal(MYNAME ": Invalid option value (%s)!\n", opt_routes);
175     }
176   }
177   if (opt_tracks != nullptr) {
178     current_target = 'T';
179     switch (toupper(*opt_tracks)) {
180     case 'W':
181       transform_waypoints();
182       if (delete_after) {
183         waypt_flush_all();
184       }
185       break;
186     case 'R':
187       transform_routes();
188       if (delete_after) {
189         route_flush_all_routes();
190       }
191       break;
192     default:
193       fatal(MYNAME ": Invalid option value (%s)!\n", opt_tracks);
194     }
195   }
196 }
197 
198 #endif // FILTERS_ENABLED
199