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

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

Modified gml2svg app to support fine-grained application PMC events.

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