/**************************************************************************************************** RepRapFirmware - Webserver This class serves web pages to the attached network. These pages form the user's interface with the RepRap machine. It interprests returned values from those pages and uses them to Generate G Codes, which it sends to the RepRap. It also collects values from the RepRap like temperature and uses those to construct the web pages. ----------------------------------------------------------------------------------------------------- Version 0.1 13 February 2013 Adrian Bowyer RepRap Professional Ltd http://reprappro.com Licence: GPL ****************************************************************************************************/ #include "RepRapFirmware.h" Webserver::Webserver(Platform* p) { Serial.println("Webserver constructor"); platform = p; lastTime = platform->time(); writing = false; clientLineIsBlank = true; needToCloseClient = false; clientLinePointer = 0; clientLine[0] = 0; clientRequest[0] = 0; password = DEFAULT_PASSWORD; myName = DEFAULT_NAME; gotPassword = false; gcodeAvailable = false; gcodePointer = 0; } boolean Webserver::Available() { return gcodeAvailable; } byte Webserver::Read() { byte c = gcodeBuffer[gcodePointer]; if(!c) { gcodeAvailable = false; gcodePointer = 0; gcodeBuffer[gcodePointer] = 0; } else gcodePointer++; return c; } boolean Webserver::LoadGcodeBuffer(char* gc, boolean convertWeb) { if(gcodeAvailable) return false; if(strlen(gc) > GCODE_LENGTH-1) { platform->Message(HOST_MESSAGE, "Webserver: GCode buffer overflow.\n"); return false; } int gcp = 0; gcodePointer = 0; gcodeBuffer[gcodePointer] = 0; char c; while(c = gc[gcp++]) { if(c == '+' && convertWeb) c = ' '; if(c == '%'&& convertWeb) // FIXME - just convert the next two hex bytes to a char { if(StringStartsWith(&gc[gcp], "2B")) c = '+'; else if(StringStartsWith(&gc[gcp], "20")) c = ' '; else { platform->Message(HOST_MESSAGE, "Webserver: Dud web-form byte: "); platform->Message(HOST_MESSAGE, gc); platform->Message(HOST_MESSAGE, "\n"); } gcp += 2; } gcodeBuffer[gcodePointer++] = c; } gcodeBuffer[gcodePointer] = 0; gcodePointer = 0; gcodeAvailable = true; return true; } boolean Webserver::StringEndsWith(char* string, char* ending) { int j = strlen(string); int k = strlen(ending); if(k > j) return false; return(!strcmp(&string[j - k], ending)); } boolean Webserver::StringStartsWith(char* string, char* starting) { int j = strlen(string); int k = strlen(starting); if(k > j) return false; for(int i = 0; i < k; i++) if(string[i] != starting[i]) return false; return true; } void Webserver::InternalHead(boolean sendTab, int noLink) { platform->SendToClient("\n
Control | "); else platform->SendToClient("Control | "); if(noLink == 1) platform->SendToClient("Help | "); if(noLink == 3) platform->SendToClient("Settings | "); else platform->SendToClient("Settings | "); platform->SendToClient("Logout | "); platform->SendToClient("