LRSD stephane / Mbed 2 deprecated WEBserverv3

Dependencies:   mbed

Committer:
geiineuville
Date:
Thu Sep 08 08:57:21 2011 +0000
Revision:
0:9cf1d79ebe04
v0 v1 v2   \"v3\"

Who changed what in which revision?

UserRevisionLine numberNew contents of line
geiineuville 0:9cf1d79ebe04 1 #ifndef HTTPSTATICPAGE_H
geiineuville 0:9cf1d79ebe04 2 #define HTTPSTATICPAGE_H
geiineuville 0:9cf1d79ebe04 3
geiineuville 0:9cf1d79ebe04 4 #include "HTTPServer.h"
geiineuville 0:9cf1d79ebe04 5
geiineuville 0:9cf1d79ebe04 6 /**
geiineuville 0:9cf1d79ebe04 7 * A datastorage helper for the HTTPStaticPage class.
geiineuville 0:9cf1d79ebe04 8 * Stores only the left upload size.
geiineuville 0:9cf1d79ebe04 9 */
geiineuville 0:9cf1d79ebe04 10 class HTTPStaticPageData : public HTTPData {
geiineuville 0:9cf1d79ebe04 11 public: int left;
geiineuville 0:9cf1d79ebe04 12 };
geiineuville 0:9cf1d79ebe04 13
geiineuville 0:9cf1d79ebe04 14 /**
geiineuville 0:9cf1d79ebe04 15 * This class Provide a Handler to send Static HTTP Pages from the bin file.
geiineuville 0:9cf1d79ebe04 16 */
geiineuville 0:9cf1d79ebe04 17 class HTTPStaticPage : public HTTPHandler {
geiineuville 0:9cf1d79ebe04 18 public:
geiineuville 0:9cf1d79ebe04 19 /**
geiineuville 0:9cf1d79ebe04 20 * Constructer takes the pagename and the pagedata.
geiineuville 0:9cf1d79ebe04 21 * As long as the pagedata is NULL terminated you have not to tell the data length.
geiineuville 0:9cf1d79ebe04 22 * But if you want to send binary data you should tell us the size.
geiineuville 0:9cf1d79ebe04 23 */
geiineuville 0:9cf1d79ebe04 24 HTTPStaticPage(const char *path, const char *page, int length = 0)
geiineuville 0:9cf1d79ebe04 25 : HTTPHandler(path), _page(page) {
geiineuville 0:9cf1d79ebe04 26 _size = (length)?length:strlen(_page);
geiineuville 0:9cf1d79ebe04 27 }
geiineuville 0:9cf1d79ebe04 28
geiineuville 0:9cf1d79ebe04 29 HTTPStaticPage(HTTPServer *server, const char *path, const char *page, int length = 0)
geiineuville 0:9cf1d79ebe04 30 : HTTPHandler(path), _page(page) {
geiineuville 0:9cf1d79ebe04 31 _size = (length)?length:strlen(_page);
geiineuville 0:9cf1d79ebe04 32 server->addHandler(this);
geiineuville 0:9cf1d79ebe04 33 }
geiineuville 0:9cf1d79ebe04 34
geiineuville 0:9cf1d79ebe04 35 private:
geiineuville 0:9cf1d79ebe04 36 /**
geiineuville 0:9cf1d79ebe04 37 * A this Static Page is requested!
geiineuville 0:9cf1d79ebe04 38 * Prepare a datastorage helper "HTTPStaticPageHelper" to store the left data size.
geiineuville 0:9cf1d79ebe04 39 * And return HTTP_OK
geiineuville 0:9cf1d79ebe04 40 */
geiineuville 0:9cf1d79ebe04 41 virtual HTTPStatus init(HTTPConnection *con) const {
geiineuville 0:9cf1d79ebe04 42 HTTPStaticPageData *data = new HTTPStaticPageData();
geiineuville 0:9cf1d79ebe04 43 con->data = data;
geiineuville 0:9cf1d79ebe04 44 data->left = _size;
geiineuville 0:9cf1d79ebe04 45 con->setLength(_size);
geiineuville 0:9cf1d79ebe04 46 return HTTP_OK;
geiineuville 0:9cf1d79ebe04 47 }
geiineuville 0:9cf1d79ebe04 48
geiineuville 0:9cf1d79ebe04 49 /**
geiineuville 0:9cf1d79ebe04 50 * Send the maximum data out to the client.
geiineuville 0:9cf1d79ebe04 51 * If the file is complete transmitted close connection by returning HTTP_SuccessEnded
geiineuville 0:9cf1d79ebe04 52 */
geiineuville 0:9cf1d79ebe04 53 virtual HTTPHandle send(HTTPConnection *con, int maximum) const {
geiineuville 0:9cf1d79ebe04 54 HTTPStaticPageData *data = static_cast<HTTPStaticPageData *>(con->data);
geiineuville 0:9cf1d79ebe04 55 int len = min(maximum, data->left);
geiineuville 0:9cf1d79ebe04 56 err_t err;
geiineuville 0:9cf1d79ebe04 57
geiineuville 0:9cf1d79ebe04 58 do {
geiineuville 0:9cf1d79ebe04 59 err = con->write((void*)&_page[_size - data->left], len, 1);
geiineuville 0:9cf1d79ebe04 60 if(err == ERR_MEM) {
geiineuville 0:9cf1d79ebe04 61 len >>= 1;
geiineuville 0:9cf1d79ebe04 62 }
geiineuville 0:9cf1d79ebe04 63 } while(err == ERR_MEM && len > 1);
geiineuville 0:9cf1d79ebe04 64 if(err == ERR_OK) {
geiineuville 0:9cf1d79ebe04 65 data->left -= len;
geiineuville 0:9cf1d79ebe04 66 }
geiineuville 0:9cf1d79ebe04 67
geiineuville 0:9cf1d79ebe04 68 return (data->left)? HTTP_Success : HTTP_SuccessEnded;
geiineuville 0:9cf1d79ebe04 69 }
geiineuville 0:9cf1d79ebe04 70
geiineuville 0:9cf1d79ebe04 71 /** Pointer to the page data */
geiineuville 0:9cf1d79ebe04 72 const char *_page;
geiineuville 0:9cf1d79ebe04 73
geiineuville 0:9cf1d79ebe04 74 /** page data size*/
geiineuville 0:9cf1d79ebe04 75 int _size;
geiineuville 0:9cf1d79ebe04 76 };
geiineuville 0:9cf1d79ebe04 77
geiineuville 0:9cf1d79ebe04 78 #endif