diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index dbd2beaa..b8cb15a7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -135,3 +135,11 @@ install(DIRECTORY assets/deepin-compressor DESTINATION ${CMAKE_INSTALL_DATADIR}/ # 支持压缩的格式 #install(FILES conf/compressor-singlecompress.conf DESTINATION ${CMAKE_INSTALL_DATADIR}/deepin-compressor/compressedformat/) + +# Install DBus service file +install(FILES ${CMAKE_CURRENT_LIST_DIR}/com.deepin.Compressor.service + DESTINATION ${CMAKE_INSTALL_DATADIR}/dbus-1/services/) + +# Install DBus interface XML file +install(FILES ${CMAKE_CURRENT_LIST_DIR}/com.deepin.Compressor.xml + DESTINATION ${CMAKE_INSTALL_DATADIR}/dbus-1/interfaces/) diff --git a/src/com.deepin.Compressor.service b/src/com.deepin.Compressor.service new file mode 100644 index 00000000..29ac2b4a --- /dev/null +++ b/src/com.deepin.Compressor.service @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=com.deepin.Compressor +Exec=/usr/bin/deepin-compressor diff --git a/src/com.deepin.Compressor.xml b/src/com.deepin.Compressor.xml new file mode 100644 index 00000000..8392787b --- /dev/null +++ b/src/com.deepin.Compressor.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main.cpp b/src/main.cpp index 0982cc5b..06412911 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -217,30 +217,31 @@ int main(int argc, char *argv[]) showWatermark(sJsonStr, &w); qDebug() << "Creating DBus adaptor and connecting to session bus"; - ApplicationAdaptor adaptor(&app); + ApplicationAdaptor adaptor(&w); QDBusConnection dbus = QDBusConnection::sessionBus(); if(!orderObject){ qDebug() << "Registering standard DBus service"; - if (dbus.registerService("com.deepin.compressor")) { + if (dbus.registerService("com.deepin.Compressor")) { + dbus.registerObject("/com/deepin/Compressor", &w); qDebug() << "DBus service registered successfully, moving window to center"; Dtk::Widget::moveToCenter(&w); } else { - qWarning() << "Failed to register standard DBus service"; + qWarning() << "Failed to register standard DBus service:" << dbus.lastError().message(); } } else { qDebug() << "Registering WPS-specific DBus service"; - QString serviceName = "com.deepin.compressor"+QString::number(QGuiApplication::applicationPid()); + QString serviceName = "com.deepin.Compressor"+QString::number(QGuiApplication::applicationPid()); if (dbus.registerService(serviceName)) { qDebug() << "WPS DBus service registered successfully"; - QString objectPath = "/"+QString::number(QGuiApplication::applicationPid()); - dbus.registerObject(objectPath, &app); + QString objectPath = "/com/deepin/Compressor/"+QString::number(QGuiApplication::applicationPid()); + dbus.registerObject(objectPath, &w); adaptor.setCompressFile(newfilelist.first()); Dtk::Widget::moveToCenter(&w); w.setProperty(ORDER_JSON, sJsonStr); qDebug() << "Window properties set for WPS mode"; } else { - qWarning() << "Failed to register WPS DBus service"; + qWarning() << "Failed to register WPS DBus service:" << dbus.lastError().message(); } qDebug() << "Connecting to WPS cryptfs DBus interface"; diff --git a/src/source/common/dbusadpator.cpp b/src/source/common/dbusadpator.cpp index 8cc90503..a3196117 100644 --- a/src/source/common/dbusadpator.cpp +++ b/src/source/common/dbusadpator.cpp @@ -3,24 +3,30 @@ // // SPDX-License-Identifier: GPL-3.0-or-later +#include "dbusadpator.h" +#include "mainwindow.h" +#include "archivemanager.h" + #include #include #include -#include "dbusadpator.h" #include #include #include +#include + const QString SOPENLIST = "openfiles"; -ApplicationAdaptor::ApplicationAdaptor(QApplication *application) - : QDBusAbstractAdaptor(application), app(application) +ApplicationAdaptor::ApplicationAdaptor(MainWindow *mainwindow) + : QDBusAbstractAdaptor(mainwindow), m_mainWindow(mainwindow) { qDebug() << "ApplicationAdaptor initialized"; - connect(application, SIGNAL(aboutToQuit()), SIGNAL(aboutToQuit())); - connect(application, SIGNAL(focusChanged(QWidget*, QWidget*)), - SLOT(focusChangedSlot(QWidget*, QWidget*))); } +void ApplicationAdaptor::setMainWindow(MainWindow *mainWindow) +{ + m_mainWindow = mainWindow; +} /** * @brief setCurOpenFile 设置当前的压缩包文件名 @@ -32,16 +38,18 @@ void ApplicationAdaptor::setCompressFile(const QString &sFile) m_sFile = sFile; } - -void ApplicationAdaptor::raise(const QString &sFile) +bool ApplicationAdaptor::raise(const QString &sFile) { qDebug() << "Raise window request for file:" << sFile; if(m_sFile.isEmpty() || m_sFile.isNull()) { qWarning() << "No compress file set, cannot raise window"; - return; + return false; } - if(m_curShowWidget && (m_sFile == sFile)) + if(m_curShowWidget && (m_sFile == sFile)) { m_curShowWidget->activateWindow(); + return true; + } + return false; } void ApplicationAdaptor::onActiveWindow(qint64 pid) @@ -84,5 +92,109 @@ void ApplicationAdaptor::onActiveWindow(qint64 pid) } } } +} + +// Window management methods +bool ApplicationAdaptor::showWindow() +{ + if (m_mainWindow) { + m_mainWindow->show(); + m_mainWindow->raise(); + m_mainWindow->activateWindow(); + return true; + } + return false; +} + +bool ApplicationAdaptor::hideWindow() +{ + if (m_mainWindow) { + m_mainWindow->hide(); + return true; + } + return false; +} + +bool ApplicationAdaptor::raiseWindow() +{ + if (m_mainWindow) { + m_mainWindow->raise(); + m_mainWindow->activateWindow(); + return true; + } + return false; +} + +bool ApplicationAdaptor::quitWindow() +{ + if (m_mainWindow) { + m_mainWindow->close(); + return true; + } + return false; +} + +bool ApplicationAdaptor::compressFiles(const QStringList &filePaths) +{ + if (filePaths.isEmpty()) { + qWarning() << "No files provided for compression"; + return false; + } + + if (!m_mainWindow) { + qWarning() << "MainWindow not available"; + return false; + } + + for (const QString &filePath : filePaths) { + if (!QFileInfo::exists(filePath)) { + qWarning() << "File does not exist:" << filePath; + return false; + } + } + + showWindow(); + m_mainWindow->slotDragSelectedFiles(QStringList{filePaths}); + return true; +} + +bool ApplicationAdaptor::extractFiles(const QString &archivePath, const QString &destinationPath) +{ + if (!QFileInfo::exists(archivePath)) { + qWarning() << "Archive file does not exist:" << archivePath; + return false; + } + + if (!m_mainWindow) { + qWarning() << "MainWindow not available"; + return false; + } + + QFileInfo destInfo(destinationPath); + if (!destInfo.isDir() || !destInfo.isWritable()) { + qWarning() << "Destination path is not a writable directory:" << destinationPath; + return false; + } + + showWindow(); + m_mainWindow->slotDragSelectedFiles(QStringList{archivePath}); + m_mainWindow->slotUncompressClicked(destinationPath); + return true; +} + +bool ApplicationAdaptor::previewArchive(const QString &archivePath) +{ + if (!QFileInfo::exists(archivePath)) { + qWarning() << "Archive file does not exist:" << archivePath; + return false; + } + + if (!m_mainWindow) { + qWarning() << "MainWindow not available"; + return false; + } + showWindow(); + m_mainWindow->slotDragSelectedFiles(QStringList{archivePath}); + return true; } diff --git a/src/source/common/dbusadpator.h b/src/source/common/dbusadpator.h index 93fe7bf0..fdbcf8db 100644 --- a/src/source/common/dbusadpator.h +++ b/src/source/common/dbusadpator.h @@ -4,11 +4,13 @@ #ifndef DBUS_ADAPTOR #define DBUS_ADAPTOR -#include - -#include "QApplication" +#include +#include #include #include +#include + +class MainWindow; /** * @file d-bus适配器,开放归档管理器d-bus接口 @@ -16,37 +18,73 @@ class ApplicationAdaptor: public QDBusAbstractAdaptor { Q_OBJECT - Q_CLASSINFO("D-Bus Interface", "com.deepin.compressor") + Q_CLASSINFO("D-Bus Interface", "com.deepin.Compressor") Q_CLASSINFO("D-Bus Introspection", "" - " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" " \n" - " \n" + " \n" + " \n" " \n" - " \n") public: - ApplicationAdaptor(QApplication *application); + ApplicationAdaptor(MainWindow *mainwindow); /** * @brief setCurOpenFile 设置当前的压缩包文件名 * @param sFile 压缩包文件名 */ void setCompressFile(const QString &sFile); - + void setMainWindow(MainWindow *mainWindow); public Q_SLOTS: /** * @brief raise dbus接口 * @param sFile 压缩包文件名的窗口激活 */ - void raise(const QString &sFile); + bool raise(const QString &sFile); /** * @brief onActiveWindow 激活窗口 * @param pid 对应进程id */ void onActiveWindow(qint64 pid); + // Window management methods + bool showWindow(); + bool hideWindow(); + bool raiseWindow(); + bool quitWindow(); + + // Compression related methods + bool compressFiles(const QStringList &filePaths); + bool extractFiles(const QString &archivePath, const QString &destinationPath); + bool previewArchive(const QString &archivePath); + private slots: /** * @brief focusChangedSlot 激活窗口切换 @@ -61,6 +99,7 @@ private slots: QApplication *app = nullptr; //运行应用程序实例 QWidget *m_curShowWidget = nullptr; //当前显示窗口 QString m_sFile; //压缩包文件名 + MainWindow *m_mainWindow = nullptr; //主窗口指针 }; #endif /* ifndef _DMR_DBUS_ADAPTOR */ diff --git a/src/source/compressorapplication.cpp b/src/source/compressorapplication.cpp index dcbe7dd9..6900e5a5 100644 --- a/src/source/compressorapplication.cpp +++ b/src/source/compressorapplication.cpp @@ -5,6 +5,10 @@ #include "compressorapplication.h" #include "mainwindow.h" +#include "common/dbusadpator.h" + +#include +#include #include #include @@ -16,6 +20,14 @@ CompressorApplication::CompressorApplication(int &argc, char **argv) : DApplication(argc, argv) { qDebug() << "CompressorApplication constructor"; + + // Register DBus service + QDBusConnection connection = QDBusConnection::sessionBus(); + if (!connection.registerService("com.deepin.Compressor")) { + qWarning() << "Failed to register DBus service:" << connection.lastError().message(); + } else { + qDebug() << "DBus service registered successfully"; + } } CompressorApplication::~CompressorApplication() diff --git a/src/source/mainwindow.cpp b/src/source/mainwindow.cpp index 5882a55c..8395a9d8 100644 --- a/src/source/mainwindow.cpp +++ b/src/source/mainwindow.cpp @@ -4,6 +4,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "mainwindow.h" +#include "common/dbusadpator.h" #include "loadingpage.h" #include "homepage.h" #include "compresspage.h" @@ -74,6 +75,12 @@ MainWindow::MainWindow(QWidget *parent) m_pMainWidget->setCurrentIndex(0); qDebug() << "Main UI components created"; + // Initialize DBus interface + qDebug() << "Initializing DBus interface"; + // m_compressorInterface = new ApplicationAdaptor(qApp); + // m_compressorInterface->setMainWindow(this); + qDebug() << "DBus interface initialized"; + #if QT_VERSION < QT_VERSION_CHECK(6 ,0, 0) qDebug() << "Creating shortcut for Qt5"; m_openkey = new QShortcut(QKeySequence(Qt::Key_Slash + Qt::CTRL + Qt::SHIFT), this); // Ctrl+Shift+/ @@ -112,6 +119,13 @@ MainWindow::~MainWindow() qDebug() << "Destroying ArchiveManager instance"; ArchiveManager::get_instance()->destory_instance(); + // Clean up DBus interface + qDebug() << "Cleaning up DBus interface"; + // if (m_compressorInterface) { + // delete m_compressorInterface; + // m_compressorInterface = nullptr; + // } + // 清除缓存数据 qDebug() << "Cleaning up temporary files"; QProcess p; diff --git a/src/source/mainwindow.h b/src/source/mainwindow.h index b7afc6df..6f9acabf 100644 --- a/src/source/mainwindow.h +++ b/src/source/mainwindow.h @@ -35,6 +35,7 @@ class OpenFileWatcher; class QFileSystemWatcher; class CalculateSizeThread; class TitleWidget; +class ApplicationAdaptor; DWIDGET_USE_NAMESPACE DCORE_USE_NAMESPACE @@ -345,13 +346,13 @@ private Q_SLOTS: * @brief slotTitleBtnClicked 选择文件触发 */ void slotChoosefiles(); - +public Q_SLOTS: /** * @brief slotDragSelectedFiles 拖拽添加文件 * @param listFiles 拖拽的文件 */ void slotDragSelectedFiles(const QStringList &listFiles); - +private Q_SLOTS: /** * @brief compressLevelChanged 处理压缩层级变化 * @param bRootIndex 是否是根目录 @@ -375,13 +376,13 @@ private Q_SLOTS: * @param eErrorType 错误类型 */ void slotJobFinished(ArchiveJob::JobType eJobType, PluginFinishType eFinishType, ErrorType eErrorType); - +public Q_SLOTS: /** * @brief slotUncompressClicked 解压按钮点击,执行解压操作 * @param strUncompressPath 解压路径 */ void slotUncompressClicked(const QString &strUncompressPath); - +private Q_SLOTS: /** * @brief slotReceiveProgress 进度信号处理 * @param dPercentage 进度值 @@ -572,6 +573,8 @@ private Q_SLOTS: #endif QString m_strCurrentName; + + ApplicationAdaptor *m_compressorInterface = nullptr; // DBus interface }; class TitleWidget : public QWidget