feat: support persistent stroage and lastLaunchedTime

Signed-off-by: ComixHe <heyuming@deepin.org>
This commit is contained in:
ComixHe
2023-09-13 11:47:04 +08:00
committed by Comix
parent 7b527c609b
commit 23dcd13f10
10 changed files with 335 additions and 22 deletions

View File

@ -13,8 +13,11 @@
ApplicationManager1Service::~ApplicationManager1Service() = default;
ApplicationManager1Service::ApplicationManager1Service(std::unique_ptr<Identifier> ptr, QDBusConnection &connection) noexcept
ApplicationManager1Service::ApplicationManager1Service(std::unique_ptr<Identifier> ptr,
QDBusConnection &connection,
std::weak_ptr<ApplicationManager1Storage> storage) noexcept
: m_identifier(std::move(ptr))
, m_storage(std::move(storage))
{
if (!connection.registerService(DDEApplicationManager1ServiceName)) {
qFatal("%s", connection.lastError().message().toLocal8Bit().data());
@ -116,6 +119,17 @@ void ApplicationManager1Service::addInstanceToApplication(const QString &unitNam
return;
}
if (sender() != nullptr) { // activate by signal
auto timestamp = QDateTime::currentMSecsSinceEpoch();
if (auto ptr = m_storage.lock(); ptr) {
ptr->updateApplicationValue((*appIt)->m_desktopSource.desktopId(),
ApplicationPropertiesGroup,
LastLaunchedTime,
QVariant::fromValue(timestamp));
}
}
const auto &applicationPath = (*appIt)->applicationPath().path();
if (!(*appIt)->addOneInstance(instanceId, applicationPath, systemdUnitPath.path())) [[likely]] {
@ -229,7 +243,7 @@ QList<QDBusObjectPath> ApplicationManager1Service::list() const
bool ApplicationManager1Service::addApplication(DesktopFile desktopFileSource) noexcept
{
QSharedPointer<ApplicationService> application =
ApplicationService::createApplicationService(std::move(desktopFileSource), this);
ApplicationService::createApplicationService(std::move(desktopFileSource), this, m_storage);
if (!application) {
return false;
}
@ -251,6 +265,18 @@ bool ApplicationManager1Service::addApplication(DesktopFile desktopFileSource) n
return false;
}
m_applicationList.insert(application->applicationPath(), application);
if (auto storagePtr = m_storage.lock(); storagePtr) {
auto appId = ptr->id();
auto value = storagePtr->readApplicationValue(appId, ApplicationPropertiesGroup, LastLaunchedTime);
if (value.isNull()) {
storagePtr->createApplicationValue(
appId, ApplicationPropertiesGroup, LastLaunchedTime, QVariant::fromValue<qint64>(0));
} else {
ptr->m_lastLaunch = value.toInt();
}
}
emit listChanged();
emit InterfacesAdded(application->applicationPath(), getChildInterfacesAndPropertiesFromObject(ptr));
@ -261,8 +287,12 @@ void ApplicationManager1Service::removeOneApplication(const QDBusObjectPath &app
{
if (auto it = m_applicationList.find(application); it != m_applicationList.cend()) {
emit InterfacesRemoved(application, getChildInterfacesFromObject(it->data()));
if (auto ptr = m_storage.lock(); ptr) {
ptr->deleteApplicationValue((*it)->id());
}
unregisterObjectFromDBus(application.path());
m_applicationList.remove(application);
emit listChanged();
}
}

View File

@ -12,6 +12,7 @@
#include <QScopedPointer>
#include <memory>
#include <QMap>
#include "applicationmanagerstorage.h"
#include "dbus/jobmanager1service.h"
#include "desktopentry.h"
#include "identifier.h"
@ -22,7 +23,9 @@ class ApplicationManager1Service final : public QObject
{
Q_OBJECT
public:
explicit ApplicationManager1Service(std::unique_ptr<Identifier> ptr, QDBusConnection &connection) noexcept;
explicit ApplicationManager1Service(std::unique_ptr<Identifier> ptr,
QDBusConnection &connection,
std::weak_ptr<ApplicationManager1Storage> storage) noexcept;
~ApplicationManager1Service() override;
ApplicationManager1Service(const ApplicationManager1Service &) = delete;
ApplicationManager1Service(ApplicationManager1Service &&) = delete;
@ -52,6 +55,7 @@ Q_SIGNALS:
private:
std::unique_ptr<Identifier> m_identifier;
std::weak_ptr<ApplicationManager1Storage> m_storage;
QScopedPointer<JobManager1Service> m_jobManager{nullptr};
QMap<QDBusObjectPath, QSharedPointer<ApplicationService>> m_applicationList;

View File

@ -6,6 +6,7 @@
#include "APPobjectmanager1adaptor.h"
#include "applicationchecker.h"
#include "applicationmanager1service.h"
#include "applicationmanagerstorage.h"
#include "propertiesForwarder.h"
#include "dbus/instanceadaptor.h"
#include "launchoptions.h"
@ -18,10 +19,14 @@
#include <QStandardPaths>
#include <algorithm>
#include <new>
#include <utility>
#include <wordexp.h>
ApplicationService::ApplicationService(DesktopFile source, ApplicationManager1Service *parent)
ApplicationService::ApplicationService(DesktopFile source,
ApplicationManager1Service *parent,
std::weak_ptr<ApplicationManager1Storage> storage)
: QObject(parent)
, m_storage(std::move(storage))
, m_desktopSource(std::move(source))
{
}
@ -36,10 +41,10 @@ ApplicationService::~ApplicationService()
}
}
QSharedPointer<ApplicationService> ApplicationService::createApplicationService(DesktopFile source,
ApplicationManager1Service *parent) noexcept
QSharedPointer<ApplicationService> ApplicationService::createApplicationService(
DesktopFile source, ApplicationManager1Service *parent, std::weak_ptr<ApplicationManager1Storage> storage) noexcept
{
QSharedPointer<ApplicationService> app{new (std::nothrow) ApplicationService{std::move(source), parent}};
QSharedPointer<ApplicationService> app{new (std::nothrow) ApplicationService{std::move(source), parent, std::move(storage)}};
if (!app) {
qCritical() << "new application service failed.";
return nullptr;
@ -90,6 +95,12 @@ QSharedPointer<ApplicationService> ApplicationService::createApplicationService(
return nullptr;
}
auto ptr = app->m_storage.lock();
if (!ptr) {
qWarning() << "runtime storage doesn't exists.";
return app;
}
return app;
}
@ -176,7 +187,7 @@ QDBusObjectPath ApplicationService::Launch(const QString &action, const QStringL
auto &jobManager = static_cast<ApplicationManager1Service *>(parent())->jobManager();
return jobManager.addJob(
m_applicationPath.path(),
[this, binary = std::move(bin), commands = std::move(cmds)](QVariant variantValue) mutable -> QVariant {
[this, binary = std::move(bin), commands = std::move(cmds)](const QVariant &variantValue) mutable -> QVariant {
auto resourceFile = variantValue.toString();
auto instanceRandomUUID = QUuid::createUuid().toString(QUuid::Id128);
auto objectPath = m_applicationPath.path() + "/" + instanceRandomUUID;

View File

@ -17,6 +17,7 @@
#include <QFile>
#include <memory>
#include <utility>
#include "applicationmanagerstorage.h"
#include "dbus/instanceservice.h"
#include "global.h"
#include "desktopentry.h"
@ -110,10 +111,13 @@ Q_SIGNALS:
private:
friend class ApplicationManager1Service;
explicit ApplicationService(DesktopFile source, ApplicationManager1Service *parent);
static QSharedPointer<ApplicationService> createApplicationService(DesktopFile source,
ApplicationManager1Service *parent) noexcept;
qlonglong m_lastLaunch{0};
explicit ApplicationService(DesktopFile source,
ApplicationManager1Service *parent,
std::weak_ptr<ApplicationManager1Storage> storage);
static QSharedPointer<ApplicationService> createApplicationService(
DesktopFile source, ApplicationManager1Service *parent, std::weak_ptr<ApplicationManager1Storage> storage) noexcept;
qint64 m_lastLaunch{0};
std::weak_ptr<ApplicationManager1Storage> m_storage;
QDBusObjectPath m_applicationPath;
QString m_launcher{getApplicationLauncherBinary()};
DesktopFile m_desktopSource;