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@18:ad5c461905bd, 2018-03-23 (annotated)
- Committer:
- aktk
- Date:
- Fri Mar 23 07:40:26 2018 +0000
- Revision:
- 18:ad5c461905bd
- Parent:
- handlers/Filehandler.cpp@17:ce5845164001
rename: Filehandler.h -> FileHandler.h
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
aktk | 0:cc483bea4fe3 | 1 | #include "FileHandler.h" |
aktk | 16:c3920b5b8572 | 2 | //#ifndef DEBUG |
aktk | 16:c3920b5b8572 | 3 | #define FILE_HANDLER_DEBUG |
aktk | 16:c3920b5b8572 | 4 | //#endif |
aktk | 17:ce5845164001 | 5 | LocalFileSystem local("local"); |
aktk | 16:c3920b5b8572 | 6 | |
aktk | 16:c3920b5b8572 | 7 | namespace FILE_HANDLER |
aktk | 16:c3920b5b8572 | 8 | { |
aktk | 16:c3920b5b8572 | 9 | void DEBUG_PRINT_NAME() |
aktk | 16:c3920b5b8572 | 10 | { |
aktk | 16:c3920b5b8572 | 11 | #ifdef FILE_HANDLER_DEBUG |
aktk | 16:c3920b5b8572 | 12 | printf("(DEBUG LINE: FILE_HANDLER) "); |
aktk | 16:c3920b5b8572 | 13 | #endif |
aktk | 16:c3920b5b8572 | 14 | } |
aktk | 16:c3920b5b8572 | 15 | |
aktk | 16:c3920b5b8572 | 16 | void DEBUG_PRINT_LINE(const char* arg_line) |
aktk | 16:c3920b5b8572 | 17 | { |
aktk | 16:c3920b5b8572 | 18 | #ifdef FILE_HANDLER_DEBUG |
aktk | 16:c3920b5b8572 | 19 | DEBUG_PRINT_NAME(); |
aktk | 16:c3920b5b8572 | 20 | printf(arg_line); |
aktk | 16:c3920b5b8572 | 21 | printf("\r\n"); |
aktk | 0:cc483bea4fe3 | 22 | #endif |
aktk | 16:c3920b5b8572 | 23 | } |
aktk | 16:c3920b5b8572 | 24 | template<typename T> |
aktk | 16:c3920b5b8572 | 25 | void DEBUG_PRINT_LINE(const char* arg_line, T arg_t) |
aktk | 16:c3920b5b8572 | 26 | { |
aktk | 16:c3920b5b8572 | 27 | #ifdef FILE_HANDLER_DEBUG |
aktk | 16:c3920b5b8572 | 28 | DEBUG_PRINT_NAME(); |
aktk | 16:c3920b5b8572 | 29 | printf(arg_line, arg_t); |
aktk | 16:c3920b5b8572 | 30 | printf("\r\n"); |
aktk | 16:c3920b5b8572 | 31 | #endif |
aktk | 16:c3920b5b8572 | 32 | } |
aktk | 16:c3920b5b8572 | 33 | template<typename T1, typename T2> |
aktk | 16:c3920b5b8572 | 34 | void DEBUG_PRINT_LINE(const char* arg_line, T1 arg_t1, T2 arg_t2) |
aktk | 16:c3920b5b8572 | 35 | { |
aktk | 16:c3920b5b8572 | 36 | #ifdef FILE_HANDLER_DEBUG |
aktk | 16:c3920b5b8572 | 37 | DEBUG_PRINT_NAME(); |
aktk | 16:c3920b5b8572 | 38 | printf(arg_line, arg_t1, arg_t2); |
aktk | 16:c3920b5b8572 | 39 | printf("\r\n"); |
aktk | 16:c3920b5b8572 | 40 | #endif |
aktk | 16:c3920b5b8572 | 41 | } |
aktk | 16:c3920b5b8572 | 42 | } |
aktk | 16:c3920b5b8572 | 43 | using namespace FILE_HANDLER; |
aktk | 16:c3920b5b8572 | 44 | |
aktk | 0:cc483bea4fe3 | 45 | FileHandler::FileHandler() |
aktk | 0:cc483bea4fe3 | 46 | { |
aktk | 0:cc483bea4fe3 | 47 | fullpath = NULL; |
aktk | 0:cc483bea4fe3 | 48 | filename = NULL; |
aktk | 0:cc483bea4fe3 | 49 | suffix = NULL; |
aktk | 0:cc483bea4fe3 | 50 | fp = NULL; |
aktk | 0:cc483bea4fe3 | 51 | file_size = 0; |
aktk | 0:cc483bea4fe3 | 52 | } |
aktk | 0:cc483bea4fe3 | 53 | FileHandler::~FileHandler() |
aktk | 0:cc483bea4fe3 | 54 | { |
aktk | 0:cc483bea4fe3 | 55 | if (fullpath != NULL) free(fullpath); |
aktk | 0:cc483bea4fe3 | 56 | if (fp != NULL) fclose(fp); |
aktk | 0:cc483bea4fe3 | 57 | } |
aktk | 0:cc483bea4fe3 | 58 | |
aktk | 0:cc483bea4fe3 | 59 | FILE* FileHandler::open |
aktk | 0:cc483bea4fe3 | 60 | ( const char* arg_filepath, |
aktk | 0:cc483bea4fe3 | 61 | const char* arg_mode |
aktk | 0:cc483bea4fe3 | 62 | ) |
aktk | 0:cc483bea4fe3 | 63 | { |
aktk | 0:cc483bea4fe3 | 64 | FILE *tmp; |
aktk | 0:cc483bea4fe3 | 65 | |
aktk | 17:ce5845164001 | 66 | DEBUG_PRINT_LINE("fp: %d", fp); |
aktk | 0:cc483bea4fe3 | 67 | if (fullpath != NULL) free(fullpath); |
aktk | 17:ce5845164001 | 68 | // Allocating memory for fullpath; |
aktk | 17:ce5845164001 | 69 | // [[+ strlen("index.htm") + 1]] at the end of line is ONLY a MARGIN allowed for concatenating the string. |
aktk | 0:cc483bea4fe3 | 70 | fullpath = (char*)malloc(sizeof(char) * (strlen("/local/") + strlen(arg_filepath) + strlen("index.htm") + 1)); |
aktk | 0:cc483bea4fe3 | 71 | |
aktk | 0:cc483bea4fe3 | 72 | // Path formatting |
aktk | 0:cc483bea4fe3 | 73 | if (arg_filepath[0] == '/') { |
aktk | 0:cc483bea4fe3 | 74 | sprintf(fullpath, "/local/%s", arg_filepath + 1); |
aktk | 0:cc483bea4fe3 | 75 | } else { |
aktk | 0:cc483bea4fe3 | 76 | sprintf(fullpath, "/local/%s", arg_filepath); |
aktk | 0:cc483bea4fe3 | 77 | } |
aktk | 0:cc483bea4fe3 | 78 | // if the argument has no file name but directory, defalt settiing. |
aktk | 0:cc483bea4fe3 | 79 | if (fullpath[strlen(fullpath) - 1] == '/') |
aktk | 0:cc483bea4fe3 | 80 | strcat(fullpath, "index.htm"); |
aktk | 17:ce5845164001 | 81 | DEBUG_PRINT_LINE("full-file-path: %s", fullpath); |
aktk | 16:c3920b5b8572 | 82 | // store the file name part into a pointer |
aktk | 0:cc483bea4fe3 | 83 | filename = strrchr(fullpath, '/'); |
aktk | 17:ce5845164001 | 84 | // remove '/' and just get only the file name. |
aktk | 17:ce5845164001 | 85 | if(filename != NULL) filename++; |
aktk | 0:cc483bea4fe3 | 86 | // store the suffix part to a pointer |
aktk | 0:cc483bea4fe3 | 87 | suffix = strchr(filename, '.'); |
aktk | 17:ce5845164001 | 88 | // remove '.' and just get only the suffix. |
aktk | 17:ce5845164001 | 89 | if(suffix != NULL) suffix++; |
aktk | 17:ce5845164001 | 90 | DEBUG_PRINT_LINE("!!Public function check..."); |
aktk | 17:ce5845164001 | 91 | DEBUG_PRINT_LINE(" full path: %s", getFullpath()); |
aktk | 17:ce5845164001 | 92 | DEBUG_PRINT_LINE(" filename : %s", getFilename()); |
aktk | 17:ce5845164001 | 93 | DEBUG_PRINT_LINE(" suffix : %s", getSuffix()); |
aktk | 17:ce5845164001 | 94 | DEBUG_PRINT_LINE("...DONE!!"); |
aktk | 17:ce5845164001 | 95 | DEBUG_PRINT_LINE("fopen(...)"); |
aktk | 17:ce5845164001 | 96 | DEBUG_PRINT_LINE(" path: %s", fullpath); |
aktk | 17:ce5845164001 | 97 | DEBUG_PRINT_LINE(" mode: %s", arg_mode); |
aktk | 0:cc483bea4fe3 | 98 | fp = fopen(fullpath, arg_mode); |
aktk | 17:ce5845164001 | 99 | if(fp != NULL) { |
aktk | 17:ce5845164001 | 100 | DEBUG_PRINT_LINE("file opened"); |
aktk | 17:ce5845164001 | 101 | DEBUG_PRINT_LINE("fp: %d", fp); |
aktk | 17:ce5845164001 | 102 | } else { |
aktk | 17:ce5845164001 | 103 | DEBUG_PRINT_LINE("Something is wrong @fopen(...)"); |
aktk | 17:ce5845164001 | 104 | } |
aktk | 0:cc483bea4fe3 | 105 | // mesure file size |
aktk | 0:cc483bea4fe3 | 106 | file_size = 0; |
aktk | 0:cc483bea4fe3 | 107 | tmp = fp; |
aktk | 0:cc483bea4fe3 | 108 | if(tmp != NULL ) { |
aktk | 11:0ee7d100db24 | 109 | ////printf("\r\nfile content\r\n"); |
aktk | 0:cc483bea4fe3 | 110 | int ctmp; |
aktk | 0:cc483bea4fe3 | 111 | while(1) { |
aktk | 0:cc483bea4fe3 | 112 | ctmp = fgetc(tmp); |
aktk | 0:cc483bea4fe3 | 113 | if(ctmp != EOF) { |
aktk | 11:0ee7d100db24 | 114 | //////printf("%c", ctmp); |
aktk | 0:cc483bea4fe3 | 115 | file_size++; |
aktk | 0:cc483bea4fe3 | 116 | } else { |
aktk | 11:0ee7d100db24 | 117 | //////printf("[EOF]\r\n"); |
aktk | 0:cc483bea4fe3 | 118 | break; |
aktk | 0:cc483bea4fe3 | 119 | } |
aktk | 0:cc483bea4fe3 | 120 | } |
aktk | 11:0ee7d100db24 | 121 | ////printf("file size: %d\r\n", file_size); |
aktk | 0:cc483bea4fe3 | 122 | if(fseek(tmp, 0L, SEEK_SET) != 0) { |
aktk | 11:0ee7d100db24 | 123 | //////printf("fseek failed\r\n"); |
aktk | 0:cc483bea4fe3 | 124 | } |
aktk | 0:cc483bea4fe3 | 125 | } else { |
aktk | 0:cc483bea4fe3 | 126 | file_size = 0; |
aktk | 0:cc483bea4fe3 | 127 | } |
aktk | 0:cc483bea4fe3 | 128 | |
aktk | 0:cc483bea4fe3 | 129 | return fp; |
aktk | 0:cc483bea4fe3 | 130 | } |
aktk | 0:cc483bea4fe3 | 131 | int FileHandler::close() |
aktk | 0:cc483bea4fe3 | 132 | { |
aktk | 0:cc483bea4fe3 | 133 | int tmp; |
aktk | 7:184c6f1ace94 | 134 | |
aktk | 7:184c6f1ace94 | 135 | if(fp != NULL) { |
aktk | 0:cc483bea4fe3 | 136 | tmp = fclose(fp); |
aktk | 0:cc483bea4fe3 | 137 | fp = NULL; |
aktk | 0:cc483bea4fe3 | 138 | return tmp; |
aktk | 7:184c6f1ace94 | 139 | } else { |
aktk | 0:cc483bea4fe3 | 140 | return 1; |
aktk | 0:cc483bea4fe3 | 141 | } |
aktk | 0:cc483bea4fe3 | 142 | } |
aktk | 0:cc483bea4fe3 | 143 | |
aktk | 0:cc483bea4fe3 | 144 | int FileHandler::getc() |
aktk | 0:cc483bea4fe3 | 145 | { |
aktk | 0:cc483bea4fe3 | 146 | int tmp = fgetc(fp); |
aktk | 11:0ee7d100db24 | 147 | #ifdef DEBUG |
aktk | 0:cc483bea4fe3 | 148 | if(0x20 < tmp && tmp < 0x7e) |
aktk | 0:cc483bea4fe3 | 149 | printf("%c", tmp); |
aktk | 0:cc483bea4fe3 | 150 | else if (tmp == '\r') |
aktk | 0:cc483bea4fe3 | 151 | printf("\r"); |
aktk | 0:cc483bea4fe3 | 152 | else if (tmp == '\n') |
aktk | 0:cc483bea4fe3 | 153 | printf("\n"); |
aktk | 0:cc483bea4fe3 | 154 | else |
aktk | 0:cc483bea4fe3 | 155 | printf("@"); |
aktk | 11:0ee7d100db24 | 156 | #endif |
aktk | 11:0ee7d100db24 | 157 | return tmp; |
aktk | 0:cc483bea4fe3 | 158 | } |
aktk | 0:cc483bea4fe3 | 159 | bool FileHandler::arrival() |
aktk | 0:cc483bea4fe3 | 160 | { |
aktk | 0:cc483bea4fe3 | 161 | return (bool)fp; |
aktk | 0:cc483bea4fe3 | 162 | } |
aktk | 0:cc483bea4fe3 | 163 | bool FileHandler::atEOF() |
aktk | 0:cc483bea4fe3 | 164 | { |
aktk | 0:cc483bea4fe3 | 165 | return (bool)feof(fp); |
aktk | 0:cc483bea4fe3 | 166 | } |
aktk | 0:cc483bea4fe3 | 167 | bool FileHandler::hasError() |
aktk | 0:cc483bea4fe3 | 168 | { |
aktk | 0:cc483bea4fe3 | 169 | return (bool)ferror(fp); |
aktk | 0:cc483bea4fe3 | 170 | } |
aktk | 0:cc483bea4fe3 | 171 | char *FileHandler::getFullpath() |
aktk | 0:cc483bea4fe3 | 172 | { |
aktk | 0:cc483bea4fe3 | 173 | return fullpath; |
aktk | 0:cc483bea4fe3 | 174 | } |
aktk | 0:cc483bea4fe3 | 175 | char *FileHandler::getFilename() |
aktk | 0:cc483bea4fe3 | 176 | { |
aktk | 0:cc483bea4fe3 | 177 | return filename; |
aktk | 0:cc483bea4fe3 | 178 | } |
aktk | 0:cc483bea4fe3 | 179 | char *FileHandler::getSuffix() |
aktk | 0:cc483bea4fe3 | 180 | { |
aktk | 0:cc483bea4fe3 | 181 | return suffix; |
aktk | 0:cc483bea4fe3 | 182 | } |
aktk | 0:cc483bea4fe3 | 183 | int FileHandler::getFileSize() |
aktk | 0:cc483bea4fe3 | 184 | { |
aktk | 0:cc483bea4fe3 | 185 | return file_size; |
aktk | 0:cc483bea4fe3 | 186 | } |