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