Some quick code to use UDP-only (no TCP) with mBed. Echos received packets and sends packets when a button is pressed

Dependencies:   mbed

Committer:
pehrhovey
Date:
Sun Mar 14 00:54:12 2010 +0000
Revision:
0:a548a085de55

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pehrhovey 0:a548a085de55 1 #ifndef HTTPFILESYSTEM_H
pehrhovey 0:a548a085de55 2 #define HTTPFILESYSTEM_H
pehrhovey 0:a548a085de55 3
pehrhovey 0:a548a085de55 4 #include "mbed.h"
pehrhovey 0:a548a085de55 5
pehrhovey 0:a548a085de55 6 #include "HTTPServer.h"
pehrhovey 0:a548a085de55 7
pehrhovey 0:a548a085de55 8 #define HTTP_BUFFER_SIZE 700
pehrhovey 0:a548a085de55 9 #define FILENAMELANGTH 100
pehrhovey 0:a548a085de55 10
pehrhovey 0:a548a085de55 11 /**
pehrhovey 0:a548a085de55 12 * This class will store the data which are required for an request.
pehrhovey 0:a548a085de55 13 * We are not in every case able to return all data at once, that means we have to store
pehrhovey 0:a548a085de55 14 * the actual level of transmission.
pehrhovey 0:a548a085de55 15 */
pehrhovey 0:a548a085de55 16 class HTTPFileSystemData : public HTTPData {
pehrhovey 0:a548a085de55 17 public:
pehrhovey 0:a548a085de55 18 int fleft;
pehrhovey 0:a548a085de55 19 int bleft;
pehrhovey 0:a548a085de55 20 int offset;
pehrhovey 0:a548a085de55 21 FILE *file;
pehrhovey 0:a548a085de55 22 char buffer[HTTP_BUFFER_SIZE];
pehrhovey 0:a548a085de55 23
pehrhovey 0:a548a085de55 24 virtual ~HTTPFileSystemData() {
pehrhovey 0:a548a085de55 25 if(file) {
pehrhovey 0:a548a085de55 26 fclose(file);
pehrhovey 0:a548a085de55 27 file = 0;
pehrhovey 0:a548a085de55 28 }
pehrhovey 0:a548a085de55 29 }
pehrhovey 0:a548a085de55 30 };
pehrhovey 0:a548a085de55 31
pehrhovey 0:a548a085de55 32 /**
pehrhovey 0:a548a085de55 33 * This class will deliver files form the virtual file system.
pehrhovey 0:a548a085de55 34 * Furthermore it is a simple example how to implement an HTTPHandler for big data requests.
pehrhovey 0:a548a085de55 35 */
pehrhovey 0:a548a085de55 36 class HTTPFileSystemHandler : public HTTPHandler {
pehrhovey 0:a548a085de55 37 public:
pehrhovey 0:a548a085de55 38 /**
pehrhovey 0:a548a085de55 39 * Create a new HTTPFileSzstemHandler.
pehrhovey 0:a548a085de55 40 * @param prefix The Prefix is the URL Proefix in witch the Handler will work.
pehrhovey 0:a548a085de55 41 * @param dir The Prefix will be directly mappt on the dir.
pehrhovey 0:a548a085de55 42 */
pehrhovey 0:a548a085de55 43 HTTPFileSystemHandler(const char *path, const char *dir) : HTTPHandler(path), _dir(dir) {}
pehrhovey 0:a548a085de55 44 HTTPFileSystemHandler(HTTPServer *server, const char *path, const char *dir) : HTTPHandler(path), _dir(dir) { server->addHandler(this); }
pehrhovey 0:a548a085de55 45
pehrhovey 0:a548a085de55 46 private:
pehrhovey 0:a548a085de55 47 /**
pehrhovey 0:a548a085de55 48 * Check if a requested file exists.
pehrhovey 0:a548a085de55 49 * If it exists open it and store the data back in the HTTPConnection.
pehrhovey 0:a548a085de55 50 * We would not store connection specific data into the Handler.
pehrhovey 0:a548a085de55 51 * If the file exists and we cann serve a page return HTTP_OK else HTTP_NotFound.
pehrhovey 0:a548a085de55 52 * @param con The Connection which will be handled.
pehrhovey 0:a548a085de55 53 */
pehrhovey 0:a548a085de55 54 virtual HTTPStatus init(HTTPConnection *con) const {
pehrhovey 0:a548a085de55 55 char filename[FILENAMELANGTH];
pehrhovey 0:a548a085de55 56 HTTPFileSystemData *data = new HTTPFileSystemData();
pehrhovey 0:a548a085de55 57 snprintf(filename, FILENAMELANGTH, "%s%s\0", _dir, con->getURL() + strlen(_prefix));
pehrhovey 0:a548a085de55 58 data->file = fopen(filename, "r");
pehrhovey 0:a548a085de55 59 if(!data->file) {
pehrhovey 0:a548a085de55 60 delete data;
pehrhovey 0:a548a085de55 61 return HTTP_NotFound;
pehrhovey 0:a548a085de55 62 }
pehrhovey 0:a548a085de55 63 data->fleft = fleft(data->file);
pehrhovey 0:a548a085de55 64 data->bleft = 0;
pehrhovey 0:a548a085de55 65 data->offset = 0;
pehrhovey 0:a548a085de55 66
pehrhovey 0:a548a085de55 67 con->data = data;
pehrhovey 0:a548a085de55 68 con->setLength(data->fleft);
pehrhovey 0:a548a085de55 69 loadFromFile(con);
pehrhovey 0:a548a085de55 70 return HTTP_OK;
pehrhovey 0:a548a085de55 71 }
pehrhovey 0:a548a085de55 72
pehrhovey 0:a548a085de55 73 /**
pehrhovey 0:a548a085de55 74 * Send the maximum available data chunk to the Client.
pehrhovey 0:a548a085de55 75 * If it is the last chunk close connection by returning HTTP_SuccessEnded
pehrhovey 0:a548a085de55 76 * @param con The connection to handle
pehrhovey 0:a548a085de55 77 * @param maximum The maximal available sendbuffer size.
pehrhovey 0:a548a085de55 78 * @return HTTP_Success when mor data is available or HTTP_SuccessEnded when the file is complete.
pehrhovey 0:a548a085de55 79 */
pehrhovey 0:a548a085de55 80 virtual HTTPHandle send(HTTPConnection *con, int maximum) const {
pehrhovey 0:a548a085de55 81 HTTPFileSystemData *data = static_cast<HTTPFileSystemData *>(con->data);
pehrhovey 0:a548a085de55 82 err_t err;
pehrhovey 0:a548a085de55 83 u16_t len = min(data->bleft, maximum);
pehrhovey 0:a548a085de55 84 // printf("Send File\n");
pehrhovey 0:a548a085de55 85 if(len) {
pehrhovey 0:a548a085de55 86 do {
pehrhovey 0:a548a085de55 87 err = con->write(
pehrhovey 0:a548a085de55 88 &data->buffer[data->offset], len, (((!data->fleft)&&(data->bleft==len))?
pehrhovey 0:a548a085de55 89 (TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE) : (TCP_WRITE_FLAG_COPY)));
pehrhovey 0:a548a085de55 90 if(err == ERR_MEM) {
pehrhovey 0:a548a085de55 91 len /= 2;
pehrhovey 0:a548a085de55 92 }
pehrhovey 0:a548a085de55 93 } while (err == ERR_MEM && len > 1);
pehrhovey 0:a548a085de55 94
pehrhovey 0:a548a085de55 95 if(err == ERR_OK) {
pehrhovey 0:a548a085de55 96 data->offset += len;
pehrhovey 0:a548a085de55 97 data->bleft -= len;
pehrhovey 0:a548a085de55 98 }
pehrhovey 0:a548a085de55 99 }
pehrhovey 0:a548a085de55 100 return loadFromFile(con);
pehrhovey 0:a548a085de55 101 }
pehrhovey 0:a548a085de55 102
pehrhovey 0:a548a085de55 103 /**
pehrhovey 0:a548a085de55 104 * Returns the left size of a file.
pehrhovey 0:a548a085de55 105 * @param fd The filehandler of which we want to know the filesize.
pehrhovey 0:a548a085de55 106 * @return The filesize of fd.
pehrhovey 0:a548a085de55 107 */
pehrhovey 0:a548a085de55 108 long fleft(FILE *fd) const {
pehrhovey 0:a548a085de55 109 long len, cur;
pehrhovey 0:a548a085de55 110 cur = ftell(fd);
pehrhovey 0:a548a085de55 111 fseek(fd, 0, SEEK_END);
pehrhovey 0:a548a085de55 112 len = ftell(fd);
pehrhovey 0:a548a085de55 113 fseek(fd, cur, SEEK_SET);
pehrhovey 0:a548a085de55 114 return len;
pehrhovey 0:a548a085de55 115 }
pehrhovey 0:a548a085de55 116
pehrhovey 0:a548a085de55 117 /**
pehrhovey 0:a548a085de55 118 * Fill the buffer if the buffer is empty.
pehrhovey 0:a548a085de55 119 * If the file is complete close the filehandler and return HTTP_SuccessEnded.
pehrhovey 0:a548a085de55 120 */
pehrhovey 0:a548a085de55 121 HTTPHandle loadFromFile(HTTPConnection *con) const {
pehrhovey 0:a548a085de55 122 HTTPFileSystemData *data = static_cast<HTTPFileSystemData *>(con->data);
pehrhovey 0:a548a085de55 123 if(!data->bleft) {
pehrhovey 0:a548a085de55 124 if(data->fleft) {
pehrhovey 0:a548a085de55 125 int len = fread(&data->buffer[0], sizeof(char), HTTP_BUFFER_SIZE, data->file);
pehrhovey 0:a548a085de55 126 data->fleft -= len;
pehrhovey 0:a548a085de55 127 data->bleft = len;
pehrhovey 0:a548a085de55 128 data->offset = 0;
pehrhovey 0:a548a085de55 129 } else {
pehrhovey 0:a548a085de55 130 if(data->file) {
pehrhovey 0:a548a085de55 131 fclose(data->file);
pehrhovey 0:a548a085de55 132 data->file = 0;
pehrhovey 0:a548a085de55 133 }
pehrhovey 0:a548a085de55 134 return HTTP_SuccessEnded;
pehrhovey 0:a548a085de55 135 }
pehrhovey 0:a548a085de55 136 }
pehrhovey 0:a548a085de55 137 return HTTP_Success;
pehrhovey 0:a548a085de55 138 }
pehrhovey 0:a548a085de55 139
pehrhovey 0:a548a085de55 140 /** The Directory which will replace the prefix of the URL */
pehrhovey 0:a548a085de55 141 const char *_dir;
pehrhovey 0:a548a085de55 142 };
pehrhovey 0:a548a085de55 143
pehrhovey 0:a548a085de55 144 #endif