diff options
Diffstat (limited to 'lib/kross/runner/main.cpp')
-rw-r--r-- | lib/kross/runner/main.cpp | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/lib/kross/runner/main.cpp b/lib/kross/runner/main.cpp new file mode 100644 index 00000000..89a35278 --- /dev/null +++ b/lib/kross/runner/main.cpp @@ -0,0 +1,144 @@ +/*************************************************************************** + * main.cpp + * This file is part of the KDE project + * copyright (C)2006 by Sebastian Sauer (mail@dipe.org) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * This program 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 + * Library General Public License for more details. + * You should have received a copy of the GNU Library General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + ***************************************************************************/ + +// for std namespace +#include <string> +#include <iostream> + +// Qt +#include <qstring.h> +#include <qfile.h> + +// KDE +#include <kinstance.h> +#include <kapplication.h> +#include <kcmdlineargs.h> +#include <kaboutdata.h> +#include <ksharedptr.h> + +// Kross +#include "../main/manager.h" +#include "../main/scriptcontainer.h" +#include "../api/interpreter.h" + +#define ERROR_OK 0 +#define ERROR_HELP -1 +#define ERROR_NOSUCHFILE -2 +#define ERROR_OPENFAILED -3 +#define ERROR_NOINTERPRETER -4 +#define ERROR_UNHALDEDEXCEPTION -5 +#define ERROR_EXCEPTION -6 + +KApplication* app = 0; + +int runScriptFile(const QString& scriptfile) +{ + // Read the scriptfile + QFile f(QFile::encodeName(scriptfile)); + if(! f.exists()) { + std::cerr << "No such scriptfile: " << scriptfile.latin1() << std::endl; + return ERROR_NOSUCHFILE; + } + if(! f.open(IO_ReadOnly)) { + std::cerr << "Failed to open scriptfile: " << scriptfile.latin1() << std::endl; + return ERROR_OPENFAILED; + } + QString scriptcode = f.readAll(); + f.close(); + + // Determinate the matching interpreter + Kross::Api::Manager* manager = Kross::Api::Manager::scriptManager(); + Kross::Api::InterpreterInfo* interpreterinfo = manager->getInterpreterInfo( manager->getInterpreternameForFile(scriptfile) ); + if(! interpreterinfo) { + std::cerr << "No interpreter for file: " << scriptfile.latin1() << std::endl; + return ERROR_NOINTERPRETER; + } + + // Run the script. + try { + // First we need a scriptcontainer and fill it. + Kross::Api::ScriptContainer::Ptr scriptcontainer = manager->getScriptContainer(scriptfile); + scriptcontainer->setInterpreterName( interpreterinfo->getInterpretername() ); + scriptcontainer->setCode(scriptcode); + // Now execute the scriptcontainer. + scriptcontainer->execute(); + if(scriptcontainer->hadException()) { + // We had an exception. + QString errormessage = scriptcontainer->getException()->getError(); + QString tracedetails = scriptcontainer->getException()->getTrace(); + std::cerr << QString("%2\n%1").arg(tracedetails).arg(errormessage).latin1() << std::endl; + return ERROR_EXCEPTION; + } + } + catch(Kross::Api::Exception::Ptr e) { + // Normaly that shouldn't be the case... + std::cerr << QString("EXCEPTION %1").arg(e->toString()).latin1() << std::endl; + return ERROR_UNHALDEDEXCEPTION; + } + return ERROR_OK; +} + +int main(int argc, char **argv) +{ + int result = ERROR_OK; + + KAboutData about("krossrunner", + "krossrunner", + "0.1", + "KDE application to run Kross scripts.", + KAboutData::License_LGPL, + "(C) 2006 Sebastian Sauer", + "Run Kross scripts.", + "http://www.dipe.org/kross", + "kross@dipe.org"); + about.addAuthor("Sebastian Sauer", "Author", "mail@dipe.org"); + + // Initialize command line args + KCmdLineArgs::init(argc, argv, &about); + // Tell which options are supported and parse them. + static KCmdLineOptions options[] = { + { "+file", I18N_NOOP("Scriptfile"), 0 }, + KCmdLineLastOption + }; + KCmdLineArgs::addCmdLineOptions(options); + KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); + + // If no options are defined. + if(args->count() < 1) { + std::cout << "Syntax: " << KCmdLineArgs::appName() << " scriptfile1 [scriptfile2] [scriptfile3] ..." << std::endl; + return ERROR_HELP; + } + + // Create KApplication instance. + app = new KApplication( /* allowStyles */ true, /* GUIenabled */ true ); + + //QString interpretername = args->getOption("interpreter"); + //QString scriptfilename = args->getOption("scriptfile"); + + // Each argument is a scriptfile to open + for(int i = 0; i < args->count(); i++) { + result = runScriptFile(QFile::decodeName(args->arg(i))); + if(result != ERROR_OK) + break; + } + + // Free the KApplication instance and exit the program. + delete app; + return result; +} |