summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libutil/include/cmdutils.h326
-rw-r--r--libutil/include/userutils.h12
-rw-r--r--main.cpp335
3 files changed, 339 insertions, 334 deletions
diff --git a/libutil/include/cmdutils.h b/libutil/include/cmdutils.h
index fc1162d9..d75a1773 100644
--- a/libutil/include/cmdutils.h
+++ b/libutil/include/cmdutils.h
@@ -38,13 +38,13 @@ namespace Commandline {
* Specifies how flags are decorated
*/
enum class FlagStyle {
- GNU, /**< --option and -o (GNU Style) */
- Unix, /**< -option and -o (Unix Style) */
- Windows, /**< /option and /o (Windows Style) */
+ GNU, /**< --option and -o (GNU Style) */
+ Unix, /**< -option and -o (Unix Style) */
+ Windows, /**< /option and /o (Windows Style) */
#ifdef Q_OS_WIN32
- Default = Windows
+ Default = Windows
#else
- Default = GNU
+ Default = GNU
#endif
};
@@ -52,13 +52,13 @@ enum class FlagStyle {
* @brief The ArgumentStyle enum
*/
enum class ArgumentStyle {
- Space, /**< --option=value */
- Equals, /**< --option value */
- SpaceAndEquals, /**< --option[= ]value */
+ Space, /**< --option=value */
+ Equals, /**< --option value */
+ SpaceAndEquals, /**< --option[= ]value */
#ifdef Q_OS_WIN32
- Default = Equals
+ Default = Equals
#else
- Default = SpaceAndEquals
+ Default = SpaceAndEquals
#endif
};
@@ -68,13 +68,13 @@ enum class ArgumentStyle {
class ParsingError : public std::exception
{
public:
- ParsingError(const QString &what);
- ParsingError(const ParsingError &e);
- ~ParsingError() throw() {}
- const char *what() const throw();
- QString qwhat() const;
+ ParsingError(const QString &what);
+ ParsingError(const ParsingError &e);
+ ~ParsingError() throw() {}
+ const char *what() const throw();
+ QString qwhat() const;
private:
- QString m_what;
+ QString m_what;
};
/**
@@ -83,154 +83,154 @@ private:
class Parser
{
public:
- /**
- * @brief Parser constructor
- * @param flagStyle the FlagStyle to use in this Parser
- * @param argStyle the ArgumentStyle to use in this Parser
- */
- Parser(FlagStyle flagStyle=FlagStyle::Default, ArgumentStyle argStyle=ArgumentStyle::Default);
-
- /**
- * @brief set the flag style
- * @param style
- */
- void setFlagStyle(FlagStyle style);
-
- /**
- * @brief get the flag style
- * @return
- */
- FlagStyle flagStyle();
-
- /**
- * @brief set the argument style
- * @param style
- */
- void setArgumentStyle(ArgumentStyle style);
-
- /**
- * @brief get the argument style
- * @return
- */
- ArgumentStyle argumentStyle();
-
- /**
- * @brief define a boolean switch
- * @param name the parameter name
- * @param def the default value
- */
- void addSwitch(QString name, bool def=false);
-
- /**
- * @brief define an option that takes an additional argument
- * @param name the parameter name
- * @param def the default value
- */
- void addOption(QString name, QVariant def=QVariant());
-
- /**
- * @brief define a positional argument
- * @param name the parameter name
- * @param required wether this argument is required
- * @param def the default value
- */
- void addArgument(QString name, bool required=true, QVariant def=QVariant());
-
- /**
- * @brief adds a flag to an existing parameter
- * @param name the (existing) parameter name
- * @param flag the flag character
- * @see addSwitch addArgument addOption
- * Note: any one parameter can only have one flag
- */
- void addShortOpt(QString name, QChar flag);
-
- /**
- * @brief adds documentation to a Parameter
- * @param name the parameter name
- * @param metavar a string to be displayed as placeholder for the value
- * @param doc a QString containing the documentation
- * Note: on positional arguments, metavar replaces the name as displayed.
- * on options , metavar replaces the value placeholder
- */
- void addDocumentation(QString name, QString doc, QString metavar=QString());
-
- /**
- * @brief generate a help message
- * @param progName the program name to use in the help message
- * @param helpIndent how much the parameter documentation should be indented
- * @param flagsInUsage whether we should use flags instead of options in the usage
- * @return a help message
- */
- QString compileHelp(QString progName, int helpIndent=22, bool flagsInUsage=true);
-
- /**
- * @brief generate a short usage message
- * @param progName the program name to use in the usage message
- * @param useFlags whether we should use flags instead of options
- * @return a usage message
- */
- QString compileUsage(QString progName, bool useFlags=true);
-
- /**
- * @brief parse
- * @param argv a QStringList containing the program ARGV
- * @return a QHash mapping argument names to their values
- */
- QHash<QString, QVariant> parse(QStringList argv);
-
- /**
- * @brief clear all definitions
- */
- void clear();
-
- ~Parser();
-
+ /**
+ * @brief Parser constructor
+ * @param flagStyle the FlagStyle to use in this Parser
+ * @param argStyle the ArgumentStyle to use in this Parser
+ */
+ Parser(FlagStyle flagStyle=FlagStyle::Default, ArgumentStyle argStyle=ArgumentStyle::Default);
+
+ /**
+ * @brief set the flag style
+ * @param style
+ */
+ void setFlagStyle(FlagStyle style);
+
+ /**
+ * @brief get the flag style
+ * @return
+ */
+ FlagStyle flagStyle();
+
+ /**
+ * @brief set the argument style
+ * @param style
+ */
+ void setArgumentStyle(ArgumentStyle style);
+
+ /**
+ * @brief get the argument style
+ * @return
+ */
+ ArgumentStyle argumentStyle();
+
+ /**
+ * @brief define a boolean switch
+ * @param name the parameter name
+ * @param def the default value
+ */
+ void addSwitch(QString name, bool def=false);
+
+ /**
+ * @brief define an option that takes an additional argument
+ * @param name the parameter name
+ * @param def the default value
+ */
+ void addOption(QString name, QVariant def=QVariant());
+
+ /**
+ * @brief define a positional argument
+ * @param name the parameter name
+ * @param required wether this argument is required
+ * @param def the default value
+ */
+ void addArgument(QString name, bool required=true, QVariant def=QVariant());
+
+ /**
+ * @brief adds a flag to an existing parameter
+ * @param name the (existing) parameter name
+ * @param flag the flag character
+ * @see addSwitch addArgument addOption
+ * Note: any one parameter can only have one flag
+ */
+ void addShortOpt(QString name, QChar flag);
+
+ /**
+ * @brief adds documentation to a Parameter
+ * @param name the parameter name
+ * @param metavar a string to be displayed as placeholder for the value
+ * @param doc a QString containing the documentation
+ * Note: on positional arguments, metavar replaces the name as displayed.
+ * on options , metavar replaces the value placeholder
+ */
+ void addDocumentation(QString name, QString doc, QString metavar=QString());
+
+ /**
+ * @brief generate a help message
+ * @param progName the program name to use in the help message
+ * @param helpIndent how much the parameter documentation should be indented
+ * @param flagsInUsage whether we should use flags instead of options in the usage
+ * @return a help message
+ */
+ QString compileHelp(QString progName, int helpIndent=22, bool flagsInUsage=true);
+
+ /**
+ * @brief generate a short usage message
+ * @param progName the program name to use in the usage message
+ * @param useFlags whether we should use flags instead of options
+ * @return a usage message
+ */
+ QString compileUsage(QString progName, bool useFlags=true);
+
+ /**
+ * @brief parse
+ * @param argv a QStringList containing the program ARGV
+ * @return a QHash mapping argument names to their values
+ */
+ QHash<QString, QVariant> parse(QStringList argv);
+
+ /**
+ * @brief clear all definitions
+ */
+ void clear();
+
+ ~Parser();
+
private:
- FlagStyle m_flagStyle;
- ArgumentStyle m_argStyle;
-
- enum class OptionType {
- Switch,
- Option
- };
-
- // Important: the common part MUST BE COMMON ON ALL THREE structs
- struct CommonDef {
- QString name;
- QString doc;
- QString metavar;
- QVariant def;
- };
-
- struct OptionDef {
- // common
- QString name;
- QString doc;
- QString metavar;
- QVariant def;
- // option
- OptionType type;
- QChar flag;
- };
-
- struct PositionalDef {
- // common
- QString name;
- QString doc;
- QString metavar;
- QVariant def;
- // positional
- bool required;
- };
-
- QHash<QString, OptionDef *> m_options;
- QHash<QChar, OptionDef *> m_flags;
- QHash<QString, CommonDef *> m_params;
- QList<PositionalDef *> m_positionals;
- QList<OptionDef *> m_optionList;
-
- void getPrefix(QString &opt, QString &flag);
+ FlagStyle m_flagStyle;
+ ArgumentStyle m_argStyle;
+
+ enum class OptionType {
+ Switch,
+ Option
+ };
+
+ // Important: the common part MUST BE COMMON ON ALL THREE structs
+ struct CommonDef {
+ QString name;
+ QString doc;
+ QString metavar;
+ QVariant def;
+ };
+
+ struct OptionDef {
+ // common
+ QString name;
+ QString doc;
+ QString metavar;
+ QVariant def;
+ // option
+ OptionType type;
+ QChar flag;
+ };
+
+ struct PositionalDef {
+ // common
+ QString name;
+ QString doc;
+ QString metavar;
+ QVariant def;
+ // positional
+ bool required;
+ };
+
+ QHash<QString, OptionDef *> m_options;
+ QHash<QChar, OptionDef *> m_flags;
+ QHash<QString, CommonDef *> m_params;
+ QList<PositionalDef *> m_positionals;
+ QList<OptionDef *> m_optionList;
+
+ void getPrefix(QString &opt, QString &flag);
};
}
diff --git a/libutil/include/userutils.h b/libutil/include/userutils.h
index c99e758e..2ea1d457 100644
--- a/libutil/include/userutils.h
+++ b/libutil/include/userutils.h
@@ -5,13 +5,13 @@
namespace Util
{
- // Get the Directory representing the User's Desktop
- QString getDesktopDir();
+// Get the Directory representing the User's Desktop
+QString getDesktopDir();
- // Create a shortcut at *location*, pointing to *dest* called with the arguments *args*
- // call it *name* and assign it the icon *icon*
- // return true if operation succeeded
- bool createShortCut(QString location, QString dest, QStringList args, QString name, QString iconLocation);
+// Create a shortcut at *location*, pointing to *dest* called with the arguments *args*
+// call it *name* and assign it the icon *icon*
+// return true if operation succeeded
+bool createShortCut(QString location, QString dest, QStringList args, QString name, QString iconLocation);
}
#endif // USERUTILS_H
diff --git a/main.cpp b/main.cpp
index a115b67d..27e86d5f 100644
--- a/main.cpp
+++ b/main.cpp
@@ -44,192 +44,197 @@ using namespace Util::Commandline;
// Commandline instance launcher
class InstanceLauncher : public QObject
{
- Q_OBJECT
+ Q_OBJECT
private:
- InstanceList instances;
- QString instId;
- InstancePtr instance;
- MinecraftProcess *proc;
- ConsoleWindow *console;
+ InstanceList instances;
+ QString instId;
+ InstancePtr instance;
+ MinecraftProcess *proc;
+ ConsoleWindow *console;
public:
- InstanceLauncher(QString instId) : QObject(), instances(settings->getInstanceDir())
- {
- this->instId = instId;
- }
-
+ InstanceLauncher(QString instId) : QObject(), instances(settings->get("InstanceDir").toString())
+ {
+ this->instId = instId;
+ }
+
private:
- InstancePtr findInstance(QString instId)
- {
- QListIterator<InstancePtr> iter(instances);
- InstancePtr inst;
- while(iter.hasNext())
- {
- inst = iter.next();
- if (inst->id() == instId)
- break;
- }
- if (inst->id() != instId)
- return InstancePtr();
- else
- return iter.peekPrevious();
- }
-
+ InstancePtr findInstance(QString instId)
+ {
+ QListIterator<InstancePtr> iter(instances);
+ InstancePtr inst;
+ while(iter.hasNext())
+ {
+ inst = iter.next();
+ if (inst->id() == instId)
+ break;
+ }
+ if (inst->id() != instId)
+ return InstancePtr();
+ else
+ return iter.peekPrevious();
+ }
+
private slots:
- void onTerminated()
- {
- std::cout << "Minecraft exited" << std::endl;
- QApplication::instance()->quit();
- }
-
- void onLoginComplete(LoginResponse response)
- {
- // TODO: console
- console = new ConsoleWindow();
- proc = new MinecraftProcess(instance, response.getUsername(), response.getSessionID(), console);
- //if (instance->getShowConsole())
- console->show();
- connect(proc, SIGNAL(ended()), SLOT(onTerminated()));
- proc->launch();
- }
-
- void doLogin(const QString &errorMsg)
- {
- LoginDialog* loginDlg = new LoginDialog(nullptr, errorMsg);
- if (loginDlg->exec())
- {
- UserInfo uInfo(loginDlg->getUsername(), loginDlg->getPassword());
-
- TaskDialog* tDialog = new TaskDialog(nullptr);
- LoginTask* loginTask = new LoginTask(uInfo, tDialog);
- connect(loginTask, SIGNAL(loginComplete(LoginResponse)),
- SLOT(onLoginComplete(LoginResponse)), Qt::QueuedConnection);
- connect(loginTask, SIGNAL(loginFailed(QString)),
- SLOT(doLogin(QString)), Qt::QueuedConnection);
- tDialog->exec(loginTask);
- }
- //onLoginComplete(LoginResponse("Offline","Offline", 1));
- }
-
+ void onTerminated()
+ {
+ std::cout << "Minecraft exited" << std::endl;
+ QApplication::instance()->quit();
+ }
+
+ void onLoginComplete(LoginResponse response)
+ {
+ // TODO: console
+ console = new ConsoleWindow();
+ proc = new MinecraftProcess(instance, response.getUsername(), response.getSessionID(), console);
+ //if (instance->getShowConsole())
+ console->show();
+ connect(proc, SIGNAL(ended()), SLOT(onTerminated()));
+ proc->launch();
+ }
+
+ void doLogin(const QString &errorMsg)
+ {
+ LoginDialog* loginDlg = new LoginDialog(nullptr, errorMsg);
+ if (loginDlg->exec())
+ {
+ UserInfo uInfo(loginDlg->getUsername(), loginDlg->getPassword());
+
+ TaskDialog* tDialog = new TaskDialog(nullptr);
+ LoginTask* loginTask = new LoginTask(uInfo, tDialog);
+ connect(loginTask, SIGNAL(loginComplete(LoginResponse)),
+ SLOT(onLoginComplete(LoginResponse)), Qt::QueuedConnection);
+ connect(loginTask, SIGNAL(loginFailed(QString)),
+ SLOT(doLogin(QString)), Qt::QueuedConnection);
+ tDialog->exec(loginTask);
+ }
+ //onLoginComplete(LoginResponse("Offline","Offline", 1));
+ }
+
public:
- int launch()
- {
- std::cout << "Loading Instances..." << std::endl;
- instances.loadList();
-
- std::cout << "Launching Instance '" << qPrintable(instId) << "'" << std::endl;
- instance = findInstance(instId);
- if (instance.isNull())
- {
- std::cout << "Could not find instance requested. note that you have to specify the ID, not the NAME" << std::endl;
- return 1;
- }
-
- std::cout << "Logging in..." << std::endl;
- doLogin("");
-
- return QApplication::instance()->exec();
- }
+ int launch()
+ {
+ std::cout << "Loading Instances..." << std::endl;
+ instances.loadList();
+
+ std::cout << "Launching Instance '" << qPrintable(instId) << "'" << std::endl;
+ instance = findInstance(instId);
+ if (instance.isNull())
+ {
+ std::cout << "Could not find instance requested. note that you have to specify the ID, not the NAME" << std::endl;
+ return 1;
+ }
+
+ std::cout << "Logging in..." << std::endl;
+ doLogin("");
+
+ return QApplication::instance()->exec();
+ }
};
int main(int argc, char *argv[])
{
- // initialize Qt
+ // initialize Qt
QApplication app(argc, argv);
app.setOrganizationName("Forkk");
app.setApplicationName("MultiMC 5");
-
- // Print app header
- std::cout << "MultiMC 5" << std::endl;
- std::cout << "(c) 2013 MultiMC Contributors" << std::endl << std::endl;
-
- // Commandline parsing
- Parser parser(FlagStyle::GNU, ArgumentStyle::SpaceAndEquals);
-
- // --help
- parser.addSwitch("help");
- parser.addShortOpt("help", 'h');
- parser.addDocumentation("help", "display this help and exit.");
- // --version
- parser.addSwitch("version");
- parser.addShortOpt("version", 'V');
- parser.addDocumentation("version", "display program version and exit.");
- // --dir
- parser.addOption("dir", app.applicationDirPath());
- parser.addShortOpt("dir", 'd');
- parser.addDocumentation("dir", "use the supplied directory as MultiMC root instead of the binary location (use '.' for current)");
- // --update
- parser.addOption("update");
- parser.addShortOpt("update", 'u');
- parser.addDocumentation("update", "replaces the given file with the running executable", "<path>");
- // --quietupdate
- parser.addSwitch("quietupdate");
- parser.addShortOpt("quietupdate", 'U');
- parser.addDocumentation("quietupdate", "doesn't restart MultiMC after installing updates");
- // --launch
- parser.addOption("launch");
- parser.addShortOpt("launch", 'l');
- parser.addDocumentation("launch", "tries to launch the given instance", "<inst>");
-
- // parse the arguments
- QHash<QString, QVariant> args;
- try {
- args = parser.parse(app.arguments());
- } catch(ParsingError e) {
- std::cerr << "CommandLineError: " << e.what() << std::endl;
- std::cerr << "Try '%1 -h' to get help on MultiMC's command line parameters." << std::endl;
- return 1;
- }
-
- // display help and exit
- if (args["help"].toBool()) {
- std::cout << qPrintable(parser.compileHelp(app.arguments()[0]));
- return 0;
- }
-
- // display version and exit
- if (args["version"].toBool()) {
- std::cout << "Version " << VERSION_STR << std::endl;
- std::cout << "Git " << GIT_COMMIT << std::endl;
- std::cout << "Tag: " << JENKINS_BUILD_TAG << " " << (ARCH==x64?"x86_64":"x86") << std::endl;
- return 0;
- }
-
- // update
- // Note: cwd is always the current executable path!
- if (!args["update"].isNull())
- {
- std::cout << "Performing MultiMC update: " << qPrintable(args["update"].toString()) << std::endl;
- QString cwd = QDir::currentPath();
- QDir::setCurrent(app.applicationDirPath());
- QFile file(app.applicationFilePath());
- file.copy(args["update"].toString());
- if(args["quietupdate"].toBool())
- return 0;
- QDir::setCurrent(cwd);
- }
-
- // change directory
- QDir::setCurrent(args["dir"].toString());
-
- // load settings
+
+ // Print app header
+ std::cout << "MultiMC 5" << std::endl;
+ std::cout << "(c) 2013 MultiMC Contributors" << std::endl << std::endl;
+
+ // Commandline parsing
+ Parser parser(FlagStyle::GNU, ArgumentStyle::SpaceAndEquals);
+
+ // --help
+ parser.addSwitch("help");
+ parser.addShortOpt("help", 'h');
+ parser.addDocumentation("help", "display this help and exit.");
+ // --version
+ parser.addSwitch("version");
+ parser.addShortOpt("version", 'V');
+ parser.addDocumentation("version", "display program version and exit.");
+ // --dir
+ parser.addOption("dir", app.applicationDirPath());
+ parser.addShortOpt("dir", 'd');
+ parser.addDocumentation("dir", "use the supplied directory as MultiMC root instead of the binary location (use '.' for current)");
+ // --update
+ parser.addOption("update");
+ parser.addShortOpt("update", 'u');
+ parser.addDocumentation("update", "replaces the given file with the running executable", "<path>");
+ // --quietupdate
+ parser.addSwitch("quietupdate");
+ parser.addShortOpt("quietupdate", 'U');
+ parser.addDocumentation("quietupdate", "doesn't restart MultiMC after installing updates");
+ // --launch
+ parser.addOption("launch");
+ parser.addShortOpt("launch", 'l');
+ parser.addDocumentation("launch", "tries to launch the given instance", "<inst>");
+
+ // parse the arguments
+ QHash<QString, QVariant> args;
+ try
+ {
+ args = parser.parse(app.arguments());
+ }
+ catch(ParsingError e)
+ {
+ std::cerr << "CommandLineError: " << e.what() << std::endl;
+ std::cerr << "Try '%1 -h' to get help on MultiMC's command line parameters." << std::endl;
+ return 1;
+ }
+
+ // display help and exit
+ if (args["help"].toBool())
+ {
+ std::cout << qPrintable(parser.compileHelp(app.arguments()[0]));
+ return 0;
+ }
+
+ // display version and exit
+ if (args["version"].toBool())
+ {
+ std::cout << "Version " << VERSION_STR << std::endl;
+ std::cout << "Git " << GIT_COMMIT << std::endl;
+ std::cout << "Tag: " << JENKINS_BUILD_TAG << " " << (ARCH==x64?"x86_64":"x86") << std::endl;
+ return 0;
+ }
+
+ // update
+ // Note: cwd is always the current executable path!
+ if (!args["update"].isNull())
+ {
+ std::cout << "Performing MultiMC update: " << qPrintable(args["update"].toString()) << std::endl;
+ QString cwd = QDir::currentPath();
+ QDir::setCurrent(app.applicationDirPath());
+ QFile file(app.applicationFilePath());
+ file.copy(args["update"].toString());
+ if(args["quietupdate"].toBool())
+ return 0;
+ QDir::setCurrent(cwd);
+ }
+
+ // change directory
+ QDir::setCurrent(args["dir"].toString());
+
+ // load settings
settings = new AppSettings(&app);
-
+
// Register meta types.
qRegisterMetaType<LoginResponse>("LoginResponse");
-
+
// Initialize plugins.
PluginManager::get().loadPlugins(PathCombine(qApp->applicationDirPath(), "plugins"));
PluginManager::get().initInstanceTypes();
-
- // launch instance.
- if (!args["launch"].isNull())
- return InstanceLauncher(args["launch"].toString()).launch();
-
- // show main window
+
+ // launch instance.
+ if (!args["launch"].isNull())
+ return InstanceLauncher(args["launch"].toString()).launch();
+
+ // show main window
MainWindow mainWin;
mainWin.show();
- // loop
+ // loop
return app.exec();
}