Skip to content

Commit fbb08e3

Browse files
committed
feat(dbus): implement comprehensive DBus service interface
Add DBus service files and implement full interface for deepin-compressor: - Install DBus service and interface XML files via CMake - Create com.deepin.Compressor.service with proper service name and executable path - Define DBus interface with methods for window management (show/hide/raise/quit) - Add compression operations (compressFiles, extractFiles, previewArchive) - Update ApplicationAdaptor to handle MainWindow instead of QApplication - Register DBus service in CompressorApplication constructor - Modify main.cpp to use correct service name and object paths The implementation provides a complete DBus API for external applications to interact with the compressor application programmatically, enabling integration with desktop environments and other system services.
1 parent 710f210 commit fbb08e3

File tree

9 files changed

+258
-31
lines changed

9 files changed

+258
-31
lines changed

src/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,11 @@ install(DIRECTORY assets/deepin-compressor DESTINATION ${CMAKE_INSTALL_DATADIR}/
135135

136136
# 支持压缩的格式
137137
#install(FILES conf/compressor-singlecompress.conf DESTINATION ${CMAKE_INSTALL_DATADIR}/deepin-compressor/compressedformat/)
138+
139+
# Install DBus service file
140+
install(FILES ${CMAKE_CURRENT_LIST_DIR}/com.deepin.Compressor.service
141+
DESTINATION ${CMAKE_INSTALL_DATADIR}/dbus-1/services/)
142+
143+
# Install DBus interface XML file
144+
install(FILES ${CMAKE_CURRENT_LIST_DIR}/com.deepin.Compressor.xml
145+
DESTINATION ${CMAKE_INSTALL_DATADIR}/dbus-1/interfaces/)

src/com.deepin.Compressor.service

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[D-BUS Service]
2+
Name=com.deepin.Compressor
3+
Exec=/usr/bin/deepin-compressor

src/com.deepin.Compressor.xml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
2+
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
3+
<node>
4+
<interface name="com.deepin.Compressor">
5+
<method name="showWindow">
6+
<arg direction="out" type="b"/>
7+
</method>
8+
<method name="hideWindow">
9+
<arg direction="out" type="b"/>
10+
</method>
11+
<method name="raiseWindow">
12+
<arg direction="out" type="b"/>
13+
</method>
14+
<method name="raise">
15+
<arg direction="in" type="s" name="sFile"/>
16+
<arg direction="out" type="b"/>
17+
</method>
18+
<method name="quitWindow">
19+
<arg direction="out" type="b"/>
20+
</method>
21+
<method name="compressFiles">
22+
<arg direction="in" type="as" name="filePaths"/>
23+
<arg direction="out" type="b"/>
24+
</method>
25+
<method name="extractFiles">
26+
<arg direction="in" type="s" name="archivePath"/>
27+
<arg direction="in" type="s" name="destinationPath"/>
28+
<arg direction="out" type="b"/>
29+
</method>
30+
<method name="previewArchive">
31+
<arg direction="in" type="s" name="archivePath"/>
32+
<arg direction="out" type="b"/>
33+
</method>
34+
</interface>
35+
</node>

src/main.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -217,30 +217,31 @@ int main(int argc, char *argv[])
217217
showWatermark(sJsonStr, &w);
218218

219219
qDebug() << "Creating DBus adaptor and connecting to session bus";
220-
ApplicationAdaptor adaptor(&app);
220+
ApplicationAdaptor adaptor(&w);
221221
QDBusConnection dbus = QDBusConnection::sessionBus();
222222

223223
if(!orderObject){
224224
qDebug() << "Registering standard DBus service";
225-
if (dbus.registerService("com.deepin.compressor")) {
225+
if (dbus.registerService("com.deepin.Compressor")) {
226+
dbus.registerObject("/com/deepin/Compressor", &w);
226227
qDebug() << "DBus service registered successfully, moving window to center";
227228
Dtk::Widget::moveToCenter(&w);
228229
} else {
229-
qWarning() << "Failed to register standard DBus service";
230+
qWarning() << "Failed to register standard DBus service:" << dbus.lastError().message();
230231
}
231232
} else {
232233
qDebug() << "Registering WPS-specific DBus service";
233-
QString serviceName = "com.deepin.compressor"+QString::number(QGuiApplication::applicationPid());
234+
QString serviceName = "com.deepin.Compressor"+QString::number(QGuiApplication::applicationPid());
234235
if (dbus.registerService(serviceName)) {
235236
qDebug() << "WPS DBus service registered successfully";
236-
QString objectPath = "/"+QString::number(QGuiApplication::applicationPid());
237-
dbus.registerObject(objectPath, &app);
237+
QString objectPath = "/com/deepin/Compressor/"+QString::number(QGuiApplication::applicationPid());
238+
dbus.registerObject(objectPath, &w);
238239
adaptor.setCompressFile(newfilelist.first());
239240
Dtk::Widget::moveToCenter(&w);
240241
w.setProperty(ORDER_JSON, sJsonStr);
241242
qDebug() << "Window properties set for WPS mode";
242243
} else {
243-
qWarning() << "Failed to register WPS DBus service";
244+
qWarning() << "Failed to register WPS DBus service:" << dbus.lastError().message();
244245
}
245246

246247
qDebug() << "Connecting to WPS cryptfs DBus interface";

src/source/common/dbusadpator.cpp

Lines changed: 122 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,30 @@
33
//
44
// SPDX-License-Identifier: GPL-3.0-or-later
55

6+
#include "dbusadpator.h"
7+
#include "mainwindow.h"
8+
#include "archivemanager.h"
9+
610
#include <QFileInfo>
711
#include <QtDebug>
812
#include <DSettings>
9-
#include "dbusadpator.h"
1013
#include <QMainWindow>
1114
#include <QDBusInterface>
1215
#include <QDBusReply>
16+
#include <QDir>
17+
1318
const QString SOPENLIST = "openfiles";
1419

15-
ApplicationAdaptor::ApplicationAdaptor(QApplication *application)
16-
: QDBusAbstractAdaptor(application), app(application)
20+
ApplicationAdaptor::ApplicationAdaptor(MainWindow *mainwindow)
21+
: QDBusAbstractAdaptor(mainwindow), m_mainWindow(mainwindow)
1722
{
1823
qDebug() << "ApplicationAdaptor initialized";
19-
connect(application, SIGNAL(aboutToQuit()), SIGNAL(aboutToQuit()));
20-
connect(application, SIGNAL(focusChanged(QWidget*, QWidget*)),
21-
SLOT(focusChangedSlot(QWidget*, QWidget*)));
2224
}
2325

26+
void ApplicationAdaptor::setMainWindow(MainWindow *mainWindow)
27+
{
28+
m_mainWindow = mainWindow;
29+
}
2430

2531
/**
2632
* @brief setCurOpenFile 设置当前的压缩包文件名
@@ -32,16 +38,18 @@ void ApplicationAdaptor::setCompressFile(const QString &sFile)
3238
m_sFile = sFile;
3339
}
3440

35-
36-
void ApplicationAdaptor::raise(const QString &sFile)
41+
bool ApplicationAdaptor::raise(const QString &sFile)
3742
{
3843
qDebug() << "Raise window request for file:" << sFile;
3944
if(m_sFile.isEmpty() || m_sFile.isNull()) {
4045
qWarning() << "No compress file set, cannot raise window";
41-
return;
46+
return false;
4247
}
43-
if(m_curShowWidget && (m_sFile == sFile))
48+
if(m_curShowWidget && (m_sFile == sFile)) {
4449
m_curShowWidget->activateWindow();
50+
return true;
51+
}
52+
return false;
4553
}
4654

4755
void ApplicationAdaptor::onActiveWindow(qint64 pid)
@@ -84,5 +92,109 @@ void ApplicationAdaptor::onActiveWindow(qint64 pid)
8492
}
8593
}
8694
}
95+
}
96+
97+
// Window management methods
98+
bool ApplicationAdaptor::showWindow()
99+
{
100+
if (m_mainWindow) {
101+
m_mainWindow->show();
102+
m_mainWindow->raise();
103+
m_mainWindow->activateWindow();
104+
return true;
105+
}
106+
return false;
107+
}
108+
109+
bool ApplicationAdaptor::hideWindow()
110+
{
111+
if (m_mainWindow) {
112+
m_mainWindow->hide();
113+
return true;
114+
}
115+
return false;
116+
}
117+
118+
bool ApplicationAdaptor::raiseWindow()
119+
{
120+
if (m_mainWindow) {
121+
m_mainWindow->raise();
122+
m_mainWindow->activateWindow();
123+
return true;
124+
}
125+
return false;
126+
}
127+
128+
bool ApplicationAdaptor::quitWindow()
129+
{
130+
if (m_mainWindow) {
131+
m_mainWindow->close();
132+
return true;
133+
}
134+
return false;
135+
}
136+
137+
bool ApplicationAdaptor::compressFiles(const QStringList &filePaths)
138+
{
139+
if (filePaths.isEmpty()) {
140+
qWarning() << "No files provided for compression";
141+
return false;
142+
}
143+
144+
if (!m_mainWindow) {
145+
qWarning() << "MainWindow not available";
146+
return false;
147+
}
148+
149+
for (const QString &filePath : filePaths) {
150+
if (!QFileInfo::exists(filePath)) {
151+
qWarning() << "File does not exist:" << filePath;
152+
return false;
153+
}
154+
}
155+
156+
showWindow();
157+
m_mainWindow->slotDragSelectedFiles(QStringList{filePaths});
158+
return true;
159+
}
160+
161+
bool ApplicationAdaptor::extractFiles(const QString &archivePath, const QString &destinationPath)
162+
{
163+
if (!QFileInfo::exists(archivePath)) {
164+
qWarning() << "Archive file does not exist:" << archivePath;
165+
return false;
166+
}
167+
168+
if (!m_mainWindow) {
169+
qWarning() << "MainWindow not available";
170+
return false;
171+
}
172+
173+
QFileInfo destInfo(destinationPath);
174+
if (!destInfo.isDir() || !destInfo.isWritable()) {
175+
qWarning() << "Destination path is not a writable directory:" << destinationPath;
176+
return false;
177+
}
178+
179+
showWindow();
180+
m_mainWindow->slotDragSelectedFiles(QStringList{archivePath});
181+
m_mainWindow->slotUncompressClicked(destinationPath);
182+
return true;
183+
}
184+
185+
bool ApplicationAdaptor::previewArchive(const QString &archivePath)
186+
{
187+
if (!QFileInfo::exists(archivePath)) {
188+
qWarning() << "Archive file does not exist:" << archivePath;
189+
return false;
190+
}
191+
192+
if (!m_mainWindow) {
193+
qWarning() << "MainWindow not available";
194+
return false;
195+
}
87196

197+
showWindow();
198+
m_mainWindow->slotDragSelectedFiles(QStringList{archivePath});
199+
return true;
88200
}

src/source/common/dbusadpator.h

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,49 +4,87 @@
44
#ifndef DBUS_ADAPTOR
55
#define DBUS_ADAPTOR
66

7-
#include <QtDBus/QDBusAbstractAdaptor>
8-
9-
#include "QApplication"
7+
#include <QDBusAbstractAdaptor>
8+
#include <QApplication>
109
#include <QWidget>
1110
#include <QSettings>
11+
#include <QStringList>
12+
13+
class MainWindow;
1214

1315
/**
1416
* @file d-bus适配器,开放归档管理器d-bus接口
1517
*/
1618
class ApplicationAdaptor: public QDBusAbstractAdaptor
1719
{
1820
Q_OBJECT
19-
Q_CLASSINFO("D-Bus Interface", "com.deepin.compressor")
21+
Q_CLASSINFO("D-Bus Interface", "com.deepin.Compressor")
2022
Q_CLASSINFO("D-Bus Introspection", ""
21-
" <interface name=\"com.deepin.compressor\">\n"
23+
" <interface name=\"com.deepin.Compressor\">\n"
2224

25+
" <method name=\"showWindow\">\n"
26+
" <arg direction=\"out\" type=\"b\"/>\n"
27+
" </method>\n"
28+
" <method name=\"hideWindow\">\n"
29+
" <arg direction=\"out\" type=\"b\"/>\n"
30+
" </method>\n"
31+
" <method name=\"raiseWindow\">\n"
32+
" <arg direction=\"out\" type=\"b\"/>\n"
33+
" </method>\n"
34+
" <method name=\"quitWindow\">\n"
35+
" <arg direction=\"out\" type=\"b\"/>\n"
36+
" </method>\n"
37+
" <method name=\"compressFiles\">\n"
38+
" <arg direction=\"in\" type=\"as\" name=\"filePaths\"/>\n"
39+
" <arg direction=\"out\" type=\"b\"/>\n"
40+
" </method>\n"
41+
" <method name=\"extractFiles\">\n"
42+
" <arg direction=\"in\" type=\"s\" name=\"archivePath\"/>\n"
43+
" <arg direction=\"in\" type=\"s\" name=\"destinationPath\"/>\n"
44+
" <arg direction=\"out\" type=\"b\"/>\n"
45+
" </method>\n"
46+
" <method name=\"previewArchive\">\n"
47+
" <arg direction=\"in\" type=\"s\" name=\"archivePath\"/>\n"
48+
" <arg direction=\"out\" type=\"b\"/>\n"
49+
" </method>\n"
2350
" <method name=\"raise\">\n"
24-
" <arg direction=\"in\" type=\"none\" name=\"raise\"/>\n"
51+
" <arg direction=\"in\" type=\"s\" name=\"sFile\"/>\n"
52+
" <arg direction=\"out\" type=\"b\"/>\n"
2553
" </method>\n"
26-
2754
" </interface>\n")
2855

2956
public:
30-
ApplicationAdaptor(QApplication *application);
57+
ApplicationAdaptor(MainWindow *mainwindow);
3158
/**
3259
* @brief setCurOpenFile 设置当前的压缩包文件名
3360
* @param sFile 压缩包文件名
3461
*/
3562
void setCompressFile(const QString &sFile);
36-
63+
void setMainWindow(MainWindow *mainWindow);
3764

3865
public Q_SLOTS:
3966
/**
4067
* @brief raise dbus接口
4168
* @param sFile 压缩包文件名的窗口激活
4269
*/
43-
void raise(const QString &sFile);
70+
bool raise(const QString &sFile);
4471
/**
4572
* @brief onActiveWindow 激活窗口
4673
* @param pid 对应进程id
4774
*/
4875
void onActiveWindow(qint64 pid);
4976

77+
// Window management methods
78+
bool showWindow();
79+
bool hideWindow();
80+
bool raiseWindow();
81+
bool quitWindow();
82+
83+
// Compression related methods
84+
bool compressFiles(const QStringList &filePaths);
85+
bool extractFiles(const QString &archivePath, const QString &destinationPath);
86+
bool previewArchive(const QString &archivePath);
87+
5088
private slots:
5189
/**
5290
* @brief focusChangedSlot 激活窗口切换
@@ -61,6 +99,7 @@ private slots:
6199
QApplication *app = nullptr; //运行应用程序实例
62100
QWidget *m_curShowWidget = nullptr; //当前显示窗口
63101
QString m_sFile; //压缩包文件名
102+
MainWindow *m_mainWindow = nullptr; //主窗口指针
64103
};
65104

66105
#endif /* ifndef _DMR_DBUS_ADAPTOR */

src/source/compressorapplication.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55

66
#include "compressorapplication.h"
77
#include "mainwindow.h"
8+
#include "common/dbusadpator.h"
9+
10+
#include <QDBusConnection>
11+
#include <QDBusError>
812

913
#include <DCheckBox>
1014
#include <DSuggestButton>
@@ -16,6 +20,14 @@ CompressorApplication::CompressorApplication(int &argc, char **argv)
1620
: DApplication(argc, argv)
1721
{
1822
qDebug() << "CompressorApplication constructor";
23+
24+
// Register DBus service
25+
QDBusConnection connection = QDBusConnection::sessionBus();
26+
if (!connection.registerService("com.deepin.Compressor")) {
27+
qWarning() << "Failed to register DBus service:" << connection.lastError().message();
28+
} else {
29+
qDebug() << "DBus service registered successfully";
30+
}
1931
}
2032

2133
CompressorApplication::~CompressorApplication()

0 commit comments

Comments
 (0)