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