summaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'server/src')
-rw-r--r--server/src/Makefile.am2
-rw-r--r--server/src/template.h69
-rw-r--r--server/src/templateparser.cc223
-rw-r--r--server/src/templateparser.h72
4 files changed, 366 insertions, 0 deletions
diff --git a/server/src/Makefile.am b/server/src/Makefile.am
index faf6aa1..4d64067 100644
--- a/server/src/Makefile.am
+++ b/server/src/Makefile.am
@@ -20,6 +20,7 @@ pracrod_SOURCES = \
resumeparser.cc \
sax_parser.cc \
server.cc \
+ templateparser.cc \
tcpsocket.cc \
tostring.cc \
uid.cc \
@@ -41,6 +42,7 @@ EXTRA_DIST = \
resumeparser.h \
sax_parser.h \
server.h \
+ templateparser.h \
tcpsocket.h \
tostring.h \
uid.h \
diff --git a/server/src/template.h b/server/src/template.h
new file mode 100644
index 0000000..e3b030c
--- /dev/null
+++ b/server/src/template.h
@@ -0,0 +1,69 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * template.h
+ *
+ * Mon May 12 10:42:39 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.
+ */
+#ifndef __PRACRO_TEMPLATE_H__
+#define __PRACRO_TEMPLATE_H__
+
+#include <vector>
+#include <map>
+
+class Widget {
+public:
+ std::vector< Widget > widgets;
+ std::map< std::string, std::string > attributes;
+};
+
+class Map {
+public:
+ std::map< std::string, std::string > attributes;
+};
+
+class Query {
+public:
+ std::map< std::string, std::string > attributes;
+};
+
+class Macro {
+public:
+ std::vector< Query > queries;
+ std::vector< Map > maps;
+ Widget window;
+ std::map< std::string, std::string > attributes;
+};
+
+class MacroSequence {
+public:
+ std::vector< Macro > macroes;
+ std::map< std::string, std::string > attributes;
+};
+
+class Template {
+public:
+ MacroSequence macrosequence;
+ std::map< std::string, std::string > attributes;
+};
+
+#endif/*__PRACRO_TEMPLATE_H__*/
diff --git a/server/src/templateparser.cc b/server/src/templateparser.cc
new file mode 100644
index 0000000..1e6ddc7
--- /dev/null
+++ b/server/src/templateparser.cc
@@ -0,0 +1,223 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * templateparser.cc
+ *
+ * Mon May 12 08:36:24 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 "templateparser.h"
+
+// For assert
+#include <assert.h>
+
+// For open and friends
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+// For vprintf and friends
+#include <stdarg.h>
+
+void TemplateParser::error(char* fmt, ...)
+{
+ // TODO: Throw exception here.
+
+ fprintf(stderr, "Error in TemplateParser: ");
+
+ va_list argp;
+ va_start(argp, fmt);
+ vfprintf(stderr, fmt, argp);
+ va_end(argp);
+
+ fprintf(stderr, "\n");
+}
+
+TemplateParser::TemplateParser(std::string templatefile)
+{
+ 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());
+}
+
+TemplateParser::~TemplateParser()
+{
+ if(fd != -1) close(fd);
+}
+
+void TemplateParser::startTag(std::string name, std::map< std::string, std::string> attributes)
+{
+ // Create template and enable parsing of macrosequences
+ if(name == "template") {
+ if(state != UNDEFINED) error("template found not in outer level.");
+ state = TEMPLATE;
+
+ assert(!t); // A Template has already been allocated!
+
+ t = new Template();
+ t->attributes = attributes;
+
+ return;
+ }
+
+ // Enable macro parsing
+ if(name == "macrosequence") {
+ if(state != TEMPLATE) error("macrosequence found outside template.");
+ state = MACROSEQUENCE;
+
+ assert(t); // A Template has not yet been allocated, cannot create macrosequence!
+
+ t->macrosequence.attributes = attributes;
+
+ return;
+ }
+
+ // Create macro and enable parsing of queries, maps and window
+ if(name == "macro") {
+ if(state != MACROSEQUENCE) error("macro found outside macrosequence.");
+ state = MACRO;
+
+ assert(t); // A Template has not yet been allocated, cannot create macro!
+
+ Macro m;
+ m.attributes = attributes;
+ t->macrosequence.macroes.push_back(m);
+ current_macro = &(t->macrosequence.macroes.back());
+
+ return;
+ }
+
+ // Enable Query parsing
+ if(name == "queries") {
+ if(state != TEMPLATE) error("queries found outside template.");
+ state = QUERIES;
+
+ assert(current_macro); // No macro is currently available, cannot create queries!
+
+ return;
+ }
+
+ // Create Query
+ if(name == "query") {
+ if(state != QUERIES) error("query found outside queries.");
+ state = QUERY;
+
+ assert(current_macro); // No macro is currently available, cannot create query!
+
+ Query q;
+ q.attributes = attributes;
+ current_macro->queries.push_back(q);
+
+ return;
+ }
+
+ // Enable Map parsing
+ if(name == "maps") {
+ if(state != TEMPLATE) error("maps found outside template.");
+ state = MAPS;
+
+ assert(current_macro); // No macro is currently available, cannot create maps!
+
+ return;
+ }
+
+ // Create Query
+ if(name == "map") {
+ if(state != MAPS) error("map found outside maps.");
+ state = MAP;
+
+ assert(current_macro); // No macro is currently available, cannot create map!
+
+ Map m;
+ m.attributes = attributes;
+ current_macro->maps.push_back(m);
+
+ return;
+ }
+
+ // Enable widget parsing
+ if(name == "window") {
+ if(state != TEMPLATE) error("window found outside template.");
+ state = WINDOW;
+
+ assert(current_macro); // No macro is currently available, cannot create window!
+
+ current_macro->window.attributes = attributes;
+ widgetstack.push_back(&(current_macro->window));
+
+ return;
+ }
+
+ // TODO: We need to parse some (maybe even all) widgets in order to
+ // make db lookup of the previous values.
+ if(state == WINDOW) {
+
+ assert(widgetstack.size()); // Widget stack is empty, cannot create!
+
+ Widget w;
+ w.attributes = attributes;
+ widgetstack.back()->widgets.push_back(w);
+ widgetstack.push_back(&(widgetstack.back()->widgets.back()));
+
+ return;
+ }
+
+
+ // Handle include
+ if(name == "include") {
+ return;
+ }
+
+ error("Unknown/illegal tag: %s", name.c_str());
+}
+
+void TemplateParser::endTag(std::string name)
+{
+ if(name == "template") state = UNDEFINED;
+ if(name == "macrosequence") state = TEMPLATE;
+ if(name == "macro") state = MACROSEQUENCE;
+ if(name == "queries") state = MACRO;
+ if(name == "query") state = QUERIES;
+ if(name == "maps") state = MACRO;
+ if(name == "map") state = MAPS;
+ if(name == "window") state = MACRO;
+
+ if(state == WINDOW) {
+ assert(widgetstack.size()); // Widget stack is empty, cannot pop!
+ widgetstack.pop_back();
+ }
+
+}
+
+int TemplateParser::readData(char *data, size_t size)
+{
+ if(fd == -1) return 0;
+ return read(fd, data, size);
+}
+
+Template *TemplateParser::getTemplate()
+{
+ return t;
+}
diff --git a/server/src/templateparser.h b/server/src/templateparser.h
new file mode 100644
index 0000000..c53b04d
--- /dev/null
+++ b/server/src/templateparser.h
@@ -0,0 +1,72 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * templateparser.h
+ *
+ * Mon May 12 08:36:24 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.
+ */
+#ifndef __PRACRO_TEMPLATEPARSER_H__
+#define __PRACRO_TEMPLATEPARSER_H__
+
+#include "sax_parser.h"
+#include "template.h"
+
+typedef enum {
+ UNDEFINED,
+ TEMPLATE,
+ MACROSEQUENCE,
+ MACRO,
+ QUERIES,
+ QUERY,
+ MAPS,
+ MAP,
+ WINDOW
+} ParserState;
+
+class TemplateParser : public SAXParser {
+public:
+ TemplateParser(std::string templatefile);
+ ~TemplateParser();
+
+ void startTag(std::string name, std::map< std::string, std::string> attributes);
+ void endTag(std::string name);
+
+ Template *getTemplate();
+
+protected:
+ int readData(char *data, size_t size);
+
+private:
+ int fd;
+
+ // Parser state data
+ ParserState state;
+ Template *t;
+ Macro *current_macro;
+ Map *current_map;
+ std::vector< Widget* > widgetstack;
+
+ // Error callback function.
+ void error(char* fmt, ...);
+};
+
+#endif/*__PRACRO_TEMPLATEPARSER_H__*/