refact: DesktopFile's method and structure
Signed-off-by: ComixHe <heyuming@deepin.org>
This commit is contained in:
@ -1,8 +1,9 @@
|
||||
// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
|
||||
#include "applicationadaptor.h"
|
||||
#include "dbus/applicationmanager1adaptor.h"
|
||||
#include "applicationservice.h"
|
||||
#include "dbus/AMobjectmanager1adaptor.h"
|
||||
#include "systemdsignaldispatcher.h"
|
||||
#include <QFile>
|
||||
@ -10,17 +11,20 @@
|
||||
|
||||
ApplicationManager1Service::~ApplicationManager1Service() = default;
|
||||
|
||||
ApplicationManager1Service::ApplicationManager1Service(std::unique_ptr<Identifier> ptr, QDBusConnection &connection)
|
||||
ApplicationManager1Service::ApplicationManager1Service(std::unique_ptr<Identifier> ptr, QDBusConnection &connection) noexcept
|
||||
: m_identifier(std::move(ptr))
|
||||
{
|
||||
if (!connection.registerService(DDEApplicationManager1ServiceName)) {
|
||||
qFatal() << connection.lastError();
|
||||
qFatal("%s", connection.lastError().message().toLocal8Bit().data());
|
||||
}
|
||||
|
||||
new ApplicationManager1Adaptor{this};
|
||||
auto *tmp = new AMObjectManagerAdaptor{this};
|
||||
if (auto *tmp = new (std::nothrow) ApplicationManager1Adaptor{this}; tmp == nullptr) {
|
||||
qCritical() << "new Application Manager Adaptor failed.";
|
||||
std::terminate();
|
||||
}
|
||||
|
||||
if (tmp == nullptr) {
|
||||
if (auto *tmp = new (std::nothrow) AMObjectManagerAdaptor{this}; tmp == nullptr) {
|
||||
qCritical() << "new Object Manager of Application Manager Adaptor failed.";
|
||||
std::terminate();
|
||||
}
|
||||
|
||||
@ -29,7 +33,12 @@ ApplicationManager1Service::ApplicationManager1Service(std::unique_ptr<Identifie
|
||||
std::terminate();
|
||||
}
|
||||
|
||||
m_jobManager.reset(new JobManager1Service(this));
|
||||
m_jobManager.reset(new (std::nothrow) JobManager1Service(this));
|
||||
|
||||
if (!m_jobManager) {
|
||||
qCritical() << "new JobManager failed.";
|
||||
std::terminate();
|
||||
}
|
||||
|
||||
auto &dispatcher = SystemdSignalDispatcher::instance();
|
||||
|
||||
@ -109,11 +118,8 @@ bool ApplicationManager1Service::addApplication(DesktopFile desktopFileSource) n
|
||||
}
|
||||
|
||||
if (m_applicationList.constFind(application->applicationPath()) != m_applicationList.cend()) {
|
||||
auto info = qInfo();
|
||||
info << "this application already exists.";
|
||||
if (application->desktopFileSource().persistence()) {
|
||||
info << "desktop source:" << application->desktopFileSource().fileSource();
|
||||
}
|
||||
qInfo() << "this application already exists."
|
||||
<< "desktop source:" << application->desktopFileSource().sourcePath();
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -209,16 +215,9 @@ void ApplicationManager1Service::updateApplication(const QSharedPointer<Applicat
|
||||
return;
|
||||
}
|
||||
|
||||
struct stat buf;
|
||||
const auto *filePath = desktopFile.fileSource().toLocal8Bit().data();
|
||||
if (auto ret = stat(filePath, &buf); ret == -1) {
|
||||
qWarning() << "get file" << filePath << "state failed:" << std::strerror(errno);
|
||||
return;
|
||||
}
|
||||
auto mtime = getFileModifiedTime(desktopFile.sourceFileRef());
|
||||
|
||||
constexpr std::size_t secToNano = 1e9;
|
||||
|
||||
if (destApp->desktopFileSource().modified(buf.st_mtim.tv_sec * secToNano + buf.st_mtim.tv_nsec)) {
|
||||
if (destApp->desktopFileSource().modified(mtime)) {
|
||||
auto *newEntry = new (std::nothrow) DesktopEntry{};
|
||||
if (newEntry == nullptr) {
|
||||
qCritical() << "new DesktopEntry failed.";
|
||||
|
@ -13,15 +13,16 @@
|
||||
#include <memory>
|
||||
#include <QMap>
|
||||
#include "dbus/jobmanager1service.h"
|
||||
#include "dbus/APPobjectmanager1adaptor.h"
|
||||
#include "dbus/applicationadaptor.h"
|
||||
#include "desktopentry.h"
|
||||
#include "identifier.h"
|
||||
|
||||
class ApplicationService;
|
||||
|
||||
class ApplicationManager1Service final : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit ApplicationManager1Service(std::unique_ptr<Identifier> ptr, QDBusConnection &connection);
|
||||
explicit ApplicationManager1Service(std::unique_ptr<Identifier> ptr, QDBusConnection &connection) noexcept;
|
||||
~ApplicationManager1Service() override;
|
||||
ApplicationManager1Service(const ApplicationManager1Service &) = delete;
|
||||
ApplicationManager1Service(ApplicationManager1Service &&) = delete;
|
||||
|
@ -3,6 +3,7 @@
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
|
||||
#include "dbus/applicationservice.h"
|
||||
#include "APPobjectmanager1adaptor.h"
|
||||
#include "applicationmanager1service.h"
|
||||
#include "dbus/instanceadaptor.h"
|
||||
#include "pwd.h"
|
||||
@ -34,28 +35,24 @@ ApplicationService::~ApplicationService()
|
||||
QSharedPointer<ApplicationService> ApplicationService::createApplicationService(DesktopFile source,
|
||||
ApplicationManager1Service *parent) noexcept
|
||||
{
|
||||
QSharedPointer<ApplicationService> app{new (std::nothrow) ApplicationService{std::move(source), parent}};
|
||||
if (!app) {
|
||||
qCritical() << "new application service failed.";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
QString objectPath;
|
||||
QTextStream sourceStream;
|
||||
QFile sourceFile;
|
||||
QString tempSource;
|
||||
QSharedPointer<ApplicationService> app{nullptr};
|
||||
|
||||
if (source.persistence()) {
|
||||
objectPath = QString{DDEApplicationManager1ObjectPath} + "/" + escapeToObjectPath(source.desktopId());
|
||||
sourceFile.setFileName(source.fileSource());
|
||||
if (!sourceFile.open(QFile::ExistingOnly | QFile::ReadOnly | QFile::Text)) {
|
||||
qCritical() << "desktop file can't open:" << source.fileSource() << sourceFile.errorString();
|
||||
return nullptr;
|
||||
}
|
||||
auto appId = app->desktopFileSource().desktopId();
|
||||
|
||||
app.reset(new (std::nothrow) ApplicationService{std::move(source), parent});
|
||||
sourceStream.setDevice(&sourceFile);
|
||||
if (!appId.isEmpty()) {
|
||||
objectPath = QString{DDEApplicationManager1ObjectPath} + "/" + escapeToObjectPath(appId);
|
||||
} else {
|
||||
tempSource = source.fileSource();
|
||||
objectPath = QString{DDEApplicationManager1ObjectPath} + "/" + QUuid::createUuid().toString(QUuid::Id128);
|
||||
app.reset(new (std::nothrow) ApplicationService{std::move(source), parent});
|
||||
sourceStream.setString(&tempSource, QTextStream::ReadOnly | QTextStream::Text);
|
||||
}
|
||||
|
||||
sourceStream.setDevice(app->desktopFileSource().sourceFile());
|
||||
std::unique_ptr<DesktopEntry> entry{std::make_unique<DesktopEntry>()};
|
||||
auto error = entry->parse(sourceStream);
|
||||
|
||||
@ -76,7 +73,11 @@ QSharedPointer<ApplicationService> ApplicationService::createApplicationService(
|
||||
app->m_applicationPath = QDBusObjectPath{std::move(objectPath)};
|
||||
|
||||
// TODO: icon lookup
|
||||
new (std::nothrow) APPObjectManagerAdaptor{app.data()};
|
||||
if (auto *ptr = new (std::nothrow) APPObjectManagerAdaptor{app.data()}; ptr == nullptr) {
|
||||
qCritical() << "new Object Manager of Application failed.";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return app;
|
||||
}
|
||||
|
||||
@ -252,10 +253,7 @@ QDBusObjectPath ApplicationService::Launch(const QString &action, const QStringL
|
||||
auto resourceFile = variantValue.toString();
|
||||
auto instanceRandomUUID = QUuid::createUuid().toString(QUuid::Id128);
|
||||
auto objectPath = m_applicationPath.path() + "/" + instanceRandomUUID;
|
||||
|
||||
if (m_desktopSource.persistence()) {
|
||||
commands.push_front(QString{"--SourcePath=%1"}.arg(m_desktopSource.fileSource()));
|
||||
}
|
||||
commands.push_front(QString{"--SourcePath=%1"}.arg(m_desktopSource.sourcePath()));
|
||||
|
||||
if (resourceFile.isEmpty()) {
|
||||
commands.push_front(QString{R"(--unitName=app-DDE-%1@%2.service)"}.arg(
|
||||
@ -303,7 +301,7 @@ QDBusObjectPath ApplicationService::Launch(const QString &action, const QStringL
|
||||
QStringList ApplicationService::actions() const noexcept
|
||||
{
|
||||
if (m_entry.isNull()) {
|
||||
qWarning() << "desktop entry is empty, isPersistence:" << m_desktopSource.persistence();
|
||||
qWarning() << "desktop entry is empty, source file:" << m_desktopSource.sourcePath();
|
||||
return {};
|
||||
}
|
||||
|
||||
@ -332,10 +330,7 @@ ObjectMap ApplicationService::GetManagedObjects() const
|
||||
|
||||
QString ApplicationService::id() const noexcept
|
||||
{
|
||||
if (m_desktopSource.persistence()) {
|
||||
return m_desktopSource.desktopId();
|
||||
}
|
||||
return {};
|
||||
return m_desktopSource.desktopId();
|
||||
}
|
||||
|
||||
IconMap ApplicationService::icons() const
|
||||
|
@ -59,7 +59,7 @@ public:
|
||||
void removeOneInstance(const QDBusObjectPath &instance) noexcept;
|
||||
void removeAllInstance() noexcept;
|
||||
[[nodiscard]] const QDBusObjectPath &applicationPath() const noexcept { return m_applicationPath; }
|
||||
[[nodiscard]] const DesktopFile &desktopFileSource() const noexcept { return m_desktopSource; }
|
||||
[[nodiscard]] DesktopFile &desktopFileSource() noexcept { return m_desktopSource; }
|
||||
[[nodiscard]] const QMap<QDBusObjectPath, QSharedPointer<InstanceService>> &applicationInstances() const noexcept
|
||||
{
|
||||
return m_Instances;
|
||||
|
Reference in New Issue
Block a user