Merge remote-tracking branch 'origin/3.3'

This commit is contained in:
Eike Ziller
2014-11-26 11:11:46 +01:00
39 changed files with 639 additions and 173 deletions

View File

@@ -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}.

View 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>

View File

@@ -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\">&copy;</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

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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;
} }

View File

@@ -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);
} }

View File

@@ -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;

View File

@@ -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

View File

@@ -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;
} }

View File

@@ -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();
} }

View File

@@ -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)

View File

@@ -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;

View File

@@ -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:

View File

@@ -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,

View File

@@ -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);
} }
} }

View File

@@ -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();
} }

View File

@@ -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)

View File

@@ -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();

View File

@@ -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)

View File

@@ -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";

View File

@@ -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();

View File

@@ -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*)),

View File

@@ -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());
} }

View File

@@ -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

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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,

View File

@@ -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());

View File

@@ -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);
} }

View File

@@ -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);

View File

@@ -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

View File

@@ -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);
} }

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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");