diff options
Diffstat (limited to 'server')
| -rw-r--r-- | server/src/.cvsignore | 1 | ||||
| -rw-r--r-- | server/src/Makefile.am | 21 | ||||
| -rw-r--r-- | server/src/macrotool.cc | 157 | ||||
| -rw-r--r-- | server/src/macrotool_dump.cc | 286 | ||||
| -rw-r--r-- | server/src/macrotool_dump.h | 35 | 
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__*/ | 
