forked from qt-creator/qt-creator
		
	
		
			
				
	
	
		
			209 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			209 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "launcher.h"
 | 
						|
#include "communicationstarter.h"
 | 
						|
 | 
						|
#include <QtCore/QCoreApplication>
 | 
						|
#include <QtCore/QSharedPointer>
 | 
						|
#include <QtCore/QDebug>
 | 
						|
#include <QtCore/QStringList>
 | 
						|
 | 
						|
static const char usageC[] =
 | 
						|
"\n"
 | 
						|
"Usage: %1 [options] <trk_port_name>\n"
 | 
						|
"       %1 [options] <trk_port_name> <remote_executable_name> [-- args]\n"
 | 
						|
"       %1 [options] -i <trk_port_name> remote_sis_file\n"
 | 
						|
"       %1 [options] -I local_sis_file remote_sis_file] [<remote_executable_name>] [-- args]\n"
 | 
						|
"       %1 [options] -c local_file remote_file\n"
 | 
						|
"       %1 [options] -C remote_file [local_file|-]\n"
 | 
						|
"\nOptions:\n    -v verbose\n"
 | 
						|
            "    -q quiet\n"
 | 
						|
            "    -b Prompt for Bluetooth connect (Linux only)\n"
 | 
						|
            "    -f turn serial message frame off (Bluetooth)\n"
 | 
						|
"\nPing:\n"
 | 
						|
"%1 COM5\n"
 | 
						|
"\nRemote launch:\n"
 | 
						|
"%1 COM5 C:\\sys\\bin\\test.exe\n"
 | 
						|
"\nInstallation:\n"
 | 
						|
"%1 -i COM5 C:\\Data\\test_gcce_udeb.sisx\n"
 | 
						|
"\nInstallation and remote launch:\n"
 | 
						|
"%1 -i COM5 C:\\Data\\test_gcce_udeb.sisx C:\\sys\\bin\\test.exe\n"
 | 
						|
"\nCopy from local file, installation:\n"
 | 
						|
"%1 -I COM5 C:\\Projects\\test\\test_gcce_udeb.sisx C:\\Data\\test_gcce_udeb.sisx\n"
 | 
						|
"\nCopy from local file, installation and remote launch:\n"
 | 
						|
"%1 -I COM5 C:\\Projects\\test\\test_gcce_udeb.sisx C:\\Data\\test_gcce_udeb.sisx C:\\sys\\bin\\test.exe\n"
 | 
						|
"\nCopy from local file\n"
 | 
						|
"%1 -c COM5 c:\\foo.dat C:\\Data\\foo.dat\n"
 | 
						|
"\nCopy to local file\n"
 | 
						|
"%1 -C COM5 C:\\Data\\foo.dat c:\\foo.dat\n";
 | 
						|
 | 
						|
static void usage()
 | 
						|
{
 | 
						|
    const QString msg = QString::fromLatin1(usageC).arg(QCoreApplication::applicationName());
 | 
						|
    qWarning("%s", qPrintable(msg));
 | 
						|
}
 | 
						|
 | 
						|
typedef QSharedPointer<trk::Launcher> TrkLauncherPtr;
 | 
						|
 | 
						|
// Parse arguments, return pointer or a null none.
 | 
						|
 | 
						|
static inline TrkLauncherPtr createLauncher(trk::Launcher::Actions actions,
 | 
						|
                                            const QString &serverName,
 | 
						|
                                            bool serialFrame,
 | 
						|
                                            int verbosity)
 | 
						|
{
 | 
						|
    TrkLauncherPtr launcher(new trk::Launcher(actions));
 | 
						|
    launcher->setTrkServerName(serverName);
 | 
						|
    launcher->setSerialFrame(serialFrame);
 | 
						|
    launcher->setVerbose(verbosity);
 | 
						|
    return launcher;
 | 
						|
}
 | 
						|
 | 
						|
static TrkLauncherPtr parseArguments(const QStringList &arguments, bool *bluetooth)
 | 
						|
{
 | 
						|
    enum Mode { Ping, RemoteLaunch, Install, CustomInstall, Copy, Download };
 | 
						|
    // Parse away options
 | 
						|
    Mode mode = Ping;
 | 
						|
    bool serialFrame = true;
 | 
						|
    const int argCount = arguments.size();
 | 
						|
    int verbosity = 1;
 | 
						|
    *bluetooth = false;
 | 
						|
    QStringList remoteArguments;
 | 
						|
    trk::Launcher::Actions actions = trk::Launcher::ActionPingOnly;
 | 
						|
    int a = 1;
 | 
						|
    for ( ; a < argCount; a++) {
 | 
						|
        const QString option = arguments.at(a);
 | 
						|
        if (!option.startsWith(QLatin1Char('-')))
 | 
						|
            break;
 | 
						|
        if (option.size() != 2)
 | 
						|
            return TrkLauncherPtr();
 | 
						|
        switch (option.at(1).toAscii()) {
 | 
						|
        case 'v':
 | 
						|
            verbosity++;
 | 
						|
            break;
 | 
						|
        case 'q':
 | 
						|
            verbosity = 0;
 | 
						|
            break;
 | 
						|
        case 'f':
 | 
						|
            serialFrame = false;
 | 
						|
            break;
 | 
						|
        case 'b':
 | 
						|
            *bluetooth = true;
 | 
						|
            break;
 | 
						|
        case 'i':
 | 
						|
            mode = Install;
 | 
						|
            actions = trk::Launcher::ActionInstall;
 | 
						|
            break;
 | 
						|
        case 'I':
 | 
						|
            mode = CustomInstall;
 | 
						|
            actions = trk::Launcher::ActionCopyInstall;
 | 
						|
            break;
 | 
						|
        case 'c':
 | 
						|
            mode = Copy;
 | 
						|
            actions = trk::Launcher::ActionCopy;
 | 
						|
            break;
 | 
						|
        case 'C':
 | 
						|
            mode = Download;
 | 
						|
            actions = trk::Launcher::ActionDownload;
 | 
						|
            break;
 | 
						|
        default:
 | 
						|
            return TrkLauncherPtr();
 | 
						|
        }
 | 
						|
    }
 | 
						|
    // Parse for '--' delimiter for remote executable argunment
 | 
						|
    int pastArguments = a;
 | 
						|
    for ( ; pastArguments < argCount && arguments.at(pastArguments) != QLatin1String("--"); pastArguments++) ;
 | 
						|
    if (pastArguments != argCount)
 | 
						|
        for (int ra = pastArguments + 1; ra < argCount; ra++)
 | 
						|
            remoteArguments.push_back(arguments.at(ra));
 | 
						|
    // Evaluate arguments
 | 
						|
    const int remainingArgsCount = pastArguments -a ;
 | 
						|
    // Ping and launch are only distinguishable by argument counts
 | 
						|
    if (mode == Ping && remainingArgsCount > 1)
 | 
						|
        mode = RemoteLaunch;
 | 
						|
    switch (mode) {
 | 
						|
    case Ping:
 | 
						|
        if (remainingArgsCount == 1)
 | 
						|
            return createLauncher(actions, arguments.at(a), serialFrame, verbosity);
 | 
						|
        break;
 | 
						|
    case RemoteLaunch:
 | 
						|
        if (remainingArgsCount == 2) {
 | 
						|
            // remote exec
 | 
						|
            TrkLauncherPtr launcher = createLauncher(actions, arguments.at(a), serialFrame, verbosity);
 | 
						|
            launcher->addStartupActions(trk::Launcher::ActionRun);
 | 
						|
            launcher->setFileName(arguments.at(a + 1));
 | 
						|
            launcher->setCommandLineArgs(remoteArguments);
 | 
						|
            return launcher;
 | 
						|
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    case Install:
 | 
						|
        if (remainingArgsCount == 3 || remainingArgsCount == 2) {
 | 
						|
            TrkLauncherPtr launcher = createLauncher(actions, arguments.at(a), serialFrame, verbosity);
 | 
						|
            launcher->setInstallFileName(arguments.at(a + 1));
 | 
						|
            if (remainingArgsCount == 3) {
 | 
						|
                launcher->addStartupActions(trk::Launcher::ActionRun);
 | 
						|
                launcher->setFileName(arguments.at(a + 2));
 | 
						|
                launcher->setCommandLineArgs(remoteArguments);
 | 
						|
            }
 | 
						|
            return launcher;
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    case CustomInstall:
 | 
						|
        if (remainingArgsCount == 4 || remainingArgsCount == 3) {
 | 
						|
            TrkLauncherPtr launcher = createLauncher(actions, arguments.at(a), serialFrame, verbosity);
 | 
						|
            launcher->setCopyFileName(arguments.at(a + 1), arguments.at(a + 2));
 | 
						|
            launcher->setInstallFileName(arguments.at(a + 2));
 | 
						|
            if (remainingArgsCount == 4) {
 | 
						|
                launcher->addStartupActions(trk::Launcher::ActionRun);
 | 
						|
                launcher->setFileName(arguments.at(a + 3));
 | 
						|
                launcher->setCommandLineArgs(remoteArguments);
 | 
						|
            }
 | 
						|
            return launcher;
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    case Copy:
 | 
						|
        if (remainingArgsCount == 3) {
 | 
						|
            TrkLauncherPtr launcher = createLauncher(actions, arguments.at(a), serialFrame, verbosity);
 | 
						|
            launcher->setCopyFileName(arguments.at(a + 1), arguments.at(a + 2));
 | 
						|
            return launcher;
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    case Download:
 | 
						|
        if (remainingArgsCount == 3) {
 | 
						|
            TrkLauncherPtr launcher = createLauncher(actions, arguments.at(a), serialFrame, verbosity);
 | 
						|
            launcher->setDownloadFileName(arguments.at(a + 1), arguments.at(a + 2));
 | 
						|
            return launcher;
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    return TrkLauncherPtr();
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char *argv[])
 | 
						|
{
 | 
						|
    QCoreApplication app(argc, argv);
 | 
						|
    QCoreApplication::setApplicationName(QLatin1String("trklauncher"));
 | 
						|
    QCoreApplication::setOrganizationName(QLatin1String("Nokia"));
 | 
						|
 | 
						|
    bool bluetooth;
 | 
						|
    const TrkLauncherPtr launcher = parseArguments(app.arguments(), &bluetooth);
 | 
						|
    if (launcher.isNull()) {
 | 
						|
        usage();
 | 
						|
        return 1;
 | 
						|
    }
 | 
						|
    QObject::connect(launcher.data(), SIGNAL(finished()), &app, SLOT(quit()));
 | 
						|
    QObject::connect(launcher.data(), SIGNAL(processStopped(uint,uint,uint,QString)),
 | 
						|
                     launcher.data(), SLOT(terminate()));
 | 
						|
    // BLuetooth: Open with prompt
 | 
						|
    QString errorMessage;
 | 
						|
    if (bluetooth && !trk::ConsoleBluetoothStarter::startBluetooth(launcher->trkDevice(),
 | 
						|
                                                     launcher.data(),
 | 
						|
                                                     30, &errorMessage)) {
 | 
						|
        qWarning("%s\n", qPrintable(errorMessage));
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
    if (launcher->startServer(&errorMessage))
 | 
						|
        return app.exec();
 | 
						|
    qWarning("%s\n", qPrintable(errorMessage));
 | 
						|
    return 4;
 | 
						|
}
 |