diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/src/server.cc | 256 | ||||
-rw-r--r-- | server/src/templateparser.cc | 4 |
2 files changed, 143 insertions, 117 deletions
diff --git a/server/src/server.cc b/server/src/server.cc index f74c2b0..a896102 100644 --- a/server/src/server.cc +++ b/server/src/server.cc @@ -47,140 +47,162 @@ #include "resumeparser.h" #include "journal_commit.h" -static void connection(TCPSocket &socket) +static std::string error_box(std::string message) { - Transaction transaction; - TransactionParser parser(socket, transaction); - parser.parse(); + std::string errorbox; + + errorbox += " <course name=\"error\">\n"; + errorbox += " <macro name=\"error\">\n"; + errorbox += " <window caption=\"ERROR!\" height=\"240\" layout=\"vbox\" " + "name=\"err\" width=\"320\">\n"; + errorbox += " <textedit name=\"errorlabel\" value=\""; + errorbox += message; + errorbox += "\"/>\n"; + errorbox += " <button action=\"cancel\" caption=\"Luk\" name=\"cancel\"/>\n"; + errorbox += " </window>\n"; + errorbox += " </macro>\n"; + errorbox += " </course>\n"; + + return errorbox; +} +static void connection(TCPSocket &socket) +{ socket.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); socket.write("<pracro version=\"1.0\">\n"); - Database db; - - // - // Handle commits - // - if(transaction.commits.size() > 0) { - Commits::iterator i = transaction.commits.begin(); - while(i != transaction.commits.end()) { - Commit &commit = *i; - - /* - Macro macro; - MacroParser parser(commit.macro, macro); - parser.parse(); - */ - - - Macro macro; - macro.attributes["name"] = commit.macro; - macro.attributes["version"] = "1.0";//commit.version; - - db.commit(transaction.user, transaction.cpr, macro, commit.fields); - - /* - std::string resume = resume_parser(macro.format.c_str(), commit); - - std::string journal_commit_addr = config()->lookup("journal_commit_addr"); - int journal_commit_port = config()->lookup("journal_commit_port"); - - journal_commit(transaction.cpr.c_str(), transaction.user.c_str(), - journal_commit_addr.c_str(), journal_commit_port, - resume.c_str(), resume.length()); - */ - i++; + try { + Transaction transaction; + TransactionParser parser(socket, transaction); + parser.parse(); + + Database db; + + // + // Handle commits + // + if(transaction.commits.size() > 0) { + Commits::iterator i = transaction.commits.begin(); + while(i != transaction.commits.end()) { + Commit &commit = *i; + + /* + Macro macro; + MacroParser parser(commit.macro, macro); + parser.parse(); + */ + + Macro macro; + macro.attributes["name"] = commit.macro; + macro.attributes["version"] = "1.0";//commit.version; + + db.commit(transaction.user, transaction.cpr, macro, commit.fields); + + /* + std::string resume = resume_parser(macro.format.c_str(), commit); + + std::string journal_commit_addr = config()->lookup("journal_commit_addr"); + int journal_commit_port = config()->lookup("journal_commit_port"); + + journal_commit(transaction.cpr.c_str(), transaction.user.c_str(), + journal_commit_addr.c_str(), journal_commit_port, + resume.c_str(), resume.length()); + */ + i++; + } } - } - - // - // Handle requests - // - Requests::iterator i = transaction.requests.begin(); - while(i != transaction.requests.end()) { - Request &request = *i; - - printf("Handling request - macro: %s, course: %s\n", request.macro.c_str(), request.course.c_str()); - - // Read and parse the template file. - TemplateParser tp(request.course); - tp.parse(); - - Template *templ = tp.getTemplate(); - - // Send the queries to Pentominos (if any) - TCPSocket s; - s.connect("localhost", 11108); - QueryHandler qh(&s, transaction.cpr); - std::vector< Macro >::iterator mi = templ->course.macroes.begin(); - while(mi != templ->course.macroes.end()) { - Macro ¯o = (*mi); - if(macro.attributes["name"] == request.macro) { - std::vector< Query >::iterator qi = macro.queries.begin(); - while(qi != macro.queries.end()) { - qh.addQuery(*qi); + // + // Handle requests + // + Requests::iterator i = transaction.requests.begin(); + while(i != transaction.requests.end()) { + Request &request = *i; + + printf("Handling request - macro: %s, course: %s\n", request.macro.c_str(), request.course.c_str()); + + // Read and parse the template file. + TemplateParser tp(request.course); + tp.parse(); + + Template *templ = tp.getTemplate(); + + // Send the queries to Pentominos (if any) + TCPSocket s; + s.connect("localhost", 11108); + QueryHandler qh(&s, transaction.cpr); + + std::vector< Macro >::iterator mi = templ->course.macroes.begin(); + while(mi != templ->course.macroes.end()) { + Macro ¯o = (*mi); + if(macro.attributes["name"] == request.macro) { + std::vector< Query >::iterator qi = macro.queries.begin(); + while(qi != macro.queries.end()) { + qh.addQuery(*qi); qi++; + } } - } mi++; - } - std::string result = qh.exec(); - - printf("Got result: [%s]\n", result.c_str()); - - // Parse the result from the queries to pentominos - QueryParser qp(result); - qp.parse(); - - // Map the results - LUAQueryMapper lqm(qp.result); - - socket.write(" <course name=\""); - socket.write(templ->course.attributes["name"]); - socket.write("\">\n"); - - // Generate the macro and return it to the client - std::vector< Macro >::iterator mi2 = templ->course.macroes.begin(); - while(mi2 != templ->course.macroes.end()) { - Macro ¯o = (*mi2); - - socket.write(" <macro name=\""); - socket.write(macro.attributes["name"]); + } + std::string result = qh.exec(); + + printf("Got result: [%s]\n", result.c_str()); + + // Parse the result from the queries to pentominos + QueryParser qp(result); + qp.parse(); + + // Map the results + LUAQueryMapper lqm(qp.result); + + socket.write(" <course name=\""); + socket.write(templ->course.attributes["name"]); socket.write("\">\n"); - - if(macro.attributes["name"] == request.macro) { - // Handle lua programs - if(macro.luaprograms.size()) { - socket.write(" <luaprograms>\n"); - - std::vector< LUAProgram >::iterator lpi = macro.luaprograms.begin(); - while(lpi != macro.luaprograms.end()) { - socket.write(" <luaprogram name=\""); - socket.write(lpi->attributes["name"]); - socket.write("\">\n"); + + // Generate the macro and return it to the client + std::vector< Macro >::iterator mi2 = templ->course.macroes.begin(); + while(mi2 != templ->course.macroes.end()) { + Macro ¯o = (*mi2); + + socket.write(" <macro name=\""); + socket.write(macro.attributes["name"]); + socket.write("\">\n"); + + if(macro.attributes["name"] == request.macro) { + // Handle lua programs + if(macro.luaprograms.size()) { + socket.write(" <luaprograms>\n"); - socket.write(lpi->attributes["lua"]); - - socket.write("\n </luaprogram>\n"); - - lpi++; + std::vector< LUAProgram >::iterator lpi = macro.luaprograms.begin(); + while(lpi != macro.luaprograms.end()) { + socket.write(" <luaprogram name=\""); + socket.write(lpi->attributes["name"]); + socket.write("\">\n"); + + socket.write(lpi->attributes["lua"]); + + socket.write("\n </luaprogram>\n"); + + lpi++; + } + + socket.write(" </luaprograms>\n"); } - - socket.write(" </luaprograms>\n"); + + widgetgenerator(socket, macro, lqm, db); } - widgetgenerator(socket, macro, lqm, db); + socket.write(" </macro>\n"); + + mi2++; } - - socket.write(" </macro>\n"); - - mi2++; + + socket.write(" </course>\n"); + + i++; } - - socket.write(" </course>\n"); - - i++; + } catch(std::exception &e) { + socket.write(error_box( e.what())); } socket.write("</pracro>\n"); diff --git a/server/src/templateparser.cc b/server/src/templateparser.cc index 04650ca..c67ba63 100644 --- a/server/src/templateparser.cc +++ b/server/src/templateparser.cc @@ -45,6 +45,8 @@ #include <errno.h> +#include "exception.h" + void TemplateParser::error(const char* fmt, ...) { // TODO: Throw exception here. @@ -57,6 +59,8 @@ void TemplateParser::error(const char* fmt, ...) va_end(argp); fprintf(stderr, "\n"); + + throw Exception("Error in TemplateParser"); } TemplateParser::TemplateParser(std::string course) |