forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/3.3'
This commit is contained in:
@@ -35,6 +35,12 @@
|
|||||||
build and use one for actually developing, and the other for testing
|
build and use one for actually developing, and the other for testing
|
||||||
your plugin with.
|
your plugin with.
|
||||||
|
|
||||||
|
You need to make sure that you use the same \QC version that you want
|
||||||
|
to develop for to create the plugin. Because of the
|
||||||
|
\l{Binary and Source Compatibility} rules of \QC, the \QC plugin wizard
|
||||||
|
creates a plugin that might only compile and run with the same \QC
|
||||||
|
version that it was created with.
|
||||||
|
|
||||||
\list 1
|
\list 1
|
||||||
\li Select \gui{File > New File or Project > Libraries > Qt Creator Plugin > Choose}.
|
\li Select \gui{File > New File or Project > Libraries > Qt Creator Plugin > Choose}.
|
||||||
|
|
||||||
|
|||||||
17
doc/config/style/qt5-sidebar.html
Normal file
17
doc/config/style/qt5-sidebar.html
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<div class="sectionlist normallist">
|
||||||
|
<div class="heading">
|
||||||
|
<a name="reference"></a>
|
||||||
|
<h2 id="reference">Qt Creator Manual</h2>
|
||||||
|
</div>
|
||||||
|
<div class="indexboxcont indexboxbar">
|
||||||
|
<ul>
|
||||||
|
<li><a href="creator-getting-started.html">Getting Started</a></li>
|
||||||
|
<li><a href="creator-project-managing.html">Managing Projects</a></li>
|
||||||
|
<li><a href="creator-design-mode.html">Designing User Interfaces</a></li>
|
||||||
|
<li><a href="creator-coding.html">Coding</a></li>
|
||||||
|
<li><a href="creator-building-running.html">Building and Running</a></li>
|
||||||
|
<li><a href="creator-testing.html">Debugging and Analyzing</a></li>
|
||||||
|
<li><a href="creator-advanced.html">Advanced Use</a></li>
|
||||||
|
<li><a href="creator-help-overview.html">Getting Help</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
@@ -1,3 +1,20 @@
|
|||||||
# Run qdoc from the directory that contains this file.
|
# Run qdoc from the directory that contains this file.
|
||||||
include(config/qtcreator-project.qdocconf)
|
include(config/qtcreator-project.qdocconf)
|
||||||
|
|
||||||
|
HTML.footer = \
|
||||||
|
" </div>\n" \
|
||||||
|
" <p class=\"copy-notice\">\n" \
|
||||||
|
" <acronym title=\"Copyright\">©</acronym> 2014 Digia Plc and/or its\n" \
|
||||||
|
" subsidiaries. Documentation contributions included herein are the copyrights of\n" \
|
||||||
|
" their respective owners. " \
|
||||||
|
" The documentation provided herein is licensed under the terms of the" \
|
||||||
|
" <a href=\"http://www.gnu.org/licenses/fdl.html\">GNU Free Documentation" \
|
||||||
|
" License version 1.3</a> as published by the Free Software Foundation. " \
|
||||||
|
" Digia, Qt and their respective logos are trademarks of Digia Plc " \
|
||||||
|
" in Finland and/or other countries worldwide. All other trademarks are property\n" \
|
||||||
|
" of their respective owners. </p>\n"
|
||||||
|
|
||||||
include($QT_INSTALL_DOCS/global/qt-html-templates-online.qdocconf)
|
include($QT_INSTALL_DOCS/global/qt-html-templates-online.qdocconf)
|
||||||
|
|
||||||
|
# Add an .html file with sidebar content, used in the online style
|
||||||
|
HTML.stylesheets += config/style/qt5-sidebar.html
|
||||||
|
|||||||
@@ -80,7 +80,8 @@
|
|||||||
\li \b {\l{Building and Running}}
|
\li \b {\l{Building and Running}}
|
||||||
|
|
||||||
\QC is integrated with cross-platform systems for build
|
\QC is integrated with cross-platform systems for build
|
||||||
automation: qmake and CMake. In addition, you can import
|
automation: qmake, Qbs, CMake, and Autotools. In addition, you
|
||||||
|
can import
|
||||||
projects as \e {generic projects} and fully control the steps
|
projects as \e {generic projects} and fully control the steps
|
||||||
and commands used to build the project.
|
and commands used to build the project.
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,9 @@
|
|||||||
\title Using Other Build Systems
|
\title Using Other Build Systems
|
||||||
|
|
||||||
\QC project wizards create projects that are configured to use qmake. Most
|
\QC project wizards create projects that are configured to use qmake. Most
|
||||||
of the instructions in this manual apply to using qmake.
|
of the instructions in this manual apply to using qmake. However, \QC is
|
||||||
|
also integrated to other build systems, as described in the the following
|
||||||
|
sections:
|
||||||
|
|
||||||
\list
|
\list
|
||||||
|
|
||||||
|
|||||||
@@ -107,8 +107,9 @@
|
|||||||
it is referred to as \b{Qt in PATH} and selected as the Qt
|
it is referred to as \b{Qt in PATH} and selected as the Qt
|
||||||
version to use for the \gui Desktop kit that is created by default.
|
version to use for the \gui Desktop kit that is created by default.
|
||||||
|
|
||||||
\li In the \gui {Qt mkspec} field, specify build instructions for qmake.
|
\li In the \gui {Qt mkspec} field, specify the name of the mkspec
|
||||||
If you leave this field empty, the default value is used.
|
configuration that should be used by qmake. If you leave this field
|
||||||
|
empty, the default mkspec of the selected Qt version is used.
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
|
|||||||
@@ -487,8 +487,10 @@ bool LinkPrivate::importLibrary(Document::Ptr doc,
|
|||||||
} else if (libraryInfo.pluginTypeInfoStatus() == LibraryInfo::DumpError
|
} else if (libraryInfo.pluginTypeInfoStatus() == LibraryInfo::DumpError
|
||||||
|| libraryInfo.pluginTypeInfoStatus() == LibraryInfo::TypeInfoFileError) {
|
|| libraryInfo.pluginTypeInfoStatus() == LibraryInfo::TypeInfoFileError) {
|
||||||
// Only underline import if package isn't described in .qmltypes anyway
|
// Only underline import if package isn't described in .qmltypes anyway
|
||||||
|
// and is not a private package
|
||||||
QString packageName = importInfo.name();
|
QString packageName = importInfo.name();
|
||||||
if (errorLoc.isValid() && (packageName.isEmpty() || !valueOwner->cppQmlTypes().hasModule(packageName))) {
|
if (errorLoc.isValid() && (packageName.isEmpty() || !valueOwner->cppQmlTypes().hasModule(packageName))
|
||||||
|
&& !packageName.endsWith(QLatin1String("private"), Qt::CaseInsensitive)) {
|
||||||
error(doc, errorLoc, libraryInfo.pluginTypeInfoError());
|
error(doc, errorLoc, libraryInfo.pluginTypeInfoError());
|
||||||
import->valid = false;
|
import->valid = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -876,6 +876,8 @@ void ModelManagerInterface::parseLoop(QSet<QString> &scannedPaths,
|
|||||||
language = mainLanguage;
|
language = mainLanguage;
|
||||||
if (language == Dialect::Qml && mainLanguage == Dialect::QmlQtQuick2Ui)
|
if (language == Dialect::Qml && mainLanguage == Dialect::QmlQtQuick2Ui)
|
||||||
language = Dialect::QmlQtQuick2;
|
language = Dialect::QmlQtQuick2;
|
||||||
|
if (language == Dialect::QmlTypeInfo || language == Dialect::QmlProject)
|
||||||
|
continue;
|
||||||
QString contents;
|
QString contents;
|
||||||
int documentRevision = 0;
|
int documentRevision = 0;
|
||||||
|
|
||||||
@@ -1321,6 +1323,8 @@ LibraryInfo ModelManagerInterface::builtins(const Document::Ptr &doc) const
|
|||||||
ProjectInfo info = projectInfoForPath(doc->path());
|
ProjectInfo info = projectInfoForPath(doc->path());
|
||||||
if (!info.isValid())
|
if (!info.isValid())
|
||||||
return LibraryInfo();
|
return LibraryInfo();
|
||||||
|
if (!info.qtQmlPath.isEmpty())
|
||||||
|
return m_validSnapshot.libraryInfo(info.qtQmlPath);
|
||||||
return m_validSnapshot.libraryInfo(info.qtImportsPath);
|
return m_validSnapshot.libraryInfo(info.qtImportsPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -93,34 +93,35 @@ void PluginDumper::scheduleMaybeRedumpBuiltins(const QmlJS::ModelManagerInterfac
|
|||||||
|
|
||||||
void PluginDumper::onLoadBuiltinTypes(const QmlJS::ModelManagerInterface::ProjectInfo &info, bool force)
|
void PluginDumper::onLoadBuiltinTypes(const QmlJS::ModelManagerInterface::ProjectInfo &info, bool force)
|
||||||
{
|
{
|
||||||
if (info.qmlDumpPath.isEmpty() || info.qtImportsPath.isEmpty())
|
if (info.qmlDumpPath.isEmpty() || (info.qtImportsPath.isEmpty() && info.qtQmlPath.isEmpty()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const QString importsPath = QDir::cleanPath(info.qtImportsPath);
|
const QString baseImportsPath = info.qtQmlPath.isEmpty() ? info.qtImportsPath : info.qtQmlPath;
|
||||||
|
const QString importsPath = QDir::cleanPath(baseImportsPath);
|
||||||
if (m_runningQmldumps.values().contains(importsPath))
|
if (m_runningQmldumps.values().contains(importsPath))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LibraryInfo builtinInfo;
|
LibraryInfo builtinInfo;
|
||||||
if (!force) {
|
if (!force) {
|
||||||
const Snapshot snapshot = m_modelManager->snapshot();
|
const Snapshot snapshot = m_modelManager->snapshot();
|
||||||
builtinInfo = snapshot.libraryInfo(info.qtImportsPath);
|
builtinInfo = snapshot.libraryInfo(baseImportsPath);
|
||||||
if (builtinInfo.isValid())
|
if (builtinInfo.isValid())
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
builtinInfo = LibraryInfo(LibraryInfo::Found);
|
builtinInfo = LibraryInfo(LibraryInfo::Found);
|
||||||
m_modelManager->updateLibraryInfo(info.qtImportsPath, builtinInfo);
|
m_modelManager->updateLibraryInfo(info.qtImportsPath, builtinInfo);
|
||||||
|
|
||||||
// prefer QTDIR/imports/builtins.qmltypes if available
|
// prefer QTDIR/qml/builtins.qmltypes if available
|
||||||
const QString builtinQmltypesPath = info.qtImportsPath + QLatin1String("/builtins.qmltypes");
|
const QString builtinQmltypesPath = baseImportsPath + QLatin1String("/builtins.qmltypes");
|
||||||
if (QFile::exists(builtinQmltypesPath)) {
|
if (QFile::exists(builtinQmltypesPath)) {
|
||||||
loadQmltypesFile(QStringList(builtinQmltypesPath), info.qtImportsPath, builtinInfo);
|
loadQmltypesFile(QStringList(builtinQmltypesPath), baseImportsPath, builtinInfo);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// QTDIR/imports/QtQuick1/builtins.qmltypes was used in developer builds of 5.0.0, 5.0.1
|
// QTDIR/imports/QtQuick1/builtins.qmltypes was used in developer builds of 5.0.0, 5.0.1
|
||||||
const QString builtinQmltypesPath2 = info.qtImportsPath
|
const QString builtinQmltypesPath2 = info.qtImportsPath
|
||||||
+ QLatin1String("/QtQuick1/builtins.qmltypes");
|
+ QLatin1String("/QtQuick1/builtins.qmltypes");
|
||||||
if (QFile::exists(builtinQmltypesPath2)) {
|
if (QFile::exists(builtinQmltypesPath2)) {
|
||||||
loadQmltypesFile(QStringList(builtinQmltypesPath2), info.qtImportsPath, builtinInfo);
|
loadQmltypesFile(QStringList(builtinQmltypesPath2), baseImportsPath, builtinInfo);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,8 +132,8 @@ void PluginDumper::onLoadBuiltinTypes(const QmlJS::ModelManagerInterface::Projec
|
|||||||
connect(process, SIGNAL(error(QProcess::ProcessError)), SLOT(qmlPluginTypeDumpError(QProcess::ProcessError)));
|
connect(process, SIGNAL(error(QProcess::ProcessError)), SLOT(qmlPluginTypeDumpError(QProcess::ProcessError)));
|
||||||
QStringList args(QLatin1String("--builtins"));
|
QStringList args(QLatin1String("--builtins"));
|
||||||
process->start(info.qmlDumpPath, args);
|
process->start(info.qmlDumpPath, args);
|
||||||
m_runningQmldumps.insert(process, info.qtImportsPath);
|
m_runningQmldumps.insert(process, baseImportsPath);
|
||||||
m_qtToInfo.insert(info.qtImportsPath, info);
|
m_qtToInfo.insert(baseImportsPath, info);
|
||||||
}
|
}
|
||||||
|
|
||||||
static QString makeAbsolute(const QString &path, const QString &base)
|
static QString makeAbsolute(const QString &path, const QString &base)
|
||||||
@@ -306,9 +307,11 @@ void PluginDumper::qmlPluginTypeDumpDone(int exitCode)
|
|||||||
return;
|
return;
|
||||||
const Snapshot snapshot = m_modelManager->snapshot();
|
const Snapshot snapshot = m_modelManager->snapshot();
|
||||||
LibraryInfo libraryInfo = snapshot.libraryInfo(libraryPath);
|
LibraryInfo libraryInfo = snapshot.libraryInfo(libraryPath);
|
||||||
|
bool privatePlugin = libraryPath.endsWith(QLatin1String("private"));
|
||||||
|
|
||||||
if (exitCode != 0) {
|
if (exitCode != 0) {
|
||||||
const QString errorMessages = qmlPluginDumpErrorMessage(process);
|
const QString errorMessages = qmlPluginDumpErrorMessage(process);
|
||||||
|
if (!privatePlugin)
|
||||||
ModelManagerInterface::writeWarning(qmldumpErrorMessage(libraryPath, errorMessages));
|
ModelManagerInterface::writeWarning(qmldumpErrorMessage(libraryPath, errorMessages));
|
||||||
libraryInfo.setPluginTypeInfoStatus(LibraryInfo::DumpError, qmldumpFailedMessage(libraryPath, errorMessages));
|
libraryInfo.setPluginTypeInfoStatus(LibraryInfo::DumpError, qmldumpFailedMessage(libraryPath, errorMessages));
|
||||||
}
|
}
|
||||||
@@ -324,6 +327,7 @@ void PluginDumper::qmlPluginTypeDumpDone(int exitCode)
|
|||||||
if (!error.isEmpty()) {
|
if (!error.isEmpty()) {
|
||||||
libraryInfo.setPluginTypeInfoStatus(LibraryInfo::DumpError,
|
libraryInfo.setPluginTypeInfoStatus(LibraryInfo::DumpError,
|
||||||
qmldumpErrorMessage(libraryPath, error));
|
qmldumpErrorMessage(libraryPath, error));
|
||||||
|
if (!privatePlugin)
|
||||||
printParseWarnings(libraryPath, libraryInfo.pluginTypeInfoError());
|
printParseWarnings(libraryPath, libraryInfo.pluginTypeInfoError());
|
||||||
} else {
|
} else {
|
||||||
libraryInfo.setMetaObjects(objectsList.values());
|
libraryInfo.setMetaObjects(objectsList.values());
|
||||||
@@ -349,16 +353,14 @@ void PluginDumper::qmlPluginTypeDumpError(QProcess::ProcessError)
|
|||||||
const QString libraryPath = m_runningQmldumps.take(process);
|
const QString libraryPath = m_runningQmldumps.take(process);
|
||||||
if (libraryPath.isEmpty())
|
if (libraryPath.isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const QString errorMessages = qmlPluginDumpErrorMessage(process);
|
const QString errorMessages = qmlPluginDumpErrorMessage(process);
|
||||||
ModelManagerInterface::writeWarning(qmldumpErrorMessage(libraryPath, errorMessages));
|
|
||||||
if (!libraryPath.isEmpty()) {
|
|
||||||
const Snapshot snapshot = m_modelManager->snapshot();
|
const Snapshot snapshot = m_modelManager->snapshot();
|
||||||
LibraryInfo libraryInfo = snapshot.libraryInfo(libraryPath);
|
LibraryInfo libraryInfo = snapshot.libraryInfo(libraryPath);
|
||||||
|
if (!libraryPath.endsWith(QLatin1String("private"), Qt::CaseInsensitive))
|
||||||
|
ModelManagerInterface::writeWarning(qmldumpErrorMessage(libraryPath, errorMessages));
|
||||||
libraryInfo.setPluginTypeInfoStatus(LibraryInfo::DumpError, qmldumpFailedMessage(libraryPath, errorMessages));
|
libraryInfo.setPluginTypeInfoStatus(LibraryInfo::DumpError, qmldumpFailedMessage(libraryPath, errorMessages));
|
||||||
libraryInfo.updateFingerprint();
|
libraryInfo.updateFingerprint();
|
||||||
m_modelManager->updateLibraryInfo(libraryPath, libraryInfo);
|
m_modelManager->updateLibraryInfo(libraryPath, libraryInfo);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginDumper::pluginChanged(const QString &pluginLibrary)
|
void PluginDumper::pluginChanged(const QString &pluginLibrary)
|
||||||
@@ -421,10 +423,12 @@ void PluginDumper::loadQmltypesFile(const QStringList &qmltypesFilePaths,
|
|||||||
|
|
||||||
void PluginDumper::dump(const Plugin &plugin)
|
void PluginDumper::dump(const Plugin &plugin)
|
||||||
{
|
{
|
||||||
// if there are type infos, don't dump!
|
ModelManagerInterface::ProjectInfo info = m_modelManager->defaultProjectInfo();
|
||||||
if (!plugin.typeInfoPaths.isEmpty()) {
|
|
||||||
const Snapshot snapshot = m_modelManager->snapshot();
|
const Snapshot snapshot = m_modelManager->snapshot();
|
||||||
LibraryInfo libraryInfo = snapshot.libraryInfo(plugin.qmldirPath);
|
LibraryInfo libraryInfo = snapshot.libraryInfo(plugin.qmldirPath);
|
||||||
|
|
||||||
|
// if there are type infos, don't dump!
|
||||||
|
if (!plugin.typeInfoPaths.isEmpty()) {
|
||||||
if (!libraryInfo.isValid())
|
if (!libraryInfo.isValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -432,11 +436,10 @@ void PluginDumper::dump(const Plugin &plugin)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ModelManagerInterface::ProjectInfo info = m_modelManager->defaultProjectInfo();
|
if (plugin.importUri.isEmpty())
|
||||||
|
return; // initial scan without uri, ignore
|
||||||
|
|
||||||
if (!info.tryQmlDump || info.qmlDumpPath.isEmpty()) {
|
if (!info.tryQmlDump || info.qmlDumpPath.isEmpty()) {
|
||||||
const Snapshot snapshot = m_modelManager->snapshot();
|
|
||||||
LibraryInfo libraryInfo = snapshot.libraryInfo(plugin.qmldirPath);
|
|
||||||
if (!libraryInfo.isValid())
|
if (!libraryInfo.isValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -460,10 +463,8 @@ void PluginDumper::dump(const Plugin &plugin)
|
|||||||
connect(process, SIGNAL(finished(int)), SLOT(qmlPluginTypeDumpDone(int)));
|
connect(process, SIGNAL(finished(int)), SLOT(qmlPluginTypeDumpDone(int)));
|
||||||
connect(process, SIGNAL(error(QProcess::ProcessError)), SLOT(qmlPluginTypeDumpError(QProcess::ProcessError)));
|
connect(process, SIGNAL(error(QProcess::ProcessError)), SLOT(qmlPluginTypeDumpError(QProcess::ProcessError)));
|
||||||
QStringList args;
|
QStringList args;
|
||||||
if (plugin.importUri.isEmpty())
|
|
||||||
return; // dumping with --path always fails
|
|
||||||
if (info.qmlDumpHasRelocatableFlag)
|
if (info.qmlDumpHasRelocatableFlag)
|
||||||
args << QLatin1String("-relocatable");
|
args << QLatin1String("-nonrelocatable");
|
||||||
args << plugin.importUri;
|
args << plugin.importUri;
|
||||||
args << plugin.importVersion;
|
args << plugin.importVersion;
|
||||||
args << plugin.importPath;
|
args << plugin.importPath;
|
||||||
|
|||||||
@@ -137,10 +137,16 @@ void AbstractSshChannel::flushSendBuffer()
|
|||||||
void AbstractSshChannel::handleOpenSuccess(quint32 remoteChannelId,
|
void AbstractSshChannel::handleOpenSuccess(quint32 remoteChannelId,
|
||||||
quint32 remoteWindowSize, quint32 remoteMaxPacketSize)
|
quint32 remoteWindowSize, quint32 remoteMaxPacketSize)
|
||||||
{
|
{
|
||||||
if (m_state != SessionRequested) {
|
switch (m_state) {
|
||||||
|
case SessionRequested:
|
||||||
|
break; // Ok, continue.
|
||||||
|
case CloseRequested:
|
||||||
|
return; // Late server reply; we requested a channel close in the meantime.
|
||||||
|
default:
|
||||||
throw SSH_SERVER_EXCEPTION(SSH_DISCONNECT_PROTOCOL_ERROR,
|
throw SSH_SERVER_EXCEPTION(SSH_DISCONNECT_PROTOCOL_ERROR,
|
||||||
"Invalid SSH_MSG_CHANNEL_OPEN_CONFIRMATION packet.");
|
"Unexpected SSH_MSG_CHANNEL_OPEN_CONFIRMATION packet.");
|
||||||
}
|
}
|
||||||
|
|
||||||
m_timeoutTimer->stop();
|
m_timeoutTimer->stop();
|
||||||
|
|
||||||
if (remoteMaxPacketSize < MinMaxPacketSize) {
|
if (remoteMaxPacketSize < MinMaxPacketSize) {
|
||||||
@@ -162,10 +168,16 @@ void AbstractSshChannel::handleOpenSuccess(quint32 remoteChannelId,
|
|||||||
|
|
||||||
void AbstractSshChannel::handleOpenFailure(const QString &reason)
|
void AbstractSshChannel::handleOpenFailure(const QString &reason)
|
||||||
{
|
{
|
||||||
if (m_state != SessionRequested) {
|
switch (m_state) {
|
||||||
|
case SessionRequested:
|
||||||
|
break; // Ok, continue.
|
||||||
|
case CloseRequested:
|
||||||
|
return; // Late server reply; we requested a channel close in the meantime.
|
||||||
|
default:
|
||||||
throw SSH_SERVER_EXCEPTION(SSH_DISCONNECT_PROTOCOL_ERROR,
|
throw SSH_SERVER_EXCEPTION(SSH_DISCONNECT_PROTOCOL_ERROR,
|
||||||
"Invalid SSH_MSG_CHANNEL_OPEN_FAILURE packet.");
|
"Unexpected SSH_MSG_CHANNEL_OPEN_CONFIRMATION packet.");
|
||||||
}
|
}
|
||||||
|
|
||||||
m_timeoutTimer->stop();
|
m_timeoutTimer->stop();
|
||||||
|
|
||||||
#ifdef CREATOR_SSH_DEBUG
|
#ifdef CREATOR_SSH_DEBUG
|
||||||
|
|||||||
@@ -85,9 +85,7 @@ SshRemoteProcess::SshRemoteProcess(quint32 channelId, Internal::SshSendFacility
|
|||||||
|
|
||||||
SshRemoteProcess::~SshRemoteProcess()
|
SshRemoteProcess::~SshRemoteProcess()
|
||||||
{
|
{
|
||||||
Q_ASSERT(d->channelState() == Internal::SshRemoteProcessPrivate::Inactive
|
close();
|
||||||
|| d->channelState() == Internal::SshRemoteProcessPrivate::CloseRequested
|
|
||||||
|| d->channelState() == Internal::SshRemoteProcessPrivate::Closed);
|
|
||||||
delete d;
|
delete d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include <new> // std::bad_alloc
|
||||||
|
|
||||||
namespace Utils {
|
namespace Utils {
|
||||||
|
|
||||||
quint16 getHalfWord(const unsigned char *&s, const ElfData &context)
|
quint16 getHalfWord(const unsigned char *&s, const ElfData &context)
|
||||||
@@ -113,7 +115,11 @@ bool ElfMapper::map()
|
|||||||
ustart = file.map(0, fdlen);
|
ustart = file.map(0, fdlen);
|
||||||
if (ustart == 0) {
|
if (ustart == 0) {
|
||||||
// Try reading the data into memory instead.
|
// Try reading the data into memory instead.
|
||||||
|
try {
|
||||||
raw = file.readAll();
|
raw = file.readAll();
|
||||||
|
} catch (std::bad_alloc &) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
start = raw.constData();
|
start = raw.constData();
|
||||||
fdlen = raw.size();
|
fdlen = raw.size();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,8 +42,10 @@ using namespace Utils;
|
|||||||
|
|
||||||
JsonMemoryPool::~JsonMemoryPool()
|
JsonMemoryPool::~JsonMemoryPool()
|
||||||
{
|
{
|
||||||
foreach (char *obj, _objs)
|
foreach (char *obj, _objs) {
|
||||||
|
reinterpret_cast<JsonValue *>(obj)->~JsonValue();
|
||||||
delete[] obj;
|
delete[] obj;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonValue::JsonValue(Kind kind)
|
JsonValue::JsonValue(Kind kind)
|
||||||
|
|||||||
@@ -51,6 +51,9 @@ DetailedErrorDelegate::DetailedErrorDelegate(QListView *parent)
|
|||||||
QSize DetailedErrorDelegate::sizeHint(const QStyleOptionViewItem &opt,
|
QSize DetailedErrorDelegate::sizeHint(const QStyleOptionViewItem &opt,
|
||||||
const QModelIndex &index) const
|
const QModelIndex &index) const
|
||||||
{
|
{
|
||||||
|
if (!index.isValid())
|
||||||
|
return QStyledItemDelegate::sizeHint(opt, index);
|
||||||
|
|
||||||
const QListView *view = qobject_cast<const QListView *>(parent());
|
const QListView *view = qobject_cast<const QListView *>(parent());
|
||||||
const int viewportWidth = view->viewport()->width();
|
const int viewportWidth = view->viewport()->width();
|
||||||
const bool isSelected = view->selectionModel()->currentIndex() == index;
|
const bool isSelected = view->selectionModel()->currentIndex() == index;
|
||||||
|
|||||||
@@ -308,6 +308,7 @@ QString AndroidManager::androidNameForApiLevel(int x)
|
|||||||
case 19:
|
case 19:
|
||||||
return QLatin1String("Android 4.4");
|
return QLatin1String("Android 4.4");
|
||||||
case 20:
|
case 20:
|
||||||
|
return QLatin1String("Android 4.4W");
|
||||||
case 21:
|
case 21:
|
||||||
return QLatin1String("Android 5.0");
|
return QLatin1String("Android 5.0");
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -149,7 +149,6 @@ void CppEditorWidget::finalizeInitialization()
|
|||||||
d->m_cppEditorDocument = qobject_cast<CppEditorDocument *>(textDocument());
|
d->m_cppEditorDocument = qobject_cast<CppEditorDocument *>(textDocument());
|
||||||
|
|
||||||
setLanguageSettingsId(CppTools::Constants::CPP_SETTINGS_ID);
|
setLanguageSettingsId(CppTools::Constants::CPP_SETTINGS_ID);
|
||||||
setRevisionsVisible(true);
|
|
||||||
|
|
||||||
// function combo box sorting
|
// function combo box sorting
|
||||||
connect(CppEditorPlugin::instance(), &CppEditorPlugin::outlineSortingChanged,
|
connect(CppEditorPlugin::instance(), &CppEditorPlugin::outlineSortingChanged,
|
||||||
|
|||||||
@@ -693,7 +693,7 @@ void CppModelManager::updateVisibleEditorDocuments() const
|
|||||||
foreach (Core::IEditor *editor, Core::EditorManager::visibleEditors()) {
|
foreach (Core::IEditor *editor, Core::EditorManager::visibleEditors()) {
|
||||||
if (const Core::IDocument *document = editor->document()) {
|
if (const Core::IDocument *document = editor->document()) {
|
||||||
const QString filePath = document->filePath();
|
const QString filePath = document->filePath();
|
||||||
QTC_ASSERT(!filePath.isEmpty(), continue);
|
if (!filePath.isEmpty())
|
||||||
visibleDocumentsInEditMode.insert(filePath);
|
visibleDocumentsInEditMode.insert(filePath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1576,8 +1576,8 @@ void DebuggerPluginPrivate::continueOnAttach(Debugger::DebuggerState state)
|
|||||||
if (state != InferiorStopOk)
|
if (state != InferiorStopOk)
|
||||||
return;
|
return;
|
||||||
// disconnect and continue
|
// disconnect and continue
|
||||||
disconnect(currentEngine(), SIGNAL(stateChanged(Debugger::DebuggerState)),
|
disconnect(currentEngine(), &DebuggerEngine::stateChanged,
|
||||||
this, SLOT(continueOnAttach(Debugger::DebuggerState)));
|
this, &DebuggerPluginPrivate::continueOnAttach);
|
||||||
handleExecContinue();
|
handleExecContinue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
#include "unstartedappwatcherdialog.h"
|
#include "unstartedappwatcherdialog.h"
|
||||||
|
|
||||||
#include "debuggerdialogs.h"
|
#include "debuggerdialogs.h"
|
||||||
|
#include "debuggerkitinformation.h"
|
||||||
|
|
||||||
#include <utils/pathchooser.h>
|
#include <utils/pathchooser.h>
|
||||||
|
|
||||||
@@ -151,6 +152,9 @@ UnstartedAppWatcherDialog::UnstartedAppWatcherDialog(QWidget *parent)
|
|||||||
connect(m_pathChooser, SIGNAL(pathChanged(QString)), this, SLOT(stopAndCheckExecutable()));
|
connect(m_pathChooser, SIGNAL(pathChanged(QString)), this, SLOT(stopAndCheckExecutable()));
|
||||||
connect(m_closePushButton, SIGNAL(clicked()), this, SLOT(reject()));
|
connect(m_closePushButton, SIGNAL(clicked()), this, SLOT(reject()));
|
||||||
connect(&m_timer, SIGNAL(timeout()), this, SLOT(findProcess()));
|
connect(&m_timer, SIGNAL(timeout()), this, SLOT(findProcess()));
|
||||||
|
connect(m_kitChooser, &ProjectExplorer::KitChooser::currentIndexChanged,
|
||||||
|
this, &UnstartedAppWatcherDialog::kitChanged);
|
||||||
|
kitChanged();
|
||||||
|
|
||||||
setWaitingState(checkExecutableString() ? NotWatchingState : InvalidWacherState);
|
setWaitingState(checkExecutableString() ? NotWatchingState : InvalidWacherState);
|
||||||
}
|
}
|
||||||
@@ -224,10 +228,10 @@ void UnstartedAppWatcherDialog::startStopTimer(bool start)
|
|||||||
|
|
||||||
void UnstartedAppWatcherDialog::findProcess()
|
void UnstartedAppWatcherDialog::findProcess()
|
||||||
{
|
{
|
||||||
QString appName = m_pathChooser->path();
|
const QString &appName = Utils::FileUtils::normalizePathName(m_pathChooser->path());
|
||||||
DeviceProcessItem fallback;
|
DeviceProcessItem fallback;
|
||||||
foreach (const DeviceProcessItem &p, DeviceProcessList::localProcesses()) {
|
foreach (const DeviceProcessItem &p, DeviceProcessList::localProcesses()) {
|
||||||
if (p.exe == appName) {
|
if (Utils::FileUtils::normalizePathName(p.exe) == appName) {
|
||||||
pidFound(p);
|
pidFound(p);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -244,6 +248,19 @@ void UnstartedAppWatcherDialog::stopAndCheckExecutable()
|
|||||||
setWaitingState(checkExecutableString() ? NotWatchingState : InvalidWacherState);
|
setWaitingState(checkExecutableString() ? NotWatchingState : InvalidWacherState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UnstartedAppWatcherDialog::kitChanged()
|
||||||
|
{
|
||||||
|
const DebuggerItem *debugger = DebuggerKitInformation::debugger(m_kitChooser->currentKit());
|
||||||
|
if (!debugger)
|
||||||
|
return;
|
||||||
|
if (debugger->engineType() == Debugger::CdbEngineType) {
|
||||||
|
m_continueOnAttachCheckBox->setEnabled(false);
|
||||||
|
m_continueOnAttachCheckBox->setChecked(true);
|
||||||
|
} else {
|
||||||
|
m_continueOnAttachCheckBox->setEnabled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool UnstartedAppWatcherDialog::checkExecutableString() const
|
bool UnstartedAppWatcherDialog::checkExecutableString() const
|
||||||
{
|
{
|
||||||
if (!m_pathChooser->path().isEmpty()) {
|
if (!m_pathChooser->path().isEmpty()) {
|
||||||
@@ -270,7 +287,7 @@ bool UnstartedAppWatcherDialog::hideOnAttach() const
|
|||||||
|
|
||||||
bool UnstartedAppWatcherDialog::continueOnAttach() const
|
bool UnstartedAppWatcherDialog::continueOnAttach() const
|
||||||
{
|
{
|
||||||
return m_continueOnAttachCheckBox->isChecked();
|
return m_continueOnAttachCheckBox->isEnabled() && m_continueOnAttachCheckBox->isChecked();
|
||||||
}
|
}
|
||||||
|
|
||||||
void UnstartedAppWatcherDialog::setWaitingState(UnstartedAppWacherState state)
|
void UnstartedAppWatcherDialog::setWaitingState(UnstartedAppWacherState state)
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ public slots:
|
|||||||
void startStopWatching(bool start);
|
void startStopWatching(bool start);
|
||||||
void findProcess();
|
void findProcess();
|
||||||
void stopAndCheckExecutable();
|
void stopAndCheckExecutable();
|
||||||
|
void kitChanged();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void processFound();
|
void processFound();
|
||||||
|
|||||||
@@ -420,10 +420,11 @@ void IosConfigurations::updateSimulators()
|
|||||||
DeviceManager *devManager = DeviceManager::instance();
|
DeviceManager *devManager = DeviceManager::instance();
|
||||||
Core::Id devId = Constants::IOS_SIMULATOR_DEVICE_ID;
|
Core::Id devId = Constants::IOS_SIMULATOR_DEVICE_ID;
|
||||||
IDevice::ConstPtr dev = devManager->find(devId);
|
IDevice::ConstPtr dev = devManager->find(devId);
|
||||||
if (!dev.isNull())
|
if (dev.isNull()) {
|
||||||
return;
|
dev = IDevice::ConstPtr(new IosSimulator(devId));
|
||||||
IosSimulator *newDev = new IosSimulator(devId);
|
devManager->addDevice(dev);
|
||||||
devManager->addDevice(IDevice::ConstPtr(newDev));
|
}
|
||||||
|
IosSimulator::updateAvailableDevices();
|
||||||
}
|
}
|
||||||
|
|
||||||
void IosConfigurations::setDeveloperPath(const FileName &devPath)
|
void IosConfigurations::setDeveloperPath(const FileName &devPath)
|
||||||
|
|||||||
@@ -38,17 +38,6 @@ namespace Internal {
|
|||||||
Q_DECLARE_LOGGING_CATEGORY(iosLog)
|
Q_DECLARE_LOGGING_CATEGORY(iosLog)
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
|
||||||
namespace IosDeviceType {
|
|
||||||
enum Enum {
|
|
||||||
IosDevice,
|
|
||||||
SimulatedIphone,
|
|
||||||
SimulatedIpad,
|
|
||||||
SimulatedIphoneRetina4Inch,
|
|
||||||
SimulatedIphoneRetina3_5Inch,
|
|
||||||
SimulatedIpadRetina
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Constants {
|
namespace Constants {
|
||||||
const char IOS_SETTINGS_ID[] = "ZZ.Ios Configurations";
|
const char IOS_SETTINGS_ID[] = "ZZ.Ios Configurations";
|
||||||
const char IOS_SETTINGS_CATEGORY[] = "XA.Ios";
|
const char IOS_SETTINGS_CATEGORY[] = "XA.Ios";
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ void IosDeployStep::run(QFutureInterface<bool> &fi)
|
|||||||
}
|
}
|
||||||
m_transferStatus = TransferInProgress;
|
m_transferStatus = TransferInProgress;
|
||||||
QTC_CHECK(m_toolHandler == 0);
|
QTC_CHECK(m_toolHandler == 0);
|
||||||
m_toolHandler = new IosToolHandler(IosDeviceType::IosDevice, this);
|
m_toolHandler = new IosToolHandler(IosDeviceType(), this);
|
||||||
m_futureInterface.setProgressRange(0, 200);
|
m_futureInterface.setProgressRange(0, 200);
|
||||||
m_futureInterface.setProgressValueAndText(0, QLatin1String("Transferring application"));
|
m_futureInterface.setProgressValueAndText(0, QLatin1String("Transferring application"));
|
||||||
m_futureInterface.reportStarted();
|
m_futureInterface.reportStarted();
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "iosdevice.h"
|
#include "iosdevice.h"
|
||||||
|
#include "iossimulator.h"
|
||||||
#include "iosconstants.h"
|
#include "iosconstants.h"
|
||||||
#include "iosconfigurations.h"
|
#include "iosconfigurations.h"
|
||||||
#include "iostoolhandler.h"
|
#include "iostoolhandler.h"
|
||||||
@@ -291,7 +292,7 @@ void IosDeviceManager::deviceDisconnected(const QString &uid)
|
|||||||
|
|
||||||
void IosDeviceManager::updateInfo(const QString &devId)
|
void IosDeviceManager::updateInfo(const QString &devId)
|
||||||
{
|
{
|
||||||
IosToolHandler *requester = new IosToolHandler(IosDeviceType::IosDevice, this);
|
IosToolHandler *requester = new IosToolHandler(IosDeviceType(), this);
|
||||||
connect(requester, SIGNAL(deviceInfo(Ios::IosToolHandler*,QString,Ios::IosToolHandler::Dict)),
|
connect(requester, SIGNAL(deviceInfo(Ios::IosToolHandler*,QString,Ios::IosToolHandler::Dict)),
|
||||||
SLOT(deviceInfo(Ios::IosToolHandler*,QString,Ios::IosToolHandler::Dict)), Qt::QueuedConnection);
|
SLOT(deviceInfo(Ios::IosToolHandler*,QString,Ios::IosToolHandler::Dict)), Qt::QueuedConnection);
|
||||||
connect(requester, SIGNAL(finished(Ios::IosToolHandler*)),
|
connect(requester, SIGNAL(finished(Ios::IosToolHandler*)),
|
||||||
|
|||||||
@@ -47,6 +47,7 @@
|
|||||||
#include <qtsupport/qtkitinformation.h>
|
#include <qtsupport/qtkitinformation.h>
|
||||||
|
|
||||||
#include <QList>
|
#include <QList>
|
||||||
|
#include <QStandardItemModel>
|
||||||
|
|
||||||
#include <utils/qtcprocess.h>
|
#include <utils/qtcprocess.h>
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
@@ -79,6 +80,7 @@ private slots:
|
|||||||
private:
|
private:
|
||||||
Ui::IosRunConfiguration *m_ui;
|
Ui::IosRunConfiguration *m_ui;
|
||||||
IosRunConfiguration *m_runConfiguration;
|
IosRunConfiguration *m_runConfiguration;
|
||||||
|
QStandardItemModel m_deviceTypeModel;
|
||||||
};
|
};
|
||||||
|
|
||||||
IosRunConfiguration::IosRunConfiguration(Target *parent, Core::Id id, const QString &path)
|
IosRunConfiguration::IosRunConfiguration(Target *parent, Core::Id id, const QString &path)
|
||||||
@@ -103,7 +105,6 @@ void IosRunConfiguration::init()
|
|||||||
m_parseInProgress = project->parseInProgress(m_profilePath);
|
m_parseInProgress = project->parseInProgress(m_profilePath);
|
||||||
m_lastIsEnabled = isEnabled();
|
m_lastIsEnabled = isEnabled();
|
||||||
m_lastDisabledReason = disabledReason();
|
m_lastDisabledReason = disabledReason();
|
||||||
m_deviceType = IosDeviceType::IosDevice;
|
|
||||||
updateDisplayNames();
|
updateDisplayNames();
|
||||||
connect(DeviceManager::instance(), SIGNAL(updated()),
|
connect(DeviceManager::instance(), SIGNAL(updated()),
|
||||||
SLOT(deviceChanges()));
|
SLOT(deviceChanges()));
|
||||||
@@ -161,9 +162,9 @@ QStringList IosRunConfiguration::commandLineArguments()
|
|||||||
void IosRunConfiguration::updateDisplayNames()
|
void IosRunConfiguration::updateDisplayNames()
|
||||||
{
|
{
|
||||||
if (DeviceTypeKitInformation::deviceTypeId(target()->kit()) == Constants::IOS_DEVICE_TYPE)
|
if (DeviceTypeKitInformation::deviceTypeId(target()->kit()) == Constants::IOS_DEVICE_TYPE)
|
||||||
m_deviceType = IosDeviceType::IosDevice;
|
m_deviceType = IosDeviceType();
|
||||||
else if (m_deviceType == IosDeviceType::IosDevice)
|
else if (m_deviceType.type == IosDeviceType::IosDevice)
|
||||||
m_deviceType = IosDeviceType::SimulatedIphoneRetina4Inch;
|
m_deviceType = IosDeviceType(IosDeviceType::SimulatedDevice);
|
||||||
IDevice::ConstPtr dev = DeviceKitInformation::device(target()->kit());
|
IDevice::ConstPtr dev = DeviceKitInformation::device(target()->kit());
|
||||||
const QString devName = dev.isNull() ? IosDevice::name() : dev->displayName();
|
const QString devName = dev.isNull() ? IosDevice::name() : dev->displayName();
|
||||||
setDefaultDisplayName(tr("Run on %1").arg(devName));
|
setDefaultDisplayName(tr("Run on %1").arg(devName));
|
||||||
@@ -264,19 +265,14 @@ Utils::FileName IosRunConfiguration::localExecutable() const
|
|||||||
bool IosRunConfiguration::fromMap(const QVariantMap &map)
|
bool IosRunConfiguration::fromMap(const QVariantMap &map)
|
||||||
{
|
{
|
||||||
m_arguments = map.value(runConfigurationKey).toStringList();
|
m_arguments = map.value(runConfigurationKey).toStringList();
|
||||||
IosDeviceType::Enum deviceType = static_cast<IosDeviceType::Enum>(map.value(deviceTypeKey)
|
bool deviceTypeIsInt;
|
||||||
.toInt());
|
map.value(deviceTypeKey).toInt(&deviceTypeIsInt);
|
||||||
bool valid = false;
|
if (deviceTypeIsInt || !m_deviceType.fromMap(map.value(deviceTypeKey).toMap())) {
|
||||||
for (int i = 0 ; i < nSimulatedDevices; ++i)
|
if (DeviceTypeKitInformation::deviceTypeId(target()->kit()) == Constants::IOS_DEVICE_TYPE)
|
||||||
if (simulatedDevices[i] == m_deviceType)
|
m_deviceType = IosDeviceType(IosDeviceType::IosDevice);
|
||||||
valid = true;
|
|
||||||
if (valid)
|
|
||||||
m_deviceType = deviceType;
|
|
||||||
else if (DeviceTypeKitInformation::deviceTypeId(target()->kit()) == Constants::IOS_DEVICE_TYPE)
|
|
||||||
m_deviceType = IosDeviceType::IosDevice;
|
|
||||||
else
|
else
|
||||||
m_deviceType = IosDeviceType::SimulatedIphoneRetina4Inch;
|
m_deviceType = IosDeviceType(IosDeviceType::SimulatedDevice);
|
||||||
|
}
|
||||||
return RunConfiguration::fromMap(map);
|
return RunConfiguration::fromMap(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -284,7 +280,7 @@ QVariantMap IosRunConfiguration::toMap() const
|
|||||||
{
|
{
|
||||||
QVariantMap res = RunConfiguration::toMap();
|
QVariantMap res = RunConfiguration::toMap();
|
||||||
res[runConfigurationKey] = m_arguments;
|
res[runConfigurationKey] = m_arguments;
|
||||||
res[deviceTypeKey] = m_deviceType;
|
res[deviceTypeKey] = deviceType().toMap();
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,12 +354,29 @@ QString IosRunConfiguration::disabledReason() const
|
|||||||
return RunConfiguration::disabledReason();
|
return RunConfiguration::disabledReason();
|
||||||
}
|
}
|
||||||
|
|
||||||
IosDeviceType::Enum IosRunConfiguration::deviceType() const
|
IosDeviceType IosRunConfiguration::deviceType() const
|
||||||
{
|
{
|
||||||
|
QList<IosDeviceType> availableSimulators;
|
||||||
|
if (m_deviceType.type == IosDeviceType::SimulatedDevice)
|
||||||
|
availableSimulators = IosSimulator::availableDevices();
|
||||||
|
if (!availableSimulators.isEmpty()) {
|
||||||
|
QList<IosDeviceType> elegibleDevices;
|
||||||
|
QString devname = m_deviceType.identifier.split(QLatin1Char(',')).value(0);
|
||||||
|
foreach (const IosDeviceType &dType, availableSimulators) {
|
||||||
|
if (dType == m_deviceType)
|
||||||
|
return m_deviceType;
|
||||||
|
if (!devname.isEmpty() && dType.identifier.startsWith(devname)
|
||||||
|
&& dType.identifier.split(QLatin1Char(',')).value(0) == devname)
|
||||||
|
elegibleDevices << dType;
|
||||||
|
}
|
||||||
|
if (!elegibleDevices.isEmpty())
|
||||||
|
return elegibleDevices.last();
|
||||||
|
return availableSimulators.last();
|
||||||
|
}
|
||||||
return m_deviceType;
|
return m_deviceType;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IosRunConfiguration::setDeviceType(IosDeviceType::Enum deviceType)
|
void IosRunConfiguration::setDeviceType(const IosDeviceType &deviceType)
|
||||||
{
|
{
|
||||||
m_deviceType = deviceType;
|
m_deviceType = deviceType;
|
||||||
}
|
}
|
||||||
@@ -372,6 +385,7 @@ IosRunConfigurationWidget::IosRunConfigurationWidget(IosRunConfiguration *runCon
|
|||||||
m_ui(new Ui::IosRunConfiguration), m_runConfiguration(runConfiguration)
|
m_ui(new Ui::IosRunConfiguration), m_runConfiguration(runConfiguration)
|
||||||
{
|
{
|
||||||
m_ui->setupUi(this);
|
m_ui->setupUi(this);
|
||||||
|
m_ui->deviceTypeComboBox->setModel(&m_deviceTypeModel);
|
||||||
|
|
||||||
updateValues();
|
updateValues();
|
||||||
connect(m_ui->deviceTypeComboBox, SIGNAL(currentIndexChanged(int)),
|
connect(m_ui->deviceTypeComboBox, SIGNAL(currentIndexChanged(int)),
|
||||||
@@ -436,25 +450,46 @@ void IosRunConfigurationWidget::argumentsLineEditTextEdited()
|
|||||||
|
|
||||||
void IosRunConfigurationWidget::setDeviceTypeIndex(int devIndex)
|
void IosRunConfigurationWidget::setDeviceTypeIndex(int devIndex)
|
||||||
{
|
{
|
||||||
if (devIndex >= 0 && devIndex < nSimulatedDevices)
|
QVariant selectedDev = m_deviceTypeModel.data(m_deviceTypeModel.index(devIndex, 0), Qt::UserRole + 1);
|
||||||
m_runConfiguration->setDeviceType(simulatedDevices[devIndex]);
|
if (selectedDev.isValid())
|
||||||
else
|
m_runConfiguration->setDeviceType(selectedDev.value<IosDeviceType>());
|
||||||
m_runConfiguration->setDeviceType(IosDeviceType::SimulatedIphoneRetina4Inch);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void IosRunConfigurationWidget::updateValues()
|
void IosRunConfigurationWidget::updateValues()
|
||||||
{
|
{
|
||||||
bool showDeviceSelector = m_runConfiguration->deviceType() != IosDeviceType::IosDevice;
|
bool showDeviceSelector = m_runConfiguration->deviceType().type != IosDeviceType::IosDevice;
|
||||||
m_ui->deviceTypeLabel->setVisible(showDeviceSelector);
|
m_ui->deviceTypeLabel->setVisible(showDeviceSelector);
|
||||||
m_ui->deviceTypeComboBox->setVisible(showDeviceSelector);
|
m_ui->deviceTypeComboBox->setVisible(showDeviceSelector);
|
||||||
|
if (showDeviceSelector && m_deviceTypeModel.rowCount() == 0) {
|
||||||
|
foreach (const IosDeviceType &dType, IosSimulator::availableDevices()) {
|
||||||
|
QStandardItem *item = new QStandardItem(dType.displayName);
|
||||||
|
QVariant v;
|
||||||
|
v.setValue(dType);
|
||||||
|
item->setData(v);
|
||||||
|
m_deviceTypeModel.appendRow(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
QStringList args = m_runConfiguration->commandLineArguments();
|
QStringList args = m_runConfiguration->commandLineArguments();
|
||||||
QString argsString = argListToString(args);
|
QString argsString = argListToString(args);
|
||||||
|
|
||||||
if (m_runConfiguration->deviceType() == IosDeviceType::IosDevice)
|
IosDeviceType currentDType = m_runConfiguration->deviceType();
|
||||||
for (int i = 0; i < nSimulatedDevices; ++i)
|
if (!m_ui->deviceTypeComboBox->currentData().isValid()
|
||||||
if (simulatedDevices[i] == m_runConfiguration->deviceType())
|
|| currentDType != m_ui->deviceTypeComboBox->currentData().value<IosDeviceType>()) {
|
||||||
|
bool didSet = false;
|
||||||
|
for (int i = 0; m_deviceTypeModel.hasIndex(i, 0); ++i) {
|
||||||
|
QVariant vData = m_deviceTypeModel.data(m_deviceTypeModel.index(i, 0), Qt::UserRole + 1);
|
||||||
|
IosDeviceType dType = vData.value<IosDeviceType>();
|
||||||
|
if (dType == currentDType) {
|
||||||
m_ui->deviceTypeComboBox->setCurrentIndex(i);
|
m_ui->deviceTypeComboBox->setCurrentIndex(i);
|
||||||
|
didSet = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!didSet) {
|
||||||
|
qCWarning(iosLog) << "could not set " << currentDType << " as it is not in model";
|
||||||
|
}
|
||||||
|
}
|
||||||
m_ui->argumentsLineEdit->setText(argsString);
|
m_ui->argumentsLineEdit->setText(argsString);
|
||||||
m_ui->executableLineEdit->setText(m_runConfiguration->localExecutable().toUserOutput());
|
m_ui->executableLineEdit->setText(m_runConfiguration->localExecutable().toUserOutput());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
|
|
||||||
#include "iosconstants.h"
|
#include "iosconstants.h"
|
||||||
#include "iosconfigurations.h"
|
#include "iosconfigurations.h"
|
||||||
|
#include "iossimulator.h"
|
||||||
|
|
||||||
#include <projectexplorer/runconfiguration.h>
|
#include <projectexplorer/runconfiguration.h>
|
||||||
#include <utils/fileutils.h>
|
#include <utils/fileutils.h>
|
||||||
@@ -43,16 +44,6 @@ class QmakeProFileNode;
|
|||||||
namespace Ios {
|
namespace Ios {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
enum { nSimulatedDevices = 4 };
|
|
||||||
static const IosDeviceType::Enum simulatedDevices[nSimulatedDevices] = {
|
|
||||||
// skip iPhone as it does not support iOS7
|
|
||||||
// TODO: clean solution would be to check also sdk version or make it configurable
|
|
||||||
IosDeviceType::SimulatedIphoneRetina3_5Inch,
|
|
||||||
IosDeviceType::SimulatedIphoneRetina4Inch,
|
|
||||||
IosDeviceType::SimulatedIpad,
|
|
||||||
IosDeviceType::SimulatedIpadRetina
|
|
||||||
};
|
|
||||||
|
|
||||||
class IosDeployStep;
|
class IosDeployStep;
|
||||||
class IosRunConfigurationFactory;
|
class IosRunConfigurationFactory;
|
||||||
class IosRunConfigurationWidget;
|
class IosRunConfigurationWidget;
|
||||||
@@ -76,8 +67,8 @@ public:
|
|||||||
Utils::FileName localExecutable() const;
|
Utils::FileName localExecutable() const;
|
||||||
bool isEnabled() const;
|
bool isEnabled() const;
|
||||||
QString disabledReason() const;
|
QString disabledReason() const;
|
||||||
IosDeviceType::Enum deviceType() const;
|
IosDeviceType deviceType() const;
|
||||||
void setDeviceType(IosDeviceType::Enum deviceType);
|
void setDeviceType(const IosDeviceType &deviceType);
|
||||||
|
|
||||||
bool fromMap(const QVariantMap &map) Q_DECL_OVERRIDE;
|
bool fromMap(const QVariantMap &map) Q_DECL_OVERRIDE;
|
||||||
QVariantMap toMap() const Q_DECL_OVERRIDE;
|
QVariantMap toMap() const Q_DECL_OVERRIDE;
|
||||||
@@ -102,7 +93,7 @@ private:
|
|||||||
bool m_lastIsEnabled;
|
bool m_lastIsEnabled;
|
||||||
bool m_parseInProgress;
|
bool m_parseInProgress;
|
||||||
bool m_parseSuccess;
|
bool m_parseSuccess;
|
||||||
IosDeviceType::Enum m_deviceType;
|
IosDeviceType m_deviceType;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
#include "iosconfigurations.h"
|
#include "iosconfigurations.h"
|
||||||
#include "iostoolhandler.h"
|
#include "iostoolhandler.h"
|
||||||
#include "iosconstants.h"
|
#include "iossimulator.h"
|
||||||
|
|
||||||
#include <projectexplorer/devicesupport/idevice.h>
|
#include <projectexplorer/devicesupport/idevice.h>
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ private:
|
|||||||
QString m_bundleDir;
|
QString m_bundleDir;
|
||||||
QStringList m_arguments;
|
QStringList m_arguments;
|
||||||
ProjectExplorer::IDevice::ConstPtr m_device;
|
ProjectExplorer::IDevice::ConstPtr m_device;
|
||||||
IosDeviceType::Enum m_deviceType;
|
IosDeviceType m_deviceType;
|
||||||
bool m_cppDebug;
|
bool m_cppDebug;
|
||||||
bool m_qmlDebug;
|
bool m_qmlDebug;
|
||||||
bool m_cleanExit;
|
bool m_cleanExit;
|
||||||
|
|||||||
@@ -30,10 +30,13 @@
|
|||||||
|
|
||||||
#include "iossimulator.h"
|
#include "iossimulator.h"
|
||||||
#include "iosconstants.h"
|
#include "iosconstants.h"
|
||||||
|
#include "iostoolhandler.h"
|
||||||
|
|
||||||
#include <projectexplorer/kitinformation.h>
|
#include <projectexplorer/kitinformation.h>
|
||||||
|
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
|
#include <QMapIterator>
|
||||||
|
#include <QMutexLocker>
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
|
|
||||||
using namespace ProjectExplorer;
|
using namespace ProjectExplorer;
|
||||||
@@ -41,6 +44,13 @@ using namespace ProjectExplorer;
|
|||||||
namespace Ios {
|
namespace Ios {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
|
static const QLatin1String iosDeviceTypeDisplayNameKey = QLatin1String("displayName");
|
||||||
|
static const QLatin1String iosDeviceTypeTypeKey = QLatin1String("type");
|
||||||
|
static const QLatin1String iosDeviceTypeIdentifierKey = QLatin1String("identifier");
|
||||||
|
|
||||||
|
QMutex IosSimulator::_mutex;
|
||||||
|
QList<IosDeviceType> IosSimulator::_availableDevices;
|
||||||
|
|
||||||
IosSimulator::IosSimulator(Core::Id id)
|
IosSimulator::IosSimulator(Core::Id id)
|
||||||
: IDevice(Core::Id(Constants::IOS_SIMULATOR_TYPE),
|
: IDevice(Core::Id(Constants::IOS_SIMULATOR_TYPE),
|
||||||
IDevice::AutoDetected,
|
IDevice::AutoDetected,
|
||||||
@@ -113,6 +123,48 @@ IDevice::Ptr IosSimulator::clone() const
|
|||||||
return IDevice::Ptr(new IosSimulator(*this));
|
return IDevice::Ptr(new IosSimulator(*this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<IosDeviceType> IosSimulator::availableDevices()
|
||||||
|
{
|
||||||
|
QMutexLocker l(&_mutex);
|
||||||
|
return _availableDevices;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IosSimulator::setAvailableDevices(QList<IosDeviceType> value)
|
||||||
|
{
|
||||||
|
QMutexLocker l(&_mutex);
|
||||||
|
_availableDevices = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
void handleDeviceInfo(Ios::IosToolHandler *handler, const QString &deviceId,
|
||||||
|
const Ios::IosToolHandler::Dict &info)
|
||||||
|
{
|
||||||
|
Q_UNUSED(deviceId);
|
||||||
|
QList<IosDeviceType> res;
|
||||||
|
QMapIterator<QString, QString> i(info);
|
||||||
|
while (i.hasNext()) {
|
||||||
|
i.next();
|
||||||
|
IosDeviceType simulatorType(IosDeviceType::SimulatedDevice);
|
||||||
|
simulatorType.displayName = i.value();
|
||||||
|
simulatorType.identifier = i.key();
|
||||||
|
QStringList ids = i.key().split(QLatin1Char(','));
|
||||||
|
if (ids.length() > 1)
|
||||||
|
simulatorType.displayName += QLatin1String(", iOS ") + ids.last().trimmed();
|
||||||
|
res.append(simulatorType);
|
||||||
|
}
|
||||||
|
handler->deleteLater();
|
||||||
|
std::stable_sort(res.begin(), res.end());
|
||||||
|
IosSimulator::setAvailableDevices(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IosSimulator::updateAvailableDevices()
|
||||||
|
{
|
||||||
|
IosToolHandler *toolHandler = new IosToolHandler(IosDeviceType(IosDeviceType::SimulatedDevice));
|
||||||
|
QObject::connect(toolHandler, &IosToolHandler::deviceInfo, &handleDeviceInfo);
|
||||||
|
toolHandler->requestDeviceInfo(QString());
|
||||||
|
}
|
||||||
|
|
||||||
void IosSimulator::fromMap(const QVariantMap &map)
|
void IosSimulator::fromMap(const QVariantMap &map)
|
||||||
{
|
{
|
||||||
IDevice::fromMap(map);
|
IDevice::fromMap(map);
|
||||||
@@ -162,5 +214,137 @@ IosSimulator::ConstPtr IosKitInformation::simulator(Kit *kit)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IosDeviceType::IosDeviceType(IosDeviceType::Type type, const QString &identifier, const QString &displayName) :
|
||||||
|
type(type), identifier(identifier), displayName(displayName)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
bool IosDeviceType::fromMap(const QVariantMap &map)
|
||||||
|
{
|
||||||
|
bool validType;
|
||||||
|
displayName = map.value(iosDeviceTypeDisplayNameKey, QVariant()).toString();
|
||||||
|
type = IosDeviceType::Type(map.value(iosDeviceTypeTypeKey, QVariant()).toInt(&validType));
|
||||||
|
identifier = map.value(iosDeviceTypeIdentifierKey, QVariant()).toString();
|
||||||
|
return validType && !displayName.isEmpty()
|
||||||
|
&& (type != IosDeviceType::SimulatedDevice || !identifier.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariantMap IosDeviceType::toMap() const
|
||||||
|
{
|
||||||
|
QVariantMap res;
|
||||||
|
res[iosDeviceTypeDisplayNameKey] = displayName;
|
||||||
|
res[iosDeviceTypeTypeKey] = type;
|
||||||
|
res[iosDeviceTypeIdentifierKey] = identifier;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IosDeviceType::operator ==(const IosDeviceType &o) const
|
||||||
|
{
|
||||||
|
return o.type == type && o.identifier == identifier && o.displayName == displayName;
|
||||||
|
}
|
||||||
|
|
||||||
|
// compare strings comparing embedded numbers as numeric values.
|
||||||
|
// the result is negative if x<y, zero if x==y, positive if x>y
|
||||||
|
// Prefixed 0 are used to resolve ties, so that this ordering is still a total ordering (equality
|
||||||
|
// only for identical strings)
|
||||||
|
// "20" > "3" , "03-4" < "3-10", "3-5" < "03-5"
|
||||||
|
static int numberCompare(const QString &s1, const QString &s2)
|
||||||
|
{
|
||||||
|
int i1 = 0;
|
||||||
|
int i2 = 0;
|
||||||
|
int solveTie = 0;
|
||||||
|
while (i1 < s1.size() && i2 < s2.size()) {
|
||||||
|
QChar c1 = s1.at(i1);
|
||||||
|
QChar c2 = s2.at(i2);
|
||||||
|
if (c1.isDigit() && c2.isDigit()) {
|
||||||
|
// we found a number on both sides, find where the number ends
|
||||||
|
int j1 = i1 + 1;
|
||||||
|
int j2 = i2 + 1;
|
||||||
|
while (j1 < s1.size() && s1.at(j1).isDigit())
|
||||||
|
++j1;
|
||||||
|
while (j2 < s2.size() && s2.at(j2).isDigit())
|
||||||
|
++j2;
|
||||||
|
// and compare it from the right side, first units, then decimals,....
|
||||||
|
int cmp = 0;
|
||||||
|
int newI1 = j1;
|
||||||
|
int newI2 = j2;
|
||||||
|
while (j1 > i1 && j2 > i2) {
|
||||||
|
--j1;
|
||||||
|
--j2;
|
||||||
|
QChar cc1 = s1.at(j1);
|
||||||
|
QChar cc2 = s2.at(j2);
|
||||||
|
if (cc1 < cc2)
|
||||||
|
cmp = -1;
|
||||||
|
else if (cc1 > cc2)
|
||||||
|
cmp = 1;
|
||||||
|
}
|
||||||
|
int tie = 0;
|
||||||
|
// if the left number has more digits, if they are all 0, use this info only to break
|
||||||
|
// ties, otherwise the left number is larger
|
||||||
|
while (j1-- > i1) {
|
||||||
|
tie = 1;
|
||||||
|
if (s1.at(j1) != QLatin1Char('0'))
|
||||||
|
cmp = 1;
|
||||||
|
}
|
||||||
|
// same for the right number
|
||||||
|
while (j2-- > i2) {
|
||||||
|
tie = -1;
|
||||||
|
if (s2.at(j2) != QLatin1Char('0'))
|
||||||
|
cmp = -1;
|
||||||
|
}
|
||||||
|
// if not equal return
|
||||||
|
if (cmp != 0)
|
||||||
|
return cmp;
|
||||||
|
// otherwise possibly store info to break ties (first nomber with more leading zeros is
|
||||||
|
// larger)
|
||||||
|
if (solveTie == 0)
|
||||||
|
solveTie = tie;
|
||||||
|
// continue comparing after the numbers
|
||||||
|
i1 = newI1;
|
||||||
|
i2 = newI2;
|
||||||
|
} else {
|
||||||
|
// compare plain characters (non numbers)
|
||||||
|
if (c1 < c2)
|
||||||
|
return -1;
|
||||||
|
if (c1 > c2)
|
||||||
|
return 1;
|
||||||
|
++i1; ++i2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if one side has more characters it is the larger one
|
||||||
|
if (i1 < s1.size())
|
||||||
|
return 1;
|
||||||
|
if (i2 < s2.size())
|
||||||
|
return -1;
|
||||||
|
// if we had differences in prefixed 0, use that choose the largest string, otherwise they are
|
||||||
|
// equal
|
||||||
|
return solveTie;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IosDeviceType::operator <(const IosDeviceType &o) const
|
||||||
|
{
|
||||||
|
if (type < o.type)
|
||||||
|
return true;
|
||||||
|
if (type > o.type)
|
||||||
|
return false;
|
||||||
|
int cmp = numberCompare(displayName, o.displayName);
|
||||||
|
if (cmp < 0)
|
||||||
|
return true;
|
||||||
|
if (cmp > 0)
|
||||||
|
return false;
|
||||||
|
cmp = numberCompare(identifier, o.identifier);
|
||||||
|
if (cmp < 0)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDebug operator <<(QDebug debug, const IosDeviceType &deviceType)
|
||||||
|
{
|
||||||
|
if (deviceType.type == IosDeviceType::IosDevice)
|
||||||
|
debug << "iOS Device " << deviceType.displayName << deviceType.identifier;
|
||||||
|
else
|
||||||
|
debug << deviceType.displayName << " (" << deviceType.identifier << ")";
|
||||||
|
return debug;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
} // namespace Ios
|
} // namespace Ios
|
||||||
|
|||||||
@@ -33,6 +33,8 @@
|
|||||||
#include <projectexplorer/devicesupport/idevice.h>
|
#include <projectexplorer/devicesupport/idevice.h>
|
||||||
#include <utils/fileutils.h>
|
#include <utils/fileutils.h>
|
||||||
|
|
||||||
|
#include <QMutex>
|
||||||
|
#include <QDebug>
|
||||||
#include <QSharedPointer>
|
#include <QSharedPointer>
|
||||||
|
|
||||||
namespace ProjectExplorer { class Kit; }
|
namespace ProjectExplorer { class Kit; }
|
||||||
@@ -41,6 +43,28 @@ namespace Internal {
|
|||||||
class IosConfigurations;
|
class IosConfigurations;
|
||||||
class IosSimulatorFactory;
|
class IosSimulatorFactory;
|
||||||
|
|
||||||
|
class IosDeviceType {
|
||||||
|
public:
|
||||||
|
enum Type {
|
||||||
|
IosDevice,
|
||||||
|
SimulatedDevice
|
||||||
|
};
|
||||||
|
IosDeviceType(Type type = IosDevice, const QString &identifier = QString(),
|
||||||
|
const QString &displayName = QString());
|
||||||
|
|
||||||
|
bool fromMap(const QVariantMap &map);
|
||||||
|
QVariantMap toMap() const;
|
||||||
|
|
||||||
|
bool operator ==(const IosDeviceType &o) const;
|
||||||
|
bool operator !=(const IosDeviceType &o) const { return !(*this == o); }
|
||||||
|
bool operator <(const IosDeviceType &o) const;
|
||||||
|
|
||||||
|
Type type;
|
||||||
|
QString identifier;
|
||||||
|
QString displayName;
|
||||||
|
};
|
||||||
|
QDebug operator <<(QDebug debug, const IosDeviceType &deviceType);
|
||||||
|
|
||||||
class IosSimulator : public ProjectExplorer::IDevice
|
class IosSimulator : public ProjectExplorer::IDevice
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -48,6 +72,10 @@ public:
|
|||||||
typedef QSharedPointer<IosSimulator> Ptr;
|
typedef QSharedPointer<IosSimulator> Ptr;
|
||||||
ProjectExplorer::IDevice::DeviceInfo deviceInformation() const Q_DECL_OVERRIDE;
|
ProjectExplorer::IDevice::DeviceInfo deviceInformation() const Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
static QList<IosDeviceType> availableDevices();
|
||||||
|
static void setAvailableDevices(QList<IosDeviceType> value);
|
||||||
|
static void updateAvailableDevices();
|
||||||
|
|
||||||
QString displayType() const Q_DECL_OVERRIDE;
|
QString displayType() const Q_DECL_OVERRIDE;
|
||||||
ProjectExplorer::IDeviceWidget *createWidget() Q_DECL_OVERRIDE;
|
ProjectExplorer::IDeviceWidget *createWidget() Q_DECL_OVERRIDE;
|
||||||
QList<Core::Id> actionIds() const Q_DECL_OVERRIDE;
|
QList<Core::Id> actionIds() const Q_DECL_OVERRIDE;
|
||||||
@@ -60,7 +88,6 @@ public:
|
|||||||
bool canAutoDetectPorts() const Q_DECL_OVERRIDE;
|
bool canAutoDetectPorts() const Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
ProjectExplorer::IDevice::Ptr clone() const Q_DECL_OVERRIDE;
|
ProjectExplorer::IDevice::Ptr clone() const Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
friend class IosSimulatorFactory;
|
friend class IosSimulatorFactory;
|
||||||
friend class IosConfigurations;
|
friend class IosConfigurations;
|
||||||
@@ -69,6 +96,8 @@ protected:
|
|||||||
IosSimulator(const IosSimulator &other);
|
IosSimulator(const IosSimulator &other);
|
||||||
private:
|
private:
|
||||||
mutable quint16 m_lastPort;
|
mutable quint16 m_lastPort;
|
||||||
|
static QMutex _mutex;
|
||||||
|
static QList<IosDeviceType> _availableDevices;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace IosKitInformation {
|
namespace IosKitInformation {
|
||||||
@@ -77,4 +106,6 @@ IosSimulator::ConstPtr simulator(ProjectExplorer::Kit *kit);
|
|||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
} // namespace Ios
|
} // namespace Ios
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(Ios::Internal::IosDeviceType)
|
||||||
|
|
||||||
#endif // IOSSIMULATOR_H
|
#endif // IOSSIMULATOR_H
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
#include "iostoolhandler.h"
|
#include "iostoolhandler.h"
|
||||||
#include "iosconfigurations.h"
|
#include "iosconfigurations.h"
|
||||||
#include "iosconstants.h"
|
#include "iosconstants.h"
|
||||||
|
#include "iossimulator.h"
|
||||||
|
|
||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
@@ -126,7 +127,7 @@ public:
|
|||||||
OpAppRun
|
OpAppRun
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit IosToolHandlerPrivate(IosDeviceType::Enum devType, IosToolHandler *q);
|
explicit IosToolHandlerPrivate(const IosDeviceType &devType, IosToolHandler *q);
|
||||||
virtual ~IosToolHandlerPrivate() {}
|
virtual ~IosToolHandlerPrivate() {}
|
||||||
virtual void requestTransferApp(const QString &bundlePath, const QString &deviceId,
|
virtual void requestTransferApp(const QString &bundlePath, const QString &deviceId,
|
||||||
int timeout = 1000) = 0;
|
int timeout = 1000) = 0;
|
||||||
@@ -170,7 +171,7 @@ protected:
|
|||||||
IosToolHandler::RunKind runKind;
|
IosToolHandler::RunKind runKind;
|
||||||
State state;
|
State state;
|
||||||
Op op;
|
Op op;
|
||||||
IosDeviceType::Enum devType;
|
IosDeviceType devType;
|
||||||
static const int lookaheadSize = 67;
|
static const int lookaheadSize = 67;
|
||||||
int iBegin, iEnd, gdbSocket;
|
int iBegin, iEnd, gdbSocket;
|
||||||
QList<ParserState> stack;
|
QList<ParserState> stack;
|
||||||
@@ -179,7 +180,7 @@ protected:
|
|||||||
class IosDeviceToolHandlerPrivate : public IosToolHandlerPrivate
|
class IosDeviceToolHandlerPrivate : public IosToolHandlerPrivate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit IosDeviceToolHandlerPrivate(IosDeviceType::Enum devType, IosToolHandler *q);
|
explicit IosDeviceToolHandlerPrivate(const IosDeviceType &devType, IosToolHandler *q);
|
||||||
virtual void requestTransferApp(const QString &bundlePath, const QString &deviceId,
|
virtual void requestTransferApp(const QString &bundlePath, const QString &deviceId,
|
||||||
int timeout = 1000);
|
int timeout = 1000);
|
||||||
virtual void requestRunApp(const QString &bundlePath, const QStringList &extraArgs,
|
virtual void requestRunApp(const QString &bundlePath, const QStringList &extraArgs,
|
||||||
@@ -192,7 +193,7 @@ public:
|
|||||||
class IosSimulatorToolHandlerPrivate : public IosToolHandlerPrivate
|
class IosSimulatorToolHandlerPrivate : public IosToolHandlerPrivate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit IosSimulatorToolHandlerPrivate(IosDeviceType::Enum devType, IosToolHandler *q);
|
explicit IosSimulatorToolHandlerPrivate(const IosDeviceType &devType, IosToolHandler *q);
|
||||||
virtual void requestTransferApp(const QString &bundlePath, const QString &deviceId,
|
virtual void requestTransferApp(const QString &bundlePath, const QString &deviceId,
|
||||||
int timeout = 1000);
|
int timeout = 1000);
|
||||||
virtual void requestRunApp(const QString &bundlePath, const QStringList &extraArgs,
|
virtual void requestRunApp(const QString &bundlePath, const QStringList &extraArgs,
|
||||||
@@ -204,7 +205,7 @@ private:
|
|||||||
void addDeviceArguments(QStringList &args) const;
|
void addDeviceArguments(QStringList &args) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
IosToolHandlerPrivate::IosToolHandlerPrivate(IosDeviceType::Enum devType,
|
IosToolHandlerPrivate::IosToolHandlerPrivate(const IosDeviceType &devType,
|
||||||
Ios::IosToolHandler *q) :
|
Ios::IosToolHandler *q) :
|
||||||
q(q), state(NonStarted), devType(devType), iBegin(0), iEnd(0),
|
q(q), state(NonStarted), devType(devType), iBegin(0), iEnd(0),
|
||||||
gdbSocket(-1)
|
gdbSocket(-1)
|
||||||
@@ -578,7 +579,7 @@ void IosToolHandlerPrivate::subprocessHasData()
|
|||||||
|
|
||||||
// IosDeviceToolHandlerPrivate
|
// IosDeviceToolHandlerPrivate
|
||||||
|
|
||||||
IosDeviceToolHandlerPrivate::IosDeviceToolHandlerPrivate(IosDeviceType::Enum devType,
|
IosDeviceToolHandlerPrivate::IosDeviceToolHandlerPrivate(const IosDeviceType &devType,
|
||||||
IosToolHandler *q)
|
IosToolHandler *q)
|
||||||
: IosToolHandlerPrivate(devType, q)
|
: IosToolHandlerPrivate(devType, q)
|
||||||
{ }
|
{ }
|
||||||
@@ -637,7 +638,7 @@ bool IosDeviceToolHandlerPrivate::expectsFileDescriptor()
|
|||||||
|
|
||||||
// IosSimulatorToolHandlerPrivate
|
// IosSimulatorToolHandlerPrivate
|
||||||
|
|
||||||
IosSimulatorToolHandlerPrivate::IosSimulatorToolHandlerPrivate(IosDeviceType::Enum devType,
|
IosSimulatorToolHandlerPrivate::IosSimulatorToolHandlerPrivate(const IosDeviceType &devType,
|
||||||
IosToolHandler *q)
|
IosToolHandler *q)
|
||||||
: IosToolHandlerPrivate(devType, q)
|
: IosToolHandlerPrivate(devType, q)
|
||||||
{ }
|
{ }
|
||||||
@@ -684,7 +685,7 @@ void IosSimulatorToolHandlerPrivate::requestDeviceInfo(const QString &deviceId,
|
|||||||
Q_UNUSED(timeout);
|
Q_UNUSED(timeout);
|
||||||
this->deviceId = deviceId;
|
this->deviceId = deviceId;
|
||||||
QStringList args;
|
QStringList args;
|
||||||
args << QLatin1String("showsdks");
|
args << QLatin1String("showdevicetypes");
|
||||||
op = OpDeviceInfo;
|
op = OpDeviceInfo;
|
||||||
start(IosToolHandler::iosSimulatorToolPath(), args);
|
start(IosToolHandler::iosSimulatorToolPath(), args);
|
||||||
}
|
}
|
||||||
@@ -696,27 +697,11 @@ bool IosSimulatorToolHandlerPrivate::expectsFileDescriptor()
|
|||||||
|
|
||||||
void IosSimulatorToolHandlerPrivate::addDeviceArguments(QStringList &args) const
|
void IosSimulatorToolHandlerPrivate::addDeviceArguments(QStringList &args) const
|
||||||
{
|
{
|
||||||
switch (devType) {
|
if (devType.type != IosDeviceType::SimulatedDevice) {
|
||||||
case IosDeviceType::IosDevice:
|
qCWarning(toolHandlerLog) << "IosSimulatorToolHandlerPrivate device type is not SimulatedDevice";
|
||||||
qCWarning(toolHandlerLog) << "IosSimulatorToolHandlerPrivate has device type IosDeviceType";
|
return;
|
||||||
break;
|
|
||||||
case IosDeviceType::SimulatedIphone:
|
|
||||||
args << QLatin1String("--family") << QLatin1String("iphone");
|
|
||||||
break;
|
|
||||||
case IosDeviceType::SimulatedIpad:
|
|
||||||
args << QLatin1String("--family") << QLatin1String("ipad");
|
|
||||||
break;
|
|
||||||
case IosDeviceType::SimulatedIphoneRetina4Inch:
|
|
||||||
args << QLatin1String("--family") << QLatin1String("iphone")
|
|
||||||
<< QLatin1String("--retina") << QLatin1String("--tall");
|
|
||||||
break;
|
|
||||||
case IosDeviceType::SimulatedIphoneRetina3_5Inch:
|
|
||||||
args << QLatin1String("--family") << QLatin1String("iphone") << QLatin1String("--retina");
|
|
||||||
break;
|
|
||||||
case IosDeviceType::SimulatedIpadRetina:
|
|
||||||
args << QLatin1String("--family") << QLatin1String("ipad") << QLatin1String("--retina");
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
args << QLatin1String("--devicetypeid") << devType.identifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IosToolHandlerPrivate::killProcess()
|
void IosToolHandlerPrivate::killProcess()
|
||||||
@@ -745,10 +730,10 @@ QString IosToolHandler::iosSimulatorToolPath()
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
IosToolHandler::IosToolHandler(IosDeviceType::Enum devType, QObject *parent) :
|
IosToolHandler::IosToolHandler(const Internal::IosDeviceType &devType, QObject *parent) :
|
||||||
QObject(parent)
|
QObject(parent)
|
||||||
{
|
{
|
||||||
if (devType == IosDeviceType::IosDevice)
|
if (devType.type == Internal::IosDeviceType::IosDevice)
|
||||||
d = new Internal::IosDeviceToolHandlerPrivate(devType, this);
|
d = new Internal::IosDeviceToolHandlerPrivate(devType, this);
|
||||||
else
|
else
|
||||||
d = new Internal::IosSimulatorToolHandlerPrivate(devType, this);
|
d = new Internal::IosSimulatorToolHandlerPrivate(devType, this);
|
||||||
|
|||||||
@@ -31,8 +31,6 @@
|
|||||||
#ifndef IOSTOOLHANDLER_H
|
#ifndef IOSTOOLHANDLER_H
|
||||||
#define IOSTOOLHANDLER_H
|
#define IOSTOOLHANDLER_H
|
||||||
|
|
||||||
#include "iosconstants.h"
|
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
@@ -41,7 +39,10 @@
|
|||||||
|
|
||||||
|
|
||||||
namespace Ios {
|
namespace Ios {
|
||||||
namespace Internal { class IosToolHandlerPrivate; }
|
namespace Internal {
|
||||||
|
class IosToolHandlerPrivate;
|
||||||
|
class IosDeviceType;
|
||||||
|
}
|
||||||
|
|
||||||
class IosToolHandler : public QObject
|
class IosToolHandler : public QObject
|
||||||
{
|
{
|
||||||
@@ -61,7 +62,7 @@ public:
|
|||||||
static QString iosDeviceToolPath();
|
static QString iosDeviceToolPath();
|
||||||
static QString iosSimulatorToolPath();
|
static QString iosSimulatorToolPath();
|
||||||
|
|
||||||
explicit IosToolHandler(IosDeviceType::Enum = IosDeviceType::IosDevice, QObject *parent = 0);
|
explicit IosToolHandler(const Internal::IosDeviceType &type, QObject *parent = 0);
|
||||||
~IosToolHandler();
|
~IosToolHandler();
|
||||||
void requestTransferApp(const QString &bundlePath, const QString &deviceId, int timeout = 1000);
|
void requestTransferApp(const QString &bundlePath, const QString &deviceId, int timeout = 1000);
|
||||||
void requestRunApp(const QString &bundlePath, const QStringList &extraArgs, RunKind runType,
|
void requestRunApp(const QString &bundlePath, const QStringList &extraArgs, RunKind runType,
|
||||||
|
|||||||
@@ -1184,7 +1184,15 @@ IEditor *PerforcePlugin::showOutputInEditor(const QString &title,
|
|||||||
qDebug() << "PerforcePlugin::showOutputInEditor" << title << id.name()
|
qDebug() << "PerforcePlugin::showOutputInEditor" << title << id.name()
|
||||||
<< "Size= " << output.size() << " Type=" << editorType << debugCodec(codec);
|
<< "Size= " << output.size() << " Type=" << editorType << debugCodec(codec);
|
||||||
QString s = title;
|
QString s = title;
|
||||||
IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8());
|
QString content = output;
|
||||||
|
const int maxSize = EditorManager::maxTextFileSize() - 1000;
|
||||||
|
if (content.size() >= maxSize) {
|
||||||
|
content = tr("[Only %1 MB of output shown]").arg(maxSize / 1024 / 1024) + QLatin1Char('\n')
|
||||||
|
+ content.right(maxSize);
|
||||||
|
|
||||||
|
}
|
||||||
|
IEditor *editor = EditorManager::openEditorWithContents(id, &s, content.toUtf8());
|
||||||
|
QTC_ASSERT(editor, return 0);
|
||||||
connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,QString,int)),
|
connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,QString,int)),
|
||||||
this, SLOT(vcsAnnotate(QString,QString,QString,int)));
|
this, SLOT(vcsAnnotate(QString,QString,QString,int)));
|
||||||
PerforceEditorWidget *e = qobject_cast<PerforceEditorWidget*>(editor->widget());
|
PerforceEditorWidget *e = qobject_cast<PerforceEditorWidget*>(editor->widget());
|
||||||
|
|||||||
@@ -265,7 +265,8 @@ void ModelManager::updateDefaultProjectInfo()
|
|||||||
{
|
{
|
||||||
// needs to be performed in the ui therad
|
// needs to be performed in the ui therad
|
||||||
ProjectExplorer::Project *currentProject = ProjectExplorer::ProjectExplorerPlugin::currentProject();
|
ProjectExplorer::Project *currentProject = ProjectExplorer::ProjectExplorerPlugin::currentProject();
|
||||||
ProjectInfo newDefaultProjectInfo = defaultProjectInfoForProject(currentProject);
|
ProjectInfo newDefaultProjectInfo = projectInfo(currentProject,
|
||||||
|
defaultProjectInfoForProject(currentProject));
|
||||||
setDefaultProject(projectInfo(currentProject,newDefaultProjectInfo), currentProject);
|
setDefaultProject(projectInfo(currentProject,newDefaultProjectInfo), currentProject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7211,7 +7211,6 @@ bool TextEditorWidget::isMissingSyntaxDefinition() const
|
|||||||
// The remnants of PlainTextEditor.
|
// The remnants of PlainTextEditor.
|
||||||
void TextEditorWidget::setupAsPlainEditor()
|
void TextEditorWidget::setupAsPlainEditor()
|
||||||
{
|
{
|
||||||
setRevisionsVisible(true);
|
|
||||||
setMarksVisible(true);
|
setMarksVisible(true);
|
||||||
setLineSeparatorsAllowed(true);
|
setLineSeparatorsAllowed(true);
|
||||||
|
|
||||||
|
|||||||
@@ -154,9 +154,13 @@ static QString errorLocation(const QModelIndex &index, const Error &error,
|
|||||||
link, linkAttr));
|
link, linkAttr));
|
||||||
}
|
}
|
||||||
|
|
||||||
QWidget *MemcheckErrorDelegate::createDetailsWidget(const QFont & font, const QModelIndex &errorIndex, QWidget *parent) const
|
QWidget *MemcheckErrorDelegate::createDetailsWidget(const QFont & font,
|
||||||
|
const QModelIndex &errorIndex,
|
||||||
|
QWidget *parent) const
|
||||||
{
|
{
|
||||||
QWidget *widget = new QWidget(parent);
|
QWidget *widget = new QWidget(parent);
|
||||||
|
QTC_ASSERT(errorIndex.isValid(), return widget);
|
||||||
|
|
||||||
QVBoxLayout *layout = new QVBoxLayout;
|
QVBoxLayout *layout = new QVBoxLayout;
|
||||||
// code + white-space:pre so the padding (see below) works properly
|
// code + white-space:pre so the padding (see below) works properly
|
||||||
// don't include frameName here as it should wrap if required and pre-line is not supported
|
// don't include frameName here as it should wrap if required and pre-line is not supported
|
||||||
|
|||||||
@@ -159,9 +159,12 @@ ValgrindConfigWidget::ValgrindConfigWidget(ValgrindBaseSettings *settings,
|
|||||||
if (!global) {
|
if (!global) {
|
||||||
// In project settings we want a flat vertical list.
|
// In project settings we want a flat vertical list.
|
||||||
QVBoxLayout *l = new QVBoxLayout;
|
QVBoxLayout *l = new QVBoxLayout;
|
||||||
while (layout()->count())
|
while (layout()->count()) {
|
||||||
if (QWidget *w = layout()->takeAt(0)->widget())
|
QLayoutItem *item = layout()->takeAt(0);
|
||||||
|
if (QWidget *w = item->widget())
|
||||||
l->addWidget(w);
|
l->addWidget(w);
|
||||||
|
delete item;
|
||||||
|
}
|
||||||
delete layout();
|
delete layout();
|
||||||
setLayout(l);
|
setLayout(l);
|
||||||
}
|
}
|
||||||
|
|||||||
89
src/tools/3rdparty/iossim/iphonesimulator.mm
vendored
89
src/tools/3rdparty/iossim/iphonesimulator.mm
vendored
@@ -284,13 +284,24 @@ NSString* FindDeveloperDir() {
|
|||||||
|
|
||||||
- (int) showDeviceTypes {
|
- (int) showDeviceTypes {
|
||||||
Class simDeviceSet = NSClassFromString(@"SimDeviceSet");
|
Class simDeviceSet = NSClassFromString(@"SimDeviceSet");
|
||||||
|
nsprintf(@"<device_info>");
|
||||||
|
bool hasDevices = false;
|
||||||
if (simDeviceSet) {
|
if (simDeviceSet) {
|
||||||
SimDeviceSet* deviceSet = [simDeviceSet defaultSet];
|
SimDeviceSet* deviceSet = [simDeviceSet defaultSet];
|
||||||
NSArray* devices = [deviceSet availableDevices];
|
NSArray* devices = [deviceSet availableDevices];
|
||||||
for (SimDevice* device in devices) {
|
for (SimDevice* device in devices) {
|
||||||
nsfprintf(stderr, @"%@, %@", device.deviceType.identifier, device.runtime.versionString);
|
hasDevices = true;
|
||||||
|
nsfprintf(stdout, @"<item><key>%@, %@</key><value>%@</value></item>",device.deviceType.identifier, device.runtime.versionString, device.deviceType.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!hasDevices) {
|
||||||
|
// fallback devices for Xcode 5.x
|
||||||
|
nsprintf(@"<item><key>com.apple.CoreSimulator.SimDeviceType.iPhone-4s</key><value>iPhone 3.5-inch Retina Display</value></item>");
|
||||||
|
nsprintf(@"<item><key>com.apple.CoreSimulator.SimDeviceType.iPhone-5s</key><value>iPhone 4-inch Retina Display</value></item>");
|
||||||
|
nsprintf(@"<item><key>com.apple.CoreSimulator.SimDeviceType.iPad-2</key><value>iPad</value></item>");
|
||||||
|
nsprintf(@"<item><key>com.apple.CoreSimulator.SimDeviceType.iPad-Retina</key><value>iPad Retina Display</value></item>");
|
||||||
|
}
|
||||||
|
nsprintf(@"</device_info>");
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -620,7 +631,21 @@ static void ChildSignal(int /*arg*/) {
|
|||||||
|
|
||||||
- (NSString*) changeDeviceType:(NSString *)family retina:(BOOL)retina isTallDevice:(BOOL)isTallDevice is64Bit:(BOOL)is64Bit {
|
- (NSString*) changeDeviceType:(NSString *)family retina:(BOOL)retina isTallDevice:(BOOL)isTallDevice is64Bit:(BOOL)is64Bit {
|
||||||
NSString *devicePropertyValue;
|
NSString *devicePropertyValue;
|
||||||
if (retina) {
|
if (self->deviceTypeId) {
|
||||||
|
if ([deviceTypeIdIphone4s isEqual: deviceTypeId])
|
||||||
|
devicePropertyValue = deviceIphoneRetina3_5Inch;
|
||||||
|
else if ([deviceTypeIdIphone5s isEqual: deviceTypeId])
|
||||||
|
devicePropertyValue = deviceIphoneRetina4_0Inch;
|
||||||
|
else if ([deviceTypeIdIpad2 isEqual: deviceTypeId])
|
||||||
|
devicePropertyValue = deviceIpad;
|
||||||
|
else if ([deviceTypeIdIpadRetina isEqual: deviceTypeId])
|
||||||
|
devicePropertyValue = deviceIpadRetina;
|
||||||
|
else {
|
||||||
|
nsprintf(@"<msg>Unknown or unsupported device type: %@</msg>\n", deviceTypeId);
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
} else if (retina) {
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
msgprintf(@"using retina");
|
msgprintf(@"using retina");
|
||||||
}
|
}
|
||||||
@@ -690,8 +715,8 @@ static void ChildSignal(int /*arg*/) {
|
|||||||
}
|
}
|
||||||
NSString* developerDir = FindDeveloperDir();
|
NSString* developerDir = FindDeveloperDir();
|
||||||
if (!developerDir) {
|
if (!developerDir) {
|
||||||
nsprintf(@"Unable to find developer directory.");
|
nsprintf(@"<msg>Unable to find developer directory.</msg>");
|
||||||
exit(EXIT_FAILURE);
|
[self doExit:EXIT_FAILURE];
|
||||||
}
|
}
|
||||||
NSString *xcodePlistPath = [developerDir stringByAppendingPathComponent:@"../Info.plist"];
|
NSString *xcodePlistPath = [developerDir stringByAppendingPathComponent:@"../Info.plist"];
|
||||||
NSAssert([[NSFileManager defaultManager] fileExistsAtPath:xcodePlistPath isDirectory:NULL],
|
NSAssert([[NSFileManager defaultManager] fileExistsAtPath:xcodePlistPath isDirectory:NULL],
|
||||||
@@ -717,15 +742,15 @@ static void ChildSignal(int /*arg*/) {
|
|||||||
}
|
}
|
||||||
if (strcmp(argv[1], "showsdks") == 0) {
|
if (strcmp(argv[1], "showsdks") == 0) {
|
||||||
[self LoadSimulatorFramework:developerDir];
|
[self LoadSimulatorFramework:developerDir];
|
||||||
exit([self showSDKs]);
|
[self doExit:[self showSDKs]];
|
||||||
} else if (strcmp(argv[1], "showdevicetypes") == 0) {
|
} else if (strcmp(argv[1], "showdevicetypes") == 0) {
|
||||||
[self LoadSimulatorFramework:developerDir];
|
[self LoadSimulatorFramework:developerDir];
|
||||||
exit([self showDeviceTypes]);
|
[self doExit:[self showDeviceTypes]];
|
||||||
} else if (strcmp(argv[1], "launch") == 0 || startOnly) {
|
} else if (strcmp(argv[1], "launch") == 0 || startOnly) {
|
||||||
if (strcmp(argv[1], "launch") == 0 && argc < 3) {
|
if (strcmp(argv[1], "launch") == 0 && argc < 3) {
|
||||||
msgprintf(@"Missing application path argument");
|
msgprintf(@"Missing application path argument");
|
||||||
[self printUsage];
|
[self printUsage];
|
||||||
exit(EXIT_FAILURE);
|
[self doExit:EXIT_FAILURE];
|
||||||
}
|
}
|
||||||
|
|
||||||
NSString *appPath = nil;
|
NSString *appPath = nil;
|
||||||
@@ -767,6 +792,11 @@ static void ChildSignal(int /*arg*/) {
|
|||||||
useGDB = YES;
|
useGDB = YES;
|
||||||
} else if (strcmp(argv[i], "--developer-path") == 0) {
|
} else if (strcmp(argv[i], "--developer-path") == 0) {
|
||||||
++i;
|
++i;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --developer-path</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
} else if (strcmp(argv[i], "--timeout") == 0) {
|
} else if (strcmp(argv[i], "--timeout") == 0) {
|
||||||
if (i + 1 < argc) {
|
if (i + 1 < argc) {
|
||||||
timeout = [[NSString stringWithUTF8String:argv[++i]] doubleValue];
|
timeout = [[NSString stringWithUTF8String:argv[++i]] doubleValue];
|
||||||
@@ -776,6 +806,11 @@ static void ChildSignal(int /*arg*/) {
|
|||||||
else if (strcmp(argv[i], "--sdk") == 0) {
|
else if (strcmp(argv[i], "--sdk") == 0) {
|
||||||
[self printDeprecation:argv[i]];
|
[self printDeprecation:argv[i]];
|
||||||
i++;
|
i++;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --sdk</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
[self LoadSimulatorFramework:developerDir];
|
[self LoadSimulatorFramework:developerDir];
|
||||||
NSString* ver = [NSString stringWithCString:argv[i] encoding:NSUTF8StringEncoding];
|
NSString* ver = [NSString stringWithCString:argv[i] encoding:NSUTF8StringEncoding];
|
||||||
Class systemRootClass = [self FindClassByName:@"DTiPhoneSimulatorSystemRoot"];
|
Class systemRootClass = [self FindClassByName:@"DTiPhoneSimulatorSystemRoot"];
|
||||||
@@ -795,19 +830,44 @@ static void ChildSignal(int /*arg*/) {
|
|||||||
} else if (strcmp(argv[i], "--family") == 0) {
|
} else if (strcmp(argv[i], "--family") == 0) {
|
||||||
[self printDeprecation:argv[i]];
|
[self printDeprecation:argv[i]];
|
||||||
i++;
|
i++;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --sdkfamilymsg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
family = [NSString stringWithUTF8String:argv[i]];
|
family = [NSString stringWithUTF8String:argv[i]];
|
||||||
} else if (strcmp(argv[i], "--uuid") == 0) {
|
} else if (strcmp(argv[i], "--uuid") == 0) {
|
||||||
i++;
|
i++;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --uuid</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
uuid = [NSString stringWithUTF8String:argv[i]];
|
uuid = [NSString stringWithUTF8String:argv[i]];
|
||||||
} else if (strcmp(argv[i], "--devicetypeid") == 0) {
|
} else if (strcmp(argv[i], "--devicetypeid") == 0) {
|
||||||
i++;
|
i++;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --devicetypeid</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
deviceTypeId = [NSString stringWithUTF8String:argv[i]];
|
deviceTypeId = [NSString stringWithUTF8String:argv[i]];
|
||||||
} else if (strcmp(argv[i], "--setenv") == 0) {
|
} else if (strcmp(argv[i], "--setenv") == 0) {
|
||||||
i++;
|
i++;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --setenv</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
NSArray *parts = [[NSString stringWithUTF8String:argv[i]] componentsSeparatedByString:@"="];
|
NSArray *parts = [[NSString stringWithUTF8String:argv[i]] componentsSeparatedByString:@"="];
|
||||||
[environment setObject:[parts objectAtIndex:1] forKey:[parts objectAtIndex:0]];
|
[environment setObject:[parts objectAtIndex:1] forKey:[parts objectAtIndex:0]];
|
||||||
} else if (strcmp(argv[i], "--env") == 0) {
|
} else if (strcmp(argv[i], "--env") == 0) {
|
||||||
i++;
|
i++;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --env</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
NSString *envFilePath = [[NSString stringWithUTF8String:argv[i]] expandPath];
|
NSString *envFilePath = [[NSString stringWithUTF8String:argv[i]] expandPath];
|
||||||
[environment setValuesForKeysWithDictionary:[NSDictionary dictionaryWithContentsOfFile:envFilePath]];
|
[environment setValuesForKeysWithDictionary:[NSDictionary dictionaryWithContentsOfFile:envFilePath]];
|
||||||
if (!environment) {
|
if (!environment) {
|
||||||
@@ -817,14 +877,29 @@ static void ChildSignal(int /*arg*/) {
|
|||||||
}
|
}
|
||||||
} else if (strcmp(argv[i], "--stdout") == 0) {
|
} else if (strcmp(argv[i], "--stdout") == 0) {
|
||||||
i++;
|
i++;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --stdout</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
stdoutPath = [[NSString stringWithUTF8String:argv[i]] expandPath];
|
stdoutPath = [[NSString stringWithUTF8String:argv[i]] expandPath];
|
||||||
NSLog(@"stdoutPath: %@", stdoutPath);
|
NSLog(@"stdoutPath: %@", stdoutPath);
|
||||||
} else if (strcmp(argv[i], "--stderr") == 0) {
|
} else if (strcmp(argv[i], "--stderr") == 0) {
|
||||||
i++;
|
i++;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --stderr</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
stderrPath = [[NSString stringWithUTF8String:argv[i]] expandPath];
|
stderrPath = [[NSString stringWithUTF8String:argv[i]] expandPath];
|
||||||
NSLog(@"stderrPath: %@", stderrPath);
|
NSLog(@"stderrPath: %@", stderrPath);
|
||||||
} else if (strcmp(argv[i], "--xctest") == 0) {
|
} else if (strcmp(argv[i], "--xctest") == 0) {
|
||||||
i++;
|
i++;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --xctest</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
xctest = [[NSString stringWithUTF8String:argv[i]] expandPath];
|
xctest = [[NSString stringWithUTF8String:argv[i]] expandPath];
|
||||||
NSLog(@"xctest: %@", xctest);
|
NSLog(@"xctest: %@", xctest);
|
||||||
} else if (strcmp(argv[i], "--retina") == 0) {
|
} else if (strcmp(argv[i], "--retina") == 0) {
|
||||||
|
|||||||
@@ -400,7 +400,16 @@ NSString *deviceIpadRetina = @"iPad (Retina)";
|
|||||||
startOnly = strcmp(argv[1], "start") == 0;
|
startOnly = strcmp(argv[1], "start") == 0;
|
||||||
nsprintf(@"<query_result>");
|
nsprintf(@"<query_result>");
|
||||||
|
|
||||||
if (strcmp(argv[1], "showsdks") == 0) {
|
if (strcmp(argv[1], "showdevicetypes") == 0) {
|
||||||
|
nsprintf(@"<deviceinfo>");
|
||||||
|
nsprintf(@"<item><key>com.apple.CoreSimulator.SimDeviceType.iPhone-4s</key><value>iPhone 3.5-inch Retina Display</value></item>");
|
||||||
|
nsprintf(@"<item><key>com.apple.CoreSimulator.SimDeviceType.iPhone-5s</key><value>iPhone 4-inch Retina Display</value></item>");
|
||||||
|
nsprintf(@"<item><key>com.apple.CoreSimulator.SimDeviceType.iPad-2</key><value>iPad</value></item>");
|
||||||
|
nsprintf(@"<item><key>com.apple.CoreSimulator.SimDeviceType.iPad-Retina</key><value>iPad Retina Display</value></item>");
|
||||||
|
nsprintf(@"</deviceinfo>");
|
||||||
|
[self doExit:0];
|
||||||
|
return;
|
||||||
|
} else if (strcmp(argv[1], "showsdks") == 0) {
|
||||||
[self doExit:[self showSDKs]];
|
[self doExit:[self showSDKs]];
|
||||||
return;
|
return;
|
||||||
} else if (strcmp(argv[1], "launch") == 0 || startOnly) {
|
} else if (strcmp(argv[1], "launch") == 0 || startOnly) {
|
||||||
@@ -449,14 +458,24 @@ NSString *deviceIpadRetina = @"iPad (Retina)";
|
|||||||
useGDB = YES;
|
useGDB = YES;
|
||||||
} else if (strcmp(argv[i], "--developer-path") == 0) {
|
} else if (strcmp(argv[i], "--developer-path") == 0) {
|
||||||
++i;
|
++i;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --developer-path</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
} else if (strcmp(argv[i], "--timeout") == 0) {
|
} else if (strcmp(argv[i], "--timeout") == 0) {
|
||||||
if (i + 1 < argc) {
|
if (i + 1 < argc) {
|
||||||
timeout = [[NSString stringWithUTF8String:argv[++i]] doubleValue];
|
timeout = [[NSString stringWithUTF8String:argv[++i]] doubleValue];
|
||||||
NSLog(@"<msg>Timeout: %f second(s)</msg>", timeout);
|
nsprintf(@"<msg>Timeout: %f second(s)</msg>", timeout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (strcmp(argv[i], "--sdk") == 0) {
|
else if (strcmp(argv[i], "--sdk") == 0) {
|
||||||
i++;
|
i++;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --sdk</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
NSString* ver = [NSString stringWithCString:argv[i] encoding:NSUTF8StringEncoding];
|
NSString* ver = [NSString stringWithCString:argv[i] encoding:NSUTF8StringEncoding];
|
||||||
id tClass = objc_getClass("DTiPhoneSimulatorSystemRoot");
|
id tClass = objc_getClass("DTiPhoneSimulatorSystemRoot");
|
||||||
NSArray *roots;
|
NSArray *roots;
|
||||||
@@ -480,16 +499,55 @@ NSString *deviceIpadRetina = @"iPad (Retina)";
|
|||||||
}
|
}
|
||||||
} else if (strcmp(argv[i], "--family") == 0) {
|
} else if (strcmp(argv[i], "--family") == 0) {
|
||||||
i++;
|
i++;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --family</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
family = [NSString stringWithUTF8String:argv[i]];
|
family = [NSString stringWithUTF8String:argv[i]];
|
||||||
} else if (strcmp(argv[i], "--uuid") == 0) {
|
} else if (strcmp(argv[i], "--uuid") == 0) {
|
||||||
i++;
|
i++;
|
||||||
uuid = [NSString stringWithUTF8String:argv[i]];
|
uuid = [NSString stringWithUTF8String:argv[i]];
|
||||||
|
} else if (strcmp(argv[i], "--devicetypeid") == 0) {
|
||||||
|
i++;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --devicetypeid</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (strcmp(argv[i], "com.apple.CoreSimulator.SimDeviceType.iPhone-4s") == 0) {
|
||||||
|
family = [NSString stringWithUTF8String:"iphone"];
|
||||||
|
retinaDevice = YES;
|
||||||
|
} else if (strcmp(argv[i], "com.apple.CoreSimulator.SimDeviceType.iPad-2") == 0) {
|
||||||
|
family = [NSString stringWithUTF8String:"ipad"];
|
||||||
|
} else if (strcmp(argv[i], "com.apple.CoreSimulator.SimDeviceType.iPhone-5s") == 0) {
|
||||||
|
family = [NSString stringWithUTF8String:"iphone"];
|
||||||
|
retinaDevice = YES;
|
||||||
|
tallDevice = YES;
|
||||||
|
} else if (strcmp(argv[i], "com.apple.CoreSimulator.SimDeviceType.iPad-Retina") == 0) {
|
||||||
|
family = [NSString stringWithUTF8String:"ipad"];
|
||||||
|
retinaDevice = YES;
|
||||||
|
} else {
|
||||||
|
fprintf(stdout,"<msg>Unknown or unsupported device type: %s</msg>\n",argv[i]);
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
} else if (strcmp(argv[i], "--setenv") == 0) {
|
} else if (strcmp(argv[i], "--setenv") == 0) {
|
||||||
i++;
|
i++;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --setenv</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
NSArray *parts = [[NSString stringWithUTF8String:argv[i]] componentsSeparatedByString:@"="];
|
NSArray *parts = [[NSString stringWithUTF8String:argv[i]] componentsSeparatedByString:@"="];
|
||||||
[environment setObject:[parts objectAtIndex:1] forKey:[parts objectAtIndex:0]];
|
[environment setObject:[parts objectAtIndex:1] forKey:[parts objectAtIndex:0]];
|
||||||
} else if (strcmp(argv[i], "--env") == 0) {
|
} else if (strcmp(argv[i], "--env") == 0) {
|
||||||
i++;
|
i++;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --env</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
NSString *envFilePath = [[NSString stringWithUTF8String:argv[i]] expandPath];
|
NSString *envFilePath = [[NSString stringWithUTF8String:argv[i]] expandPath];
|
||||||
environment = [NSMutableDictionary dictionaryWithContentsOfFile:envFilePath];
|
environment = [NSMutableDictionary dictionaryWithContentsOfFile:envFilePath];
|
||||||
if (!environment) {
|
if (!environment) {
|
||||||
@@ -499,12 +557,22 @@ NSString *deviceIpadRetina = @"iPad (Retina)";
|
|||||||
}
|
}
|
||||||
} else if (strcmp(argv[i], "--stdout") == 0) {
|
} else if (strcmp(argv[i], "--stdout") == 0) {
|
||||||
i++;
|
i++;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --stdout</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
stdoutPath = [[NSString stringWithUTF8String:argv[i]] expandPath];
|
stdoutPath = [[NSString stringWithUTF8String:argv[i]] expandPath];
|
||||||
NSLog(@"stdoutPath: %@", stdoutPath);
|
nsprintf(@"<msg>stdoutPath: %@</msg>", stdoutPath);
|
||||||
} else if (strcmp(argv[i], "--stderr") == 0) {
|
} else if (strcmp(argv[i], "--stderr") == 0) {
|
||||||
i++;
|
i++;
|
||||||
|
if (i == argc) {
|
||||||
|
nsprintf(@"<msg>missing arg after --stderr</msg>");
|
||||||
|
[self doExit:EXIT_FAILURE];
|
||||||
|
return;
|
||||||
|
}
|
||||||
stderrPath = [[NSString stringWithUTF8String:argv[i]] expandPath];
|
stderrPath = [[NSString stringWithUTF8String:argv[i]] expandPath];
|
||||||
NSLog(@"stderrPath: %@", stderrPath);
|
nsprintf(@"<msg>stderrPath: %@</msg>", stderrPath);
|
||||||
} else if (strcmp(argv[i], "--retina") == 0) {
|
} else if (strcmp(argv[i], "--retina") == 0) {
|
||||||
retinaDevice = YES;
|
retinaDevice = YES;
|
||||||
} else if (strcmp(argv[i], "--tall") == 0) {
|
} else if (strcmp(argv[i], "--tall") == 0) {
|
||||||
|
|||||||
@@ -4274,11 +4274,11 @@ void tst_Dumpers::dumper_data()
|
|||||||
// Known issue: Clang produces "std::vector<std::allocator<bool>>
|
// Known issue: Clang produces "std::vector<std::allocator<bool>>
|
||||||
+ Check("b0", "<0 items>", "std::vector<bool>") % GdbEngine
|
+ Check("b0", "<0 items>", "std::vector<bool>") % GdbEngine
|
||||||
+ Check("b0", "<0 items>", "std::vector<bool>") % ClangVersion(600)
|
+ Check("b0", "<0 items>", "std::vector<bool>") % ClangVersion(600)
|
||||||
+ Check("b0", "<0 items>", "std::vector<std::allocator<bool>>") % ClangVersion(0, 599)
|
+ Check("b0", "<0 items>", "std::vector<std::allocator<bool>>") % ClangVersion(1, 599)
|
||||||
|
|
||||||
+ Check("b1", "<5 items>", "std::vector<bool>") % GdbEngine
|
+ Check("b1", "<5 items>", "std::vector<bool>") % GdbEngine
|
||||||
+ Check("b1", "<5 items>", "std::vector<bool>") % ClangVersion(600)
|
+ Check("b1", "<5 items>", "std::vector<bool>") % ClangVersion(600)
|
||||||
+ Check("b1", "<5 items>", "std::vector<std::allocator<bool>>") % ClangVersion(0, 599)
|
+ Check("b1", "<5 items>", "std::vector<std::allocator<bool>>") % ClangVersion(1, 599)
|
||||||
+ Check("b1.0", "[0]", "1", "bool")
|
+ Check("b1.0", "[0]", "1", "bool")
|
||||||
+ Check("b1.1", "[1]", "0", "bool")
|
+ Check("b1.1", "[1]", "0", "bool")
|
||||||
+ Check("b1.2", "[2]", "0", "bool")
|
+ Check("b1.2", "[2]", "0", "bool")
|
||||||
@@ -4287,13 +4287,13 @@ void tst_Dumpers::dumper_data()
|
|||||||
|
|
||||||
+ Check("b2", "<65 items>", "std::vector<bool>") % GdbEngine
|
+ Check("b2", "<65 items>", "std::vector<bool>") % GdbEngine
|
||||||
+ Check("b2", "<65 items>", "std::vector<bool>") % ClangVersion(600)
|
+ Check("b2", "<65 items>", "std::vector<bool>") % ClangVersion(600)
|
||||||
+ Check("b2", "<65 items>", "std::vector<std::allocator<bool>>") % ClangVersion(0, 599)
|
+ Check("b2", "<65 items>", "std::vector<std::allocator<bool>>") % ClangVersion(1, 599)
|
||||||
+ Check("b2.0", "[0]", "1", "bool")
|
+ Check("b2.0", "[0]", "1", "bool")
|
||||||
+ Check("b2.64", "[64]", "1", "bool")
|
+ Check("b2.64", "[64]", "1", "bool")
|
||||||
|
|
||||||
+ Check("b3", "<300 items>", "std::vector<bool>") % GdbEngine
|
+ Check("b3", "<300 items>", "std::vector<bool>") % GdbEngine
|
||||||
+ Check("b3", "<300 items>", "std::vector<bool>") % ClangVersion(600)
|
+ Check("b3", "<300 items>", "std::vector<bool>") % ClangVersion(600)
|
||||||
+ Check("b3", "<300 items>", "std::vector<std::allocator<bool>>") % ClangVersion(0, 599)
|
+ Check("b3", "<300 items>", "std::vector<std::allocator<bool>>") % ClangVersion(1, 599)
|
||||||
+ Check("b3.0", "[0]", "0", "bool")
|
+ Check("b3.0", "[0]", "0", "bool")
|
||||||
+ Check("b3.299", "[299]", "0", "bool");
|
+ Check("b3.299", "[299]", "0", "bool");
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user