summaryrefslogtreecommitdiff
path: root/server/src/macrotool/macrotool_filehandler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/macrotool/macrotool_filehandler.cc')
-rw-r--r--server/src/macrotool/macrotool_filehandler.cc227
1 files changed, 227 insertions, 0 deletions
diff --git a/server/src/macrotool/macrotool_filehandler.cc b/server/src/macrotool/macrotool_filehandler.cc
new file mode 100644
index 0000000..c52921a
--- /dev/null
+++ b/server/src/macrotool/macrotool_filehandler.cc
@@ -0,0 +1,227 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * macrotool_filehandler.cc
+ *
+ * Fri Jul 17 08:48:09 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_filehandler.h"
+
+#include <fstream>
+#include <ios>
+
+#include <string.h>
+
+#include "macroheaderparser.h"
+#include "macroparser.h"
+#include "template.h"
+
+#include "debug.h"
+
+#include "macrotool_util.h"
+
+#include "configuration.h"
+
+static const char usage_str[] =
+" help Prints this helptext.\n"
+" add file Add a file called 'file' to the macro or template folder, according\n"
+" to its contents.\n"
+" check file Check if a file is valid, and print a resume of its contents.\n"
+;
+
+/**
+class Macro {
+public:
+ std::vector< Query > queries;
+ std::vector< Map > maps;
+ std::vector< Script > scripts;
+ Widget widgets;
+ std::map< std::string, std::string > attributes;
+ Resume resume;
+};
+ **/
+static bool check(std::string file, std::string *name = NULL, std::string *version = NULL);
+static bool check(std::string file, std::string *name, std::string *version)
+{
+ try {
+ MacroHeaderParser parser(file);
+ parser.parse();
+ Macro *macro = parser.getMacro();
+
+ if(!macro) {
+ printf("Macro malformed!\n");
+ return false;
+ }
+
+ printf("Parsing of %s was succesful.\n", file.c_str());
+ printf("Name: %s\n", macro->attributes["name"].c_str());
+ printf("Version: %s\n", macro->attributes["version"].c_str());
+
+ if(name) *name = macro->attributes["name"];
+ if(version) *version = macro->attributes["version"];
+
+ } catch( std::exception &e ) {
+ printf("%s\n", e.what());
+ return false;
+ }
+ return true;
+}
+
+#define SZ 1 // For stress test purposes set this to a large number (1000)
+static bool macro_exists(std::string name, std::string version, std::string &clashfile)
+{
+ std::vector<std::string> macrofiles = getMacros();
+
+ for(int prut = 0; prut < SZ; prut++) {
+ std::vector<std::string>::iterator mfs = macrofiles.begin();
+ while(mfs != macrofiles.end()) {
+ std::string macroname = mfs->substr(0, mfs->length() - 4);
+
+ MacroHeaderParser parser(Conf::xml_basedir + "/macros/" + *mfs);
+ //MacroParser parser(macroname);
+ parser.parse();
+ Macro *macro = parser.getMacro();
+
+ if(name == macro->attributes["name"] &&
+ version == macro->attributes["version"]) {
+ clashfile = *mfs;
+ return true;
+ }
+
+ mfs++;
+ }
+ }
+ printf("Parsed %d files\n", macrofiles.size() * SZ);
+ return false;
+}
+
+static std::string strippath(std::string filename)
+{
+ if(filename.find('/') == std::string::npos) return filename;
+ return filename.substr(filename.rfind('/')+1);
+}
+
+static bool file_exist(std::string file)
+{
+ FILE *fp = fopen(file.c_str(), "r");
+ if(!fp) return false;
+ fclose(fp);
+ return true;
+}
+
+static void add(std::string file)
+{
+ std::string name;
+ std::string version;
+ std::string clashfile;
+ std::string target;
+
+ if(!check(file, &name, &version)) {
+ printf("File not a valid macro file.\nAborting...\n");
+ return;
+ }
+
+ if(macro_exists(name, version, clashfile)) {
+ printf("WARNING: A macro with that name and version already exists."
+ " THE EXISTING FILE WILL BE OVERWRITTEN!\n");
+ printf("File: %s\n", clashfile.c_str());
+ char answer[32];
+ answer[0] = '\0';
+ while(std::string(answer) != "yes\n" && std::string(answer) != "no\n") {
+ if(answer[0] == '\0') printf("Are you sure you want to put the file in the macro directory? [yes/no]\n");
+ else printf("Please answer 'yes' or 'no'\n");
+ fgets(answer, sizeof(answer), stdin);
+ }
+
+ if(std::string(answer) == "no\n") {
+ printf("Aborting...\n");
+ return;
+ }
+ target = Conf::xml_basedir + "/macros/" + clashfile;
+ } else {
+ target = Conf::xml_basedir + "/macros/" + strippath(file);
+
+ size_t cnt = 0;
+ while(file_exist(target)) {
+ char *num;
+ if(cnt) asprintf(&num, "-%d", cnt);
+ else num = strdup("");
+ target = Conf::xml_basedir + "/macros/" + name + "-" + version + num + ".xml";
+ printf("Trying: %d %s\n", cnt, target.c_str());
+ free(num);
+ cnt++;
+ }
+ }
+
+ printf("Copying '%s' to '%s' ...\n", file.c_str(), target.c_str());
+
+ {
+ std::ifstream ifs(file.c_str(), std::ios::binary);
+ if(!ifs) {
+ printf("Could read source file.\nAborting...\n");
+ return;
+ }
+ std::ofstream ofs(target.c_str(), std::ios::binary);
+ ofs << ifs.rdbuf();
+ }
+ printf("done\n");
+}
+
+void macrotool_filehandler(std::vector<std::string> params)
+{
+ if(params.size() < 1) {
+ printf("%s", usage_str);
+ return;
+ }
+
+ PRACRO_DEBUG(filehandler, "filehandler: %s\n", params[0].c_str());
+
+ if(params[0] == "add") {
+ if(params.size() != 2) {
+ printf("The command 'add' needs 1 parameter.\n");
+ printf("%s", usage_str);
+ return;
+ }
+ add(params[1]);
+ return;
+ }
+
+ if(params[0] == "check") {
+ if(params.size() != 2) {
+ printf("The command 'check' needs 1 parameter.\n");
+ printf("%s", usage_str);
+ return;
+ }
+ check(params[1]);
+ return;
+ }
+
+ if(params[0] == "help") {
+ printf("%s", usage_str);
+ return;
+ }
+
+ printf("Unknown command '%s'\n", params[0].c_str());
+ printf("%s", usage_str);
+ return;
+}