Files
qt-creator/src/plugins/ios/iostoolhandler.h
Jarek Kobus ad7de40a9d IosToolTaskAdapter: Don't leak the IosToolHandler on destruction
The TaskAdapter may be destructed at any point in time,
even when the task is still running (i.e. when the task tree
was canceled). Make sure the internal IosToolHandler gets
deleted in this case.

Amends 150441bf88

Change-Id: I1ae4d324390c38d4faf9ec32f83c66295ed18532
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
2024-07-12 07:53:49 +00:00

100 lines
3.3 KiB
C++

// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include "iossimulator.h"
#include <utils/filepath.h>
#include <utils/port.h>
#include <solutions/tasking/tasktree.h>
#include <QObject>
#include <QMap>
#include <QString>
#include <QStringList>
namespace Ios {
namespace Internal {
class IosToolHandlerPrivate;
class IosDeviceType;
}
class IosToolHandler : public QObject
{
Q_OBJECT
public:
using Dict = QMap<QString,QString>;
enum RunKind {
NormalRun,
DebugRun
};
enum OpStatus {
Success = 0,
Unknown = 1,
Failure = 2
};
static QString iosDeviceToolPath();
explicit IosToolHandler(const Internal::IosDeviceType &type, QObject *parent = nullptr);
~IosToolHandler() override;
void requestTransferApp(const Utils::FilePath &bundlePath, const QString &deviceId, int timeout = 1000);
void requestRunApp(const Utils::FilePath &bundlePath, const QStringList &extraArgs, RunKind runType,
const QString &deviceId, int timeout = 1000);
void requestDeviceInfo(const QString &deviceId, int timeout = 1000);
bool isRunning() const;
void stop();
signals:
void isTransferringApp(Ios::IosToolHandler *handler, const Utils::FilePath &bundlePath,
const QString &deviceId, int progress, int maxProgress,
const QString &info);
void didTransferApp(Ios::IosToolHandler *handler, const Utils::FilePath &bundlePath,
const QString &deviceId, Ios::IosToolHandler::OpStatus status);
void didStartApp(Ios::IosToolHandler *handler, const Utils::FilePath &bundlePath,
const QString &deviceId, Ios::IosToolHandler::OpStatus status);
void gotServerPorts(Ios::IosToolHandler *handler, const Utils::FilePath &bundlePath,
const QString &deviceId, Utils::Port gdbPort, Utils::Port qmlPort);
void gotInferiorPid(Ios::IosToolHandler *handler, const Utils::FilePath &bundlePath,
const QString &deviceId, qint64 pid);
void deviceInfo(Ios::IosToolHandler *handler, const QString &deviceId,
const Ios::IosToolHandler::Dict &info);
void appOutput(Ios::IosToolHandler *handler, const QString &output);
void errorMsg(Ios::IosToolHandler *handler, const QString &msg);
void toolExited(Ios::IosToolHandler *handler, int code);
void finished(Ios::IosToolHandler *handler);
private:
friend class Ios::Internal::IosToolHandlerPrivate;
Ios::Internal::IosToolHandlerPrivate *d;
};
// for Tasking:
class IosToolRunner
{
public:
using StartHandler = std::function<void(IosToolHandler *)>;
void setStartHandler(const StartHandler &startHandler);
void setDeviceType(const Internal::IosDeviceType &type);
private:
friend class IosToolTaskAdapter;
std::unique_ptr<IosToolHandler> m_iosToolHandler;
StartHandler m_startHandler;
Internal::IosDeviceType m_deviceType = Internal::IosDeviceType::IosDevice;
};
class IosToolTaskAdapter : public Tasking::TaskAdapter<IosToolRunner>
{
public:
IosToolTaskAdapter();
void start() final;
};
using IosToolTask = Tasking::CustomTask<IosToolTaskAdapter>;
} // namespace Ios