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