#include <QMap>
#include <QString>
#include <QSettings>
#include <QTranslator>
#include <QtAlgorithms>
#include <QtGui/QApplication>
#include <cstdlib>
#include <iostream>
#include <string>
#include "command_line_options.h"
#include "dialog.h"
#include "globals.h"
#include "save_restore_session.h"
#include "vsession.h"
#include "xsession.h"
bool myLessThan(Session* a, Session* b) {
return *a < *b;
}
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QTranslator translator;
translator.load(":" + QLocale::system().name());
a.installTranslator(&translator);
std::string version = "0.0.13";
CommandLineOptions cmdOptions(argc, argv);
std::string usage(a.translate(
"Console",
"Usage: vmchooser [ OPTIONS | FILE ]\n\n"
" -d, --default name of default session\n"
" -p, --path path to vmware .xml files\n"
" -x, --xpath path of X Session .desktop files\n"
" -s, --size window size <width>x<height>\n"
" -v, --version print version and exit\n"
" -h, --help print usage information and exit\n"
"\nFILE can be a vmware .xml or an X .desktop file\n")
.toUtf8().data());
if (cmdOptions.contains("error")) {
std::cerr << usage;
return EXIT_FAILURE;
}
if (cmdOptions.contains("usage")) {
std::cout << usage;
return EXIT_SUCCESS;
}
if (cmdOptions.contains("version")) {
std::cout << version;
return EXIT_SUCCESS;
}
if (cmdOptions.contains("file")) {
QString file(cmdOptions.value("file"));
if (file.endsWith(".desktop")) {
XSession s;
if (s.init(file) && s.run()) {
return EXIT_SUCCESS;
}
std::cerr << a.translate(
"Console",
"vmchooser: failed to run session").toUtf8().data() <<
std::endl;
return EXIT_FAILURE;
} else if (file.endsWith(".xml")) {
// our XML-files can contain multiple sessions
// let's just take the first one
Session* s(VSession::readXmlFile(file).value(0));
if (s && s->run()) {
return EXIT_SUCCESS;
}
std::cerr << a.translate(
"Console",
"vmchooser: failed to run session").toUtf8().data() <<
std::endl;
} else {
std::cerr << a.translate(
"Console",
"vmchooser: invalid session file").toUtf8().data() <<
std::endl;
return EXIT_FAILURE;
}
}
// read configuration file:
// file supplied as command line option or
// user vmchooser.conf or
// globel vmchooser.conf
QString confFile;
QString userConfFile(QDir::homePath() + "/" +
VMCHOOSER_USER_PATH + "/" +
VMCHOOSER_CONF_FILE);
QString globalConfFile(QString(VMCHOOSER_ETC_BASE_PATH) + "/" +
VMCHOOSER_CONF_FILE);
if (cmdOptions.contains("config")) {
confFile = cmdOptions.value("config");
} else if (QFileInfo(userConfFile).exists()) {
confFile = userConfFile;
} else {
confFile = globalConfFile;
}
QSettings settings(confFile, QSettings::IniFormat);
settings.setIniCodec("UTF-8");
QString defaultSession;
if (cmdOptions.contains("default")) {
defaultSession = cmdOptions.value("default");
} else if (settings.contains("default")) {
defaultSession = settings.value("default").toString();
} else {
defaultSession = readSessionName();
}
QString vSessionXmlPath;
if (cmdOptions.contains("path")) {
vSessionXmlPath = cmdOptions.value("path");
} else if (settings.contains("path")) {
vSessionXmlPath = settings.value("path").toString();
} else {
vSessionXmlPath = VMCHOOSER_VMPATH;
}
QString xSessionPath;
if (cmdOptions.contains("xpath")) {
xSessionPath = cmdOptions.value("xpath");
} else if (settings.contains("xpath")) {
xSessionPath = settings.value("xpath").toString();
} else {
xSessionPath = VMCHOOSER_X_SESSIONS_PATH;
}
QString size;
if (cmdOptions.contains("size")) {
size = cmdOptions.value("size");
} else if (settings.contains("size")) {
size = settings.value("size").toString();
}
int width, height;
QRegExp rx("^(\\d+)x(\\d+)$");
if (rx.indexIn(size) != -1) {
QStringList list = rx.capturedTexts();
width = list.value(1).toInt();
height = list.value(2).toInt();
} else if (!size.isEmpty()) {
std::cerr << a.translate(
"Console",
"vmchooser: invlid size argument").toUtf8().data()
<< std::endl;
return EXIT_FAILURE;
} else {
width = VMCHOOSER_DEFAULT_WIDTH;
height = VMCHOOSER_DEFAULT_HEIGHT;
}
/* read session files */
QList<Session*> xsessions(XSession::readSessions(xSessionPath));
QList<Session*> vsessions(VSession::readXmlDir(vSessionXmlPath));
Dialog w;
w.resize(width, height);
if (xsessions.empty() && vsessions.empty()) {
std::cerr << a.translate(
"Console",
"vmchooser: no sessions found").toUtf8().data()
<< std::endl;
return EXIT_FAILURE;
}
if (xsessions.size()) {
qSort(xsessions.begin(), xsessions.end(), myLessThan);
w.addItems(xsessions, a.translate("Dialog", "X Sessions"));
}
if (vsessions.size()) {
qSort(vsessions.begin(), vsessions.end(), myLessThan);
w.addItems(vsessions, a.translate("Dialog", "Virtual Sessions"));
}
w.selectSession(defaultSession);
w.show();
return a.exec();
}