student test for professor
Dependencies: EthernetInterface mbed-rpc mbed-rtos mbed
Fork of HTTP-Server by
Diff: Formatter.cpp
- 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); +} + +