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:
Thu Sep 06 14:38:33 2012 +0000
Revision:
8:a9541e8897f5
Parent:
7:ad9fcf0e1bc5
Using external library spxml.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
togayan 7:ad9fcf0e1bc5 1 /* HTTPFile.cpp */
togayan 7:ad9fcf0e1bc5 2 #include "HTTPFile.h"
togayan 7:ad9fcf0e1bc5 3
togayan 7:ad9fcf0e1bc5 4 #include <cstring>
togayan 7:ad9fcf0e1bc5 5
togayan 7:ad9fcf0e1bc5 6 #define OK 0
togayan 7:ad9fcf0e1bc5 7 #define NG -1
togayan 7:ad9fcf0e1bc5 8
togayan 7:ad9fcf0e1bc5 9 using std::memcpy;
togayan 7:ad9fcf0e1bc5 10 using std::strncpy;
togayan 7:ad9fcf0e1bc5 11 using std::strlen;
togayan 7:ad9fcf0e1bc5 12
togayan 7:ad9fcf0e1bc5 13 HTTPFile::HTTPFile(const char* path) :
togayan 7:ad9fcf0e1bc5 14 m_fp(NULL),
togayan 7:ad9fcf0e1bc5 15 m_path(path),
togayan 7:ad9fcf0e1bc5 16 m_len(0),
togayan 7:ad9fcf0e1bc5 17 m_chunked(false)
togayan 7:ad9fcf0e1bc5 18 {
togayan 7:ad9fcf0e1bc5 19 }
togayan 7:ad9fcf0e1bc5 20
togayan 7:ad9fcf0e1bc5 21 HTTPFile::~HTTPFile()
togayan 7:ad9fcf0e1bc5 22 {
togayan 7:ad9fcf0e1bc5 23 closeFile();
togayan 7:ad9fcf0e1bc5 24 }
togayan 7:ad9fcf0e1bc5 25
togayan 7:ad9fcf0e1bc5 26 void HTTPFile::clear()
togayan 7:ad9fcf0e1bc5 27 {
togayan 7:ad9fcf0e1bc5 28 closeFile();
togayan 7:ad9fcf0e1bc5 29 //Force reopening
togayan 7:ad9fcf0e1bc5 30 }
togayan 7:ad9fcf0e1bc5 31
togayan 7:ad9fcf0e1bc5 32 /*virtual*/ void HTTPFile::readReset()
togayan 7:ad9fcf0e1bc5 33 {
togayan 7:ad9fcf0e1bc5 34 if(m_fp)
togayan 7:ad9fcf0e1bc5 35 fseek(m_fp, 0, SEEK_SET);
togayan 7:ad9fcf0e1bc5 36 }
togayan 7:ad9fcf0e1bc5 37
togayan 7:ad9fcf0e1bc5 38 /*virtual*/ int HTTPFile::read(char* buf, size_t len, size_t* pReadLen)
togayan 7:ad9fcf0e1bc5 39 {
togayan 7:ad9fcf0e1bc5 40 if(!openFile("r")) //File does not exist, or I/O error...
togayan 7:ad9fcf0e1bc5 41 return NG;
togayan 7:ad9fcf0e1bc5 42
togayan 7:ad9fcf0e1bc5 43 *pReadLen = fread(buf, 1, len, m_fp);
togayan 7:ad9fcf0e1bc5 44 if( feof(m_fp) )
togayan 7:ad9fcf0e1bc5 45 {
togayan 7:ad9fcf0e1bc5 46 //File read completely, we can close it
togayan 7:ad9fcf0e1bc5 47 closeFile();
togayan 7:ad9fcf0e1bc5 48 }
togayan 7:ad9fcf0e1bc5 49 return OK;
togayan 7:ad9fcf0e1bc5 50 }
togayan 7:ad9fcf0e1bc5 51
togayan 7:ad9fcf0e1bc5 52 /*virtual*/ void HTTPFile::writeReset()
togayan 7:ad9fcf0e1bc5 53 {
togayan 7:ad9fcf0e1bc5 54 if(m_fp)
togayan 7:ad9fcf0e1bc5 55 fseek(m_fp, 0, SEEK_SET);
togayan 7:ad9fcf0e1bc5 56 }
togayan 7:ad9fcf0e1bc5 57
togayan 7:ad9fcf0e1bc5 58 /*virtual*/ int HTTPFile::write(const char* buf, size_t len)
togayan 7:ad9fcf0e1bc5 59 {
togayan 7:ad9fcf0e1bc5 60 if(!openFile("w")) //File does not exist, or I/O error...
togayan 7:ad9fcf0e1bc5 61 return NG;
togayan 7:ad9fcf0e1bc5 62
togayan 7:ad9fcf0e1bc5 63 len = fwrite(buf, 1, len, m_fp);
togayan 7:ad9fcf0e1bc5 64 //DBG("Written %d bytes in %d\n", len, m_fp);
togayan 7:ad9fcf0e1bc5 65 if( (!m_chunked && (ftell(m_fp) >= m_len)) || (m_chunked && !len) )
togayan 7:ad9fcf0e1bc5 66 {
togayan 7:ad9fcf0e1bc5 67 //File received completely, we can close it
togayan 7:ad9fcf0e1bc5 68 closeFile();
togayan 7:ad9fcf0e1bc5 69 }
togayan 7:ad9fcf0e1bc5 70 return len;
togayan 7:ad9fcf0e1bc5 71 }
togayan 7:ad9fcf0e1bc5 72
togayan 7:ad9fcf0e1bc5 73 /*virtual*/ int HTTPFile::getDataType(char* type, size_t maxTypeLen) //Internet media type for Content-Type header
togayan 7:ad9fcf0e1bc5 74 {
togayan 7:ad9fcf0e1bc5 75 strncpy(type, "text/plain", maxTypeLen-1);
togayan 7:ad9fcf0e1bc5 76 type[maxTypeLen-1] = '\0';
togayan 7:ad9fcf0e1bc5 77 return OK;
togayan 7:ad9fcf0e1bc5 78 }
togayan 7:ad9fcf0e1bc5 79
togayan 7:ad9fcf0e1bc5 80 /*virtual*/ void HTTPFile::setDataType(const char* type) //Internet media type from Content-Type header
togayan 7:ad9fcf0e1bc5 81 {
togayan 7:ad9fcf0e1bc5 82 //Do not really care here
togayan 7:ad9fcf0e1bc5 83 }
togayan 7:ad9fcf0e1bc5 84
togayan 7:ad9fcf0e1bc5 85 /*virtual*/ bool HTTPFile::getIsChunked() //For Transfer-Encoding header
togayan 7:ad9fcf0e1bc5 86 {
togayan 7:ad9fcf0e1bc5 87 return false;
togayan 7:ad9fcf0e1bc5 88 }
togayan 7:ad9fcf0e1bc5 89
togayan 7:ad9fcf0e1bc5 90 /*virtual*/ void HTTPFile::setIsChunked(bool chunked) //For Transfer-Encoding header
togayan 7:ad9fcf0e1bc5 91 {
togayan 7:ad9fcf0e1bc5 92 m_chunked = chunked;
togayan 7:ad9fcf0e1bc5 93 }
togayan 7:ad9fcf0e1bc5 94
togayan 7:ad9fcf0e1bc5 95 /*virtual*/ size_t HTTPFile::getDataLen() //For Content-Length header
togayan 7:ad9fcf0e1bc5 96 {
togayan 7:ad9fcf0e1bc5 97 return m_len;
togayan 7:ad9fcf0e1bc5 98 }
togayan 7:ad9fcf0e1bc5 99
togayan 7:ad9fcf0e1bc5 100 /*virtual*/ void HTTPFile::setDataLen(size_t len) //For Content-Length header, or if the transfer is chunked, next chunk length
togayan 7:ad9fcf0e1bc5 101 {
togayan 7:ad9fcf0e1bc5 102 if(!m_chunked)
togayan 7:ad9fcf0e1bc5 103 m_len = len; //Useful so that we can close file when last byte is written
togayan 7:ad9fcf0e1bc5 104 }
togayan 7:ad9fcf0e1bc5 105
togayan 7:ad9fcf0e1bc5 106 bool HTTPFile::openFile(const char* mode) //true on success, false otherwise
togayan 7:ad9fcf0e1bc5 107 {
togayan 7:ad9fcf0e1bc5 108 if(m_fp)
togayan 7:ad9fcf0e1bc5 109 return true;
togayan 7:ad9fcf0e1bc5 110
togayan 7:ad9fcf0e1bc5 111 m_fp = fopen(m_path.c_str(), mode);
togayan 7:ad9fcf0e1bc5 112 if(m_fp && mode[0]=='r')
togayan 7:ad9fcf0e1bc5 113 {
togayan 7:ad9fcf0e1bc5 114 //Seek EOF to get length
togayan 7:ad9fcf0e1bc5 115 fseek(m_fp, 0, SEEK_END);
togayan 7:ad9fcf0e1bc5 116 m_len = ftell(m_fp);
togayan 7:ad9fcf0e1bc5 117 fseek(m_fp, 0, SEEK_SET); //Goto SOF
togayan 7:ad9fcf0e1bc5 118 }
togayan 7:ad9fcf0e1bc5 119
togayan 7:ad9fcf0e1bc5 120 //DBG("fd = %d\n", m_fp);
togayan 7:ad9fcf0e1bc5 121
togayan 7:ad9fcf0e1bc5 122 if(!m_fp)
togayan 7:ad9fcf0e1bc5 123 return false;
togayan 7:ad9fcf0e1bc5 124
togayan 7:ad9fcf0e1bc5 125 return true;
togayan 7:ad9fcf0e1bc5 126 }
togayan 7:ad9fcf0e1bc5 127
togayan 7:ad9fcf0e1bc5 128 void HTTPFile::closeFile()
togayan 7:ad9fcf0e1bc5 129 {
togayan 7:ad9fcf0e1bc5 130 if(m_fp)
togayan 7:ad9fcf0e1bc5 131 fclose(m_fp);
togayan 7:ad9fcf0e1bc5 132 }