diff options
-rw-r--r-- | server/src/Makefile.am | 22 | ||||
-rw-r--r-- | server/src/database.cc | 6 | ||||
-rw-r--r-- | server/src/database.h | 3 | ||||
-rw-r--r-- | server/src/macro.h | 63 | ||||
-rw-r--r-- | server/src/macro_parser.cc | 205 | ||||
-rw-r--r-- | server/src/server.cc | 252 | ||||
-rw-r--r-- | server/src/tcpsocket.cc | 4 | ||||
-rw-r--r-- | server/src/templateparser.cc | 91 | ||||
-rw-r--r-- | server/src/templateparser.h | 2 | ||||
-rw-r--r-- | server/src/widgetgenerator.cc | 77 | ||||
-rw-r--r-- | server/src/widgetgenerator.h (renamed from server/src/macro_parser.h) | 38 |
11 files changed, 308 insertions, 455 deletions
diff --git a/server/src/Makefile.am b/server/src/Makefile.am index 7077301..52eade2 100644 --- a/server/src/Makefile.am +++ b/server/src/Makefile.am @@ -1,7 +1,7 @@ bin_PROGRAMS = pracrod -pracrod_LDADD = $(LD_EFENCE) $(PQXX_LIBS) $(CONFIG_LIBS) $(LUA_LIBS) +pracrod_LDADD = $(LD_EFENCE) $(PQXX_LIBS) $(CONFIG_LIBS) $(LUA_LIBS) -lpthread pracrod_CXXFLAGS = $(PQXX_CXXFLAGS) $(CONFIG_CXXFLAGS) $(LUA_CXXFLAGS) @@ -16,7 +16,6 @@ pracrod_SOURCES = \ journal_commit.cc \ log.cc \ luaquerymapper.cc \ - macro_parser.cc \ resumeparser.cc \ saxparser.cc \ server.cc \ @@ -24,7 +23,8 @@ pracrod_SOURCES = \ transactionparser.cc \ tcpsocket.cc \ tostring.cc \ - uid.cc + uid.cc \ + widgetgenerator.cc EXTRA_DIST = \ configuration.h \ @@ -37,8 +37,6 @@ EXTRA_DIST = \ journal_commit.h \ log.h \ luaquerymapper.h \ - macro.h \ - macro_parser.h \ resumeparser.h \ saxparser.h \ server.h \ @@ -46,13 +44,15 @@ EXTRA_DIST = \ transactionparser.h \ tcpsocket.h \ tostring.h \ - uid.h + uid.h \ + widgetgenerator.h TESTFILES = \ test_queryhandler \ test_queryparser \ test_luaquerymapper \ - test_templateparser + test_templateparser \ + test_server TESTLOGS = `for F in ${TESTFILES}; do echo $$F.log; done` @@ -72,6 +72,10 @@ test_luaquerymapper: luaquerymapper.cc @../../tools/test luaquerymapper.cc queryparser.cc queryhandler.cc tcpsocket.cc exception.cc tostring.cc uid.cc log.cc saxparser.cc -lexpat $(LUA_LIBS) test_templateparser: templateparser.cc - @../../tools/test templateparser.cc saxparser.cc -lexpat + @../../tools/test templateparser.cc saxparser.cc -lexpat -DXML="\"../xml\"" -CLEANFILES = $(TESTFILES) $(TESTLOGS) +test_server: server.cc + @../../tools/test server.cc templateparser.cc saxparser.cc queryparser.cc queryhandler.cc luaquerymapper.cc tcpsocket.cc exception.cc log.cc configuration.cc tostring.cc transactionparser.cc widgetgenerator.cc -lexpat $(LUA_LIBS) $(CONFIG_LIBS) -DXML="\"../xml\"" + killall -9 test_server + +CLEANFILES = $(TESTFILES) $(TESTLOGS) *~ diff --git a/server/src/database.cc b/server/src/database.cc index ad6bbe0..b2d5589 100644 --- a/server/src/database.cc +++ b/server/src/database.cc @@ -41,8 +41,10 @@ Database::~Database() { } -int Database::post(std::string &user, std::string &cpr, std::string &time, Commit &commit) +int Database::post(std::string &user, std::string &cpr, time_t now, Commit &commit) { + char timestamp[32]; + sprintf(timestamp, "%u", now); UID uid; try { @@ -56,7 +58,7 @@ int Database::post(std::string &user, std::string &cpr, std::string &time, Commi uid.toString() + "', '" + commit.macro + "', '" + commit.version + "', '" + - time + "', '" + + timestamp + "', '" + user + "')"; W.exec(sql); diff --git a/server/src/database.h b/server/src/database.h index a841188..91a09f4 100644 --- a/server/src/database.h +++ b/server/src/database.h @@ -30,6 +30,7 @@ #include <pqxx/pqxx> #include <string> #include "transaction.h" +#include <time.h> class Database { public: @@ -38,7 +39,7 @@ public: std::string password = "pracro"); ~Database(); - int post(std::string &user, std::string &cpr, std::string &time, Commit &commit); + int post(std::string &user, std::string &cpr, time_t now, Commit &commit); private: pqxx::connection c; diff --git a/server/src/macro.h b/server/src/macro.h deleted file mode 100644 index 9d4692f..0000000 --- a/server/src/macro.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * macro.h - * - * Mon Sep 24 10:51:43 CEST 2007 - * Copyright 2007 Bent Bisballe Nyeng, Lars Bisballe Jensen and Peter Skaarup - * deva@aasimon.org, elsenator@gmail.com and piparum@piparum.dk - ****************************************************************************/ - -/* - * This file is part of Pracro. - * - * Pracro is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * Pracro is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Pracro; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. - */ -#ifndef __PRACRO_MACRO_H__ -#define __PRACRO_MACRO_H__ - -#include <string> -#include <vector> -#include <map> - -/* -class WidgetProperty { -public: - std::string name; - std::string value; -}; -*/ -//typedef std::vector< WidgetProperty > WidgetPropertyList; -typedef std::map< std::string, std::string > WidgetPropertyList; - -class Widget; -typedef std::vector< Widget > WidgetList; - -class Widget { -public: - std::string type; - WidgetPropertyList properties; - WidgetList widgets; -}; - -class Macro { -public: - std::string name; - std::string version; - std::string format; - - WidgetList widgets; -}; - -#endif/*__PRACRO_MACRO_H__*/ diff --git a/server/src/macro_parser.cc b/server/src/macro_parser.cc deleted file mode 100644 index 84572d3..0000000 --- a/server/src/macro_parser.cc +++ /dev/null @@ -1,205 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * macro_parser.cc - * - * Mon Sep 24 10:49:55 CEST 2007 - * Copyright 2007 Bent Bisballe Nyeng, Lars Bisballe Jensen and Peter Skaarup - * deva@aasimon.org, elsenator@gmail.com and piparum@piparum.dk - ****************************************************************************/ - -/* - * This file is part of Pracro. - * - * Pracro is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * Pracro is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Pracro; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. - */ -#include "macro_parser.h" - -// For XML -#include <config.h> - -// For open, read and close -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <unistd.h> - -#include <stdio.h> -#include <string.h> - -MacroParser::MacroParser(std::string name, Macro ¯o) -{ - this->macro = ¯o; - - std::string macrofile = std::string(XML) + "/" + name + ".xml"; - fd = open(macrofile.c_str(), O_RDONLY); - - if(fd == -1) { - printf("Cannot open file \"%s\"...", macrofile.c_str()); - printf("failed!\n"); - return; - } -} - -MacroParser::~MacroParser() -{ - if(fd != -1) close(fd); -} - -int MacroParser::readData(char *data, size_t size) -{ - return read(fd, data, size); -} - -void MacroParser::startTag(std::string name, std::map< std::string, std::string> attributes) -{ - if(name == "include") { - Macro inc; - MacroParser parser(attributes["name"], inc); - parser.parse(); - - WidgetList::iterator w = inc.widgets.front().widgets.begin(); - while(w != inc.widgets.front().widgets.end()) { - stack.back()->widgets.push_back(*w); - w++; - } - - return; // Don't do further parsing of this tag. - } - - if(name == "macro") { - - macro->name = attributes["name"]; - macro->version = attributes["version"]; - macro->format = attributes["resume"]; - - return; // Don't do further parsing of this tag. - } - - if(name == "macrolist") { - std::map< std::string, int > macro_usage; - - macro_usage["example"] = 3; - macro_usage["pimmelsus"] = 2; - macro_usage["dimmer"] = 1; - macro_usage["fnullemam"] = 2; - macro_usage["ektosup"] = 0; - macro_usage["fillehej"] = 0; - macro_usage["heppelis"] = 0; - macro_usage["simmermuh"] = 0; - macro_usage["skilletran"] = 0; - macro_usage["futterbah"] = 0; - - Widget macrolist; - Widget *wp; - - if(stack.size() > 0) {// We only pushback the child if there is a parent. - stack.back()->widgets.push_back(macrolist); - wp = &stack.back()->widgets.back(); - } else { - macro->widgets.push_back(macrolist); - wp = ¯o->widgets.back(); - } - stack.push_back(wp); - - wp->type = "listbox"; - wp->properties["name"] = attributes["name"]; - wp->properties["value"] = "example"; - wp->properties["help"] = attributes["Noget info tekst."]; - - { - Widget item; - item.type = "item"; - item.properties["type"] = "header"; - item.properties["caption"] = "Oftest brugte makroer:"; - wp->widgets.push_back(item); - } - - std::map< std::string, std::string > macro_usage_most; - std::map< std::string, int >::iterator i = macro_usage.begin(); - while(i != macro_usage.end()) { - char buf[32]; - // FIXME: Ugly hack to make sorting work on equal usage number (sub sort alphabetically) - // This only works when usage count is less than 999. - sprintf(buf, "%03d", 999 - (*i).second); - std::string key = std::string(buf) + "-" + (*i).first; - if((*i).second != 0) macro_usage_most[key] = (*i).first; - i++; - } - - std::map< std::string, std::string >::iterator j = macro_usage_most.begin(); - while(j != macro_usage_most.end()) { - Widget item; - item.type = "item"; - item.properties["value"] = (*j).second; - item.properties["caption"] = (*j).second; - wp->widgets.push_back(item); - j++; - } - - { - Widget item; - item.type = "item"; - item.properties["type"] = "separator"; - wp->widgets.push_back(item); - } - - { - Widget item; - item.type = "item"; - item.properties["type"] = "header"; - item.properties["caption"] = "Alle makroer alfabetisk:"; - wp->widgets.push_back(item); - } - - std::map< std::string, int >::iterator k = macro_usage.begin(); - while(k != macro_usage.end()) { - Widget item; - item.type = "item"; - item.properties["value"] = (*k).first; - item.properties["caption"] = (*k).first; - wp->widgets.push_back(item); - k++; - } - - return;// Don't do further parsing of this tag. - } - - Widget widget; - widget.type = name; - - Widget *wp; - - if(stack.size() > 0) {// We only pushback the child if there is a parent. - stack.back()->widgets.push_back(widget); - wp = &stack.back()->widgets.back(); - } else { - macro->widgets.push_back(widget); - wp = ¯o->widgets.back(); - } - stack.push_back(wp); - - std::map< std::string, std::string >::iterator i = attributes.begin(); - while(i != attributes.end()) { - wp->properties[i->first] = i->second; - - i++; - } -} - -void MacroParser::endTag(std::string name) -{ - if(name != "include") stack.pop_back(); - // if(!strcmp(el, "macro")) done = true; -} diff --git a/server/src/server.cc b/server/src/server.cc index 4254f47..1786f34 100644 --- a/server/src/server.cc +++ b/server/src/server.cc @@ -26,9 +26,6 @@ */ #include "server.h" -// For XML -#include <config.h> - #include "tcpsocket.h" #include <errno.h> @@ -39,53 +36,120 @@ #include <unistd.h> #include "configuration.h" - #include "transaction.h" #include "transactionparser.h" #include "templateparser.h" #include "queryhandler.h" #include "queryparser.h" #include "luaquerymapper.h" - #include "database.h" +#include "widgetgenerator.h" +#include "resumeparser.h" +#include "journal_commit.h" static void connection(TCPSocket &socket) { - Transaction t; - TransactionParser parser(socket, t); + Transaction transaction; + TransactionParser parser(socket, transaction); parser.parse(); + socket.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); + socket.write("<pracro version=\"1.0\">\n"); + + /* + // + // Handle commits + // + if(transaction.commits.size() > 0) { + time_t now = time(NULL); + + Commits::iterator i = transaction.commits.begin(); + while(i != transaction.commits.end()) { + Commit &commit = *i; + + Database db; + db.post(transaction.user, transaction.cpr, now, commit); + + Macro macro; + MacroParser parser(commit.macro, macro); + parser.parse(); + + 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 = t.requests.begin(); - while(i != t.requests.end()) { - Request request = *i; + // + 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(XML"/example2.xml"); + 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, t.cpr); - std::string result = qh.exec(); + QueryHandler qh(&s, transaction.cpr); + std::vector< Macro >::iterator mi = templ->course.macroes.begin(); + while(mi != templ->course.macroes.end()) { + printf("!!\n"); fflush(stdout); + 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(); + // Parse the result from the queries to pentominos QueryParser qp(result); qp.parse(); // Map the results LUAQueryMapper lqm(qp.result); - - + + // 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); + if(macro.attributes["name"] == request.macro) { + widgetgenerator(socket, macro, lqm); + } + mi2++; + } + i++; } + socket.write("</pracro>\n"); } void server() { + int PauseMode = 1; int port; try { port = config()->lookup("port"); @@ -108,7 +172,7 @@ void server() while(socket->connected()) { - { // Reload if new port i assigned. + { // Reload if new port is assigned. int old_port = port; try { port = config()->lookup("port"); @@ -122,11 +186,17 @@ void server() delete socket; socket = new TCPSocket(); socket->listen(port); + PauseMode = 0; } } TCPSocket child = socket->accept(); if(child.connected()) { + socket->disconnect(); + connection(child); + delete socket; + + /* switch(fork()) { case -1: // error fprintf(stderr, "Could not fork: %s\n", strerror(errno)); @@ -139,8 +209,10 @@ void server() return; default: // parent + child.disconnect(); break; } + */ } } @@ -148,129 +220,45 @@ void server() fprintf(stderr, "Oups... dropped out of the main loop\n"); } +#ifdef TEST_SERVER +char request[] = + "<?xml version='1.0' encoding='UTF-8'?>\n" + "<pracro cpr=\"2003791613\" version=\"1.0\">\n" + " <request macro=\"example2\" course=\"example2\"/>\n" + "</pracro>\n"; - - - - - - - - - - - - - -// -// -// OLD CODE! -// -// -#if 0 - -#include "macro.h" -#include "macro_parser.h" - -#include "resumeparser.h" - -#include "tostring.h" -#include <time.h> - -#include "journal_commit.h" - -static void send_macro_widget(Widget &widget, TCPSocket &socket, std::string tabs) +int main() { - socket.write(tabs + "<" + widget.type); - WidgetPropertyList::iterator p = widget.properties.begin(); - while(p != widget.properties.end()) { - socket.write(" " + p->first + "=\"" + p->second + "\""); - p++; - } - - if(widget.widgets.size() == 0) { // If node is empty, use short tag form - socket.write("/>\n"); - return; - } - - socket.write(">\n"); + Configuration conf("../etc/pracrod.conf"); + initConfig(&conf); - WidgetList::iterator w = widget.widgets.begin(); - while(w != widget.widgets.end()) { - send_macro_widget(*w, socket, tabs + " "); - w++; - } - socket.write(tabs + "</" + widget.type + ">\n"); -} - -static void connection(TCPSocket &socket) -{ - printf("Got connection...\n"); - - Transaction transaction; - TransactionParser parser(socket, transaction); - parser.parse(); - - socket.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); - socket.write("<pracro version=\"1.0\">\n"); - - // Handle requests - Requests::iterator i = transaction.requests.begin(); - while(i != transaction.requests.end()) { - Request request = *i; - - printf("Handling request for \"%s\"...", request.macro.c_str()); + switch(fork()) { + case -1: // error + return 1; - Macro macro; - MacroParser parser(request.macro, macro); - parser.parse(); - - socket.write(" <macro version=\"" + macro.version + "\" name=\"" - + macro.name + "\" resume=\"" + macro.format + "\">\n"); - WidgetList::iterator w = macro.widgets.begin(); - while(w != macro.widgets.end()) { - send_macro_widget(*w, socket, " "); - w++; - } - socket.write(" </macro>\n"); - - printf("done.\n"); + case 0: // child + server(); + return 0; - i++; - } - - // Handle commits - if(transaction.commits.size() > 0) { - std::string now = toString((unsigned int)time(NULL)); - - Commits::iterator i = transaction.commits.begin(); - while(i != transaction.commits.end()) { - Commit &commit = *i; - - Database db; - db.post(transaction.user, transaction.cpr, now, commit); - - Macro macro; - MacroParser parser(commit.macro, macro); - parser.parse(); - - 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++; + default: // parent + { + TCPSocket socket; + int port = config()->lookup("port"); + socket.connect("localhost", port); + + socket.write(request); + char buf[32]; + memset(buf, 0, sizeof(buf)); + while(socket.read(buf, 31)) { + printf(buf); fflush(stdout); + memset(buf, 0, sizeof(buf)); + } } + return 0; } - - socket.write("</pracro>\n"); - - printf("Done with connection.\n"); + + return 1; } -#endif/*0*/ +#endif/*TEST_SERVER*/ diff --git a/server/src/tcpsocket.cc b/server/src/tcpsocket.cc index 90f71a5..d361b7b 100644 --- a/server/src/tcpsocket.cc +++ b/server/src/tcpsocket.cc @@ -230,7 +230,7 @@ int TCPSocket::read(char *buf, int size) // Wait until something is ready to be read ( peek'a'loop ). errno = EAGAIN; while( recv(sock, buf, 1, MSG_PEEK) == -1 && errno == EAGAIN) { - sleep(1); + usleep(10); } // Now read it @@ -238,6 +238,8 @@ int TCPSocket::read(char *buf, int size) throw TCPReadException(strerror(errno)); } + // fwrite(buf, size, 1, stdout); fflush(stdout); + return res; } diff --git a/server/src/templateparser.cc b/server/src/templateparser.cc index 956a0e8..652a870 100644 --- a/server/src/templateparser.cc +++ b/server/src/templateparser.cc @@ -38,6 +38,13 @@ // For vprintf and friends #include <stdarg.h> +#ifndef XML +// For XML +#include <config.h> +#endif/*XML*/ + +#include <errno.h> + void TemplateParser::error(char* fmt, ...) { // TODO: Throw exception here. @@ -52,24 +59,37 @@ void TemplateParser::error(char* fmt, ...) fprintf(stderr, "\n"); } -TemplateParser::TemplateParser(std::string templatefile) +TemplateParser::TemplateParser(std::string course) { state = UNDEFINED; t = NULL; current_macro = NULL; current_map = NULL; - fd = open(templatefile.c_str(), O_RDONLY); - if(fd == -1) error("Could not open file %s", templatefile.c_str()); + + std::string file = XML"/"; + file.append(course); + file.append(".xml"); + + printf("Using template file: %s\n", file.c_str()); + + fd = open(file.c_str(), O_RDONLY); + if(fd == -1) error("Could not open file %s", file.c_str()); } TemplateParser::~TemplateParser() { if(fd != -1) close(fd); + if(t) delete t; } void TemplateParser::characterData(std::string &data) { - if(state == MAP) current_macro->maps.back().attributes["lua"].append(data); + if(state == MAP) { + // assert(current_macro->maps.size()); // No maps present! + // current_macro->maps.back().attributes["lua"].append(data); + assert(current_map); // No map present! + current_map->attributes["lua"].append(data); + } } void TemplateParser::startTag(std::string name, std::map< std::string, std::string> attributes) @@ -107,7 +127,7 @@ void TemplateParser::startTag(std::string name, std::map< std::string, std::stri assert(t); // A Template has not yet been allocated, cannot create macro! Macro m; - m.attributes = attributes; + // m.attributes = attributes; t->course.macroes.push_back(m); current_macro = &(t->course.macroes.back()); @@ -158,19 +178,27 @@ void TemplateParser::startTag(std::string name, std::map< std::string, std::stri Map m; m.attributes = attributes; current_macro->maps.push_back(m); + current_map = &(current_macro->maps.back()); return; } // Enable widget parsing if(name == "window") { + if(state != MACRO) error("window found outside macro."); state = WINDOW; assert(current_macro); // No macro is currently available, cannot create window! current_macro->window.attributes = attributes; - widgetstack.push_back(&(current_macro->window)); + current_macro->window.attributes["type"] = name; + + Widget *current = &(current_macro->window); + + printf("%p %p\n", current); fflush(stdout); + + widgetstack.push_back(current); return; } @@ -183,8 +211,22 @@ void TemplateParser::startTag(std::string name, std::map< std::string, std::stri Widget w; w.attributes = attributes; - widgetstack.back()->widgets.push_back(w); - widgetstack.push_back(&(widgetstack.back()->widgets.back())); + w.attributes["type"] = name; + + printf("1 %d\n", widgetstack.size() ); fflush(stdout); + + Widget *parent = widgetstack.back(); + + printf("%d\n", parent->widgets.size()); fflush(stdout); + + parent->widgets.push_back(w); + + printf("2\n"); fflush(stdout); + + Widget *current = &(parent->widgets.back()); + widgetstack.push_back(current); + + printf("3\n"); fflush(stdout); return; } @@ -202,24 +244,43 @@ void TemplateParser::endTag(std::string name) { if(name == "template") state = UNDEFINED; if(name == "course") state = TEMPLATE; - if(name == "macro") state = COURSE; + if(name == "macro") { + current_macro = NULL; + state = COURSE; + } if(name == "queries") state = MACRO; if(name == "query") state = QUERIES; if(name == "maps") state = MACRO; - if(name == "map") state = MAPS; + if(name == "map") { + current_map = NULL; + state = MAPS; + } if(name == "window") state = MACRO; if(state == WINDOW) { - assert(widgetstack.size()); // Widget stack is empty, cannot pop! - widgetstack.pop_back(); - } + printf("4\n"); fflush(stdout); + + assert(widgetstack.size()); // Widget stack is empty, cannot pop! + widgetstack.pop_back(); + + printf("5\n"); fflush(stdout); + + if(widgetstack.size() == 0) state = MACRO; + + printf("6\n"); fflush(stdout); + } } int TemplateParser::readData(char *data, size_t size) { if(fd == -1) return 0; - return read(fd, data, size); + ssize_t r = read(fd, data, size); + if(r == -1) { + printf("Could not read...%s\n", strerror(errno)); fflush(stdout); + return 0; + } + return r; } Template *TemplateParser::getTemplate() @@ -241,7 +302,7 @@ void print_attributes(std::string prefix, int main() { - TemplateParser parser("../xml/example2.xml"); + TemplateParser parser("example2"); parser.parse(); Template *t = parser.getTemplate(); diff --git a/server/src/templateparser.h b/server/src/templateparser.h index 8570234..6e5fb1a 100644 --- a/server/src/templateparser.h +++ b/server/src/templateparser.h @@ -44,7 +44,7 @@ typedef enum { class TemplateParser : public SAXParser { public: - TemplateParser(std::string templatefile); + TemplateParser(std::string course); ~TemplateParser(); void characterData(std::string &data); diff --git a/server/src/widgetgenerator.cc b/server/src/widgetgenerator.cc new file mode 100644 index 0000000..ced804a --- /dev/null +++ b/server/src/widgetgenerator.cc @@ -0,0 +1,77 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * widgetgenerator.cc + * + * Mon May 19 09:58:41 CEST 2008 + * Copyright 2008 Bent Bisballe Nyeng, Lars Bisballe Jensen and Peter Skaarup + * deva@aasimon.org, elsenator@gmail.com and piparum@piparum.dk + ****************************************************************************/ + +/* + * This file is part of Pracro. + * + * Pracro is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Pracro is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Pracro; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "widgetgenerator.h" + +static void send_macro_widget(Macro ¯o, Widget &widget, TCPSocket &socket, std::string tabs, LUAQueryMapper &mapper) +{ + socket.write(tabs + "<" + widget.attributes["type"]); + std::map< std::string, std::string >::iterator p = widget.attributes.begin(); + + if(widget.attributes.find("map") != widget.attributes.end()) { + std::string luamap; + + std::vector< Map >::iterator li = macro.maps.begin(); + while(li != macro.maps.end()) { + Map &map = *li; + if(map.attributes["name"] == widget.attributes["map"]) { + luamap = map.attributes["lua"]; + } + li++; + } + + // printf("LUAMAP: %s\n", luamap.c_str()); fflush(stdout); + + if(luamap != "") widget.attributes["value"] = mapper.map(luamap); + // widget.attributes.erase(widget.attributes.find("map")); + } + + while(p != widget.attributes.end()) { + if(p->first != "type" && p->first != "map") { + socket.write(" " + p->first + "=\"" + p->second + "\""); + } + p++; + } + + if(widget.widgets.size() == 0) { // If node is empty, use short tag form + socket.write("/>\n"); + return; + } + + socket.write(">\n"); + + std::vector< Widget >::iterator w = widget.widgets.begin(); + while(w != widget.widgets.end()) { + send_macro_widget(macro, *w, socket, tabs + " ", mapper); + w++; + } + socket.write(tabs + "</" + widget.attributes["type"] + ">\n"); +} + +void widgetgenerator(TCPSocket &socket, Macro ¯o, LUAQueryMapper &mapper) +{ + send_macro_widget(macro, macro.window, socket, " ", mapper); +} diff --git a/server/src/macro_parser.h b/server/src/widgetgenerator.h index 7200551..4918848 100644 --- a/server/src/macro_parser.h +++ b/server/src/widgetgenerator.h @@ -1,9 +1,9 @@ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** - * macro_parser.h + * widgetgenerator.h * - * Mon Sep 24 10:49:55 CEST 2007 - * Copyright 2007 Bent Bisballe Nyeng, Lars Bisballe Jensen and Peter Skaarup + * Mon May 19 09:58:41 CEST 2008 + * Copyright 2008 Bent Bisballe Nyeng, Lars Bisballe Jensen and Peter Skaarup * deva@aasimon.org, elsenator@gmail.com and piparum@piparum.dk ****************************************************************************/ @@ -24,31 +24,17 @@ * along with Pracro; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#ifndef __PRACRO_MACRO_PARSER_H__ -#define __PRACRO_MACRO_PARSER_H__ +#ifndef __PRACRO_WIDGETGENERATOR_H__ +#define __PRACRO_WIDGETGENERATOR_H__ #include <string> -#include "saxparser.h" -#include "macro.h" +#include "tcpsocket.h" +#include "template.h" +#include "luaquerymapper.h" -class MacroParser : public SAXParser { -public: - MacroParser(std::string name, Macro ¯o); - ~MacroParser(); +void widgetgenerator(TCPSocket &socket, + Macro ¯o, + LUAQueryMapper &mapper); - void startTag(std::string name, std::map< std::string, std::string> attributes); - void endTag(std::string name); - -protected: - int readData(char *data, size_t size); - -private: - Macro *macro; - std::vector< Widget* > stack; - bool done; - - int fd; -}; - -#endif/*__PRACRO_MACRO_PARSER_H__*/ +#endif/*__PRACRO_WIDGETGENERATOR_H__*/ |