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
togayan 4:7dae52cf560f 8 #include "spcanonxml.hpp"
togayan 4:7dae52cf560f 9
togayan 4:7dae52cf560f 10 #include "spxmlnode.hpp"
togayan 4:7dae52cf560f 11 #include "spxmlutils.hpp"
togayan 4:7dae52cf560f 12 #include "spxmlcodec.hpp"
togayan 4:7dae52cf560f 13
togayan 4:7dae52cf560f 14 SP_CanonXmlBuffer :: SP_CanonXmlBuffer( const SP_XmlNode * node )
togayan 4:7dae52cf560f 15 {
togayan 4:7dae52cf560f 16 mBuffer = new SP_XmlStringBuffer();
togayan 4:7dae52cf560f 17 dump( node, mBuffer );
togayan 4:7dae52cf560f 18 }
togayan 4:7dae52cf560f 19
togayan 4:7dae52cf560f 20 SP_CanonXmlBuffer :: ~SP_CanonXmlBuffer()
togayan 4:7dae52cf560f 21 {
togayan 4:7dae52cf560f 22 if( NULL != mBuffer ) delete mBuffer;
togayan 4:7dae52cf560f 23 mBuffer = NULL;
togayan 4:7dae52cf560f 24 }
togayan 4:7dae52cf560f 25
togayan 4:7dae52cf560f 26 const char * SP_CanonXmlBuffer :: getBuffer() const
togayan 4:7dae52cf560f 27 {
togayan 4:7dae52cf560f 28 return mBuffer->getBuffer();
togayan 4:7dae52cf560f 29 }
togayan 4:7dae52cf560f 30
togayan 4:7dae52cf560f 31 int SP_CanonXmlBuffer :: getSize() const
togayan 4:7dae52cf560f 32 {
togayan 4:7dae52cf560f 33 return mBuffer->getSize();
togayan 4:7dae52cf560f 34 }
togayan 4:7dae52cf560f 35
togayan 4:7dae52cf560f 36 void SP_CanonXmlBuffer :: canonEncode( const char * value,
togayan 4:7dae52cf560f 37 SP_XmlStringBuffer * buffer )
togayan 4:7dae52cf560f 38 {
togayan 4:7dae52cf560f 39 SP_XmlStringBuffer temp;
togayan 4:7dae52cf560f 40 SP_XmlStringCodec::encode( "", value, &temp );
togayan 4:7dae52cf560f 41
togayan 4:7dae52cf560f 42 for( const char * pos = temp.getBuffer(); '\0' != *pos; pos++ ) {
togayan 4:7dae52cf560f 43 if( '\r' == *pos ) {
togayan 4:7dae52cf560f 44 } else if( '\n' == *pos ) {
togayan 4:7dae52cf560f 45 buffer->append( "&#10;" );
togayan 4:7dae52cf560f 46 } else {
togayan 4:7dae52cf560f 47 buffer->append( *pos );
togayan 4:7dae52cf560f 48 }
togayan 4:7dae52cf560f 49 }
togayan 4:7dae52cf560f 50 }
togayan 4:7dae52cf560f 51
togayan 4:7dae52cf560f 52 void SP_CanonXmlBuffer :: dump(
togayan 4:7dae52cf560f 53 const SP_XmlNode * node, SP_XmlStringBuffer * buffer )
togayan 4:7dae52cf560f 54 {
togayan 4:7dae52cf560f 55 if( NULL == node ) return;
togayan 4:7dae52cf560f 56
togayan 4:7dae52cf560f 57 if( SP_XmlNode::eXMLDOC == node->getType() ) {
togayan 4:7dae52cf560f 58 SP_XmlDocument * document = static_cast<SP_XmlDocument*>((SP_XmlNode*)node);
togayan 4:7dae52cf560f 59 const SP_XmlNodeList * children = document->getChildren();
togayan 4:7dae52cf560f 60 for( int j = 0; j < children->getLength(); j++ ) {
togayan 4:7dae52cf560f 61 dump( children->get( j ), buffer );
togayan 4:7dae52cf560f 62 }
togayan 4:7dae52cf560f 63 } else if( SP_XmlNode::eCDATA == node->getType() ) {
togayan 4:7dae52cf560f 64 SP_XmlCDataNode * cdata = static_cast<SP_XmlCDataNode*>((SP_XmlNode*)node);
togayan 4:7dae52cf560f 65
togayan 4:7dae52cf560f 66 canonEncode( cdata->getText(), buffer );
togayan 4:7dae52cf560f 67 } else if( SP_XmlNode::ePI == node->getType() ) {
togayan 4:7dae52cf560f 68 SP_XmlPINode * piNode = static_cast<SP_XmlPINode*>((SP_XmlNode*)node);
togayan 4:7dae52cf560f 69
togayan 4:7dae52cf560f 70 buffer->append( "<?" );
togayan 4:7dae52cf560f 71 buffer->append( piNode->getTarget() );
togayan 4:7dae52cf560f 72 if( '\0' != *( piNode->getTarget() ) ) buffer->append( ' ' );
togayan 4:7dae52cf560f 73 buffer->append( piNode->getData() );
togayan 4:7dae52cf560f 74 buffer->append( "?>" );
togayan 4:7dae52cf560f 75 } else if( SP_XmlNode::eCOMMENT == node->getType() ) {
togayan 4:7dae52cf560f 76 // ignore
togayan 4:7dae52cf560f 77 } else if( SP_XmlNode::eELEMENT == node->getType() ) {
togayan 4:7dae52cf560f 78 dumpElement( node, buffer );
togayan 4:7dae52cf560f 79 } else if( SP_XmlNode::eDOCDECL == node->getType() ) {
togayan 4:7dae52cf560f 80 // ignore
togayan 4:7dae52cf560f 81 } else if( SP_XmlNode::eDOCTYPE == node->getType() ) {
togayan 4:7dae52cf560f 82 // ignore
togayan 4:7dae52cf560f 83 } else {
togayan 4:7dae52cf560f 84 // ignore
togayan 4:7dae52cf560f 85 }
togayan 4:7dae52cf560f 86 }
togayan 4:7dae52cf560f 87
togayan 4:7dae52cf560f 88 void SP_CanonXmlBuffer :: dumpElement(
togayan 4:7dae52cf560f 89 const SP_XmlNode * node, SP_XmlStringBuffer * buffer )
togayan 4:7dae52cf560f 90 {
togayan 4:7dae52cf560f 91 if( NULL == node ) return;
togayan 4:7dae52cf560f 92
togayan 4:7dae52cf560f 93 if( SP_XmlNode::eELEMENT == node->getType() ) {
togayan 4:7dae52cf560f 94 SP_XmlElementNode * element = static_cast<SP_XmlElementNode*>((SP_XmlNode*)node);
togayan 4:7dae52cf560f 95 buffer->append( "<" );
togayan 4:7dae52cf560f 96 buffer->append( element->getName() );
togayan 4:7dae52cf560f 97
togayan 4:7dae52cf560f 98 int i = 0;
togayan 4:7dae52cf560f 99
togayan 4:7dae52cf560f 100 SP_XmlArrayList attrList;
togayan 4:7dae52cf560f 101 for( i = 0; i < element->getAttrCount(); i++ ) {
togayan 4:7dae52cf560f 102 attrList.append( (void*)element->getAttr( i, NULL ) );
togayan 4:7dae52cf560f 103 }
togayan 4:7dae52cf560f 104 attrList.sort( reinterpret_cast<int(*)(const void*, const void*)>(strcmp) );
togayan 4:7dae52cf560f 105
togayan 4:7dae52cf560f 106 const char * name = NULL, * value = NULL;
togayan 4:7dae52cf560f 107 for( i = 0; i < attrList.getCount(); i++ ) {
togayan 4:7dae52cf560f 108 name = (char*)attrList.getItem( i );
togayan 4:7dae52cf560f 109 value = element->getAttrValue( name );
togayan 4:7dae52cf560f 110 if( NULL != name && NULL != value ) {
togayan 4:7dae52cf560f 111 buffer->append( ' ' );
togayan 4:7dae52cf560f 112 buffer->append( name );
togayan 4:7dae52cf560f 113 buffer->append( "=\"" );
togayan 4:7dae52cf560f 114 canonEncode( value, buffer );
togayan 4:7dae52cf560f 115 buffer->append( "\"" );
togayan 4:7dae52cf560f 116 }
togayan 4:7dae52cf560f 117 }
togayan 4:7dae52cf560f 118
togayan 4:7dae52cf560f 119 const SP_XmlNodeList * children = element->getChildren();
togayan 4:7dae52cf560f 120
togayan 4:7dae52cf560f 121 buffer->append( ">" );
togayan 4:7dae52cf560f 122
togayan 4:7dae52cf560f 123 for( int j = 0; j < children->getLength(); j++ ) {
togayan 4:7dae52cf560f 124 dump( children->get( j ), buffer );
togayan 4:7dae52cf560f 125 }
togayan 4:7dae52cf560f 126
togayan 4:7dae52cf560f 127 buffer->append( "</" );
togayan 4:7dae52cf560f 128 buffer->append( element->getName() );
togayan 4:7dae52cf560f 129 buffer->append( ">" );
togayan 4:7dae52cf560f 130 } else {
togayan 4:7dae52cf560f 131 dump( node, buffer );
togayan 4:7dae52cf560f 132 }
togayan 4:7dae52cf560f 133 }