~mardy/ubuntu-system-settings-online-accounts/click-plugins-old

« back to all changes in this revision

Viewing changes to plugins/exec-tool/main.cpp

  • Committer: Alberto Mardegan
  • Date: 2014-11-18 11:56:01 UTC
  • Revision ID: alberto.mardegan@canonical.com-20141118115601-0sclep3ly8pvlnjz
WIP

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2014 Canonical Ltd.
 
3
 *
 
4
 * Contact: Alberto Mardegan <alberto.mardegan@canonical.com>
 
5
 *
 
6
 * This file is part of online-accounts-ui
 
7
 *
 
8
 * This program is free software: you can redistribute it and/or modify it
 
9
 * under the terms of the GNU General Public License version 3, as published
 
10
 * by the Free Software Foundation.
 
11
 *
 
12
 * This program is distributed in the hope that it will be useful, but
 
13
 * WITHOUT ANY WARRANTY; without even the implied warranties of
 
14
 * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
 
15
 * PURPOSE.  See the GNU General Public License for more details.
 
16
 *
 
17
 * You should have received a copy of the GNU General Public License along
 
18
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
 
19
 */
 
20
 
 
21
#include <QByteArray>
 
22
#include <QCoreApplication>
 
23
#include <QDebug>
 
24
#include <QProcess>
 
25
#include <QStringList>
 
26
 
 
27
QStringList parseParameters(const QByteArray &cmdLine)
 
28
{
 
29
    QStringList params;
 
30
    QByteArray nextParam;
 
31
 
 
32
    bool insideDoubleQuotes = false;
 
33
 
 
34
    for (int i = 0; i < cmdLine.count(); i++) {
 
35
        char c = cmdLine.at(i);
 
36
        if (c == '\'' && !insideDoubleQuotes) {
 
37
            int endQuote = cmdLine.indexOf('\'', i + 1);
 
38
            if (Q_UNLIKELY(endQuote < 0)) {
 
39
                qWarning() << "Cannot parse parameters" << cmdLine;
 
40
                return params;
 
41
            }
 
42
            nextParam += cmdLine.mid(i + 1, endQuote - i - 1);
 
43
            i = endQuote;
 
44
        } else if (c == '"') {
 
45
            if (insideDoubleQuotes) {
 
46
                insideDoubleQuotes = false;
 
47
            } else {
 
48
                insideDoubleQuotes = true;
 
49
            }
 
50
        } else if (c == '\\') {
 
51
            i++;
 
52
            if (Q_UNLIKELY(i == cmdLine.count())) {
 
53
                qWarning() << "Incomplete command line" << cmdLine;
 
54
                return params;
 
55
            }
 
56
            nextParam += cmdLine.at(i);
 
57
        } else if (c == ' ' && !insideDoubleQuotes) {
 
58
            params.append(QString::fromUtf8(nextParam));
 
59
            nextParam.clear();
 
60
        } else {
 
61
            nextParam += cmdLine.at(i);
 
62
        }
 
63
    }
 
64
 
 
65
    if (!nextParam.isEmpty()) {
 
66
        params.append(QString::fromUtf8(nextParam));
 
67
    }
 
68
 
 
69
    return params;
 
70
}
 
71
 
 
72
int main(int argc, char **argv)
 
73
{
 
74
    QCoreApplication app(argc, argv);
 
75
 
 
76
    QStringList appUris = parseParameters(qgetenv("APP_URIS"));
 
77
    if (Q_UNLIKELY(appUris.count() < 2)) {
 
78
        qCritical() << "Missing URIs";
 
79
        return EXIT_FAILURE;
 
80
    }
 
81
 
 
82
    QStringList arguments;
 
83
    arguments.append("set-env");
 
84
    arguments.append("APP_EXEC=" ONLINE_ACCOUNTS_UI_PATH);
 
85
 
 
86
    // IPC socket URL
 
87
    QString socketUrl =
 
88
        QString("IPC_SOCKET=%1").arg(appUris[0]);
 
89
    arguments.append(socketUrl);
 
90
 
 
91
    // Mir socket URL; might be invalid
 
92
    QString mirSocket = appUris[1];
 
93
    if (!mirSocket.startsWith("invalid")) {
 
94
        QString mirUrl =
 
95
            QString("MIR_SOCKET=%1").arg(mirSocket);
 
96
        arguments.append(mirUrl);
 
97
    }
 
98
 
 
99
    arguments.append("OAU_LOGGING_LEVEL=2");
 
100
 
 
101
    QStringList newAppUrisList = appUris.mid(2);
 
102
    QString newAppUris = QString("APP_URIS=%1").arg(newAppUrisList.join(' '));
 
103
 
 
104
    arguments.append(newAppUris);
 
105
 
 
106
    int ret = QProcess::execute("initctl", arguments);
 
107
 
 
108
    return (ret >= 0) ? EXIT_SUCCESS : EXIT_FAILURE;
 
109
}
 
110