source: proto/gml2svg/C/xerces/gml2svg_handler.cpp @ 2493

Last change on this file since 2493 was 2493, checked in by ksherdy, 7 years ago

NS resulotion issue resolved for pipeline icxml.

File size: 19.5 KB
Line 
1/*
2 sax2_gml2svg_handler.cpp - GML2SVG
3 Copyright (C) 2007, 2008 Ken Herdy
4 Version 0.9
5 Licensed to the public under the Open Software License 3.0.
6 */
7
8#ifndef SAX2_GML2SVG_HANDLER_CPP_
9#define SAX2_GML2SVG_HANDLER_CPP_
10
11#include "gml2svg_handler.hpp"
12#include <gml2svg/constants.h>
13#include <gml2svg/util.h>
14#include <gml2svg/vancouver_constants.h>
15#include <style_ext/style_ext.h>
16#include <stdio.h>
17#include <float.h>
18
19#include <iostream>
20using namespace std;
21
22GML2SVGHandler::GML2SVGHandler() {
23
24        #ifndef TARE_TIME
25
26        this->_out_buf = NULL;
27        this->_out_buf_pos = 0;
28
29        // Copy and type cast defaults
30        this->_crt_decimal = DEFAULT_DECIMAL;
31        this->_crt_cs = DEFAULT_CS;
32        this->_crt_ts = DEFAULT_TS;
33
34        this->_xmlch_APP_NS_URI = XMLString::transcode(APP_NS_URI);
35        this->_xmlch_GML_NS_URI = XMLString::transcode(GML_NS_URI);
36        this->_xmlch_GML_COORDINATES_LNAME = XMLString::transcode(GML_COORDINATES_LNAME);
37        this->_xmlch_CS_LOCAL_NAME = XMLString::transcode(CS_LOCAL_NAME);
38        this->_xmlch_DECIMAL_LOCAL_NAME = XMLString::transcode(DECIMAL_LOCAL_NAME);
39        this->_xmlch_TS_LOCAL_NAME = XMLString::transcode(TS_LOCAL_NAME);
40
41        this->_width = NULL;
42        this->_height = NULL;
43        this->_sum_y = 0.0;
44        this->_scale_x = 0.0;
45        this->_scale_y = 0.0;
46        this->_x1 = 0.0;
47        this->_y1 = 0.0;
48        this->_x2 = 0.0;
49        this->_y2 = 0.0;
50
51        this->_style_string = NULL;
52        this->_feature_id = NULL;
53
54        this->_in_feature = false;
55        this->_in_geometry = false;
56        this->_in_gml_coordinates = false;
57
58        this->_coordinates_buffer.clear();
59
60        #endif
61
62}
63
64GML2SVGHandler::~GML2SVGHandler() {
65
66        #ifndef TARE_TIME
67
68        this->freeMembers();
69
70        if(this->_xmlch_APP_NS_URI) {
71                XMLString::release(&(this->_xmlch_APP_NS_URI));
72        }
73
74        if(this->_xmlch_GML_NS_URI) {
75                XMLString::release(&(this->_xmlch_GML_NS_URI));
76        }
77
78        if (this->_xmlch_GML_COORDINATES_LNAME) {
79                XMLString::release(&(this->_xmlch_GML_COORDINATES_LNAME));
80        }
81
82        if (this->_xmlch_CS_LOCAL_NAME) {
83                XMLString::release(&(this->_xmlch_CS_LOCAL_NAME));
84        }
85
86        if (this->_xmlch_DECIMAL_LOCAL_NAME) {
87                XMLString::release(&(this->_xmlch_DECIMAL_LOCAL_NAME));
88        }
89
90        if (this->_xmlch_TS_LOCAL_NAME) {
91                XMLString::release(&(this->_xmlch_TS_LOCAL_NAME));
92        }
93
94        #endif
95}
96
97// ---------------------------------------------------------------------------
98//  GML2SVGHandler: Implementation of the SAX DocumentHandler interface
99// ---------------------------------------------------------------------------
100
101void GML2SVGHandler::startDocument() {
102
103        #ifndef TARE_TIME
104
105        this->_in_feature = false;
106        this->_in_geometry = false;
107        this->_in_gml_coordinates = false;
108
109        this->_coordinates_buffer.clear();
110
111        #if defined(NAIVE_FORMATTED_IO)
112
113                this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
114                                // SVG
115                                ,SVG_START_ELEMENT
116                                ,SPACE
117                                ,XML_NAMESPACE_ATTR
118                                ,EQUALS
119                                ,DQUOTE
120                                ,SVG_NAMESPACE_VALUE
121                                ,DQUOTE
122                                ,SPACE
123                                ,SVG_WIDTH_ATTR
124                                ,EQUALS
125                                ,DQUOTE
126                                ,this->_width
127                                ,DQUOTE
128                                ,SPACE
129                                ,SVG_HEIGHT_ATTR
130                                ,EQUALS
131                                ,DQUOTE
132                                ,this->_height
133                                ,DQUOTE
134                                ,RANGLE);
135
136        #elif defined(FORMATTED_IO)
137                this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"%s\" height=\"%s\">", this->_width, this->_height);
138
139        #elif defined(MEMCPY_IO)
140                memcpy(this->_out_buf + this->_out_buf_pos,
141                                "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"",
142                                sizeof("<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"")-1);
143                this->_out_buf_pos
144                                += sizeof("<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"")-1;
145
146                memcpy(this->_out_buf + this->_out_buf_pos, this->_width,
147                                strlen(this->_width));
148                this->_out_buf_pos += strlen(this->_width);
149
150                memcpy(this->_out_buf + this->_out_buf_pos, "\" height=\"",
151                                sizeof("\" height=\"")-1);
152                this->_out_buf_pos += sizeof("\" height=\"")-1;
153
154                memcpy(this->_out_buf + this->_out_buf_pos, this->_height,
155                                strlen(this->_height));
156                this->_out_buf_pos += strlen(this->_height);
157
158                memcpy(this->_out_buf + this->_out_buf_pos, "\">", sizeof("\">")-1);
159                this->_out_buf_pos += sizeof("\">")-1;
160
161        #endif
162
163        #if defined(WORLD2SCREEN)  // g
164
165                #if defined(NAIVE_FORMATTED_IO)
166                                this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"%s%s%s%s%s%s%s%s"
167                                                ,G_START_ELEMENT
168                                                ,SPACE
169                                                ,PATH_STYLE_ATTR
170                                                ,EQUALS
171                                                ,DQUOTE
172                                                ,this->_style_string
173                                                ,DQUOTE
174                                                ,RANGLE);
175
176                #elif defined(FORMATTED_IO)
177                                this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"<g style=\"%s\">",this->_style_string);
178
179                #elif defined(MEMCPY_IO)
180                                memcpy(this->_out_buf + this->_out_buf_pos, "<g style=\"",
181                                                sizeof("<g style=\"")-1);
182                                this->_out_buf_pos += sizeof("<g style=\"")-1;
183
184                                memcpy(this->_out_buf + this->_out_buf_pos, this->_style_string, strlen(this->_style_string));
185                                this->_out_buf_pos += strlen(this->_style_string);
186
187                                memcpy(this->_out_buf + this->_out_buf_pos, "\">", sizeof("\">")-1);
188                                this->_out_buf_pos += sizeof("\">")-1;
189
190                                /* BUFFERED_IO
191                                 fwrite(this->_out_buf, 1, this->_out_buf_pos, this->_out_file);
192                                 fflush(this->_out_file);
193                                 this->_out_buf_pos = 0;
194                                 */
195
196                #endif
197
198        #else
199                char * scale_x = new char [DBL_DIG + DBL_MANT_DIG + 1];
200                char * scale_y = new char [DBL_DIG + DBL_MANT_DIG + 1];
201                char * x1 = new char [DBL_DIG + DBL_MANT_DIG + 1];
202                char * y2 = new char [DBL_DIG + DBL_MANT_DIG + 1];
203
204                #if defined(NAIVE_FORMATTED_IO)
205                                // Reduce %5.17f to %5.5f to optimize
206                                sprintf(scale_x,SCALE_FORMAT, this->_scale_x);
207                                sprintf(scale_y,SCALE_FORMAT, this->_scale_y * -1.0);
208                                sprintf(x1,"%f", this->_x1 * -1.0);
209                                sprintf(y2,"%f", this->_y2 * -1.0);
210
211                                this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
212                                                ,G_START_ELEMENT
213                                                ,SPACE
214                                                ,G_TRANSFORM_ATTR
215                                                ,EQUALS
216                                                ,DQUOTE
217                                                ,SCALE
218                                                ,LROUND
219                                                ,scale_x
220                                                ,COMMA
221                                                ,scale_y
222                                                ,RROUND
223                                                ,SPACE
224                                                ,TRANSLATE
225                                                ,LROUND
226                                                ,x1
227                                                ,COMMA
228                                                ,y2
229                                                ,RROUND
230                                                ,DQUOTE
231                                                ,SPACE
232                                                ,PATH_STYLE_ATTR
233                                                ,EQUALS
234                                                ,DQUOTE
235                                                ,this->_style_string
236                                                ,DQUOTE
237                                                ,RANGLE);
238
239                #elif defined(FORMATTED_IO)
240                                sprintf(scale_x,SCALE_FORMAT, this->_scale_x);
241                                sprintf(scale_y,SCALE_FORMAT, this->_scale_y * -1.0);
242                                sprintf(x1,"%f", this->_x1 * -1.0);
243                                sprintf(y2,"%f", this->_y2 * -1.0);
244
245                                this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"<g transform=\"scale(%s,%s) translate(%s,%s)\" style=\"%s\">",scale_x,scale_y,x1,y2,this->_style_string);
246
247                #elif defined(MEMCPY_IO)
248                                sprintf(scale_x, SCALE_FORMAT, this->_scale_x);
249                                sprintf(scale_y, SCALE_FORMAT, this->_scale_y * -1.0);
250                                sprintf(x1, "%f", this->_x1 * -1.0);
251                                sprintf(y2, "%f", this->_y2 * -1.0);
252
253                                memcpy(this->_out_buf + this->_out_buf_pos, "<g transform=\"scale(",
254                                                sizeof("<g transform=\"scale(")-1);
255                                this->_out_buf_pos += sizeof("<g transform=\"scale(")-1;
256
257                                memcpy(this->_out_buf + this->_out_buf_pos, scale_x, strlen(scale_x));
258                                this->_out_buf_pos += strlen(scale_x);
259
260                                memcpy(this->_out_buf + this->_out_buf_pos, ",", sizeof(",")-1);
261                                this->_out_buf_pos += sizeof(",")-1;
262
263                                memcpy(this->_out_buf + this->_out_buf_pos, scale_y, strlen(scale_y));
264                                this->_out_buf_pos += strlen(scale_y);
265
266                                memcpy(this->_out_buf + this->_out_buf_pos, ") translate(",
267                                                sizeof(") translate(")-1);
268                                this->_out_buf_pos += sizeof(") translate(")-1;
269
270                                memcpy(this->_out_buf + this->_out_buf_pos, x1, strlen(x1));
271                                this->_out_buf_pos += strlen(x1);
272
273                                memcpy(this->_out_buf + this->_out_buf_pos, ",", sizeof(",")-1);
274                                this->_out_buf_pos += sizeof(",")-1;
275
276                                memcpy(this->_out_buf + this->_out_buf_pos, y2, strlen(y2));
277                                this->_out_buf_pos += strlen(y2);
278
279                                memcpy(this->_out_buf + this->_out_buf_pos, ")\" style=\"",
280                                                sizeof(")\" style=\"")-1);
281                                this->_out_buf_pos += sizeof(")\" style=\"")-1;
282
283                                memcpy(this->_out_buf + this->_out_buf_pos, this->_style_string,
284                                                strlen(this->_style_string));
285                                this->_out_buf_pos += strlen(this->_style_string);
286
287                                memcpy(this->_out_buf + this->_out_buf_pos, "\">", sizeof("\">")-1);
288                                this->_out_buf_pos += sizeof("\">")-1;
289
290                        delete [] scale_x;
291                        delete [] scale_y;
292                        delete [] x1;
293                        delete [] y2;
294                #endif
295        #endif
296
297        #endif
298}
299
300void GML2SVGHandler::endDocument() {
301
302        #ifndef TARE_TIME
303
304#if defined(NAIVE_FORMATTED_IO)
305        this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"%s%s",G_END_ELEMENT
306                        ,SVG_END_ELEMENT);
307#elif defined(FORMATTED_IO)
308        this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"</g></svg>");
309
310#elif defined(MEMCPY_IO)
311        memcpy(this->_out_buf + this->_out_buf_pos, "</g></svg>",
312                        sizeof("</g></svg>")-1);
313        this->_out_buf_pos += sizeof("</g></svg>")-1;
314
315        this->_out_buf[this->_out_buf_pos] = '\0';
316
317#endif
318
319        #endif
320}
321
322void GML2SVGHandler::startElement(const XMLCh* const uri,
323                const XMLCh* const localname, const XMLCh* const qname,
324                const Attributes& attrs) {
325
326        #ifndef TARE_TIME
327
328        if (this->_in_feature) //van:featurelname//gml:geometry//gml:coordinates
329        {
330                if (this->_in_geometry) {
331
332                        if ((XMLString::compareString(this->_xmlch_GML_NS_URI, uri) == 0) &&
333                                (XMLString::compareString(this->_xmlch_GML_COORDINATES_LNAME, localname) == 0)) {
334
335                                #if defined(GML2SVG_DEBUG)
336                                        cout << "in_coordinates" << endl;
337                                #endif
338
339                                this->_in_gml_coordinates = true;
340
341                                const XMLCh* xmlch_name;
342                                const XMLCh* xmlch_val;
343
344                                for (int i=0; i<attrs.getLength(); i++) // assumes single character wide delimeters
345                                {
346                                        xmlch_name = attrs.getLocalName(i);
347                                        if (XMLString::compareString(this->_xmlch_CS_LOCAL_NAME, xmlch_val) == 0) {
348
349                                                #if defined(GML2SVG_DEBUG)
350                                                        cout << "in_cs" << endl;
351                                                #endif
352
353                                                xmlch_val = attrs.getValue(i);
354                                                char * val = XMLString::transcode(xmlch_val);
355                                                this->_crt_cs = *val;
356                                                XMLString::release(&val);
357
358                                        } else if (XMLString::compareString( this->_xmlch_DECIMAL_LOCAL_NAME, xmlch_val) == 0) {
359
360                                                #if defined(GML2SVG_DEBUG)
361                                                        cout << "in_decimal" << endl;
362                                                #endif
363
364                                                xmlch_val = attrs.getValue(i);
365                                                char * val = XMLString::transcode(xmlch_val);
366                                                this->_crt_decimal = val[0];
367                                                XMLString::release(&val);
368
369                                        } else if (XMLString::compareString(this->_xmlch_TS_LOCAL_NAME, xmlch_val) == 0) {
370
371                                                #if defined(GML2SVG_DEBUG)
372                                                        cout << "in_ts" << endl;
373                                                #endif
374
375                                                xmlch_val = attrs.getValue(i);
376                                                char * val = XMLString::transcode(xmlch_val);
377                                                this->_crt_cs = val[0];
378                                                XMLString::release(&val);
379
380                                        }
381                                }
382                        }
383                } else {
384
385                        if ((XMLString::compareString(this->_xmlch_GML_NS_URI, uri) == 0) &&
386                                (XMLString::compareString(this->_xmlch_geometry_lname, localname) == 0)) {
387
388                                #if defined(GML2SVG_DEBUG)
389                                        cout << "in_geometry" << endl;
390                                #endif
391
392                                this->_in_geometry = true;
393                        }
394                }
395        } else {
396
397                if ((XMLString::compareString(this->_xmlch_APP_NS_URI, uri) == 0) &&
398                        (XMLString::compareString(this->_xmlch_feature_lname, localname) == 0)) {
399
400                        #if defined(GML2SVG_DEBUG)
401                                cout << "in_feature" << endl;
402                        #endif
403
404                        this->_in_feature = true;
405
406                        const XMLCh* xmlch_val;
407
408                        if ((xmlch_val = attrs.getValue(this->_xmlch_GML_NS_URI, this->_xmlch_feature_id_lname)) != 0) {
409                                char * val = XMLString::transcode(xmlch_val);
410                                strcpy(this->_feature_id, val);
411                                XMLString::release(&val);
412                        }
413                }
414        }
415
416        #endif
417}
418
419void GML2SVGHandler::characters(const XMLCh* const chars,
420                const XMLSize_t length) {
421
422        #ifndef TARE_TIME
423
424        if (this->_in_gml_coordinates) {
425                this->_coordinates_buffer.push_back(XMLString::transcode(chars));
426        }
427
428        #endif
429}
430
431void GML2SVGHandler::endElement(const XMLCh* const uri,
432                const XMLCh* const localname, const XMLCh* const qname) {
433
434        #ifndef TARE_TIME
435
436        if (this->_in_gml_coordinates) {
437
438                int buf_length = 0;
439                for (int i=0; i<this->_coordinates_buffer.size(); i++) {
440                        buf_length += strlen(this->_coordinates_buffer.at(i));
441                }
442
443                char * buf = new char[buf_length+1];
444                strcpy(buf, this->_coordinates_buffer.at(0));
445                for (int i=1; i<this->_coordinates_buffer.size(); i++) {
446                        //TODO - Implement memcpy instead of strcat for performance.
447                        strcat(buf, this->_coordinates_buffer.at(i));
448                }
449
450                if ((XMLString::compareString(this->_xmlch_GML_NS_URI, uri) == 0) &&
451                        (XMLString::compareString(this->_xmlch_GML_COORDINATES_LNAME, localname) == 0)) {
452
453#if defined(NAIVE_FORMATTED_IO)
454                        this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]), "%s%s%s%s%s%s%s%s%s%s%s"
455                                        ,PATH_START_ELEMENT
456                                        ,SPACE
457                                        ,PATH_ID_ATTR
458                                        ,EQUALS
459                                        ,DQUOTE
460                                        ,this->_feature_id
461                                        ,DQUOTE
462                                        ,SPACE
463                                        ,PATH_D_ATTR
464                                        ,EQUALS
465                                        ,DQUOTE);
466
467                        char * svg_path = NULL;
468                        #if defined(WORLD2SCREEN)
469
470                                coord_to_path_strtod(&this->_sum_y, &this->_scale_x, &this->_scale_y, &this->_x1, &this->_y1, this->_crt_cs, buf, buf_length, &svg_path);
471
472                        #else
473
474                                coords_to_path(this->_crt_ts, this->_crt_cs, buf, buf_length, &svg_path,0);
475
476                        #endif
477
478                        this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"%s",svg_path);
479                        delete [] svg_path;
480                        svg_path = NULL;
481
482                        this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
483                                        ,DQUOTE
484                                        ,SPACE
485                                        ,PATH_ONMOUSEOVER_ATTR
486                                        ,EQUALS
487                                        ,DQUOTE
488                                        ,PATH_ONMOUSEOVER_VALUE
489                                        ,DQUOTE
490                                        ,SPACE
491                                        ,PATH_ONMOUSEOUT_ATTR
492                                        ,EQUALS
493                                        ,DQUOTE
494                                        ,PATH_ONMOUSEOUT_VALUE
495                                        ,DQUOTE
496                                        ,FSLASH
497                                        ,RANGLE);
498
499#elif defined(FORMATTED_IO)
500                        char * svg_path = NULL;
501
502                        #if defined(WORLD2SCREEN)
503
504                                coord_to_path_strtod(&this->_sum_y, &this->_scale_x, &this->_scale_y, &this->_x1, &this->_y1, this->_crt_cs, buf, buf_length, &svg_path);
505
506                        #else
507
508                                coords_to_path(this->_crt_ts, this->_crt_cs, buf, buf_length, &svg_path,0);
509
510                        #endif
511
512                        this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]), "<path id=\"%s\" d=\"%s\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>",this->_feature_id,svg_path);
513
514                        delete [] svg_path;
515                        svg_path = NULL;
516
517#elif defined(MEMCPY_IO)
518
519                        memcpy(this->_out_buf + this->_out_buf_pos, "<path id=\"", sizeof("<path id=\"")-1);
520                        this->_out_buf_pos += sizeof("<path id=\"")-1;
521
522                        memcpy(this->_out_buf + this->_out_buf_pos, this->_feature_id, strlen(this->_feature_id));
523                        this->_out_buf_pos += strlen(this->_feature_id);
524
525                        memcpy(this->_out_buf + this->_out_buf_pos, "\" d=\"", sizeof("\" d=\"")-1);
526                        this->_out_buf_pos += sizeof("\" d=\"")-1;
527
528                        char * svg_path= NULL;
529
530                        #if defined(WORLD2SCREEN)
531
532                                coord_to_path_strtod(&this->_sum_y, &this->_scale_x, &this->_scale_y, &this->_x1, &this->_y1, this->_crt_cs, buf, buf_length, &svg_path);
533
534                        #else
535
536                                coords_to_path(this->_crt_ts, this->_crt_cs, buf, buf_length, &svg_path, 0);
537
538                        #endif
539
540                        memcpy(this->_out_buf + this->_out_buf_pos, svg_path, strlen(svg_path));
541                        this->_out_buf_pos += strlen(svg_path);
542
543                        memcpy( this->_out_buf + this->_out_buf_pos, "\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>", sizeof("\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>")   -1);
544                        this->_out_buf_pos      += sizeof("\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>") -1;
545
546                        delete [] svg_path;
547                        svg_path = NULL;
548
549#endif
550
551                        delete [] buf;
552                        buf = NULL;
553
554                        this->_coordinates_buffer.clear();
555
556                        this->_crt_decimal = DEFAULT_DECIMAL;
557                        this->_crt_cs = DEFAULT_CS;
558                        this->_crt_ts = DEFAULT_TS;
559                        this->_in_gml_coordinates = false;
560                }
561        } else {
562                if (this->_in_geometry) {
563                        if ((XMLString::compareString(this->_xmlch_GML_NS_URI, uri) == 0) &&
564                                (XMLString::compareString(this->_xmlch_geometry_lname, localname) == 0)) {
565                                this->_in_geometry = false;
566                        }
567                } else {
568                        if (this->_in_feature) {
569                                if ((XMLString::compareString(this->_xmlch_APP_NS_URI, uri)     == 0) &&
570                                        (XMLString::compareString(this->_xmlch_feature_lname, localname) == 0)) {
571                                        this->_in_feature = false;
572                                        memset(this->_feature_id, '\0', strlen(this->_feature_id));
573                                }
574                        }
575                }
576        }
577
578        #endif
579}
580
581// ---------------------------------------------------------------------------
582//  GML2SVGHandler: Overrides of the SAX ErrorHandler interface
583// ---------------------------------------------------------------------------
584void GML2SVGHandler::error(const SAXParseException& e) {
585
586        #ifndef TARE_TIME
587
588        cerr << "\nError at (file " << XMLString::transcode(e.getSystemId())
589                        << ", line " << e.getLineNumber() << ", char "
590                        << e.getColumnNumber() << "): "
591                        << XMLString::transcode(e.getMessage()) << endl;
592
593        #endif
594}
595
596void GML2SVGHandler::fatalError(const SAXParseException& e) {
597
598        #ifndef TARE_TIME
599
600        cerr << "\nFatal Error at (file " << XMLString::transcode(e.getSystemId())
601                        << ", line " << e.getLineNumber() << ", char "
602                        << e.getColumnNumber() << "): "
603                        << XMLString::transcode(e.getMessage()) << endl;
604
605        #endif
606}
607
608void GML2SVGHandler::warning(const SAXParseException& e) {
609
610        #ifndef TARE_TIME
611
612        cerr << "\nWarning at (file " << XMLString::transcode(e.getSystemId())
613                        << ", line " << e.getLineNumber() << ", char "
614                        << e.getColumnNumber() << "): "
615                        << XMLString::transcode(e.getMessage()) << endl;
616
617        #endif
618}
619
620// ---------------------------------------------------------------------------
621//  GML2SVGHandler: Helpers
622// ---------------------------------------------------------------------------
623void GML2SVGHandler::setOutputBuffer(char * out_buf) {
624        #ifndef TARE_TIME
625
626        this->_out_buf = out_buf;
627        this->_out_buf_pos = 0;
628
629        #endif
630}
631
632int GML2SVGHandler::setParameters(const char * screen_width,
633                const char * screen_height,
634                const char * bbox,
635                const char * feature_lname,
636                const char * feature_id_lname,
637                const char * geometry_lname,
638                const char * style_string) {
639
640        int error_flag = 0;
641
642        #ifndef TARE_TIME
643
644        this->freeMembers();
645
646        this->_width = new char [strlen(screen_width)+1];
647        this->_height = new char [strlen(screen_height)+1];
648        this->_style_string = new char [strlen(style_string)+1];
649        this->_feature_id = new char [FEATURE_ID_MAX_LENGTH_EST+1];
650        memset(this->_feature_id, '\0', FEATURE_ID_MAX_LENGTH_EST);
651
652        strcpy(this->_width, screen_width);
653        strcpy(this->_height, screen_height);
654
655        this->_xmlch_feature_lname = XMLString::transcode(feature_lname);
656        this->_xmlch_feature_id_lname = XMLString::transcode(feature_id_lname);
657        this->_xmlch_geometry_lname = XMLString::transcode(geometry_lname);
658
659        double temp_screen_width;
660        double temp_screen_height;
661        error_flag = strtod_wrapper(this->_width, &temp_screen_width);
662        error_flag = strtod_wrapper(this->_height, &temp_screen_height);
663        error_flag = bbox_strtod(bbox, this->_crt_cs, &this->_x1, &this->_y1,
664                        &this->_x2, &this->_y2);
665        this->_sum_y = this->_y1 + this->_y2;
666        this->_scale_x = (temp_screen_width)/(this->_x2 - this->_x1);
667        this->_scale_y= (temp_screen_height)/(this->_y2 - this->_y1);
668
669        #if defined(WORLD2SCREEN) // scale style string values
670
671                strcpy(this->_style_string, style_string);
672        #else
673                char * temp_style_string = strdup(style_string);
674                error_flag = scale_x_style_string_parameter(temp_style_string,
675                                STROKE_WIDTH, this->_scale_x, &this->_style_string);
676                free(temp_style_string);
677        #endif
678
679
680        #endif
681
682        return error_flag;
683}
684
685// ---------------------------------------------------------------------------
686//  GML2SVGHandler: Private Helpers
687// ---------------------------------------------------------------------------
688void GML2SVGHandler::freeMembers() {
689
690        #ifndef TARE_TIME
691
692        if (this->_width) {
693                delete [] this->_width;
694        }
695        if (this->_height) {
696                delete [] this->_height;
697        }
698
699        if (this->_xmlch_feature_lname) {
700                XMLString::release(&(this->_xmlch_feature_lname));
701        }
702        if (this->_xmlch_feature_id_lname) {
703                XMLString::release(&(this->_xmlch_feature_id_lname));
704        }
705        if (this->_xmlch_geometry_lname) {
706                XMLString::release(&(this->_xmlch_geometry_lname));
707        }
708
709        if (this->_style_string) {
710                delete [] this->_style_string;
711        }
712        if (this->_feature_id) {
713                delete [] this->_feature_id;
714        }
715
716        #endif
717}
718
719#endif /*SAX2_GML2SVG_HANDLER_CPP_*/
Note: See TracBrowser for help on using the repository browser.