summaryrefslogtreecommitdiff
path: root/src/plugins/ios
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/ios')
-rwxr-xr-xsrc/plugins/ios/images/iossettings.pngbin0 -> 4681 bytes
-rw-r--r--src/plugins/ios/ios.qrc2
-rw-r--r--src/plugins/ios/iosconfigurations.cpp105
-rw-r--r--src/plugins/ios/iosconstants.h2
-rw-r--r--src/plugins/ios/iosdebugsupport.cpp2
-rw-r--r--src/plugins/ios/iosdeploystep.cpp18
-rw-r--r--src/plugins/ios/iosdeploystep.h20
-rw-r--r--src/plugins/ios/iosdevice.cpp118
-rw-r--r--src/plugins/ios/iossimulator.cpp2
-rw-r--r--src/plugins/ios/iostoolhandler.cpp148
-rw-r--r--src/plugins/ios/iostoolhandler.h1
11 files changed, 214 insertions, 204 deletions
diff --git a/src/plugins/ios/images/iossettings.png b/src/plugins/ios/images/iossettings.png
new file mode 100755
index 0000000000..307d525188
--- /dev/null
+++ b/src/plugins/ios/images/iossettings.png
Binary files differ
diff --git a/src/plugins/ios/ios.qrc b/src/plugins/ios/ios.qrc
index 81314b84cd..cf041359ad 100644
--- a/src/plugins/ios/ios.qrc
+++ b/src/plugins/ios/ios.qrc
@@ -1,5 +1,5 @@
<RCC>
<qresource prefix="/ios">
- <file>images/QtIos.png</file>
+ <file>images/iossettings.png</file>
</qresource>
</RCC>
diff --git a/src/plugins/ios/iosconfigurations.cpp b/src/plugins/ios/iosconfigurations.cpp
index 8e87c78419..34c6f02b1b 100644
--- a/src/plugins/ios/iosconfigurations.cpp
+++ b/src/plugins/ios/iosconfigurations.cpp
@@ -113,7 +113,8 @@ void IosConfigurations::updateAutomaticKitList()
iter.next();
const Platform &p = iter.value();
if (p.compilerPath == toolchain->compilerCommand()
- && p.backendFlags == toolchain->platformCodeGenFlags()) {
+ && p.backendFlags == toolchain->platformCodeGenFlags()
+ && !platformToolchainMap.contains(p.name)) {
platformToolchainMap[p.name] = toolchain;
found = true;
}
@@ -251,7 +252,7 @@ void IosConfigurations::updateAutomaticKitList()
qDebug() << "skipping existing kit with deviceKind " << deviceKind.toString();
continue;
}
- if (!k->isAutoDetected()) // use also used set kits?
+ if (!k->isAutoDetected())
continue;
existingKits << k;
kitMatched << false;
@@ -285,15 +286,20 @@ void IosConfigurations::updateAutomaticKitList()
QList<BaseQtVersion *> qtVersions = qtVersionsForArch.value(arch);
foreach (BaseQtVersion *qt, qtVersions) {
+ Kit *kitAtt = 0;
bool kitExists = false;
for (int i = 0; i < existingKits.size(); ++i) {
Kit *k = existingKits.at(i);
if (DeviceTypeKitInformation::deviceTypeId(k) == pDeviceType
&& ToolChainKitInformation::toolChain(k) == pToolchain
- && SysRootKitInformation::sysRoot(k) == p.sdkPath
&& QtKitInformation::qtVersion(k) == qt)
{
+ QTC_CHECK(!kitMatched.value(i, true));
+ // as we generate only two kits per qt (one for device and one for simulator)
+ // we do not compare the sdk (thus automatically upgrading it in place if a
+ // new Xcode is used). Change?
kitExists = true;
+ kitAtt = k;
if (debugProbe)
qDebug() << "found existing kit " << k->displayName() << " for " << p.name
<< "," << qt->displayName();
@@ -302,74 +308,65 @@ void IosConfigurations::updateAutomaticKitList()
break;
}
}
- if (kitExists)
- continue;
- if (debugProbe)
- qDebug() << "setting up new kit for " << p.name;
- Kit *newKit = new Kit;
- newKit->setAutoDetected(true);
- QString baseDisplayName = tr("%1 %2").arg(p.name, qt->displayName());
- QString displayName = baseDisplayName;
- for (int iVers = 1; iVers < 100; ++iVers) {
- bool unique = true;
- foreach (const Kit *k, existingKits) {
- if (k->displayName() == displayName) {
- unique = false;
- break;
+ if (kitExists) {
+ kitAtt->blockNotification();
+ } else {
+ if (debugProbe)
+ qDebug() << "setting up new kit for " << p.name;
+ kitAtt = new Kit;
+ kitAtt->setAutoDetected(true);
+ QString baseDisplayName = tr("%1 %2").arg(p.name, qt->displayName());
+ QString displayName = baseDisplayName;
+ for (int iVers = 1; iVers < 100; ++iVers) {
+ bool unique = true;
+ foreach (const Kit *k, existingKits) {
+ if (k->displayName() == displayName) {
+ unique = false;
+ break;
+ }
}
+ if (unique) break;
+ displayName = baseDisplayName + QLatin1String("-") + QString::number(iVers);
}
- if (unique) break;
- displayName = baseDisplayName + QLatin1String("-") + QString::number(iVers);
+ kitAtt->setDisplayName(displayName);
}
- newKit->setDisplayName(displayName);
- newKit->setIconPath(Utils::FileName::fromString(
+ kitAtt->setIconPath(Utils::FileName::fromString(
QLatin1String(Constants::IOS_SETTINGS_CATEGORY_ICON)));
- DeviceTypeKitInformation::setDeviceTypeId(newKit, pDeviceType);
- ToolChainKitInformation::setToolChain(newKit, pToolchain);
- QtKitInformation::setQtVersion(newKit, qt);
- //DeviceKitInformation::setDevice(newKit, device);
- if (!debuggerId.isValid())
- Debugger::DebuggerKitInformation::setDebugger(newKit,
+ DeviceTypeKitInformation::setDeviceTypeId(kitAtt, pDeviceType);
+ ToolChainKitInformation::setToolChain(kitAtt, pToolchain);
+ QtKitInformation::setQtVersion(kitAtt, qt);
+ if ((!Debugger::DebuggerKitInformation::debugger(kitAtt)
+ || !Debugger::DebuggerKitInformation::debugger(kitAtt)->isValid()
+ || Debugger::DebuggerKitInformation::debugger(kitAtt)->engineType() != Debugger::LldbEngineType)
+ && debuggerId.isValid())
+ Debugger::DebuggerKitInformation::setDebugger(kitAtt,
debuggerId);
- newKit->setMutable(DeviceKitInformation::id(), true);
- newKit->setSticky(QtKitInformation::id(), true);
- newKit->setSticky(ToolChainKitInformation::id(), true);
- newKit->setSticky(DeviceTypeKitInformation::id(), true);
- newKit->setSticky(SysRootKitInformation::id(), true);
+ kitAtt->setMutable(DeviceKitInformation::id(), true);
+ kitAtt->setSticky(QtKitInformation::id(), true);
+ kitAtt->setSticky(ToolChainKitInformation::id(), true);
+ kitAtt->setSticky(DeviceTypeKitInformation::id(), true);
+ kitAtt->setSticky(SysRootKitInformation::id(), true);
+ kitAtt->setSticky(Debugger::DebuggerKitInformation::id(), false);
- SysRootKitInformation::setSysRoot(newKit, p.sdkPath);
+ SysRootKitInformation::setSysRoot(kitAtt, p.sdkPath);
// QmakeProjectManager::QmakeKitInformation::setMkspec(newKit,
// Utils::FileName::fromString(QLatin1String("macx-ios-clang")));
- KitManager::registerKit(newKit);
- existingKits << newKit;
+ if (kitExists) {
+ kitAtt->unblockNotification();
+ } else {
+ KitManager::registerKit(kitAtt);
+ existingKits << kitAtt;
+ }
}
}
}
for (int i = 0; i < kitMatched.size(); ++i) {
// deleting extra (old) kits
- if (!kitMatched.at(i) && !existingKits.at(i)->isValid()) {
+ if (!kitMatched.at(i)) {
qDebug() << "deleting kit " << existingKits.at(i)->displayName();
KitManager::deregisterKit(existingKits.at(i));
}
- // fix old kits
- if (kitMatched.at(i)) {
- Kit *kit = existingKits.at(i);
- kit->blockNotification();
- const Debugger::DebuggerItem *debugger = Debugger::DebuggerKitInformation::debugger(kit);
- if ((!debugger || !debugger->isValid()) && debuggerId.isValid())
- Debugger::DebuggerKitInformation::setDebugger(kit, debuggerId);
- if (!kit->isMutable(DeviceKitInformation::id())) {
- kit->setMutable(DeviceKitInformation::id(), true);
- kit->setSticky(QtKitInformation::id(), true);
- kit->setSticky(ToolChainKitInformation::id(), true);
- kit->setSticky(DeviceTypeKitInformation::id(), true);
- kit->setSticky(SysRootKitInformation::id(), true);
- }
- if (kit->isSticky(Debugger::DebuggerKitInformation::id()))
- kit->setSticky(Debugger::DebuggerKitInformation::id(), false);
- kit->unblockNotification();
- }
}
}
diff --git a/src/plugins/ios/iosconstants.h b/src/plugins/ios/iosconstants.h
index 6eb17c67f7..f4df71a091 100644
--- a/src/plugins/ios/iosconstants.h
+++ b/src/plugins/ios/iosconstants.h
@@ -48,7 +48,7 @@ namespace Constants {
const char IOS_SETTINGS_ID[] = "ZZ.Ios Configurations";
const char IOS_SETTINGS_CATEGORY[] = "XA.Ios";
const char IOS_SETTINGS_TR_CATEGORY[] = QT_TRANSLATE_NOOP("Ios", "iOS");
-const char IOS_SETTINGS_CATEGORY_ICON[] = ":/ios/images/QtIos.png";
+const char IOS_SETTINGS_CATEGORY_ICON[] = ":/ios/images/iossettings.png";
const char IOSQT[] = "Qt4ProjectManager.QtVersion.Ios";
const char IOS_DEVICE_TYPE[] = "Ios.Device.Type";
diff --git a/src/plugins/ios/iosdebugsupport.cpp b/src/plugins/ios/iosdebugsupport.cpp
index 32d69447af..44edcb276b 100644
--- a/src/plugins/ios/iosdebugsupport.cpp
+++ b/src/plugins/ios/iosdebugsupport.cpp
@@ -162,7 +162,9 @@ void IosDebugSupport::handleGotInferiorPid(Q_PID pid)
{
if (pid > 0) {
//m_runControl->engine()->notifyInferiorPid(pid);
+#ifndef Q_OS_WIN // Q_PID might be 64 bit pointer...
m_runControl->engine()->notifyEngineRemoteSetupDone(int(pid), m_qmlPort);
+#endif
} else {
m_runControl->engine()->notifyEngineRemoteSetupFailed(
tr("Got an invalid process id."));
diff --git a/src/plugins/ios/iosdeploystep.cpp b/src/plugins/ios/iosdeploystep.cpp
index 35a8d7bc6d..37baafeea6 100644
--- a/src/plugins/ios/iosdeploystep.cpp
+++ b/src/plugins/ios/iosdeploystep.cpp
@@ -75,6 +75,7 @@ IosDeployStep::~IosDeployStep() { }
void IosDeployStep::ctor()
{
+ m_toolHandler = 0;
m_transferStatus = NoTransfer;
m_device = ProjectExplorer::DeviceKitInformation::device(target()->kit());
const QString devName = m_device.isNull() ? IosDevice::name() : m_device->displayName();
@@ -103,23 +104,24 @@ void IosDeployStep::run(QFutureInterface<bool> &fi)
ProjectExplorer::Constants::TASK_CATEGORY_DEPLOYMENT);
m_futureInterface.reportResult(!iossimulator().isNull());
cleanup();
- m_futureInterface.reportFinished();
+ emit finished();
return;
}
m_transferStatus = TransferInProgress;
- IosToolHandler *toolHandler = new IosToolHandler(IosToolHandler::IosDeviceType, this);
+ QTC_CHECK(m_toolHandler == 0);
+ m_toolHandler = new IosToolHandler(IosToolHandler::IosDeviceType, this);
m_futureInterface.setProgressRange(0, 200);
m_futureInterface.setProgressValueAndText(0, QLatin1String("Transferring application"));
m_futureInterface.reportStarted();
- connect(toolHandler, SIGNAL(isTransferringApp(Ios::IosToolHandler*,QString,QString,int,int,QString)),
+ connect(m_toolHandler, SIGNAL(isTransferringApp(Ios::IosToolHandler*,QString,QString,int,int,QString)),
SLOT(handleIsTransferringApp(Ios::IosToolHandler*,QString,QString,int,int,QString)));
- connect(toolHandler, SIGNAL(didTransferApp(Ios::IosToolHandler*,QString,QString,Ios::IosToolHandler::OpStatus)),
+ connect(m_toolHandler, SIGNAL(didTransferApp(Ios::IosToolHandler*,QString,QString,Ios::IosToolHandler::OpStatus)),
SLOT(handleDidTransferApp(Ios::IosToolHandler*,QString,QString,Ios::IosToolHandler::OpStatus)));
- connect(toolHandler, SIGNAL(finished(Ios::IosToolHandler*)),
+ connect(m_toolHandler, SIGNAL(finished(Ios::IosToolHandler*)),
SLOT(handleFinished(Ios::IosToolHandler*)));
- connect(toolHandler, SIGNAL(errorMsg(Ios::IosToolHandler*,QString)),
+ connect(m_toolHandler, SIGNAL(errorMsg(Ios::IosToolHandler*,QString)),
SLOT(handleErrorMsg(Ios::IosToolHandler*,QString)));
- toolHandler->requestTransferApp(appBundle(), deviceId());
+ m_toolHandler->requestTransferApp(appBundle(), deviceId());
}
void IosDeployStep::cancel()
@@ -179,7 +181,7 @@ void IosDeployStep::handleFinished(IosToolHandler *handler)
cleanup();
handler->deleteLater();
// move it when result is reported? (would need care to avoid problems with concurrent runs)
- m_futureInterface.reportFinished();
+ emit finished();
}
void IosDeployStep::handleErrorMsg(IosToolHandler *handler, const QString &msg)
diff --git a/src/plugins/ios/iosdeploystep.h b/src/plugins/ios/iosdeploystep.h
index e74a5c0bbb..05485b0b66 100644
--- a/src/plugins/ios/iosdeploystep.h
+++ b/src/plugins/ios/iosdeploystep.h
@@ -51,26 +51,6 @@ namespace Internal {
class IosDeviceConfigListModel;
class IosPackageCreationStep;
-class DeployItem
-{
-public:
- DeployItem(const QString &_localFileName,
- unsigned int _localTimeStamp,
- const QString &_remoteFileName,
- bool _needsStrip)
- : localFileName(_localFileName),
- remoteFileName(_remoteFileName),
- localTimeStamp(_localTimeStamp),
- remoteTimeStamp(0),
- needsStrip(_needsStrip)
- {}
- QString localFileName;
- QString remoteFileName;
- unsigned int localTimeStamp;
- unsigned int remoteTimeStamp;
- bool needsStrip;
-};
-
class IosDeployStep : public ProjectExplorer::BuildStep
{
Q_OBJECT
diff --git a/src/plugins/ios/iosdevice.cpp b/src/plugins/ios/iosdevice.cpp
index b0d552345c..58cf894b96 100644
--- a/src/plugins/ios/iosdevice.cpp
+++ b/src/plugins/ios/iosdevice.cpp
@@ -46,6 +46,8 @@
#include <CoreFoundation/CoreFoundation.h>
#endif
+#include <exception>
+
using namespace ProjectExplorer;
static bool debugDeviceDetection = false;
@@ -85,7 +87,7 @@ IosDevice::IosDevice()
Constants::IOS_DEVICE_ID)
{
setDisplayName(IosDevice::name());
- setDeviceState(DeviceStateUnknown);
+ setDeviceState(DeviceDisconnected);
}
IosDevice::IosDevice(const IosDevice &other)
@@ -99,7 +101,7 @@ IosDevice::IosDevice(const QString &uid)
Core::Id(Constants::IOS_DEVICE_ID).withSuffix(uid))
{
setDisplayName(IosDevice::name());
- setDeviceState(DeviceStateUnknown);
+ setDeviceState(DeviceDisconnected);
}
@@ -364,62 +366,80 @@ io_iterator_t gRemovedIter;
extern "C" {
void deviceConnectedCallback(void *refCon, io_iterator_t iterator)
{
- kern_return_t kr;
- io_service_t usbDevice;
- (void) refCon;
-
- while ((usbDevice = IOIteratorNext(iterator))) {
- io_name_t deviceName;
-
- // Get the USB device's name.
- kr = IORegistryEntryGetName(usbDevice, deviceName);
- QString name;
- if (KERN_SUCCESS == kr)
- name = QString::fromLocal8Bit(deviceName);
- if (debugDeviceDetection)
- qDebug() << "ios device " << name << " in deviceAddedCallback";
-
- CFStringRef cfUid = static_cast<CFStringRef>(IORegistryEntryCreateCFProperty(
- usbDevice,
- CFSTR(kUSBSerialNumberString),
- kCFAllocatorDefault, 0));
- QString uid = CFStringRef2QString(cfUid);
- CFRelease(cfUid);
- IosDeviceManager::instance()->deviceConnected(uid, name);
-
- // Done with this USB device; release the reference added by IOIteratorNext
- kr = IOObjectRelease(usbDevice);
- }
-}
-
-void deviceDisconnectedCallback(void *refCon, io_iterator_t iterator)
-{
- kern_return_t kr;
- io_service_t usbDevice;
- (void) refCon;
-
- while ((usbDevice = IOIteratorNext(iterator))) {
- io_name_t deviceName;
-
- // Get the USB device's name.
- kr = IORegistryEntryGetName(usbDevice, deviceName);
- if (KERN_SUCCESS != kr)
- deviceName[0] = '\0';
- if (debugDeviceDetection)
- qDebug() << "ios device " << deviceName << " in deviceDisconnectedCallback";
+ try {
+ kern_return_t kr;
+ io_service_t usbDevice;
+ (void) refCon;
+
+ while ((usbDevice = IOIteratorNext(iterator))) {
+ io_name_t deviceName;
+
+ // Get the USB device's name.
+ kr = IORegistryEntryGetName(usbDevice, deviceName);
+ QString name;
+ if (KERN_SUCCESS == kr)
+ name = QString::fromLocal8Bit(deviceName);
+ if (debugDeviceDetection)
+ qDebug() << "ios device " << name << " in deviceAddedCallback";
- {
CFStringRef cfUid = static_cast<CFStringRef>(IORegistryEntryCreateCFProperty(
usbDevice,
CFSTR(kUSBSerialNumberString),
kCFAllocatorDefault, 0));
QString uid = CFStringRef2QString(cfUid);
CFRelease(cfUid);
- IosDeviceManager::instance()->deviceDisconnected(uid);
+ IosDeviceManager::instance()->deviceConnected(uid, name);
+
+ // Done with this USB device; release the reference added by IOIteratorNext
+ kr = IOObjectRelease(usbDevice);
}
+ }
+ catch (std::exception &e) {
+ qDebug() << "Exception " << e.what() << " in iosdevice.cpp deviceConnectedCallback";
+ }
+ catch (...) {
+ qDebug() << "Exception in iosdevice.cpp deviceConnectedCallback";
+ throw;
+ }
+}
+
+void deviceDisconnectedCallback(void *refCon, io_iterator_t iterator)
+{
+ try {
+ kern_return_t kr;
+ io_service_t usbDevice;
+ (void) refCon;
+
+ while ((usbDevice = IOIteratorNext(iterator))) {
+ io_name_t deviceName;
+
+ // Get the USB device's name.
+ kr = IORegistryEntryGetName(usbDevice, deviceName);
+ if (KERN_SUCCESS != kr)
+ deviceName[0] = '\0';
+ if (debugDeviceDetection)
+ qDebug() << "ios device " << deviceName << " in deviceDisconnectedCallback";
+
+ {
+ CFStringRef cfUid = static_cast<CFStringRef>(IORegistryEntryCreateCFProperty(
+ usbDevice,
+ CFSTR(kUSBSerialNumberString),
+ kCFAllocatorDefault, 0));
+ QString uid = CFStringRef2QString(cfUid);
+ CFRelease(cfUid);
+ IosDeviceManager::instance()->deviceDisconnected(uid);
+ }
- // Done with this USB device; release the reference added by IOIteratorNext
- kr = IOObjectRelease(usbDevice);
+ // Done with this USB device; release the reference added by IOIteratorNext
+ kr = IOObjectRelease(usbDevice);
+ }
+ }
+ catch (std::exception &e) {
+ qDebug() << "Exception " << e.what() << " in iosdevice.cpp deviceDisconnectedCallback";
+ }
+ catch (...) {
+ qDebug() << "Exception in iosdevice.cpp deviceDisconnectedCallback";
+ throw;
}
}
diff --git a/src/plugins/ios/iossimulator.cpp b/src/plugins/ios/iossimulator.cpp
index 3d79b9fbae..711d3f7e30 100644
--- a/src/plugins/ios/iossimulator.cpp
+++ b/src/plugins/ios/iossimulator.cpp
@@ -49,6 +49,7 @@ IosSimulator::IosSimulator(Core::Id id, Utils::FileName simulatorPath)
m_simulatorPath(simulatorPath)
{
setDisplayName(QCoreApplication::translate("Ios::Internal::IosSimulator", "iOS Simulator"));
+ setDeviceState(DeviceReadyToUse);
}
IosSimulator::IosSimulator()
@@ -65,6 +66,7 @@ IosSimulator::IosSimulator(const IosSimulator &other)
: IDevice(other)
{
setDisplayName(QCoreApplication::translate("Ios::Internal::IosSimulator", "iOS Simulator"));
+ setDeviceState(DeviceReadyToUse);
}
diff --git a/src/plugins/ios/iostoolhandler.cpp b/src/plugins/ios/iostoolhandler.cpp
index 5a6eaf6491..cc921ae41e 100644
--- a/src/plugins/ios/iostoolhandler.cpp
+++ b/src/plugins/ios/iostoolhandler.cpp
@@ -42,6 +42,8 @@
#include <QList>
#include <QScopedArrayPointer>
#include <QProcessEnvironment>
+#include <QFileInfo>
+#include <QTimer>
#include <string.h>
#include <errno.h>
@@ -129,7 +131,7 @@ public:
virtual void requestDeviceInfo(const QString &deviceId, int timeout = 1000) = 0;
bool isRunning();
void start(const QString &exe, const QStringList &args);
- void stop();
+ void stop(int errorCode);
// signals
void isTransferringApp(const QString &bundlePath, const QString &deviceId, int progress,
@@ -148,12 +150,14 @@ public:
void subprocessError(QProcess::ProcessError error);
void subprocessFinished(int exitCode, QProcess::ExitStatus exitStatus);
void subprocessHasData();
+ void killProcess();
virtual bool expectsFileDescriptor() = 0;
protected:
void processXml();
IosToolHandler *q;
QProcess process;
+ QTimer killTimer;
QXmlStreamReader outputParser;
QString deviceId;
QString bundlePath;
@@ -199,16 +203,28 @@ IosToolHandlerPrivate::IosToolHandlerPrivate(IosToolHandler::DeviceType devType,
q(q), state(NonStarted), devType(devType), iBegin(0), iEnd(0),
gdbSocket(-1)
{
+ killTimer.setSingleShot(true);
QProcessEnvironment env(QProcessEnvironment::systemEnvironment());
foreach (const QString &k, env.keys())
if (k.startsWith(QLatin1String("DYLD_")))
env.remove(k);
+ QStringList frameworkPaths;
+ QString xcPath = IosConfigurations::developerPath().appendPath(QLatin1String("../OtherFrameworks")).toFileInfo().canonicalFilePath();
+ if (!xcPath.isEmpty())
+ frameworkPaths << xcPath;
+ frameworkPaths << QLatin1String("/System/Library/Frameworks")
+ << QLatin1String("/System/Library/PrivateFrameworks");
+ env.insert(QLatin1String("DYLD_FALLBACK_FRAMEWORK_PATH"), frameworkPaths.join(QLatin1String(":")));
+ if (debugToolHandler)
+ qDebug() << "IosToolHandler runEnv:" << env.toStringList();
process.setProcessEnvironment(env);
QObject::connect(&process, SIGNAL(readyReadStandardOutput()), q, SLOT(subprocessHasData()));
QObject::connect(&process, SIGNAL(finished(int,QProcess::ExitStatus)),
q, SLOT(subprocessFinished(int,QProcess::ExitStatus)));
QObject::connect(&process, SIGNAL(error(QProcess::ProcessError)),
q, SLOT(subprocessError(QProcess::ProcessError)));
+ QObject::connect(&killTimer, SIGNAL(timeout()),
+ q, SLOT(killProcess()));
}
bool IosToolHandlerPrivate::isRunning()
@@ -226,19 +242,41 @@ void IosToolHandlerPrivate::start(const QString &exe, const QStringList &args)
state = StartedInferior;
}
-void IosToolHandlerPrivate::stop()
+void IosToolHandlerPrivate::stop(int errorCode)
{
if (debugToolHandler)
qDebug() << "IosToolHandlerPrivate::stop";
- if (process.state() != QProcess::NotRunning) {
- process.close();
- process.kill();
- if (debugToolHandler)
- qDebug() << "killing";
+ State oldState = state;
+ state = Stopped;
+ switch (oldState) {
+ case NonStarted:
+ qDebug() << "IosToolHandler::stop() when state was NonStarted";
+ // pass
+ case Starting:
+ switch (op){
+ case OpNone:
+ qDebug() << "IosToolHandler::stop() when op was OpNone";
+ break;
+ case OpAppTransfer:
+ didTransferApp(bundlePath, deviceId, IosToolHandler::Failure);
+ break;
+ case OpAppRun:
+ didStartApp(bundlePath, deviceId, IosToolHandler::Failure);
+ break;
+ case OpDeviceInfo:
+ break;
+ }
+ // pass
+ case StartedInferior:
+ case XmlEndProcessed:
+ toolExited(errorCode);
+ break;
+ case Stopped:
+ return;
}
- if (state != Stopped) {
- state = Stopped;
- emit q->finished(q);
+ if (process.state() != QProcess::NotRunning) {
+ process.terminate();
+ killTimer.start(1500);
}
}
@@ -296,67 +334,23 @@ void IosToolHandlerPrivate::toolExited(int code)
void IosToolHandlerPrivate::subprocessError(QProcess::ProcessError error)
{
- switch (state) {
- case NonStarted:
- qDebug() << "subprocessError() when state was NonStarted";
- // pass
- case Starting:
- switch (op){
- case OpNone:
- qDebug() << "subprocessError() when op is OpNone";
- break;
- case OpAppTransfer:
- didTransferApp(bundlePath, deviceId, IosToolHandler::Failure);
- break;
- case OpAppRun:
- didStartApp(bundlePath, deviceId, IosToolHandler::Failure);
- break;
- case OpDeviceInfo:
- break;
- }
- // pass
- case StartedInferior:
- errorMsg(IosToolHandler::tr("Subprocess Error %1").arg(error));
- toolExited(-1);
- break;
- case XmlEndProcessed:
- case Stopped:
- qDebug() << "IosToolHandler, subprocessError() in an already stopped process";
+ if (state != Stopped)
+ errorMsg(IosToolHandler::tr("iOS tool Error %1").arg(error));
+ stop(-1);
+ if (error == QProcess::FailedToStart) {
+ if (debugToolHandler)
+ qDebug() << "IosToolHandler::finished(" << this << ")";
+ emit q->finished(q);
}
}
void IosToolHandlerPrivate::subprocessFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
- // process potentially pending data
- subprocessHasData();
- switch (state) {
- case NonStarted:
- qDebug() << "subprocessFinished() when state was NonStarted";
- // pass
- case Starting:
- switch (op){
- case OpNone:
- qDebug() << "subprocessFinished() when op was OpNone";
- break;
- case OpAppTransfer:
- didTransferApp(bundlePath, deviceId, IosToolHandler::Failure);
- break;
- case OpAppRun:
- didStartApp(bundlePath, deviceId, IosToolHandler::Failure);
- break;
- case OpDeviceInfo:
- break;
- }
- // pass
- case StartedInferior:
- case XmlEndProcessed:
- toolExited((exitStatus == QProcess::CrashExit && exitCode == 0) ? -1 : exitCode);
- break;
- case Stopped:
- if (debugToolHandler)
- qDebug() << "IosToolHandler, subprocessFinished() in an already stopped process (normal)";
- break;
- }
+ stop((exitStatus == QProcess::NormalExit) ? exitCode : -1 );
+ if (debugToolHandler)
+ qDebug() << "IosToolHandler::finished(" << this << ")";
+ killTimer.stop();
+ emit q->finished(q);
}
void IosToolHandlerPrivate::processXml()
@@ -469,7 +463,8 @@ void IosToolHandlerPrivate::processXml()
break;
case ParserState::QueryResult:
state = XmlEndProcessed;
- break;
+ stop(0);
+ return;
case ParserState::AppOutput:
break;
case ParserState::AppStarted:
@@ -523,7 +518,7 @@ void IosToolHandlerPrivate::processXml()
if (outputParser.hasError()
&& outputParser.error() != QXmlStreamReader::PrematureEndOfDocumentError) {
qDebug() << "error parsing iosTool output:" << outputParser.errorString();
- stop();
+ stop(-1);
}
}
@@ -544,7 +539,7 @@ void IosToolHandlerPrivate::subprocessHasData()
while (true) {
qint64 rRead = process.read(buf, sizeof(buf));
if (rRead == -1) {
- stop();
+ stop(-1);
return;
}
if (rRead == 0)
@@ -556,7 +551,7 @@ void IosToolHandlerPrivate::subprocessHasData()
}
}
case XmlEndProcessed:
- stop();
+ stop(0);
return;
case Stopped:
return;
@@ -707,6 +702,12 @@ void IosSimulatorToolHandlerPrivate::addDeviceArguments(QStringList &args) const
}
}
+void IosToolHandlerPrivate::killProcess()
+{
+ if (process.state() != QProcess::NotRunning)
+ process.kill();
+}
+
} // namespace Internal
QString IosToolHandler::iosDeviceToolPath()
@@ -737,7 +738,7 @@ IosToolHandler::~IosToolHandler()
void IosToolHandler::stop()
{
- d->stop();
+ d->stop(-1);
}
void IosToolHandler::requestTransferApp(const QString &bundlePath, const QString &deviceId,
@@ -777,4 +778,9 @@ void IosToolHandler::subprocessHasData()
d->subprocessHasData();
}
+void IosToolHandler::killProcess()
+{
+ d->killProcess();
+}
+
} // namespace Ios
diff --git a/src/plugins/ios/iostoolhandler.h b/src/plugins/ios/iostoolhandler.h
index 11c4a56e75..de8e53c484 100644
--- a/src/plugins/ios/iostoolhandler.h
+++ b/src/plugins/ios/iostoolhandler.h
@@ -99,6 +99,7 @@ private slots:
void subprocessError(QProcess::ProcessError error);
void subprocessFinished(int exitCode, QProcess::ExitStatus exitStatus);
void subprocessHasData();
+ void killProcess();
private:
friend class Ios::Internal::IosToolHandlerPrivate;
Ios::Internal::IosToolHandlerPrivate *d;