ported HTTP-Server with W5500 Ethernet Shield

Dependencies:   W5500Interface mbed-rpc mbed

Fork of HTTP-Server by Francois Berder

Revision:
0:9e4bcb10b3e3
Child:
4:624527ebc0fa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Formatter.cpp	Wed Jul 17 10:15:05 2013 +0000
@@ -0,0 +1,181 @@
+#include "Formatter.h"
+#include "mbed.h"
+#include "RPCObjectManager.h"
+#include "EthernetInterface.h"
+
+const char *SIMPLE_HTML_CODE = "\
+<!DOCTYPE html>\
+<html>\
+    <head>\
+        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\
+        <title>TCP Server</title>\
+    </head>\
+    <body>";
+
+
+const char* INTERACTIVE_HTML_CODE_1 = "\
+<!DOCTYPE html>\
+<html>\
+    <head>\
+        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\
+        <title>TCP Server</title>\
+        <script type=\"text/javascript\">\
+            var ip = \"%s\";\
+            function submitCreateForm()\
+            {\
+                var list = document.getElementById(\"type\");\
+                var type = list.options[list.selectedIndex].value;\
+                var name = document.getElementById(\"name\").value;\
+                var arg = document.getElementById(\"arg\").value;\
+                var url;\
+                if(arg === \"\")\
+                    url = \"http://\" + ip + type + \"new?name=\" + name;\
+                else\
+                    url = \"http://\" + ip + type + \"new?arg=\" + arg + \"&name=\" + name;\
+                location.href= url;\
+            }\
+            function submitCallFuncForm()\
+            {\
+                var command = document.getElementById(\"command\").value;\
+                var tmp = command.split(\' \');\
+                var url = tmp[0];\
+                if(tmp.length > 1)\
+                    url += \"?\";\
+                for(var i = 1; i < tmp.length; ++i)\
+                {\
+                    url += \"arg\" + i + \"=\" + tmp[i];\
+                    if(i+1 < tmp.length)\
+                        url += \"&\";\
+                }\
+                location.href = url;\
+            }\
+        </script>\
+    </head> \
+<body>";
+    
+const char* INTERACTIVE_HTML_CODE_2 = "<h3>Create Object :</h3>\
+    <form id=\"create\" method=\"get\">\
+    Type: <select id=\"type\">\
+        <option value=\"/DigitalOut/\">DigitalOut</option>\
+        <option value=\"/DigitalIn/\">DigitalIn</option>\
+        <option value=\"/DigitalInOut/\">DigitalInOut</option>\
+        <option value=\"/PwmOut/\">PwmOut</option>\
+        <option value=\"/Timer/\">Timer</option>\
+        </select><br>\
+    name: <input type=\"text\" id=\"name\"><br>\
+    arg(optional): <input type=\"text\" id=\"arg\">\
+    <p><input type=\"button\" value=\"Create\" onclick=\"javascript:submitCreateForm();\"></p>\
+    </form> \
+    \
+    <h3>Call a function :</h3>\
+    <p>Enter an RPC command.</p>\
+    <form method=\"get\">\
+    Command: <input type= \"text\" id=\"command\"><br>\
+    <input type=\"button\" value=\"Send\" onclick=\"javascript:submitCallFuncForm();\"><br>\
+    </form>\
+    </body> \
+</html>";
+
+static char chunk[1024];
+        
+Formatter::Formatter(int nb):
+currentChunk(0),
+nbChunk(nb)
+{
+}    
+
+char* Formatter::get_page(char *reply)
+{
+    chunk[0] = '\0';
+
+    if(currentChunk < nbChunk)
+    {
+        get_chunk(currentChunk, reply);
+        currentChunk++;
+    }
+    else
+        currentChunk = 0;
+    
+    return chunk;
+}    
+
+void Formatter::get_chunk(const int c, char *reply)
+{
+    strcat(chunk, reply);
+}
+
+SimpleHTMLFormatter::SimpleHTMLFormatter():
+Formatter()
+{
+}
+
+void SimpleHTMLFormatter::get_chunk(const int c, char* reply)
+{
+    strcat(chunk, SIMPLE_HTML_CODE);
+    
+    if(reply != NULL && strlen(reply) != 0)
+    {
+        strcat(chunk, "RPC reply : ");
+        strcat(chunk, reply);
+    }
+        
+    if(!RPCObjectManager::instance().is_empty())
+    {
+        strcat(chunk, "<ul>");
+        for(std::list<char*>::iterator itor = RPCObjectManager::instance().begin();
+            itor != RPCObjectManager::instance().end();
+            ++itor)
+        {
+            strcat(chunk, "<li>");
+            strcat(chunk, *itor);
+            strcat(chunk, "</li>");
+        }
+        strcat(chunk, "</ul>");
+    }
+    
+    strcat(chunk, "</body></html>");
+}
+
+InteractiveHTMLFormatter::InteractiveHTMLFormatter():
+Formatter(3)
+{
+}
+
+void InteractiveHTMLFormatter::get_chunk(const int c, char *reply)
+{
+    if(c == 0)
+        sprintf(chunk, INTERACTIVE_HTML_CODE_1, EthernetInterface::getIPAddress());
+    else if(c == 1)
+    {
+        if(reply != NULL && strlen(reply) != 0)
+        {
+            strcat(chunk, "RPC reply : ");
+            strcat(chunk, reply);
+        }
+        if(!RPCObjectManager::instance().is_empty())
+        {
+            strcat(chunk, "<p>Objects created :</p>");
+
+            strcat(chunk, "<ul>");
+            for(std::list<char*>::iterator itor = RPCObjectManager::instance().begin();
+                itor != RPCObjectManager::instance().end();
+                ++itor)
+            {
+                strcat(chunk, "<li>");
+                strcat(chunk, *itor);
+                strcat(chunk, " (<a href=\"http://");
+                strcat(chunk, EthernetInterface::getIPAddress());
+                strcat(chunk, "/");
+                strcat(chunk, *itor);
+                strcat(chunk, "/delete\">delete</a>)");
+                strcat(chunk, "</li>");
+            }
+            strcat(chunk, "</ul>");
+        }
+        strcat(chunk, " ");
+    }
+    else if(c == 2)
+        strcat(chunk, INTERACTIVE_HTML_CODE_2);
+}
+
+