LRSD stephane / Mbed 2 deprecated WEBserverv1

Dependencies:   mbed

Committer:
geiineuville
Date:
Sat Sep 03 09:42:32 2011 +0000
Revision:
0:4570f87afab6
v1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
geiineuville 0:4570f87afab6 1 #ifndef HTTPDYNAMICPAGE_H
geiineuville 0:4570f87afab6 2 #define HTTPDYNAMICPAGE_H
geiineuville 0:4570f87afab6 3
geiineuville 0:4570f87afab6 4 #include "HTTPServer.h"
geiineuville 0:4570f87afab6 5
geiineuville 0:4570f87afab6 6 /**
geiineuville 0:4570f87afab6 7 * A datastorage helper for the HTTPDynamicPage class.
geiineuville 0:4570f87afab6 8 * Stores dynamically created page data and the size left to upload.
geiineuville 0:4570f87afab6 9 */
geiineuville 0:4570f87afab6 10 class HTTPDynamicPageData : public HTTPData {
geiineuville 0:4570f87afab6 11 public:
geiineuville 0:4570f87afab6 12 HTTPDynamicPageData()
geiineuville 0:4570f87afab6 13 : page_free(NULL), page(NULL), size(0), _left(0) {}
geiineuville 0:4570f87afab6 14 virtual ~HTTPDynamicPageData() {
geiineuville 0:4570f87afab6 15 if (page_free && page) {
geiineuville 0:4570f87afab6 16 page_free(page);
geiineuville 0:4570f87afab6 17 }
geiineuville 0:4570f87afab6 18 }
geiineuville 0:4570f87afab6 19
geiineuville 0:4570f87afab6 20 /** Pointer to garbage collection function (for freeing page data)
geiineuville 0:4570f87afab6 21 * Should be set by callback function to a suitable free() if page is dynamically allocated
geiineuville 0:4570f87afab6 22 */
geiineuville 0:4570f87afab6 23 void (*page_free)(void *page);
geiineuville 0:4570f87afab6 24
geiineuville 0:4570f87afab6 25 /** Pointer to the page data */
geiineuville 0:4570f87afab6 26 char *page;
geiineuville 0:4570f87afab6 27
geiineuville 0:4570f87afab6 28 /** Page data size
geiineuville 0:4570f87afab6 29 * As long as the page is NULL terminated you don't have to tell the data length.
geiineuville 0:4570f87afab6 30 * But if you want to send binary data you should tell us the size.
geiineuville 0:4570f87afab6 31 */
geiineuville 0:4570f87afab6 32 int size;
geiineuville 0:4570f87afab6 33
geiineuville 0:4570f87afab6 34 /** Page data size left for the upload */
geiineuville 0:4570f87afab6 35 int _left;
geiineuville 0:4570f87afab6 36 };
geiineuville 0:4570f87afab6 37
geiineuville 0:4570f87afab6 38 /**
geiineuville 0:4570f87afab6 39 * This class Provide a Handler to send Static HTTP Pages from the bin file.
geiineuville 0:4570f87afab6 40 */
geiineuville 0:4570f87afab6 41 class HTTPDynamicPage : public HTTPHandler {
geiineuville 0:4570f87afab6 42 public:
geiineuville 0:4570f87afab6 43 /**
geiineuville 0:4570f87afab6 44 * Constructor takes the page path and the page callback function.
geiineuville 0:4570f87afab6 45 */
geiineuville 0:4570f87afab6 46 HTTPDynamicPage(const char *path, HTTPStatus page_fnc(HTTPConnection *con, HTTPDynamicPageData *pd))
geiineuville 0:4570f87afab6 47 : HTTPHandler(path), _page_fnc(page_fnc) {
geiineuville 0:4570f87afab6 48 }
geiineuville 0:4570f87afab6 49
geiineuville 0:4570f87afab6 50 HTTPDynamicPage(HTTPServer *server, const char *path, HTTPStatus page_fnc(HTTPConnection *con, HTTPDynamicPageData *pd))
geiineuville 0:4570f87afab6 51 : HTTPHandler(path), _page_fnc(page_fnc) {
geiineuville 0:4570f87afab6 52 server->addHandler(this);
geiineuville 0:4570f87afab6 53 }
geiineuville 0:4570f87afab6 54
geiineuville 0:4570f87afab6 55 private:
geiineuville 0:4570f87afab6 56 /**
geiineuville 0:4570f87afab6 57 * This Dynamic Page is requested!
geiineuville 0:4570f87afab6 58 * Prepare a datastorage helper "HTTPDynamicPageData", create the page and store in helper, then initialize remaining data size.
geiineuville 0:4570f87afab6 59 * And return HTTP_OK if all ok.
geiineuville 0:4570f87afab6 60 */
geiineuville 0:4570f87afab6 61 virtual HTTPStatus init(HTTPConnection *con) const {
geiineuville 0:4570f87afab6 62 HTTPDynamicPageData *data = new HTTPDynamicPageData();
geiineuville 0:4570f87afab6 63 con->data = data;
geiineuville 0:4570f87afab6 64 HTTPStatus status = _page_fnc(con, data); // assigns data->page, data->size and optionally data->page_free
geiineuville 0:4570f87afab6 65 if (!data->size && data->page)
geiineuville 0:4570f87afab6 66 data->size = strlen(data->page);
geiineuville 0:4570f87afab6 67 data->_left = data->size;
geiineuville 0:4570f87afab6 68 con->setLength(data->size);
geiineuville 0:4570f87afab6 69 return status;
geiineuville 0:4570f87afab6 70 }
geiineuville 0:4570f87afab6 71
geiineuville 0:4570f87afab6 72 /**
geiineuville 0:4570f87afab6 73 * Send the maximum data out to the client.
geiineuville 0:4570f87afab6 74 * If the file is complete transmitted close connection by returning HTTP_SuccessEnded
geiineuville 0:4570f87afab6 75 */
geiineuville 0:4570f87afab6 76 virtual HTTPHandle send(HTTPConnection *con, int maximum) const {
geiineuville 0:4570f87afab6 77 HTTPDynamicPageData *data = static_cast<HTTPDynamicPageData *>(con->data);
geiineuville 0:4570f87afab6 78 int len = min(maximum, data->_left);
geiineuville 0:4570f87afab6 79 err_t err;
geiineuville 0:4570f87afab6 80
geiineuville 0:4570f87afab6 81 do {
geiineuville 0:4570f87afab6 82 err = con->write((void*)&data->page[data->size - data->_left], len, 1);
geiineuville 0:4570f87afab6 83 if (err == ERR_MEM) {
geiineuville 0:4570f87afab6 84 len >>= 1;
geiineuville 0:4570f87afab6 85 }
geiineuville 0:4570f87afab6 86 } while(err == ERR_MEM && len > 1);
geiineuville 0:4570f87afab6 87 if (err == ERR_OK) {
geiineuville 0:4570f87afab6 88 data->_left -= len;
geiineuville 0:4570f87afab6 89 }
geiineuville 0:4570f87afab6 90 return (data->_left) ? HTTP_Success : HTTP_SuccessEnded;
geiineuville 0:4570f87afab6 91 }
geiineuville 0:4570f87afab6 92
geiineuville 0:4570f87afab6 93 HTTPStatus (*_page_fnc)(HTTPConnection *con, HTTPDynamicPageData *pd);
geiineuville 0:4570f87afab6 94 };
geiineuville 0:4570f87afab6 95
geiineuville 0:4570f87afab6 96 #endif