Download NHK English news podcast automatically. This application requires mpod mother board. See also http://mbed.org/users/geodenx/notebook/mpod/

Dependencies:   BlinkLed HTTPClient EthernetInterface FatFileSystemCpp MSCFileSystem mbed-rtos mbed

Download NHK English news podcast automatically. This application requires mpod mother board. See also http://mbed.org/users/geodenx/notebook/mpod/

Committer:
togayan
Date:
Sat Sep 01 04:12:37 2012 +0000
Revision:
4:ab3092d15121
Parent:
0:1855a008f28e
HTTPFile was changed to follow the latest HTTPClient library.; BlinkLed was isolated as a library.; Change LED port from LED1,2 to LED3,4 for the specification of pwmout.

Who changed what in which revision?

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