Jun Furutani / libMiMic

Fork of libMiMic by Ryo Iizuka

Committer:
nyatla
Date:
Fri Apr 26 05:26:34 2013 +0000
Revision:
17:f29e1ca90e3d
Child:
18:1970fec78229
update ModLocalFileSystem list API.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyatla 17:f29e1ca90e3d 1 #include "ModLocalFileSystem.h"
nyatla 17:f29e1ca90e3d 2 #include "HttpdConnection.h"
nyatla 17:f29e1ca90e3d 3 #include "NyLPC_net.h"
nyatla 17:f29e1ca90e3d 4 #include "UrlReader.h"
nyatla 17:f29e1ca90e3d 5 #include <stdio.h>
nyatla 17:f29e1ca90e3d 6 #include <stdlib.h>
nyatla 17:f29e1ca90e3d 7 #include <typeinfo>
nyatla 17:f29e1ca90e3d 8 #include "mbed.h"
nyatla 17:f29e1ca90e3d 9 #include "FATDirHandle.h"
nyatla 17:f29e1ca90e3d 10 #define ModLocalFile_SIZE_OF_BUF 256
nyatla 17:f29e1ca90e3d 11 static char buf[ModLocalFile_SIZE_OF_BUF];
nyatla 17:f29e1ca90e3d 12
nyatla 17:f29e1ca90e3d 13
nyatla 17:f29e1ca90e3d 14 namespace MiMic
nyatla 17:f29e1ca90e3d 15 {
nyatla 17:f29e1ca90e3d 16 ModLocalFileSystem::ModLocalFileSystem(const char* i_path):ModBaseClass(i_path)
nyatla 17:f29e1ca90e3d 17 {
nyatla 17:f29e1ca90e3d 18 }
nyatla 17:f29e1ca90e3d 19 ModLocalFileSystem::ModLocalFileSystem():ModBaseClass()
nyatla 17:f29e1ca90e3d 20 {
nyatla 17:f29e1ca90e3d 21 }
nyatla 17:f29e1ca90e3d 22 ModLocalFileSystem::~ModLocalFileSystem()
nyatla 17:f29e1ca90e3d 23 {
nyatla 17:f29e1ca90e3d 24 }
nyatla 17:f29e1ca90e3d 25 void ModLocalFileSystem::setParam(const char* i_path)
nyatla 17:f29e1ca90e3d 26 {
nyatla 17:f29e1ca90e3d 27 ModBaseClass::setParam(i_path);
nyatla 17:f29e1ca90e3d 28 }
nyatla 17:f29e1ca90e3d 29
nyatla 17:f29e1ca90e3d 30
nyatla 17:f29e1ca90e3d 31 bool ModLocalFileSystem::execute(HttpdConnection& i_connection)
nyatla 17:f29e1ca90e3d 32 {
nyatla 17:f29e1ca90e3d 33 //check platform
nyatla 17:f29e1ca90e3d 34 //<write here! />
nyatla 17:f29e1ca90e3d 35
nyatla 17:f29e1ca90e3d 36 //check prefix
nyatla 17:f29e1ca90e3d 37 if(!this->canHandle(i_connection)){
nyatla 17:f29e1ca90e3d 38 return false;
nyatla 17:f29e1ca90e3d 39 }
nyatla 17:f29e1ca90e3d 40 //Httpd lock
nyatla 17:f29e1ca90e3d 41 i_connection.lockHttpd();
nyatla 17:f29e1ca90e3d 42
nyatla 17:f29e1ca90e3d 43 //set file path
nyatla 17:f29e1ca90e3d 44 {
nyatla 17:f29e1ca90e3d 45 //call ModUrl
nyatla 17:f29e1ca90e3d 46 NyLPC_TcModUrl_t mod;
nyatla 17:f29e1ca90e3d 47 NyLPC_cModUrl_initialize(&mod);
nyatla 17:f29e1ca90e3d 48 if(!NyLPC_cModUrl_execute2(&mod,i_connection._ref_inst,buf,ModLocalFile_SIZE_OF_BUF,0)){
nyatla 17:f29e1ca90e3d 49 NyLPC_cModUrl_finalize(&mod);
nyatla 17:f29e1ca90e3d 50 i_connection.releaseHttpd();
nyatla 17:f29e1ca90e3d 51 return true;
nyatla 17:f29e1ca90e3d 52 }
nyatla 17:f29e1ca90e3d 53 NyLPC_cModUrl_finalize(&mod);
nyatla 17:f29e1ca90e3d 54 }
nyatla 17:f29e1ca90e3d 55 // if path has '/?list' query key,return directory information
nyatla 17:f29e1ca90e3d 56 //otherwise FILE.
nyatla 17:f29e1ca90e3d 57 UrlReader url(buf);
nyatla 17:f29e1ca90e3d 58 if(url.hasQueryKey("list")){
nyatla 17:f29e1ca90e3d 59 //directory-list
nyatla 17:f29e1ca90e3d 60 const char* t;
nyatla 17:f29e1ca90e3d 61 int l;
nyatla 17:f29e1ca90e3d 62 url.getPath(t,l);
nyatla 17:f29e1ca90e3d 63 buf[l]='\0';//split path
nyatla 17:f29e1ca90e3d 64 //remove '/'
nyatla 17:f29e1ca90e3d 65 if(buf[l-1]=='/'){
nyatla 17:f29e1ca90e3d 66 buf[l-1]='\0';
nyatla 17:f29e1ca90e3d 67 }
nyatla 17:f29e1ca90e3d 68
nyatla 17:f29e1ca90e3d 69 DIR* d=opendir(buf);
nyatla 17:f29e1ca90e3d 70 if(NyLPC_cHttpdUtils_sendJsonHeader((i_connection._ref_inst))){
nyatla 17:f29e1ca90e3d 71 if ( d != NULL )
nyatla 17:f29e1ca90e3d 72 {
nyatla 17:f29e1ca90e3d 73 bool is_fatfs=(typeid(*d) == typeid(FATDirHandle));
nyatla 17:f29e1ca90e3d 74 struct dirent *p;
nyatla 17:f29e1ca90e3d 75 p = readdir(d);
nyatla 17:f29e1ca90e3d 76 i_connection.sendBodyF("{\"dir\":\"%s\",\"status\":200,\"list\":[",buf);
nyatla 17:f29e1ca90e3d 77 for(;;)
nyatla 17:f29e1ca90e3d 78 {
nyatla 17:f29e1ca90e3d 79 if(is_fatfs){
nyatla 17:f29e1ca90e3d 80 bool isdir=(((struct direntFAT*)(p))->fattrib & AM_DIR)!=0;
nyatla 17:f29e1ca90e3d 81 i_connection.sendBodyF("{\"name\":\"%s\",\"mtype\":\"%s\",\"size\":%u}",
nyatla 17:f29e1ca90e3d 82 p->d_name,isdir?"directory":NyLPC_cMiMeType_getFileName2MimeType(p->d_name),
nyatla 17:f29e1ca90e3d 83 isdir?0:((struct direntFAT*)(p))->fsize);
nyatla 17:f29e1ca90e3d 84 }else{
nyatla 17:f29e1ca90e3d 85 i_connection.sendBodyF("{\"name\":\"%s\",\"mtype\":\"%s\",\"size\":undefined}",
nyatla 17:f29e1ca90e3d 86 p->d_name,NyLPC_cMiMeType_getFileName2MimeType(p->d_name));
nyatla 17:f29e1ca90e3d 87 }
nyatla 17:f29e1ca90e3d 88 p = readdir(d);
nyatla 17:f29e1ca90e3d 89 if(p==NULL){
nyatla 17:f29e1ca90e3d 90 break;
nyatla 17:f29e1ca90e3d 91 }
nyatla 17:f29e1ca90e3d 92 i_connection.sendBodyF(",");
nyatla 17:f29e1ca90e3d 93 }
nyatla 17:f29e1ca90e3d 94 closedir(d);
nyatla 17:f29e1ca90e3d 95 i_connection.sendBodyF("]}");
nyatla 17:f29e1ca90e3d 96 }else{
nyatla 17:f29e1ca90e3d 97 i_connection.sendBodyF("{\"dir\":\"%s\",\"status\":404,\"list\":[]}",buf);
nyatla 17:f29e1ca90e3d 98 }
nyatla 17:f29e1ca90e3d 99 }
nyatla 17:f29e1ca90e3d 100 }else{
nyatla 17:f29e1ca90e3d 101 {//split URL path and query
nyatla 17:f29e1ca90e3d 102 const char* t;
nyatla 17:f29e1ca90e3d 103 int l;
nyatla 17:f29e1ca90e3d 104 url.getPath(t,l);
nyatla 17:f29e1ca90e3d 105 buf[l]='\0';
nyatla 17:f29e1ca90e3d 106 }
nyatla 17:f29e1ca90e3d 107 //return content
nyatla 17:f29e1ca90e3d 108 FILE *fp;
nyatla 17:f29e1ca90e3d 109 size_t sz;
nyatla 17:f29e1ca90e3d 110 //size
nyatla 17:f29e1ca90e3d 111 fp = fopen(buf, "r");
nyatla 17:f29e1ca90e3d 112 if(fp!=NULL){
nyatla 17:f29e1ca90e3d 113 fseek(fp, 0, SEEK_END); // seek to end of file
nyatla 17:f29e1ca90e3d 114 sz = ftell(fp); // get current file pointer
nyatla 17:f29e1ca90e3d 115 fseek(fp, 0, SEEK_SET); // seek back to beginning of file
nyatla 17:f29e1ca90e3d 116 if(i_connection.sendHeader(200,NyLPC_cMiMeType_getFileName2MimeType(buf),NULL,sz)){
nyatla 17:f29e1ca90e3d 117 for(;;){
nyatla 17:f29e1ca90e3d 118 sz=fread(buf,1,ModLocalFile_SIZE_OF_BUF,fp);
nyatla 17:f29e1ca90e3d 119 if(sz<1){
nyatla 17:f29e1ca90e3d 120 break;
nyatla 17:f29e1ca90e3d 121 }
nyatla 17:f29e1ca90e3d 122 if(!i_connection.sendBody(buf,sz)){
nyatla 17:f29e1ca90e3d 123 break;
nyatla 17:f29e1ca90e3d 124 }
nyatla 17:f29e1ca90e3d 125 // //switch transport thread
nyatla 17:f29e1ca90e3d 126 /* i_connection.releaseHttpd();
nyatla 17:f29e1ca90e3d 127 NyLPC_cThread_yield();
nyatla 17:f29e1ca90e3d 128 i_connection.lockHttpd();
nyatla 17:f29e1ca90e3d 129 */ }
nyatla 17:f29e1ca90e3d 130 }
nyatla 17:f29e1ca90e3d 131 fclose(fp);
nyatla 17:f29e1ca90e3d 132 }else{
nyatla 17:f29e1ca90e3d 133 i_connection.sendHeader(404,"text/html",NULL);
nyatla 17:f29e1ca90e3d 134 i_connection.sendBodyF("<html><body>'%s' not found.</body></html>",buf);
nyatla 17:f29e1ca90e3d 135 }
nyatla 17:f29e1ca90e3d 136 }
nyatla 17:f29e1ca90e3d 137 //Httpd unlock
nyatla 17:f29e1ca90e3d 138 i_connection.releaseHttpd();
nyatla 17:f29e1ca90e3d 139 return true;
nyatla 17:f29e1ca90e3d 140
nyatla 17:f29e1ca90e3d 141 }
nyatla 17:f29e1ca90e3d 142 }