feat: support persistent stroage and lastLaunchedTime
Signed-off-by: ComixHe <heyuming@deepin.org>
This commit is contained in:
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user