feat: support apps launched directly by systemd

Do not filter out those not launched by application manager. Assume
unit name as the app id. When Identify, assume there is only one
unique instance.

Log: support apps launched directly by systemd
Related-to: https://github.com/linuxdeepin/developer-center/issues/8088
This commit is contained in:
Yixue Wang
2024-04-22 17:26:59 +08:00
committed by asterwyx
parent 60965359cb
commit e6fd0a61a5
3 changed files with 17 additions and 34 deletions

View File

@ -187,10 +187,6 @@ void ApplicationManager1Service::initService(QDBusConnection &connection) noexce
void ApplicationManager1Service::addInstanceToApplication(const QString &unitName, const QDBusObjectPath &systemdUnitPath)
{
if (!isApplication(systemdUnitPath)) {
return;
}
auto info = processUnitName(unitName);
auto appId = std::move(info.applicationID);
auto launcher = std::move(info.Launcher);
@ -199,6 +195,9 @@ void ApplicationManager1Service::addInstanceToApplication(const QString &unitNam
if (appId.isEmpty()) {
return;
}
if (instanceId.isEmpty()) {
instanceId = QUuid::createUuid().toString(QUuid::Id128);
}
auto appIt = std::find_if(m_applicationList.cbegin(),
m_applicationList.cend(),
@ -220,10 +219,6 @@ void ApplicationManager1Service::addInstanceToApplication(const QString &unitNam
void ApplicationManager1Service::removeInstanceFromApplication(const QString &unitName, const QDBusObjectPath &systemdUnitPath)
{
if (!isApplication(systemdUnitPath)) {
return;
}
auto info = processUnitName(unitName);
auto appId = std::move(info.applicationID);
auto launcher = std::move(info.Launcher);
@ -316,9 +311,6 @@ void ApplicationManager1Service::scanInstances() noexcept
QList<SystemdUnitDBusMessage> units;
v.value<QDBusArgument>() >> units;
for (const auto &unit : units) {
if (!isApplication(unit.objectPath)) {
continue;
}
if (unit.subState == "running") {
this->addInstanceToApplication(unit.name, unit.objectPath);
}
@ -567,10 +559,16 @@ QString ApplicationManager1Service::Identify(const QDBusUnixFileDescriptor &pidf
return {};
}
auto instancePath = (*app)->findInstance(ret.InstanceId);
if (auto path = instancePath.path(); path.isEmpty()) {
sendErrorReply(QDBusError::Failed, "can't find instance:" % path);
QDBusObjectPath instancePath;
const auto &instances = (*app)->instances();
if (ret.InstanceId.isEmpty() && instances.size() == 1) {
// Maybe a dbus systemd service
instancePath = instances.constFirst();
} else {
instancePath = (*app)->findInstance(ret.InstanceId);
}
if (instancePath.path().isEmpty()) {
sendErrorReply(QDBusError::Failed, "can't find instance:" % ret.InstanceId);
return {};
}