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

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

Reverts.

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