The lib with which to make LPC1768 a simple HTTP server. This have not yet implemented. fopen() DOESN'T WORK after EthernetInterface::connect() is called as using mbed-os 5.4~. See also https://os.mbed.com/questions/80658/HardFault-occurs-when-fopen-is-called-af/ or https://github.com/ARMmbed/mbed-os/issues/6578 and https://github.com/ARMmbed/mbed-os/issues/6624
Fork of HTTP_SERVER by
handlers/FileHandler.cpp
- Committer:
- aktk
- Date:
- 2018-03-23
- Revision:
- 18:ad5c461905bd
- Parent:
- handlers/Filehandler.cpp@ 17:ce5845164001
File content as of revision 18:ad5c461905bd:
#include "FileHandler.h" //#ifndef DEBUG #define FILE_HANDLER_DEBUG //#endif LocalFileSystem local("local"); namespace FILE_HANDLER { void DEBUG_PRINT_NAME() { #ifdef FILE_HANDLER_DEBUG printf("(DEBUG LINE: FILE_HANDLER) "); #endif } void DEBUG_PRINT_LINE(const char* arg_line) { #ifdef FILE_HANDLER_DEBUG DEBUG_PRINT_NAME(); printf(arg_line); printf("\r\n"); #endif } template<typename T> void DEBUG_PRINT_LINE(const char* arg_line, T arg_t) { #ifdef FILE_HANDLER_DEBUG DEBUG_PRINT_NAME(); printf(arg_line, arg_t); printf("\r\n"); #endif } template<typename T1, typename T2> void DEBUG_PRINT_LINE(const char* arg_line, T1 arg_t1, T2 arg_t2) { #ifdef FILE_HANDLER_DEBUG DEBUG_PRINT_NAME(); printf(arg_line, arg_t1, arg_t2); printf("\r\n"); #endif } } using namespace FILE_HANDLER; FileHandler::FileHandler() { fullpath = NULL; filename = NULL; suffix = NULL; fp = NULL; file_size = 0; } FileHandler::~FileHandler() { if (fullpath != NULL) free(fullpath); if (fp != NULL) fclose(fp); } FILE* FileHandler::open ( const char* arg_filepath, const char* arg_mode ) { FILE *tmp; DEBUG_PRINT_LINE("fp: %d", fp); if (fullpath != NULL) free(fullpath); // Allocating memory for fullpath; // [[+ strlen("index.htm") + 1]] at the end of line is ONLY a MARGIN allowed for concatenating the string. fullpath = (char*)malloc(sizeof(char) * (strlen("/local/") + strlen(arg_filepath) + strlen("index.htm") + 1)); // Path formatting if (arg_filepath[0] == '/') { sprintf(fullpath, "/local/%s", arg_filepath + 1); } else { sprintf(fullpath, "/local/%s", arg_filepath); } // if the argument has no file name but directory, defalt settiing. if (fullpath[strlen(fullpath) - 1] == '/') strcat(fullpath, "index.htm"); DEBUG_PRINT_LINE("full-file-path: %s", fullpath); // store the file name part into a pointer filename = strrchr(fullpath, '/'); // remove '/' and just get only the file name. if(filename != NULL) filename++; // store the suffix part to a pointer suffix = strchr(filename, '.'); // remove '.' and just get only the suffix. if(suffix != NULL) suffix++; DEBUG_PRINT_LINE("!!Public function check..."); DEBUG_PRINT_LINE(" full path: %s", getFullpath()); DEBUG_PRINT_LINE(" filename : %s", getFilename()); DEBUG_PRINT_LINE(" suffix : %s", getSuffix()); DEBUG_PRINT_LINE("...DONE!!"); DEBUG_PRINT_LINE("fopen(...)"); DEBUG_PRINT_LINE(" path: %s", fullpath); DEBUG_PRINT_LINE(" mode: %s", arg_mode); fp = fopen(fullpath, arg_mode); if(fp != NULL) { DEBUG_PRINT_LINE("file opened"); DEBUG_PRINT_LINE("fp: %d", fp); } else { DEBUG_PRINT_LINE("Something is wrong @fopen(...)"); } // mesure file size file_size = 0; tmp = fp; if(tmp != NULL ) { ////printf("\r\nfile content\r\n"); int ctmp; while(1) { ctmp = fgetc(tmp); if(ctmp != EOF) { //////printf("%c", ctmp); file_size++; } else { //////printf("[EOF]\r\n"); break; } } ////printf("file size: %d\r\n", file_size); if(fseek(tmp, 0L, SEEK_SET) != 0) { //////printf("fseek failed\r\n"); } } else { file_size = 0; } return fp; } int FileHandler::close() { int tmp; if(fp != NULL) { tmp = fclose(fp); fp = NULL; return tmp; } else { return 1; } } int FileHandler::getc() { int tmp = fgetc(fp); #ifdef DEBUG if(0x20 < tmp && tmp < 0x7e) printf("%c", tmp); else if (tmp == '\r') printf("\r"); else if (tmp == '\n') printf("\n"); else printf("@"); #endif return tmp; } bool FileHandler::arrival() { return (bool)fp; } bool FileHandler::atEOF() { return (bool)feof(fp); } bool FileHandler::hasError() { return (bool)ferror(fp); } char *FileHandler::getFullpath() { return fullpath; } char *FileHandler::getFilename() { return filename; } char *FileHandler::getSuffix() { return suffix; } int FileHandler::getFileSize() { return file_size; }