|
52 | 52 |
|
53 | 53 | #include <QDBusInterface> |
54 | 54 | #include <QDBusReply> |
| 55 | +#include <QDBusUnixFileDescriptor> |
55 | 56 | #include <QEventLoop> |
56 | 57 | #include <QFileInfo> |
57 | 58 | #include <QProcess> |
@@ -463,43 +464,41 @@ utils::error::Result<api::dbus::v1::PackageManager *> Cli::getPkgMan() |
463 | 464 | return this->pkgMan.get(); |
464 | 465 | } |
465 | 466 |
|
| 467 | + QString service; |
| 468 | + QDBusConnection pkgManConn{ "ll-package-manager" }; |
| 469 | + |
466 | 470 | if (this->peerMode) { |
467 | 471 | LogW("some subcommands will failed in --no-dbus mode."); |
468 | 472 | const auto pkgManAddress = QString("unix:path=/tmp/linglong-package-manager.socket"); |
469 | 473 |
|
470 | | - const auto &pkgManConn = |
471 | | - QDBusConnection::connectToPeer(pkgManAddress, "ll-package-manager"); |
| 474 | + pkgManConn = QDBusConnection::connectToPeer(pkgManAddress, "ll-package-manager"); |
472 | 475 | if (!pkgManConn.isConnected()) { |
473 | 476 | return LINGLONG_ERR(fmt::format("Failed to connect to ll-package-manager: {}", |
474 | 477 | pkgManConn.lastError().message().toStdString())); |
475 | 478 | } |
476 | | - |
477 | | - this->pkgMan = |
478 | | - std::make_unique<api::dbus::v1::PackageManager>("", |
479 | | - "/org/deepin/linglong/PackageManager1", |
480 | | - pkgManConn, |
481 | | - QCoreApplication::instance()); |
482 | 479 | } else { |
483 | | - const auto &pkgManConn = QDBusConnection::systemBus(); |
484 | | - |
485 | | - auto peer = linglong::api::dbus::v1::DBusPeer("org.deepin.linglong.PackageManager1", |
486 | | - "/org/deepin/linglong/PackageManager1", |
487 | | - pkgManConn); |
488 | | - auto reply = peer.Ping(); |
489 | | - reply.waitForFinished(); |
490 | | - if (!reply.isValid()) { |
491 | | - return LINGLONG_ERR( |
492 | | - fmt::format("Failed to activate org.deepin.linglong.PackageManager1: {}", |
493 | | - reply.error().message().toStdString())); |
494 | | - } |
| 480 | + service = "org.deepin.linglong.PackageManager1"; |
| 481 | + pkgManConn = QDBusConnection::systemBus(); |
| 482 | + } |
495 | 483 |
|
496 | | - this->pkgMan = |
497 | | - std::make_unique<api::dbus::v1::PackageManager>("org.deepin.linglong.PackageManager1", |
498 | | - "/org/deepin/linglong/PackageManager1", |
499 | | - pkgManConn, |
500 | | - QCoreApplication::instance()); |
| 484 | + auto peer = linglong::api::dbus::v1::DBusPeer(service, |
| 485 | + "/org/deepin/linglong/PackageManager1", |
| 486 | + pkgManConn); |
| 487 | + auto reply = peer.Ping(); |
| 488 | + reply.waitForFinished(); |
| 489 | + if (!reply.isValid()) { |
| 490 | + const auto message = this->peerMode |
| 491 | + ? "Failed to initialize peer connection: {}" |
| 492 | + : "Failed to activate org.deepin.linglong.PackageManager1: {}"; |
| 493 | + return LINGLONG_ERR(fmt::format(message, reply.error().message().toStdString())); |
501 | 494 | } |
502 | 495 |
|
| 496 | + this->pkgMan = |
| 497 | + std::make_unique<api::dbus::v1::PackageManager>(service, |
| 498 | + "/org/deepin/linglong/PackageManager1", |
| 499 | + pkgManConn, |
| 500 | + QCoreApplication::instance()); |
| 501 | + |
503 | 502 | auto ret = this->initPkgManSignals(); |
504 | 503 | if (!ret) { |
505 | 504 | this->pkgMan.reset(); |
@@ -1131,6 +1130,12 @@ int Cli::installFromFile(const QFileInfo &fileInfo, |
1131 | 1130 | return -1; |
1132 | 1131 | } |
1133 | 1132 |
|
| 1133 | + auto caps = (*pkgMan)->connection().connectionCapabilities(); |
| 1134 | + if (!(caps & QDBusConnection::UnixFileDescriptorPassing)) { |
| 1135 | + this->printer.printErr(LINGLONG_ERRV("peer connection does not support Unix FD passing")); |
| 1136 | + return -1; |
| 1137 | + } |
| 1138 | + |
1134 | 1139 | auto pendingReply = (*pkgMan)->InstallFromFile(dbusFileDescriptor, |
1135 | 1140 | fileInfo.suffix(), |
1136 | 1141 | common::serialize::toQVariantMap(commonOptions)); |
|
0 commit comments