diff --git a/dbus/org.desktopspec.ApplicationManager.xml b/dbus/org.desktopspec.ApplicationManager.xml index 999bf6d..73fb1f9 100644 --- a/dbus/org.desktopspec.ApplicationManager.xml +++ b/dbus/org.desktopspec.ApplicationManager.xml @@ -1,50 +1,34 @@ - - - - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - diff --git a/src/modules/startmanager/startmanager.cpp b/src/modules/startmanager/startmanager.cpp index 72272b5..4f73e37 100644 --- a/src/modules/startmanager/startmanager.cpp +++ b/src/modules/startmanager/startmanager.cpp @@ -95,16 +95,6 @@ QStringList StartManager::autostartList() return autostartFiles; } -QString StartManager::dumpMemRecord() -{ - -} - -QString StartManager::getApps() -{ - -} - /** * @brief StartManager::isAutostart * @param fileName desktopFile @@ -133,6 +123,11 @@ bool StartManager::isMemSufficient() return SETTING->getMemCheckerEnabled() ? MemInfo::isSufficient(minMemAvail, maxSwapUsed) : true; } +void StartManager::launchApp(const QString &desktopFile) +{ + doLaunchAppWithOptions(desktopFile); +} + void StartManager::launchApp(QString desktopFile, uint32_t timestamp, QStringList files) { doLaunchAppWithOptions(desktopFile, timestamp, files, QMap()); @@ -183,11 +178,6 @@ void StartManager::runCommandWithOptions(QString exe, QStringList args, QMapmarkLaunched(desktopFile); + + return true; +} + bool StartManager::doLaunchAppWithOptions(QString desktopFile, uint32_t timestamp, QStringList files, QMap options) { // launchApp @@ -359,9 +362,23 @@ bool StartManager::launch(DesktopInfo *info, QString cmdLine, uint32_t timestamp QString exec = exeArgs[0]; exeArgs.removeAt(0); +#ifdef QT_DEBUG qDebug() << "launchApp: " << desktopFile << " exec: " << exec << " args: " << exeArgs; +#endif + process.setWorkingDirectory(workingDir.c_str()); process.setEnvironment(envs); + + if (desktopFile.contains("/persistent/linglong")) { + exeArgs.clear(); + +#ifdef QT_DEBUG + qDebug() << "exeArgs:" << cmdLine.section(" ", 1, 2); +#endif + + exeArgs.append(cmdLine.section(" ", 1, 2).split(" ")); + } + return process.startDetached(exec, exeArgs); } diff --git a/src/modules/startmanager/startmanager.h b/src/modules/startmanager/startmanager.h index 1a79408..52138a2 100644 --- a/src/modules/startmanager/startmanager.h +++ b/src/modules/startmanager/startmanager.h @@ -41,16 +41,14 @@ public: bool addAutostart(QString fileName); bool removeAutostart(QString fileName); QStringList autostartList(); - QString dumpMemRecord(); - QString getApps(); bool isAutostart(QString fileName); bool isMemSufficient(); + void launchApp(const QString &desktopFile); void launchApp(QString desktopFile, uint32_t timestamp, QStringList files); void launchAppAction(QString desktopFile, QString actionSection, uint32_t timestamp); void launchAppWithOptions(QString desktopFile, uint32_t timestamp, QStringList files, QMap options); void runCommand(QString exe, QStringList args); void runCommandWithOptions(QString exe, QStringList args, QMap options); - void tryAgain(bool launch); Q_SIGNALS: void autostartChanged(QString status, QString fileName); @@ -60,6 +58,7 @@ public Q_SLOTS: private: bool setAutostart(QString fileName, bool value); + bool doLaunchAppWithOptions(const QString &desktopFile); bool doLaunchAppWithOptions(QString desktopFile, uint32_t timestamp, QStringList files, QMap options); bool launch(DesktopInfo *info, QString cmdLine, uint32_t timestamp, QStringList files); bool doRunCommandWithOptions(QString exe, QStringList args, QMap options); diff --git a/src/service/impl/application_manager.cpp b/src/service/impl/application_manager.cpp index 8c4aa7c..79a05eb 100644 --- a/src/service/impl/application_manager.cpp +++ b/src/service/impl/application_manager.cpp @@ -246,41 +246,6 @@ QList ApplicationManager::GetInstances(const QString& id) return {}; } -/** - * @brief ApplicationManager::Launch 启动应用 - * @param id QString("/%1/%2/%3").arg(Apptype).arg(d->m_type == Application::Type::System ? "system" : "user").arg(appId) - * @param files 应用打开的文件 - * @return - */ -QDBusObjectPath ApplicationManager::Launch(const QString& id, QStringList files) -{ - qInfo() << "Launch " << id; - Q_D(ApplicationManager); - if (!d->checkDMsgUid()) - return {}; - - // 创建一个实例 - for (const QSharedPointer& app : d->applications) { - QString appId = app->id(); - if (app->id() == id) { - // 创建任务所需的数据,并记录到任务队列,等待 loader 消耗 - QSharedPointer instance{app->createInstance(files)}; - const std::string hash{instance->hash().toStdString()}; - connect(instance.get(), &ApplicationInstance::taskFinished, this, [ = ] { - for (auto it = d->tasks.begin(); it != d->tasks.end(); ++it){ - if (it->first == hash) { - d->tasks.erase(it); - break; - } - } - }); - d->tasks.insert(std::make_pair(hash, instance)); - return instance->path(); - } - } - return {}; -} - bool ApplicationManager::AddAutostart(QString fileName) { Q_D(ApplicationManager); @@ -308,15 +273,6 @@ QStringList ApplicationManager::AutostartList() return d->startManager->autostartList(); } -QString ApplicationManager::DumpMemRecord() -{ - Q_D(ApplicationManager); - if (!d->checkDMsgUid()) - return ""; - - return d->startManager->dumpMemRecord(); -} - bool ApplicationManager::IsAutostart(QString fileName) { Q_D(ApplicationManager); @@ -326,16 +282,17 @@ bool ApplicationManager::IsAutostart(QString fileName) return d->startManager->isAutostart(fileName); } -bool ApplicationManager::IsMemSufficient() +void ApplicationManager::Launch(const QString &desktopFile) { Q_D(ApplicationManager); if (!d->checkDMsgUid()) - return false; + return; - return d->startManager->isMemSufficient(); + d->startManager->launchApp(desktopFile); } -void ApplicationManager::LaunchApp(QString desktopFile, uint32_t timestamp, QStringList files) + +void ApplicationManager::LaunchApp(const QString &desktopFile, uint32_t timestamp, const QStringList &files) { Q_D(ApplicationManager); if (!d->checkDMsgUid()) @@ -362,15 +319,6 @@ void ApplicationManager::LaunchAppWithOptions(QString desktopFile, uint32_t time d->startManager->launchAppWithOptions(desktopFile, timestamp, files, options); } -void ApplicationManager::RunCommand(QString exe, QStringList args) -{ - Q_D(ApplicationManager); - if (!d->checkDMsgUid()) - return; - - d->startManager->runCommand(exe, args); -} - void ApplicationManager::RunCommandWithOptions(QString exe, QStringList args, QMap options) { Q_D(ApplicationManager); @@ -380,15 +328,6 @@ void ApplicationManager::RunCommandWithOptions(QString exe, QStringList args, QM d->startManager->runCommandWithOptions(exe, args, options); } -void ApplicationManager::TryAgain(bool launch) -{ - Q_D(ApplicationManager); - if (!d->checkDMsgUid()) - return; - - d->startManager->tryAgain(launch); -} - QList ApplicationManager::instances() const { Q_D(const ApplicationManager); @@ -414,28 +353,6 @@ QList ApplicationManager::list() const return result; } -// 如果app manager拥有全部进程信息,可以在app manger里面获取 -bool ApplicationManager::IsPidVirtualMachine(uint32_t pid) -{ - Q_D(const ApplicationManager); - char buff[256]; - ssize_t nbytes = readlink(QString("/proc/%1/exe").arg(pid).toStdString().c_str(), buff, 256); - if (nbytes == -1) { - return false; - } - std::string execPath(buff); - - for (auto iter : d->virtualMachines) { - std::string::size_type idx = iter.find(execPath); - - if (idx != std::string::npos) { - return true; - } - } - - return false; -} - bool ApplicationManager::IsProcessExist(uint32_t pid) { Q_D(const ApplicationManager); diff --git a/src/service/impl/application_manager.h b/src/service/impl/application_manager.h index bb60a47..fa75291 100644 --- a/src/service/impl/application_manager.h +++ b/src/service/impl/application_manager.h @@ -66,19 +66,14 @@ public: Q_SIGNALS: void AutostartChanged(QString status, QString filePath); -public Q_SLOTS: // METHODS - //bool Launch(QString desktopFile); deprecated +public Q_SLOTS: bool AddAutostart(QString fileName); QStringList AutostartList(); - QString DumpMemRecord(); bool IsAutostart(QString fileName); - bool IsMemSufficient(); - QDBusObjectPath Launch(const QString &id, QStringList files); bool RemoveAutostart(QString fileName); - bool IsPidVirtualMachine(uint32_t pid); + void Launch(const QString &desktopFile); + void LaunchApp(const QString &desktopFile, uint32_t timestamp, const QStringList &files); void LaunchAppAction(QString desktopFile, QString action, uint32_t timestamp); - void RunCommand(QString exe, QStringList args); - void TryAgain(bool launch); protected: ApplicationManager(QObject *parent = nullptr); @@ -88,11 +83,7 @@ protected: QList list() const; QDBusObjectPath GetInformation(const QString &id); QList GetInstances(const QString &id); - // com.deepin.StartManager - //QString GetApps(); - void LaunchApp(QString desktopFile, uint32_t timestamp, QStringList files); void LaunchAppWithOptions(QString desktopFile, uint32_t timestamp, QStringList files, QMap options); - //bool LaunchWithTimestamp(QString desktopFile, uint32_t timestamp); deprecated void RunCommandWithOptions(QString exe, QStringList args, QMap options); bool IsProcessExist(uint32_t pid); }; diff --git a/src/service/main.cpp b/src/service/main.cpp index a272236..8b4f6d9 100644 --- a/src/service/main.cpp +++ b/src/service/main.cpp @@ -18,6 +18,10 @@ DCORE_USE_NAMESPACE +#define ApplicationManagerServiceName "org.desktopspec.ApplicationManager" +#define ApplicationManagerServicePath "/org/desktopspec/ApplicationManager" +#define ApplicationManagerInterface "org.desktopspec.ApplicationManager" + QFileInfoList scan(const QString &path) { QDir dir(path); @@ -83,16 +87,31 @@ int main(int argc, char *argv[]) new DockManager(ApplicationManager::instance()); new ApplicationManagerAdaptor(ApplicationManager::instance()); - QDBusConnection::sessionBus().registerService("org.desktopspec.Application"); - QDBusConnection::sessionBus().registerService("org.desktopspec.ApplicationManager"); - QDBusConnection::sessionBus().registerObject("/org/desktopspec/ApplicationManager", "org.desktopspec.ApplicationManager", ApplicationManager::instance()); + QDBusConnection connection = QDBusConnection::sessionBus(); + if (!connection.registerService("org.desktopspec.Application")) { + qWarning() << "error: " << connection.lastError().message(); + return -1; + } + + if (!connection.registerService(ApplicationManagerServiceName)) { + qWarning() << "error: " << connection.lastError().message(); + return -1; + } + + if (!connection.registerObject(ApplicationManagerServicePath, ApplicationManagerInterface, ApplicationManager::instance())) { + qWarning() << "error: " << connection.lastError().message(); + return -1; + } QList> apps{ scanFiles() }; QList> appAdapters; for (const QSharedPointer app : apps) { QSharedPointer adapter = QSharedPointer(new ApplicationAdaptor(app.get())); appAdapters << adapter; - QDBusConnection::sessionBus().registerObject(app->path().path(), "org.desktopspec.Application", app.get()); + if (!connection.registerObject(app->path().path(), "org.desktopspec.Application", app.get())) { + qWarning() << "error: " << connection.lastError().message(); + continue; + } } ApplicationManager::instance()->addApplication(apps); @@ -102,8 +121,15 @@ int main(int argc, char *argv[]) MimeApp* mimeApp = new MimeApp; new MimeAdaptor(mimeApp); - QDBusConnection::sessionBus().registerService("org.deepin.daemon.Mime1"); - QDBusConnection::sessionBus().registerObject("/org/deepin/daemon/Mime1", "org.deepin.daemon.Mime1", mimeApp); + if (!connection.registerService("org.deepin.daemon.Mime1")) { + qWarning() << "error: " << connection.lastError().message(); + return -1; + } + + if (!connection.registerObject("/org/deepin/daemon/Mime1", "org.deepin.daemon.Mime1", mimeApp)) { + qWarning() << "error: " << connection.lastError().message(); + return -1; + } return app.exec(); }