summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordeva <deva>2009-07-06 11:01:35 +0000
committerdeva <deva>2009-07-06 11:01:35 +0000
commitce3ee895ae8c893c0202e4cddb068dce9919cd0d (patch)
treee9fb1550e72da7531c65db72f8fd38df90059c16
parentee93b9e274f3aeb3f4b7b6ba33cf07098fe21d8a (diff)
Added new macro tool binary to the project.
-rw-r--r--server/src/.cvsignore1
-rw-r--r--server/src/Makefile.am21
-rw-r--r--server/src/macrotool.cc157
-rw-r--r--server/src/macrotool_dump.cc286
-rw-r--r--server/src/macrotool_dump.h35
5 files changed, 499 insertions, 1 deletions
diff --git a/server/src/.cvsignore b/server/src/.cvsignore
index 9b80a8b..e7654ee 100644
--- a/server/src/.cvsignore
+++ b/server/src/.cvsignore
@@ -1,4 +1,5 @@
pracrod
+macrotool
Makefile.in
Makefile
.libs
diff --git a/server/src/Makefile.am b/server/src/Makefile.am
index a1920fe..768f563 100644
--- a/server/src/Makefile.am
+++ b/server/src/Makefile.am
@@ -1,5 +1,5 @@
-bin_PROGRAMS = pracrod
+bin_PROGRAMS = pracrod macrotool
pracrod_LDADD = $(LD_EFENCE) $(PQXX_LIBS) $(CONFIG_LIBS) $(LUA_LIBS) -lpthread
@@ -33,6 +33,25 @@ pracrod_SOURCES = \
widgetgenerator.cc \
xml_encode_decode.cc
+macrotool_LDADD = $(LD_EFENCE) $(PQXX_LIBS) $(CONFIG_LIBS) $(LUA_LIBS) -lpthread
+
+macrotool_CXXFLAGS = $(PQXX_CXXFLAGS) $(CONFIG_CXXFLAGS) $(LUA_CXXFLAGS)
+
+macrotool_SOURCES = \
+ macrotool.cc \
+ debug.cc \
+ configuration.cc \
+ configurationparser.cc \
+ database.cc \
+ exception.cc \
+ log.cc \
+ macroparser.cc \
+ macrotool_dump.cc \
+ pracrodao.cc \
+ pracrodaopgsql.cc \
+ saxparser.cc \
+ templateparser.cc
+
EXTRA_DIST = \
configuration.h \
configurationparser.h \
diff --git a/server/src/macrotool.cc b/server/src/macrotool.cc
new file mode 100644
index 0000000..46fbc24
--- /dev/null
+++ b/server/src/macrotool.cc
@@ -0,0 +1,157 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * macrotool.cc
+ *
+ * Mon Jul 6 08:25:28 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.
+ */
+// For ETC
+#include <config.h>
+
+// For getopt_long and friends
+#include <getopt.h>
+
+#include "configurationparser.h"
+#include "configuration.h"
+
+#include "debug.h"
+
+#include "macrotool_dump.h"
+
+static const char version_str[] =
+"Pracro server v" VERSION "\n"
+;
+
+static const char copyright_str[] =
+"Copyright (C) 2006-2009 Bent Bisballe Nyeng - Aasimon.org.\n"
+"This is free software. You may redistribute copies of it under the terms of\n"
+"the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+"\n"
+"Written by Bent Bisballe Nyeng (deva@aasimon.org)\n"
+;
+
+static const char usage_str[] =
+"Usage: %s [options] command\n"
+"Options:\n"
+" -c, --config file Read configfile from 'file'\n"
+" -x, --xml-basedir d Use 'd' as basedir for finding template- and macro-files (default "XML").\n"
+" -v, --version Print version information and exit.\n"
+" -h, --help Print this message and exit.\n"
+" -D, --debug ddd Enable debug messages on 'ddd'; see documentation for details\n"
+"\n"
+"Commands:\n"
+" dump entity Dumps 'entity' to screen ('dump help' to see list of entities).\n"
+;
+
+ConfigurationParser *configparser = NULL;
+
+int main(int argc, char *argv[])
+{
+ int c;
+ char *configfile = NULL;
+ char *xml_basedir = NULL;
+ char *debugstr = NULL;
+
+ pracro_debug_init();
+
+ int option_index = 0;
+ while(1) {
+ static struct option long_options[] = {
+ {"config", required_argument, 0, 'c'},
+ {"help", no_argument, 0, 'h'},
+ {"version", no_argument, 0, 'v'},
+ {"xml-basedir", required_argument, 0, 'x'},
+ {"debug", required_argument, 0, 'D'},
+ {0, 0, 0, 0}
+ };
+
+ c = getopt_long (argc, argv, "D:hvc:x:", long_options, &option_index);
+
+ if (c == -1)
+ break;
+
+ switch(c) {
+ case 'c':
+ configfile = strdup(optarg);
+ break;
+
+ case 'x':
+ xml_basedir = strdup(optarg);
+ break;
+
+ case 'D':
+ debugstr = strdup(optarg);
+ break;
+
+ case '?':
+ case 'h':
+ printf(version_str);
+ printf(usage_str, argv[0]);
+ return 0;
+
+ case 'v':
+ printf(version_str);
+ printf(copyright_str);
+ return 0;
+
+ default:
+ break;
+ }
+ }
+
+ if(optind >= argc) {
+ fprintf(stderr, "Missing command\n");
+ printf(usage_str, argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ std::string command = argv[optind];
+
+ if(debugstr) {
+ pracro_debug_parse(debugstr);
+ }
+
+ // Load config
+ if(configfile) configparser = new ConfigurationParser(configfile);
+ else configparser = new ConfigurationParser(ETC"/pracrod.conf");
+
+ if(xml_basedir) {
+ Conf::xml_basedir = xml_basedir;
+ }
+
+ if(command == "dump") {
+ optind++;
+ if(optind >= argc) {
+ fprintf(stderr, "Missing command parameter\n");
+ printf(usage_str, argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ macrotool_dump(argv[optind]);
+ }
+
+ // Clean up
+ if(configfile) free(configfile);
+
+ return 0;
+}
diff --git a/server/src/macrotool_dump.cc b/server/src/macrotool_dump.cc
new file mode 100644
index 0000000..93a96a3
--- /dev/null
+++ b/server/src/macrotool_dump.cc
@@ -0,0 +1,286 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * macrotool_dump.cc
+ *
+ * Mon Jul 6 08:37:22 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 "macrotool_dump.h"
+
+#include "debug.h"
+
+#include "macroparser.h"
+#include "templateparser.h"
+
+#include <vector>
+#include <map>
+#include <set>
+
+#include <sys/types.h>
+#include <dirent.h>
+
+#include <config.h>
+
+#include "configuration.h"
+
+struct _macro {
+ std::string name;
+ std::string title;
+ std::set<std::string> templates;
+ std::string file;
+ std::string version;
+};
+
+struct _template {
+ std::string name;
+ std::string title;
+ std::vector<std::string> macros;
+ std::string file;
+ std::string version;
+};
+
+static const char usage_str[] =
+" help Prints this helptext.\n"
+" macros Writes macro names, versions, filenames, titles and template references to stdout.\n"
+" templates Writes template names, versions, filenames, titles and macro references to stdout.\n"
+;
+
+
+static std::vector<std::string> listdir(std::string path)
+{
+ std::vector<std::string> files;
+
+ DIR* dir = opendir(path.c_str());
+ if(!dir) {
+ PRACRO_ERR(dump, "Could not open directory: %s\n", path.c_str());
+ return files;
+ }
+
+ struct dirent *d;
+ while((d = readdir(dir)) != 0) {
+ //if(d->d_type == DT_DIR) {
+ std::string name = d->d_name;
+ if(name.length() >= 4 && name.substr(name.length() - 4) == ".xml")
+ files.push_back(name);
+ //}
+ }
+ closedir(dir);
+
+ return files;
+}
+
+static std::vector<std::string> getMacros()
+{
+ std::vector<std::string> macros = listdir(Conf::xml_basedir + "/macros");
+ return macros;
+}
+
+static std::vector<std::string> getTemplates()
+{
+ std::vector<std::string> templates = listdir(Conf::xml_basedir + "/templates");
+ return templates;
+}
+
+static void printcolumn(std::string text, size_t width)
+{
+ printf(text.c_str());
+ for(size_t i = text.length(); i < width; i++) printf(" ");
+ printf("\t");
+}
+
+static std::map<std::string, struct _macro> macroList()
+{
+ std::map<std::string, struct _macro> macros;
+
+ std::vector<std::string> macrofiles = getMacros();
+ std::vector<std::string>::iterator mfs = macrofiles.begin();
+ while(mfs != macrofiles.end()) {
+ std::string name = mfs->substr(0, mfs->length() - 4);
+
+ MacroParser parser(name);
+ parser.parse();
+ Macro *macro = parser.getMacro();
+
+ std::string key = name;// + macro->attributes["version"];
+ macros[key].name = name;
+ macros[key].file = *mfs;
+ macros[key].title = macro->window.attributes["caption"];
+ macros[key].version = macro->attributes["version"];
+
+ mfs++;
+ }
+
+ std::vector<std::string> templatefiles = getTemplates();
+ std::vector<std::string>::iterator tfs = templatefiles.begin();
+ while(tfs != templatefiles.end()) {
+ std::string course = tfs->substr(0, tfs->length() - 4);
+ TemplateParser parser(course);
+ parser.parse();
+ Template *t = parser.getTemplate();
+ std::vector<Macro>::iterator ms = t->course.macros.begin();
+ while(ms != t->course.macros.end()) {
+ if(ms->attributes.find("header") == ms->attributes.end())
+ macros[ms->attributes["name"]].templates.insert(course);
+ ms++;
+ }
+ tfs++;
+ }
+
+ return macros;
+}
+
+static void dump_macros()
+{
+ std::map<std::string, struct _macro> macros = macroList();
+ macros[""].title = "Title:";
+ macros[""].file = "File:";
+ macros[""].version = "Version:";
+ macros[""].name = "Macro:";
+ macros[""].templates.insert("Templates:");
+
+ size_t name_sz = 0;
+ size_t version_sz = 0;
+ size_t file_sz = 0;
+ size_t title_sz = 0;
+
+ std::map<std::string, struct _macro>::iterator ms = macros.begin();
+ while(ms != macros.end()) {
+ if(ms->second.name.length() > name_sz) name_sz = ms->second.name.length();
+ if(ms->second.version.length() > version_sz) version_sz = ms->second.version.length();
+ if(ms->second.file.length() > file_sz) file_sz = ms->second.file.length();
+ if(ms->second.title.length() > title_sz) title_sz = ms->second.title.length();
+ ms++;
+ }
+
+ ms = macros.begin();
+ while(ms != macros.end()) {
+ printcolumn(ms->second.name, name_sz);
+ printcolumn(ms->second.version, version_sz);
+ printcolumn(ms->second.file, file_sz);
+ printcolumn(ms->second.title, title_sz);
+
+ std::set<std::string>::iterator ts = ms->second.templates.begin();
+ while(ts != ms->second.templates.end()) {
+ if(ts != ms->second.templates.begin()) printf(", ");
+ printf("%s", ts->c_str() );
+ ts++;
+ }
+
+ printf("\n");
+ ms++;
+ }
+}
+
+static std::map<std::string, struct _template> templateList()
+{
+ std::map<std::string, struct _template> templates;
+
+ std::vector<std::string> templatefiles = getTemplates();
+ std::vector<std::string>::iterator tfs = templatefiles.begin();
+ while(tfs != templatefiles.end()) {
+ std::string course = tfs->substr(0, tfs->length() - 4);
+ TemplateParser parser(course);
+ parser.parse();
+ Template *t = parser.getTemplate();
+
+ std::string key = t->course.attributes["name"];
+
+ templates[key].file = *tfs;
+ templates[key].name = t->course.attributes["name"];
+ templates[key].title = t->course.attributes["title"];
+ templates[key].version = t->course.attributes["version"];
+
+ std::vector<Macro>::iterator ms = t->course.macros.begin();
+ while(ms != t->course.macros.end()) {
+ if(ms->attributes.find("header") == ms->attributes.end())
+ templates[key].macros.push_back(ms->attributes["name"]);
+ ms++;
+ }
+
+ tfs++;
+ }
+
+ return templates;
+}
+
+static void dump_templates()
+{
+ std::map<std::string, struct _template> templates = templateList();
+ templates[""].title = "Title:";
+ templates[""].file = "File:";
+ templates[""].version = "Version:";
+ templates[""].name = "Template:";
+
+ size_t name_sz = 0;
+ size_t version_sz = 0;
+ size_t file_sz = 0;
+ size_t title_sz = 0;
+
+ std::map<std::string, struct _template>::iterator ts = templates.begin();
+ while(ts != templates.end()) {
+ if(ts->second.name.length() > name_sz) name_sz = ts->second.name.length();
+ if(ts->second.version.length() > version_sz) version_sz = ts->second.version.length();
+ if(ts->second.file.length() > file_sz) file_sz = ts->second.file.length();
+ if(ts->second.title.length() > title_sz) title_sz = ts->second.title.length();
+ ts++;
+ }
+
+ ts = templates.begin();
+ while(ts != templates.end()) {
+ printcolumn(ts->second.name, name_sz);
+ printcolumn(ts->second.version, version_sz);
+ printcolumn(ts->second.file, file_sz);
+ printcolumn(ts->second.title, title_sz);
+
+ printf("\n");
+ std::vector<std::string>::iterator ms = ts->second.macros.begin();
+ while(ms != ts->second.macros.end()) {
+ printf("\t%s\n", ms->c_str() );
+ ms++;
+ }
+
+ printf("\n");
+ ts++;
+ }
+}
+
+void macrotool_dump(std::string param)
+{
+ PRACRO_DEBUG(dump, "dump: %s\n", param.c_str());
+
+ if(param == "help") {
+ printf(usage_str);
+ return;
+ }
+
+ if(param == "macros") {
+ dump_macros();
+ return;
+ }
+
+ if(param == "templates") {
+ dump_templates();
+ return;
+ }
+
+}
diff --git a/server/src/macrotool_dump.h b/server/src/macrotool_dump.h
new file mode 100644
index 0000000..cc5adff
--- /dev/null
+++ b/server/src/macrotool_dump.h
@@ -0,0 +1,35 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * macrotool_dump.h
+ *
+ * Mon Jul 6 08:37:22 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.
+ */
+#ifndef __PRACRO_MACROTOOL_DUMP_H__
+#define __PRACRO_MACROTOOL_DUMP_H__
+
+#include <string>
+
+void macrotool_dump(std::string param);
+
+#endif/*__PRACRO_MACROTOOL_DUMP_H__*/