summaryrefslogtreecommitdiff
path: root/server/src/templateheaderparser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/templateheaderparser.cc')
-rw-r--r--server/src/templateheaderparser.cc142
1 files changed, 142 insertions, 0 deletions
diff --git a/server/src/templateheaderparser.cc b/server/src/templateheaderparser.cc
new file mode 100644
index 0000000..8b0f162
--- /dev/null
+++ b/server/src/templateheaderparser.cc
@@ -0,0 +1,142 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * templateheaderparser.cc
+ *
+ * Thu Jul 30 08:53:26 CEST 2009
+ * Copyright 2009 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * 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 "templateheaderparser.h"
+
+#include <stdio.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>
+
+#include <errno.h>
+#include <string.h>
+
+#include "debug.h"
+#include "configuration.h"
+#include "exception.h"
+
+void TemplateHeaderParser::error(const char* fmt, ...)
+{
+ PRACRO_ERR_LOG(templateparser, "Error in TemplateHeaderParser: ");
+
+ {
+ va_list argp;
+ va_start(argp, fmt);
+ PRACRO_ERR_LOG_VA(templateparser, fmt, argp);
+ va_end(argp);
+
+ fprintf(stderr, "\n");
+ }
+
+ {
+ char *p;
+ va_list argp;
+ va_start(argp, fmt);
+ if(vasprintf(&p, fmt, argp) != -1) {
+ throw Exception("Error in TemplateHeaderParser: " + std::string(p));
+ free(p);
+ }
+ va_end(argp);
+ }
+
+}
+
+TemplateHeaderParser::TemplateHeaderParser(std::string templatefile)
+{
+ t = NULL;
+
+ file = templatefile;
+
+ PRACRO_DEBUG(templateparser, "Using template file: %s\n", templatefile.c_str());
+
+ fd = open(templatefile.c_str(), O_RDONLY);
+ if(fd == -1) error("Could not open file %s", templatefile.c_str());
+}
+
+TemplateHeaderParser::~TemplateHeaderParser()
+{
+ if(fd != -1) close(fd);
+ if(t) delete t;
+}
+
+void TemplateHeaderParser::startTag(std::string name, std::map< std::string, std::string> attributes)
+{
+ // Create template and enable parsing of queries, maps and window
+ if(name == "template") {
+ assert(!t); // A Template has already been allocated, cannot create template!
+ t = new Template();
+ t->attributes = attributes;
+ }
+}
+
+int TemplateHeaderParser::readData(char *data, size_t size)
+{
+ if(t) return 0; // If t is allocated, it means that we have parsed the template
+ // tag, and can dismiss the rest of the document.
+
+ if(fd == -1) {
+ PRACRO_ERR_LOG(templateparser, "Invalid file descriptor.\n");
+ return 0;
+ }
+ ssize_t r = read(fd, data, size);
+ if(r == -1) {
+ PRACRO_ERR_LOG(templateparser, "Could not read...%s\n", strerror(errno));
+ return 0;
+ }
+ return r;
+}
+
+void TemplateHeaderParser::parseError(char *buf, size_t len, std::string error, int lineno)
+{
+ if(t) return; // Ignore "unclosed token" errors when the template tag has been parsed.
+
+ PRACRO_ERR_LOG(templateparser, "TemplateHeaderParser[%s] error at line %d: %s\n", file.c_str(), lineno, error.c_str());
+ PRACRO_ERR_LOG(templateparser, "\tBuffer %u bytes: [", len);
+ if(fwrite(buf, len, 1, stderr) != len) {}
+ PRACRO_ERR_LOG(templateparser, "]\n");
+
+ char *slineno;
+ if(asprintf(&slineno, " at line %d\n", lineno) != -1) {
+ throw Exception(error + slineno);
+ free(slineno);
+ }
+
+}
+
+Template *TemplateHeaderParser::getTemplate()
+{
+ return t;
+}