diff options
Diffstat (limited to 'src/plugins/ios')
| -rwxr-xr-x | src/plugins/ios/images/iossettings.png | bin | 0 -> 4681 bytes | |||
| -rw-r--r-- | src/plugins/ios/ios.qrc | 2 | ||||
| -rw-r--r-- | src/plugins/ios/iosconfigurations.cpp | 105 | ||||
| -rw-r--r-- | src/plugins/ios/iosconstants.h | 2 | ||||
| -rw-r--r-- | src/plugins/ios/iosdebugsupport.cpp | 2 | ||||
| -rw-r--r-- | src/plugins/ios/iosdeploystep.cpp | 18 | ||||
| -rw-r--r-- | src/plugins/ios/iosdeploystep.h | 20 | ||||
| -rw-r--r-- | src/plugins/ios/iosdevice.cpp | 118 | ||||
| -rw-r--r-- | src/plugins/ios/iossimulator.cpp | 2 | ||||
| -rw-r--r-- | src/plugins/ios/iostoolhandler.cpp | 148 | ||||
| -rw-r--r-- | src/plugins/ios/iostoolhandler.h | 1 |
11 files changed, 214 insertions, 204 deletions
diff --git a/src/plugins/ios/images/iossettings.png b/src/plugins/ios/images/iossettings.png Binary files differnew file mode 100755 index 0000000000..307d525188 --- /dev/null +++ b/src/plugins/ios/images/iossettings.png 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; |
