Download NHK English news podcast automatically. XML Parser "spxml" is used. This application requires mpod mother board. See also http://mbed.org/users/geodenx/notebook/mpod/

Dependencies:   BlinkLed HTTPClient EthernetInterface FatFileSystemCpp MSCFileSystem spxml mbed-rtos mbed

Fork of mpod_nhk_english by Satoshi Togawa

Download NHK English news podcast automatically.
XML Parser "spxml" is used.
This application requires mpod mother board.
See also http://mbed.org/users/geodenx/notebook/mpod/

Committer:
togayan
Date:
Mon Aug 20 13:27:17 2012 +0000
Revision:
4:7dae52cf560f
1st revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
togayan 4:7dae52cf560f 1 /*
togayan 4:7dae52cf560f 2 * Copyright 2007 Stephen Liu
togayan 4:7dae52cf560f 3 * For license terms, see the file COPYING along with this library.
togayan 4:7dae52cf560f 4 */
togayan 4:7dae52cf560f 5
togayan 4:7dae52cf560f 6 #include <string.h>
togayan 4:7dae52cf560f 7 #include <ctype.h>
togayan 4:7dae52cf560f 8 #include <stdlib.h>
togayan 4:7dae52cf560f 9 #include <typeinfo>
togayan 4:7dae52cf560f 10
togayan 4:7dae52cf560f 11 #include "spxmlparser.hpp"
togayan 4:7dae52cf560f 12 #include "spxmlreader.hpp"
togayan 4:7dae52cf560f 13 #include "spxmlutils.hpp"
togayan 4:7dae52cf560f 14 #include "spxmlstag.hpp"
togayan 4:7dae52cf560f 15 #include "spxmlevent.hpp"
togayan 4:7dae52cf560f 16 #include "spxmlcodec.hpp"
togayan 4:7dae52cf560f 17
togayan 4:7dae52cf560f 18 //=========================================================
togayan 4:7dae52cf560f 19
togayan 4:7dae52cf560f 20 SP_XmlReader :: SP_XmlReader()
togayan 4:7dae52cf560f 21 {
togayan 4:7dae52cf560f 22 mBuffer = new SP_XmlStringBuffer();
togayan 4:7dae52cf560f 23 }
togayan 4:7dae52cf560f 24
togayan 4:7dae52cf560f 25 SP_XmlReader :: ~SP_XmlReader()
togayan 4:7dae52cf560f 26 {
togayan 4:7dae52cf560f 27 delete mBuffer;
togayan 4:7dae52cf560f 28 }
togayan 4:7dae52cf560f 29
togayan 4:7dae52cf560f 30 void SP_XmlReader :: changeReader(
togayan 4:7dae52cf560f 31 SP_XmlPullParser * parser, SP_XmlReader * reader )
togayan 4:7dae52cf560f 32 {
togayan 4:7dae52cf560f 33 parser->changeReader( reader );
togayan 4:7dae52cf560f 34 }
togayan 4:7dae52cf560f 35
togayan 4:7dae52cf560f 36 SP_XmlReader * SP_XmlReader :: getReader( SP_XmlPullParser * parser, int type )
togayan 4:7dae52cf560f 37 {
togayan 4:7dae52cf560f 38 return parser->getReader( type );
togayan 4:7dae52cf560f 39 }
togayan 4:7dae52cf560f 40
togayan 4:7dae52cf560f 41 void SP_XmlReader :: setError( SP_XmlPullParser * parser, const char * error )
togayan 4:7dae52cf560f 42 {
togayan 4:7dae52cf560f 43 parser->setError( error );
togayan 4:7dae52cf560f 44 }
togayan 4:7dae52cf560f 45
togayan 4:7dae52cf560f 46 void SP_XmlReader :: reset()
togayan 4:7dae52cf560f 47 {
togayan 4:7dae52cf560f 48 mBuffer->clean();
togayan 4:7dae52cf560f 49 }
togayan 4:7dae52cf560f 50
togayan 4:7dae52cf560f 51 //=========================================================
togayan 4:7dae52cf560f 52
togayan 4:7dae52cf560f 53 SP_XmlPIReader :: SP_XmlPIReader()
togayan 4:7dae52cf560f 54 {
togayan 4:7dae52cf560f 55 }
togayan 4:7dae52cf560f 56
togayan 4:7dae52cf560f 57 SP_XmlPIReader :: ~SP_XmlPIReader()
togayan 4:7dae52cf560f 58 {
togayan 4:7dae52cf560f 59 }
togayan 4:7dae52cf560f 60
togayan 4:7dae52cf560f 61 void SP_XmlPIReader :: read( SP_XmlPullParser * parser, char c )
togayan 4:7dae52cf560f 62 {
togayan 4:7dae52cf560f 63 if( '>' == c ) {
togayan 4:7dae52cf560f 64 changeReader( parser, getReader( parser, SP_XmlReader::ePCData ) );
togayan 4:7dae52cf560f 65 } else {
togayan 4:7dae52cf560f 66 mBuffer->append( c );
togayan 4:7dae52cf560f 67 }
togayan 4:7dae52cf560f 68 }
togayan 4:7dae52cf560f 69
togayan 4:7dae52cf560f 70 SP_XmlPullEvent * SP_XmlPIReader :: getEvent( SP_XmlPullParser * parser )
togayan 4:7dae52cf560f 71 {
togayan 4:7dae52cf560f 72 SP_XmlPullEvent * retEvent = NULL;
togayan 4:7dae52cf560f 73
togayan 4:7dae52cf560f 74 if( mBuffer->getSize() > 0 ) {
togayan 4:7dae52cf560f 75 char * begin = (char*)mBuffer->getBuffer();
togayan 4:7dae52cf560f 76 for( ; isspace( *begin ); ) begin++;
togayan 4:7dae52cf560f 77
togayan 4:7dae52cf560f 78 char * end = begin;
togayan 4:7dae52cf560f 79 for( ; '\0' != *end && '?' != *end && ( ! isspace( *end ) ); ) end++;
togayan 4:7dae52cf560f 80
togayan 4:7dae52cf560f 81 char savedChar = *end;
togayan 4:7dae52cf560f 82 *end = '\0';
togayan 4:7dae52cf560f 83
togayan 4:7dae52cf560f 84 if( 0 == strcasecmp( begin, "xml" ) ) {
togayan 4:7dae52cf560f 85 *end = savedChar;
togayan 4:7dae52cf560f 86
togayan 4:7dae52cf560f 87 retEvent = parseDocDeclEvent( parser, mBuffer );
togayan 4:7dae52cf560f 88 } else {
togayan 4:7dae52cf560f 89 SP_XmlPIEvent * piEvent = new SP_XmlPIEvent();
togayan 4:7dae52cf560f 90 piEvent->setTarget( begin );
togayan 4:7dae52cf560f 91
togayan 4:7dae52cf560f 92 *end = savedChar;
togayan 4:7dae52cf560f 93
togayan 4:7dae52cf560f 94 begin = end;
togayan 4:7dae52cf560f 95 for( ; isspace( *begin ); ) begin++;
togayan 4:7dae52cf560f 96
togayan 4:7dae52cf560f 97 end = begin;
togayan 4:7dae52cf560f 98 for( ; '\0' != *end && '?' != *end; ) end++;
togayan 4:7dae52cf560f 99
togayan 4:7dae52cf560f 100 piEvent->setData( begin, end - begin );
togayan 4:7dae52cf560f 101
togayan 4:7dae52cf560f 102 retEvent = piEvent;
togayan 4:7dae52cf560f 103 }
togayan 4:7dae52cf560f 104 }
togayan 4:7dae52cf560f 105
togayan 4:7dae52cf560f 106 return retEvent;
togayan 4:7dae52cf560f 107 }
togayan 4:7dae52cf560f 108
togayan 4:7dae52cf560f 109 SP_XmlPullEvent * SP_XmlPIReader :: parseDocDeclEvent( SP_XmlPullParser * parser,
togayan 4:7dae52cf560f 110 SP_XmlStringBuffer * buffer )
togayan 4:7dae52cf560f 111 {
togayan 4:7dae52cf560f 112 SP_XmlDocDeclEvent * retEvent = NULL;
togayan 4:7dae52cf560f 113
togayan 4:7dae52cf560f 114 SP_XmlSTagParser tagParser( parser->getEncoding() );
togayan 4:7dae52cf560f 115
togayan 4:7dae52cf560f 116 tagParser.append( buffer->getBuffer(), buffer->getSize() );
togayan 4:7dae52cf560f 117 tagParser.append( " ", 1 );
togayan 4:7dae52cf560f 118
togayan 4:7dae52cf560f 119 if( NULL == tagParser.getError() ) {
togayan 4:7dae52cf560f 120 SP_XmlStartTagEvent * event = tagParser.takeEvent();
togayan 4:7dae52cf560f 121
togayan 4:7dae52cf560f 122 const char * version = event->getAttrValue( "version" );
togayan 4:7dae52cf560f 123 const char * encoding = event->getAttrValue( "encoding" );
togayan 4:7dae52cf560f 124 const char * standalone = event->getAttrValue( "standalone" );
togayan 4:7dae52cf560f 125
togayan 4:7dae52cf560f 126 retEvent = new SP_XmlDocDeclEvent();
togayan 4:7dae52cf560f 127 retEvent->setVersion( NULL == version ? "" : version );
togayan 4:7dae52cf560f 128 retEvent->setEncoding( NULL == encoding ? "" : encoding );
togayan 4:7dae52cf560f 129 if( NULL != standalone ) {
togayan 4:7dae52cf560f 130 if( 0 == strcasecmp( "no", standalone ) ) {
togayan 4:7dae52cf560f 131 retEvent->setStandalone( 0 );
togayan 4:7dae52cf560f 132 } else {
togayan 4:7dae52cf560f 133 retEvent->setStandalone( 1 );
togayan 4:7dae52cf560f 134 }
togayan 4:7dae52cf560f 135 }
togayan 4:7dae52cf560f 136
togayan 4:7dae52cf560f 137 delete event;
togayan 4:7dae52cf560f 138 } else {
togayan 4:7dae52cf560f 139 setError( parser, tagParser.getError() );
togayan 4:7dae52cf560f 140 }
togayan 4:7dae52cf560f 141
togayan 4:7dae52cf560f 142 return retEvent;
togayan 4:7dae52cf560f 143 }
togayan 4:7dae52cf560f 144
togayan 4:7dae52cf560f 145 //=========================================================
togayan 4:7dae52cf560f 146
togayan 4:7dae52cf560f 147 SP_XmlStartTagReader :: SP_XmlStartTagReader()
togayan 4:7dae52cf560f 148 {
togayan 4:7dae52cf560f 149 mIsQuot = 0;
togayan 4:7dae52cf560f 150 }
togayan 4:7dae52cf560f 151
togayan 4:7dae52cf560f 152 SP_XmlStartTagReader :: ~SP_XmlStartTagReader()
togayan 4:7dae52cf560f 153 {
togayan 4:7dae52cf560f 154 }
togayan 4:7dae52cf560f 155
togayan 4:7dae52cf560f 156 void SP_XmlStartTagReader :: read( SP_XmlPullParser * parser, char c )
togayan 4:7dae52cf560f 157 {
togayan 4:7dae52cf560f 158 if( '>' == c && 0 == mIsQuot ) {
togayan 4:7dae52cf560f 159 changeReader( parser, getReader( parser, SP_XmlReader::ePCData ) );
togayan 4:7dae52cf560f 160 } else if( '/' == c && 0 == mIsQuot ) {
togayan 4:7dae52cf560f 161 SP_XmlReader * reader = getReader( parser, SP_XmlReader::eETag );
togayan 4:7dae52cf560f 162 const char * pos = mBuffer->getBuffer();
togayan 4:7dae52cf560f 163 for( ; isspace( *pos ); ) pos++;
togayan 4:7dae52cf560f 164 for( ; 0 == isspace( *pos ) && '\0' != *pos; pos++ ) {
togayan 4:7dae52cf560f 165 reader->read( parser, *pos );
togayan 4:7dae52cf560f 166 }
togayan 4:7dae52cf560f 167 changeReader( parser, reader );
togayan 4:7dae52cf560f 168 } else if( '<' == c && 0 == mIsQuot ) {
togayan 4:7dae52cf560f 169 setError( parser, "illegal char" );
togayan 4:7dae52cf560f 170 } else {
togayan 4:7dae52cf560f 171 mBuffer->append( c );
togayan 4:7dae52cf560f 172
togayan 4:7dae52cf560f 173 if( 0 == mIsQuot ) {
togayan 4:7dae52cf560f 174 if( '\'' == c ) mIsQuot = 1;
togayan 4:7dae52cf560f 175 if( '"' == c ) mIsQuot = 2;
togayan 4:7dae52cf560f 176 } else {
togayan 4:7dae52cf560f 177 if( 1 == mIsQuot && '\'' == c ) mIsQuot = 0;
togayan 4:7dae52cf560f 178 if( 2 == mIsQuot && '"' == c ) mIsQuot = 0;
togayan 4:7dae52cf560f 179 }
togayan 4:7dae52cf560f 180 }
togayan 4:7dae52cf560f 181 }
togayan 4:7dae52cf560f 182
togayan 4:7dae52cf560f 183 SP_XmlPullEvent * SP_XmlStartTagReader :: getEvent( SP_XmlPullParser * parser )
togayan 4:7dae52cf560f 184 {
togayan 4:7dae52cf560f 185 SP_XmlStartTagEvent * retEvent = NULL;
togayan 4:7dae52cf560f 186
togayan 4:7dae52cf560f 187 SP_XmlSTagParser tagParser( parser->getEncoding() );
togayan 4:7dae52cf560f 188 tagParser.append( mBuffer->getBuffer(), mBuffer->getSize() );
togayan 4:7dae52cf560f 189 tagParser.append( " ", 1 );
togayan 4:7dae52cf560f 190
togayan 4:7dae52cf560f 191 if( NULL == tagParser.getError() ) {
togayan 4:7dae52cf560f 192 retEvent = tagParser.takeEvent();
togayan 4:7dae52cf560f 193 } else {
togayan 4:7dae52cf560f 194 setError( parser, tagParser.getError() );
togayan 4:7dae52cf560f 195 }
togayan 4:7dae52cf560f 196
togayan 4:7dae52cf560f 197 return retEvent;
togayan 4:7dae52cf560f 198 }
togayan 4:7dae52cf560f 199
togayan 4:7dae52cf560f 200 void SP_XmlStartTagReader :: reset()
togayan 4:7dae52cf560f 201 {
togayan 4:7dae52cf560f 202 SP_XmlReader::reset();
togayan 4:7dae52cf560f 203 mIsQuot = 0;
togayan 4:7dae52cf560f 204 }
togayan 4:7dae52cf560f 205
togayan 4:7dae52cf560f 206 //=========================================================
togayan 4:7dae52cf560f 207
togayan 4:7dae52cf560f 208 SP_XmlEndTagReader :: SP_XmlEndTagReader()
togayan 4:7dae52cf560f 209 {
togayan 4:7dae52cf560f 210 }
togayan 4:7dae52cf560f 211
togayan 4:7dae52cf560f 212 SP_XmlEndTagReader :: ~SP_XmlEndTagReader()
togayan 4:7dae52cf560f 213 {
togayan 4:7dae52cf560f 214 }
togayan 4:7dae52cf560f 215
togayan 4:7dae52cf560f 216 void SP_XmlEndTagReader :: read( SP_XmlPullParser * parser, char c )
togayan 4:7dae52cf560f 217 {
togayan 4:7dae52cf560f 218 if( '>' == c ) {
togayan 4:7dae52cf560f 219 changeReader( parser, getReader( parser, SP_XmlReader::ePCData ) );
togayan 4:7dae52cf560f 220 } else if( '/' == c ) {
togayan 4:7dae52cf560f 221 setError( parser, "illegal name char" );
togayan 4:7dae52cf560f 222 } else {
togayan 4:7dae52cf560f 223 mBuffer->append( c );
togayan 4:7dae52cf560f 224 }
togayan 4:7dae52cf560f 225 }
togayan 4:7dae52cf560f 226
togayan 4:7dae52cf560f 227 SP_XmlPullEvent * SP_XmlEndTagReader :: getEvent( SP_XmlPullParser * parser )
togayan 4:7dae52cf560f 228 {
togayan 4:7dae52cf560f 229 const char * end = mBuffer->getBuffer() + mBuffer->getSize() - 1;
togayan 4:7dae52cf560f 230
togayan 4:7dae52cf560f 231 for( ; end > mBuffer->getBuffer() && isspace( *end ); ) end--;
togayan 4:7dae52cf560f 232
togayan 4:7dae52cf560f 233 SP_XmlEndTagEvent * retEvent = new SP_XmlEndTagEvent();
togayan 4:7dae52cf560f 234 retEvent->setText( mBuffer->getBuffer(), end - mBuffer->getBuffer() + 1 );
togayan 4:7dae52cf560f 235
togayan 4:7dae52cf560f 236 return retEvent;
togayan 4:7dae52cf560f 237 }
togayan 4:7dae52cf560f 238
togayan 4:7dae52cf560f 239 //=========================================================
togayan 4:7dae52cf560f 240
togayan 4:7dae52cf560f 241 SP_XmlPCDataReader :: SP_XmlPCDataReader()
togayan 4:7dae52cf560f 242 {
togayan 4:7dae52cf560f 243 }
togayan 4:7dae52cf560f 244
togayan 4:7dae52cf560f 245 SP_XmlPCDataReader :: ~SP_XmlPCDataReader()
togayan 4:7dae52cf560f 246 {
togayan 4:7dae52cf560f 247 }
togayan 4:7dae52cf560f 248
togayan 4:7dae52cf560f 249 void SP_XmlPCDataReader :: read( SP_XmlPullParser * parser, char c )
togayan 4:7dae52cf560f 250 {
togayan 4:7dae52cf560f 251 if( '<' == c ) {
togayan 4:7dae52cf560f 252 SP_XmlReader * reader = getReader( parser, SP_XmlReader::eLBracket );
togayan 4:7dae52cf560f 253 reader->read( parser, c );
togayan 4:7dae52cf560f 254 changeReader( parser, reader );
togayan 4:7dae52cf560f 255 } else {
togayan 4:7dae52cf560f 256 mBuffer->append( c );
togayan 4:7dae52cf560f 257 }
togayan 4:7dae52cf560f 258 }
togayan 4:7dae52cf560f 259
togayan 4:7dae52cf560f 260 SP_XmlPullEvent * SP_XmlPCDataReader :: getEvent( SP_XmlPullParser * parser )
togayan 4:7dae52cf560f 261 {
togayan 4:7dae52cf560f 262 SP_XmlCDataEvent * retEvent = NULL;
togayan 4:7dae52cf560f 263
togayan 4:7dae52cf560f 264 int ignore = 0;
togayan 4:7dae52cf560f 265
togayan 4:7dae52cf560f 266 if( 0 != parser->getIgnoreWhitespace() ) {
togayan 4:7dae52cf560f 267 ignore = 1;
togayan 4:7dae52cf560f 268 for( const char * pos = mBuffer->getBuffer(); '\0' != *pos; pos++ ) {
togayan 4:7dae52cf560f 269 if( !isspace( *pos ) ) {
togayan 4:7dae52cf560f 270 ignore = 0;
togayan 4:7dae52cf560f 271 break;
togayan 4:7dae52cf560f 272 }
togayan 4:7dae52cf560f 273 }
togayan 4:7dae52cf560f 274 }
togayan 4:7dae52cf560f 275
togayan 4:7dae52cf560f 276 if( 0 == ignore && mBuffer->getSize() > 0 ) {
togayan 4:7dae52cf560f 277 retEvent = new SP_XmlCDataEvent();
togayan 4:7dae52cf560f 278 SP_XmlStringBuffer buffer;
togayan 4:7dae52cf560f 279 SP_XmlStringCodec::decode( parser->getEncoding(), mBuffer->getBuffer(), &buffer );
togayan 4:7dae52cf560f 280 retEvent->setText( buffer.getBuffer(), buffer.getSize() );
togayan 4:7dae52cf560f 281 }
togayan 4:7dae52cf560f 282
togayan 4:7dae52cf560f 283 return retEvent;
togayan 4:7dae52cf560f 284 }
togayan 4:7dae52cf560f 285
togayan 4:7dae52cf560f 286 //=========================================================
togayan 4:7dae52cf560f 287
togayan 4:7dae52cf560f 288 SP_XmlCDataSectionReader :: SP_XmlCDataSectionReader()
togayan 4:7dae52cf560f 289 {
togayan 4:7dae52cf560f 290 }
togayan 4:7dae52cf560f 291
togayan 4:7dae52cf560f 292 SP_XmlCDataSectionReader :: ~SP_XmlCDataSectionReader()
togayan 4:7dae52cf560f 293 {
togayan 4:7dae52cf560f 294 }
togayan 4:7dae52cf560f 295
togayan 4:7dae52cf560f 296 void SP_XmlCDataSectionReader :: read( SP_XmlPullParser * parser, char c )
togayan 4:7dae52cf560f 297 {
togayan 4:7dae52cf560f 298 if( '>' == c && mBuffer->getSize() > 2 ) {
togayan 4:7dae52cf560f 299 char last1 = mBuffer->getBuffer()[ mBuffer->getSize() - 1 ];
togayan 4:7dae52cf560f 300 char last2 = mBuffer->getBuffer()[ mBuffer->getSize() - 2 ];
togayan 4:7dae52cf560f 301
togayan 4:7dae52cf560f 302 if( ']' == last1 && ']' == last2 ) {
togayan 4:7dae52cf560f 303 changeReader( parser, getReader( parser, SP_XmlReader::ePCData ) );
togayan 4:7dae52cf560f 304 } else {
togayan 4:7dae52cf560f 305 mBuffer->append( c );
togayan 4:7dae52cf560f 306 }
togayan 4:7dae52cf560f 307 } else {
togayan 4:7dae52cf560f 308 mBuffer->append( c );
togayan 4:7dae52cf560f 309 }
togayan 4:7dae52cf560f 310 }
togayan 4:7dae52cf560f 311
togayan 4:7dae52cf560f 312 SP_XmlPullEvent * SP_XmlCDataSectionReader :: getEvent( SP_XmlPullParser * parser )
togayan 4:7dae52cf560f 313 {
togayan 4:7dae52cf560f 314 SP_XmlCDataEvent * retEvent = NULL;
togayan 4:7dae52cf560f 315
togayan 4:7dae52cf560f 316 int len = mBuffer->getSize();
togayan 4:7dae52cf560f 317 const char * data = mBuffer->getBuffer();
togayan 4:7dae52cf560f 318 if( 0 == strncmp( data, "CDATA[", strlen( "CDATA[" ) ) ) {
togayan 4:7dae52cf560f 319 data += strlen( "CDATA[" );
togayan 4:7dae52cf560f 320 len -= strlen( "CDATA[" );
togayan 4:7dae52cf560f 321 }
togayan 4:7dae52cf560f 322
togayan 4:7dae52cf560f 323 int ignore = 0;
togayan 4:7dae52cf560f 324 if( 0 != parser->getIgnoreWhitespace() ) {
togayan 4:7dae52cf560f 325 ignore = 1;
togayan 4:7dae52cf560f 326 for( int i = 0; i < len - 2; i++ ) {
togayan 4:7dae52cf560f 327 if( !isspace( data[i] ) ) {
togayan 4:7dae52cf560f 328 ignore = 0;
togayan 4:7dae52cf560f 329 break;
togayan 4:7dae52cf560f 330 }
togayan 4:7dae52cf560f 331 }
togayan 4:7dae52cf560f 332 }
togayan 4:7dae52cf560f 333
togayan 4:7dae52cf560f 334 if( 0 == ignore && len > 2 ) {
togayan 4:7dae52cf560f 335 retEvent = new SP_XmlCDataEvent();
togayan 4:7dae52cf560f 336 retEvent->setText( data, len - 2 );
togayan 4:7dae52cf560f 337 }
togayan 4:7dae52cf560f 338
togayan 4:7dae52cf560f 339 return retEvent;
togayan 4:7dae52cf560f 340 }
togayan 4:7dae52cf560f 341
togayan 4:7dae52cf560f 342 //=========================================================
togayan 4:7dae52cf560f 343
togayan 4:7dae52cf560f 344 SP_XmlCommentReader :: SP_XmlCommentReader()
togayan 4:7dae52cf560f 345 {
togayan 4:7dae52cf560f 346 }
togayan 4:7dae52cf560f 347
togayan 4:7dae52cf560f 348 SP_XmlCommentReader :: ~SP_XmlCommentReader()
togayan 4:7dae52cf560f 349 {
togayan 4:7dae52cf560f 350 }
togayan 4:7dae52cf560f 351
togayan 4:7dae52cf560f 352 void SP_XmlCommentReader :: read( SP_XmlPullParser * parser, char c )
togayan 4:7dae52cf560f 353 {
togayan 4:7dae52cf560f 354 if( '>' == c && mBuffer->getSize() >= 2 ) {
togayan 4:7dae52cf560f 355 int size = mBuffer->getSize();
togayan 4:7dae52cf560f 356 if( '-' == mBuffer->getBuffer()[ size - 1 ]
togayan 4:7dae52cf560f 357 && '-' == mBuffer->getBuffer()[ size - 2 ] ) {
togayan 4:7dae52cf560f 358 changeReader( parser, getReader( parser, SP_XmlReader::ePCData ) );
togayan 4:7dae52cf560f 359 } else {
togayan 4:7dae52cf560f 360 mBuffer->append( c );
togayan 4:7dae52cf560f 361 }
togayan 4:7dae52cf560f 362 } else {
togayan 4:7dae52cf560f 363 mBuffer->append( c );
togayan 4:7dae52cf560f 364 }
togayan 4:7dae52cf560f 365 }
togayan 4:7dae52cf560f 366
togayan 4:7dae52cf560f 367 SP_XmlPullEvent * SP_XmlCommentReader :: getEvent( SP_XmlPullParser * parser )
togayan 4:7dae52cf560f 368 {
togayan 4:7dae52cf560f 369 SP_XmlCommentEvent * retEvent = new SP_XmlCommentEvent();
togayan 4:7dae52cf560f 370
togayan 4:7dae52cf560f 371 retEvent->setText( mBuffer->getBuffer(), mBuffer->getSize() - 2 );
togayan 4:7dae52cf560f 372
togayan 4:7dae52cf560f 373 return retEvent;
togayan 4:7dae52cf560f 374 }
togayan 4:7dae52cf560f 375
togayan 4:7dae52cf560f 376 //=========================================================
togayan 4:7dae52cf560f 377
togayan 4:7dae52cf560f 378 SP_XmlDocTypeReader :: SP_XmlDocTypeReader()
togayan 4:7dae52cf560f 379 {
togayan 4:7dae52cf560f 380 }
togayan 4:7dae52cf560f 381
togayan 4:7dae52cf560f 382 SP_XmlDocTypeReader :: ~SP_XmlDocTypeReader()
togayan 4:7dae52cf560f 383 {
togayan 4:7dae52cf560f 384 }
togayan 4:7dae52cf560f 385
togayan 4:7dae52cf560f 386 void SP_XmlDocTypeReader :: read( SP_XmlPullParser * parser, char c )
togayan 4:7dae52cf560f 387 {
togayan 4:7dae52cf560f 388 if( '>' == c ) {
togayan 4:7dae52cf560f 389 if( NULL != strchr( mBuffer->getBuffer(), '[' ) ) {
togayan 4:7dae52cf560f 390 char last = mBuffer->getBuffer()[ mBuffer->getSize() - 1 ];
togayan 4:7dae52cf560f 391 if( ']' == last ) {
togayan 4:7dae52cf560f 392 changeReader( parser, getReader( parser, SP_XmlReader::ePCData ) );
togayan 4:7dae52cf560f 393 } else {
togayan 4:7dae52cf560f 394 mBuffer->append( c );
togayan 4:7dae52cf560f 395 }
togayan 4:7dae52cf560f 396 } else {
togayan 4:7dae52cf560f 397 changeReader( parser, getReader( parser, SP_XmlReader::ePCData ) );
togayan 4:7dae52cf560f 398 }
togayan 4:7dae52cf560f 399 } else {
togayan 4:7dae52cf560f 400 mBuffer->append( c );
togayan 4:7dae52cf560f 401 }
togayan 4:7dae52cf560f 402 }
togayan 4:7dae52cf560f 403
togayan 4:7dae52cf560f 404 SP_XmlPullEvent * SP_XmlDocTypeReader :: getEvent( SP_XmlPullParser * parser )
togayan 4:7dae52cf560f 405 {
togayan 4:7dae52cf560f 406 SP_XmlDocTypeEvent * retEvent = NULL;
togayan 4:7dae52cf560f 407
togayan 4:7dae52cf560f 408 SP_XmlSTagParser tagParser( parser->getEncoding() );
togayan 4:7dae52cf560f 409
togayan 4:7dae52cf560f 410 tagParser.append( "DOCTYPE ", strlen( "DOCTYPE " ) );
togayan 4:7dae52cf560f 411 tagParser.append( mBuffer->getBuffer(), mBuffer->getSize() );
togayan 4:7dae52cf560f 412 tagParser.append( " ", 1 );
togayan 4:7dae52cf560f 413 if( NULL == tagParser.getError() ) {
togayan 4:7dae52cf560f 414 SP_XmlStartTagEvent * event = tagParser.takeEvent();
togayan 4:7dae52cf560f 415
togayan 4:7dae52cf560f 416 retEvent = new SP_XmlDocTypeEvent();
togayan 4:7dae52cf560f 417
togayan 4:7dae52cf560f 418 for( int i = 0; i < event->getAttrCount(); i += 2 ) {
togayan 4:7dae52cf560f 419 const char * name = event->getAttr( i, NULL );
togayan 4:7dae52cf560f 420 if( 0 == strcmp( name, "DOCTYPE" ) ) {
togayan 4:7dae52cf560f 421 name = event->getAttr( i + 1, NULL );
togayan 4:7dae52cf560f 422 retEvent->setName( NULL == name ? "" : name );
togayan 4:7dae52cf560f 423 } else if( 0 == strcmp( name, "PUBLIC" ) ) {
togayan 4:7dae52cf560f 424 name = event->getAttr( i + 1, NULL );
togayan 4:7dae52cf560f 425 retEvent->setPublicID( NULL == name ? "" : name );
togayan 4:7dae52cf560f 426 } else if( 0 == strcmp( name, "SYSTEM" ) ) {
togayan 4:7dae52cf560f 427 name = event->getAttr( i + 1, NULL );
togayan 4:7dae52cf560f 428 retEvent->setSystemID( NULL == name ? "" : name );
togayan 4:7dae52cf560f 429 } else if( NULL != strstr( name, ".dtd" ) ) {
togayan 4:7dae52cf560f 430 retEvent->setDTD( name );
togayan 4:7dae52cf560f 431 }
togayan 4:7dae52cf560f 432 }
togayan 4:7dae52cf560f 433
togayan 4:7dae52cf560f 434 delete event;
togayan 4:7dae52cf560f 435 } else {
togayan 4:7dae52cf560f 436 //setError( parser, tagParser.getError() );
togayan 4:7dae52cf560f 437 }
togayan 4:7dae52cf560f 438
togayan 4:7dae52cf560f 439 return retEvent;
togayan 4:7dae52cf560f 440 }
togayan 4:7dae52cf560f 441
togayan 4:7dae52cf560f 442 //=========================================================
togayan 4:7dae52cf560f 443
togayan 4:7dae52cf560f 444 SP_XmlLeftBracketReader :: SP_XmlLeftBracketReader()
togayan 4:7dae52cf560f 445 {
togayan 4:7dae52cf560f 446 mHasReadBracket = 0;
togayan 4:7dae52cf560f 447 }
togayan 4:7dae52cf560f 448
togayan 4:7dae52cf560f 449 SP_XmlLeftBracketReader :: ~SP_XmlLeftBracketReader()
togayan 4:7dae52cf560f 450 {
togayan 4:7dae52cf560f 451 }
togayan 4:7dae52cf560f 452
togayan 4:7dae52cf560f 453 void SP_XmlLeftBracketReader :: read( SP_XmlPullParser * parser, char c )
togayan 4:7dae52cf560f 454 {
togayan 4:7dae52cf560f 455 if( 0 == mHasReadBracket ) {
togayan 4:7dae52cf560f 456 if( isspace( c ) ) {
togayan 4:7dae52cf560f 457 //skip
togayan 4:7dae52cf560f 458 } else if( '<' == c ) {
togayan 4:7dae52cf560f 459 mHasReadBracket = 1;
togayan 4:7dae52cf560f 460 }
togayan 4:7dae52cf560f 461 } else {
togayan 4:7dae52cf560f 462 if( '?' == c ) {
togayan 4:7dae52cf560f 463 changeReader( parser, getReader( parser, SP_XmlReader::ePI ) );
togayan 4:7dae52cf560f 464 } else if( '/' == c ) {
togayan 4:7dae52cf560f 465 changeReader( parser, getReader( parser, SP_XmlReader::eETag ) );
togayan 4:7dae52cf560f 466 } else if( '!' == c ) {
togayan 4:7dae52cf560f 467 changeReader( parser, getReader( parser, SP_XmlReader::eSign ) );
togayan 4:7dae52cf560f 468 } else if( SP_XmlStringCodec::isNameChar( parser->getEncoding(), c ) ) {
togayan 4:7dae52cf560f 469 SP_XmlReader * reader = getReader( parser, SP_XmlReader::eSTag );
togayan 4:7dae52cf560f 470 reader->read( parser, c );
togayan 4:7dae52cf560f 471 changeReader( parser, reader );
togayan 4:7dae52cf560f 472 } else {
togayan 4:7dae52cf560f 473 setError( parser, "not well-formed" );
togayan 4:7dae52cf560f 474 }
togayan 4:7dae52cf560f 475 }
togayan 4:7dae52cf560f 476 }
togayan 4:7dae52cf560f 477
togayan 4:7dae52cf560f 478 SP_XmlPullEvent * SP_XmlLeftBracketReader :: getEvent( SP_XmlPullParser * parser )
togayan 4:7dae52cf560f 479 {
togayan 4:7dae52cf560f 480 return NULL;
togayan 4:7dae52cf560f 481 }
togayan 4:7dae52cf560f 482
togayan 4:7dae52cf560f 483 void SP_XmlLeftBracketReader :: reset()
togayan 4:7dae52cf560f 484 {
togayan 4:7dae52cf560f 485 SP_XmlReader::reset();
togayan 4:7dae52cf560f 486 mHasReadBracket = 0;
togayan 4:7dae52cf560f 487 }
togayan 4:7dae52cf560f 488
togayan 4:7dae52cf560f 489 //=========================================================
togayan 4:7dae52cf560f 490
togayan 4:7dae52cf560f 491 SP_XmlSignReader :: SP_XmlSignReader()
togayan 4:7dae52cf560f 492 {
togayan 4:7dae52cf560f 493 }
togayan 4:7dae52cf560f 494
togayan 4:7dae52cf560f 495 SP_XmlSignReader :: ~SP_XmlSignReader()
togayan 4:7dae52cf560f 496 {
togayan 4:7dae52cf560f 497 }
togayan 4:7dae52cf560f 498
togayan 4:7dae52cf560f 499 void SP_XmlSignReader :: read( SP_XmlPullParser * parser, char c )
togayan 4:7dae52cf560f 500 {
togayan 4:7dae52cf560f 501 if( '[' == c ) {
togayan 4:7dae52cf560f 502 changeReader( parser, getReader( parser, SP_XmlReader::eCDataSection ) );
togayan 4:7dae52cf560f 503 } else if( '-' == c ) {
togayan 4:7dae52cf560f 504 changeReader( parser, getReader( parser, SP_XmlReader::eComment ) );
togayan 4:7dae52cf560f 505 } else if( isupper( c ) ) {
togayan 4:7dae52cf560f 506 SP_XmlReader * reader = getReader( parser, SP_XmlReader::eDocType );
togayan 4:7dae52cf560f 507 reader->read( parser, c );
togayan 4:7dae52cf560f 508 changeReader( parser, reader );
togayan 4:7dae52cf560f 509 } else {
togayan 4:7dae52cf560f 510 setError( parser, "not well-formed" );
togayan 4:7dae52cf560f 511 }
togayan 4:7dae52cf560f 512 }
togayan 4:7dae52cf560f 513
togayan 4:7dae52cf560f 514 SP_XmlPullEvent * SP_XmlSignReader :: getEvent( SP_XmlPullParser * parser )
togayan 4:7dae52cf560f 515 {
togayan 4:7dae52cf560f 516 return NULL;
togayan 4:7dae52cf560f 517 }
togayan 4:7dae52cf560f 518
togayan 4:7dae52cf560f 519 //=========================================================
togayan 4:7dae52cf560f 520
togayan 4:7dae52cf560f 521 SP_XmlReaderPool :: SP_XmlReaderPool()
togayan 4:7dae52cf560f 522 {
togayan 4:7dae52cf560f 523 mReaderList = (SP_XmlReader**)malloc( sizeof( void * ) * SP_XmlReader::MAX_READER );
togayan 4:7dae52cf560f 524 memset( mReaderList, 0, sizeof( void * ) * SP_XmlReader::MAX_READER );
togayan 4:7dae52cf560f 525 }
togayan 4:7dae52cf560f 526
togayan 4:7dae52cf560f 527 SP_XmlReaderPool :: ~SP_XmlReaderPool()
togayan 4:7dae52cf560f 528 {
togayan 4:7dae52cf560f 529 for( int i = 0; i < SP_XmlReader::MAX_READER; i++ ) {
togayan 4:7dae52cf560f 530 if( NULL != mReaderList[i] ) {
togayan 4:7dae52cf560f 531 delete mReaderList[i];
togayan 4:7dae52cf560f 532 }
togayan 4:7dae52cf560f 533 }
togayan 4:7dae52cf560f 534 free( mReaderList );
togayan 4:7dae52cf560f 535 }
togayan 4:7dae52cf560f 536
togayan 4:7dae52cf560f 537 SP_XmlReader * SP_XmlReaderPool :: borrow( int type )
togayan 4:7dae52cf560f 538 {
togayan 4:7dae52cf560f 539 SP_XmlReader * reader = NULL;
togayan 4:7dae52cf560f 540
togayan 4:7dae52cf560f 541 if( type >= 0 && type < SP_XmlReader::MAX_READER ) {
togayan 4:7dae52cf560f 542 reader = mReaderList[ type ];
togayan 4:7dae52cf560f 543 if( NULL == reader ) {
togayan 4:7dae52cf560f 544 switch( type ) {
togayan 4:7dae52cf560f 545 case SP_XmlReader::ePI: reader = new SP_XmlPIReader(); break;
togayan 4:7dae52cf560f 546 case SP_XmlReader::eSTag: reader = new SP_XmlStartTagReader(); break;
togayan 4:7dae52cf560f 547 case SP_XmlReader::eETag: reader = new SP_XmlEndTagReader(); break;
togayan 4:7dae52cf560f 548 case SP_XmlReader::ePCData: reader = new SP_XmlPCDataReader(); break;
togayan 4:7dae52cf560f 549 case SP_XmlReader::eCDataSection: reader = new SP_XmlCDataSectionReader(); break;
togayan 4:7dae52cf560f 550 case SP_XmlReader::eComment: reader = new SP_XmlCommentReader(); break;
togayan 4:7dae52cf560f 551 case SP_XmlReader::eDocType: reader = new SP_XmlDocTypeReader(); break;
togayan 4:7dae52cf560f 552 case SP_XmlReader::eLBracket: reader = new SP_XmlLeftBracketReader(); break;
togayan 4:7dae52cf560f 553 case SP_XmlReader::eSign: reader = new SP_XmlSignReader(); break;
togayan 4:7dae52cf560f 554 }
togayan 4:7dae52cf560f 555 mReaderList[ type ] = reader;
togayan 4:7dae52cf560f 556 }
togayan 4:7dae52cf560f 557 }
togayan 4:7dae52cf560f 558
togayan 4:7dae52cf560f 559 //printf( "\nborrow change: %s\n", typeid( *reader ).name() );
togayan 4:7dae52cf560f 560
togayan 4:7dae52cf560f 561 return reader;
togayan 4:7dae52cf560f 562 }
togayan 4:7dae52cf560f 563
togayan 4:7dae52cf560f 564 void SP_XmlReaderPool :: save( SP_XmlReader * reader )
togayan 4:7dae52cf560f 565 {
togayan 4:7dae52cf560f 566 //printf( "\nreturn change: %s\n", typeid( *reader ).name() );
togayan 4:7dae52cf560f 567 reader->reset();
togayan 4:7dae52cf560f 568 }
togayan 4:7dae52cf560f 569
togayan 4:7dae52cf560f 570 //=========================================================