androidrunfactories.cpp 6.16 KB
Newer Older
BogDan Vatra's avatar
BogDan Vatra committed
1
2
3
4
5
6
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 BogDan Vatra <bog_dan_ro@yahoo.com>
**
Eike Ziller's avatar
Eike Ziller committed
7
** Contact: http://www.qt-project.org/
BogDan Vatra's avatar
BogDan Vatra committed
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/

#include "androidrunfactories.h"

#include "androidconstants.h"
#include "androiddebugsupport.h"
#include "androidrunconfiguration.h"
#include "androidruncontrol.h"
Tobias Hunger's avatar
Tobias Hunger committed
37
#include "androidmanager.h"
BogDan Vatra's avatar
BogDan Vatra committed
38

Tobias Hunger's avatar
Tobias Hunger committed
39
#include <projectexplorer/project.h>
BogDan Vatra's avatar
BogDan Vatra committed
40
#include <projectexplorer/projectexplorerconstants.h>
Tobias Hunger's avatar
Tobias Hunger committed
41
#include <projectexplorer/target.h>
BogDan Vatra's avatar
BogDan Vatra committed
42
43
44
#include <debugger/debuggerconstants.h>
#include <qt4projectmanager/qt4project.h>
#include <qt4projectmanager/qt4nodes.h>
Tobias Hunger's avatar
Tobias Hunger committed
45
46
47
#include <qtsupport/customexecutablerunconfiguration.h>
#include <qtsupport/qtprofileinformation.h>
#include <qtsupport/qtsupportconstants.h>
BogDan Vatra's avatar
BogDan Vatra committed
48
49
50
51
52
53
54
55
56
57


namespace Android {
namespace Internal {

using namespace ProjectExplorer;
using namespace Qt4ProjectManager;

namespace {

58
QString pathFromId(const Core::Id id)
BogDan Vatra's avatar
BogDan Vatra committed
59
{
Tobias Hunger's avatar
Tobias Hunger committed
60
    QString pathStr = id.toString();
61
62
    const QString prefix = QLatin1String(ANDROID_RC_ID_PREFIX);
    if (!pathStr.startsWith(prefix))
BogDan Vatra's avatar
BogDan Vatra committed
63
        return QString();
64
    return pathStr.mid(prefix.size());
BogDan Vatra's avatar
BogDan Vatra committed
65
66
67
68
69
}

} // namespace

AndroidRunConfigurationFactory::AndroidRunConfigurationFactory(QObject *parent)
Tobias Hunger's avatar
Tobias Hunger committed
70
71
    : QmakeRunConfigurationFactory(parent)
{ setObjectName(QLatin1String("AndroidRunConfigurationFactory")); }
BogDan Vatra's avatar
BogDan Vatra committed
72
73

AndroidRunConfigurationFactory::~AndroidRunConfigurationFactory()
Tobias Hunger's avatar
Tobias Hunger committed
74
{ }
BogDan Vatra's avatar
BogDan Vatra committed
75

Tobias Hunger's avatar
Tobias Hunger committed
76
bool AndroidRunConfigurationFactory::canCreate(Target *parent, const Core::Id id) const
BogDan Vatra's avatar
BogDan Vatra committed
77
{
Tobias Hunger's avatar
Tobias Hunger committed
78
    if (!canHandle(parent))
BogDan Vatra's avatar
BogDan Vatra committed
79
        return false;
Tobias Hunger's avatar
Tobias Hunger committed
80
    return availableCreationIds(parent).contains(id);
BogDan Vatra's avatar
BogDan Vatra committed
81
82
}

Tobias Hunger's avatar
Tobias Hunger committed
83
bool AndroidRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const
BogDan Vatra's avatar
BogDan Vatra committed
84
{
Tobias Hunger's avatar
Tobias Hunger committed
85
    if (!canHandle(parent))
BogDan Vatra's avatar
BogDan Vatra committed
86
        return false;
Tobias Hunger's avatar
Tobias Hunger committed
87
88
    QString id = ProjectExplorer::idFromMap(map).toString();
    return id.startsWith(QLatin1String(ANDROID_RC_ID_PREFIX));
BogDan Vatra's avatar
BogDan Vatra committed
89
90
91
92
93
94
95
96
}

bool AndroidRunConfigurationFactory::canClone(Target *parent,
    RunConfiguration *source) const
{
    return canCreate(parent, source->id());
}

97
QList<Core::Id> AndroidRunConfigurationFactory::availableCreationIds(Target *parent) const
BogDan Vatra's avatar
BogDan Vatra committed
98
{
99
    QList<Core::Id> ids;
Tobias Hunger's avatar
Tobias Hunger committed
100
101
102
103
104
    if (!AndroidManager::supportsAndroid(parent))
        return ids;
    QList<Qt4ProFileNode *> nodes = static_cast<Qt4Project *>(parent->project())->allProFiles();
    foreach (Qt4ProFileNode *node, nodes)
        if (node->projectType() == ApplicationTemplate || node->projectType() == LibraryTemplate)
105
            ids << Core::Id(ANDROID_RC_ID_PREFIX + node->targetInformation().target);
BogDan Vatra's avatar
BogDan Vatra committed
106
107
108
    return ids;
}

109
QString AndroidRunConfigurationFactory::displayNameForId(const Core::Id id) const
BogDan Vatra's avatar
BogDan Vatra committed
110
111
112
113
{
    return QFileInfo(pathFromId(id)).completeBaseName();
}

Tobias Hunger's avatar
Tobias Hunger committed
114
RunConfiguration *AndroidRunConfigurationFactory::create(Target *parent, const Core::Id id)
BogDan Vatra's avatar
BogDan Vatra committed
115
116
117
{
    if (!canCreate(parent, id))
        return 0;
Tobias Hunger's avatar
Tobias Hunger committed
118
    return new AndroidRunConfiguration(parent, id, pathFromId(id));
BogDan Vatra's avatar
BogDan Vatra committed
119
120
121
122
123
124
125
}

RunConfiguration *AndroidRunConfigurationFactory::restore(Target *parent,
    const QVariantMap &map)
{
    if (!canRestore(parent, map))
        return 0;
Tobias Hunger's avatar
Tobias Hunger committed
126
127
    Core::Id id = ProjectExplorer::idFromMap(map);
    AndroidRunConfiguration *rc = new AndroidRunConfiguration(parent, id, pathFromId(id));
BogDan Vatra's avatar
BogDan Vatra committed
128
129
130
131
132
133
134
    if (rc->fromMap(map))
        return rc;

    delete rc;
    return 0;
}

Tobias Hunger's avatar
Tobias Hunger committed
135
RunConfiguration *AndroidRunConfigurationFactory::clone(Target *parent, RunConfiguration *source)
BogDan Vatra's avatar
BogDan Vatra committed
136
137
138
139
140
{
    if (!canClone(parent, source))
        return 0;

    AndroidRunConfiguration *old = static_cast<AndroidRunConfiguration *>(source);
Tobias Hunger's avatar
Tobias Hunger committed
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
    return new AndroidRunConfiguration(parent, old);
}

bool AndroidRunConfigurationFactory::canHandle(Target *t) const
{
    if (!t->project()->supportsProfile(t->profile()))
        return false;
    return AndroidManager::supportsAndroid(t);
}

QList<RunConfiguration *> AndroidRunConfigurationFactory::runConfigurationsForNode(Target *t, ProjectExplorer::Node *n)
{
    QList<ProjectExplorer::RunConfiguration *> result;
    foreach (ProjectExplorer::RunConfiguration *rc, t->runConfigurations())
        if (AndroidRunConfiguration *qt4c = qobject_cast<AndroidRunConfiguration *>(rc))
                if (qt4c->proFilePath() == n->path())
                    result << rc;
    return result;
BogDan Vatra's avatar
BogDan Vatra committed
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
}

// #pragma mark -- AndroidRunControlFactory

AndroidRunControlFactory::AndroidRunControlFactory(QObject *parent)
    : IRunControlFactory(parent)
{
}

AndroidRunControlFactory::~AndroidRunControlFactory()
{
}

bool AndroidRunControlFactory::canRun(RunConfiguration *runConfiguration,
                ProjectExplorer::RunMode mode) const
{
    if (mode != NormalRunMode && mode != DebugRunMode)
        return false;
    return qobject_cast<AndroidRunConfiguration *>(runConfiguration);
}

RunControl *AndroidRunControlFactory::create(RunConfiguration *runConfig,
                                        ProjectExplorer::RunMode mode)
{
    Q_ASSERT(canRun(runConfig, mode));
    AndroidRunConfiguration *rc = qobject_cast<AndroidRunConfiguration *>(runConfig);
    Q_ASSERT(rc);
    if (mode == NormalRunMode)
        return new AndroidRunControl(rc);
    else
        return AndroidDebugSupport::createDebugRunControl(rc);
}

QString AndroidRunControlFactory::displayName() const
{
    return tr("Run on Android device/emulator");
}

} // namespace Internal
} // namespace Qt4ProjectManager