feat(dccquickdbusinterface): add enabled property to control D-Bus connection#3256
feat(dccquickdbusinterface): add enabled property to control D-Bus connection#325618202781743 wants to merge 1 commit into
Conversation
…nnection Add enabled property to DccQuickDBusInterface to allow dynamic control of D-Bus connections. When enabled is false, the interface disconnects from D-Bus signals and properties. When enabled is true, it reconnects. Changes: - Add enabled Q_PROPERTY with getter, setter, and notification signal - Add connectToDBus() and disconnectFromDBus() private methods - Track signal callbacks for proper disconnection - Add m_completed flag to handle componentComplete() ordering - Add enabled to ReservedPropertyNames list
There was a problem hiding this comment.
Sorry @18202781743, you have reached your weekly rate limit of 500000 diff characters.
Please try again later or upgrade to continue using Sourcery
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: 18202781743 The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
deepin pr auto review这份代码为 以下是详细的审查意见和改进建议: 1. 代码安全与内存管理(严重问题)问题: 改进建议: void DccQuickDBusInterface::disconnectFromDBus()
{
// 释放内存
for (const auto &[callback, signalName] : std::as_const(p_ptr->m_signalCallbacks)) {
delete callback;
}
p_ptr->m_signalCallbacks.clear();
// ... 其他逻辑
}2. 语法与代码规范(建议优化)问题:魔法数字 改进建议: // 修改前
if (m.methodType() == 2 && m.name().startsWith("on")) {
// 修改后
if (m.methodType() == QMetaMethod::Signal && m.name().startsWith("on")) {3. 逻辑严谨性(重要问题)问题: 改进建议: // dccquickdbusinterface_p.h
bool m_enabled = false; // 默认改为 false4. 代码性能与健壮性(建议优化)问题: 改进建议: 5. 代码安全与防御性编程问题:缺少对 改进建议: void DccQuickDBusInterface::connectToDBus()
{
if (p_ptr->m_signalCallbacks.isEmpty() && !p_ptr->m_propertyConnected) {
// 可以连接
} else {
return; // 已经连接,避免重复连接
}
// ...
}
void DccQuickDBusInterface::disconnectFromDBus()
{
if (p_ptr->m_signalCallbacks.isEmpty() && !p_ptr->m_propertyConnected) {
return; // 已经断开,无需操作
}
// ...
}综合修改后的代码参考dccquickdbusinterface_p.h // ... 其他代码
QList<QPair<DccDBusSignalCallback *, QString>> m_signalCallbacks;
bool m_propertyConnected = false;
bool m_completed = false;
bool m_enabled = false; // 修改:默认值改为 false,确保 QML 赋值时能触发逻辑
// ... 其他代码dccquickdbusinterface.cpp // ... setEnabled 逻辑保持不变 ...
void DccQuickDBusInterface::connectToDBus()
{
// 防御性编程:避免重复连接
if (!p_ptr->m_signalCallbacks.isEmpty() || p_ptr->m_propertyConnected)
return;
const QMetaObject *mo = this->metaObject();
const int mcount = mo->methodCount();
for (int i = mo->methodOffset(); i < mcount; ++i) {
const QMetaMethod &m = mo->method(i);
// 修改:消除魔法数字
if (m.methodType() == QMetaMethod::Signal && m.name().startsWith("on")) {
const QString signalName = m.name().mid(2);
DccDBusSignalCallback *callback = new DccDBusSignalCallback(m, this);
p_ptr->m_connection.connect(p_ptr->m_service, p_ptr->m_path, p_ptr->m_interface, signalName, callback, SLOT(returnMethod(QDBusMessage)));
p_ptr->m_signalCallbacks.append({ callback, signalName });
}
}
if (!p_ptr->m_mapProperties.isEmpty()) {
p_ptr->m_connection.connect(p_ptr->m_service,
p_ptr->m_path,
PropertiesInterface,
PropertiesChanged,
p_ptr,
SLOT(onPropertiesChanged(QString, QVariantMap, QStringList)));
p_ptr->m_propertyConnected = true;
}
}
void DccQuickDBusInterface::disconnectFromDBus()
{
// 防御性编程:无需断开时直接返回
if (p_ptr->m_signalCallbacks.isEmpty() && !p_ptr->m_propertyConnected)
return;
// 修改:释放回调对象的内存,防止内存泄漏
for (const auto &[callback, signalName] : std::as_const(p_ptr->m_signalCallbacks)) {
p_ptr->m_connection.disconnect(p_ptr->m_service,
p_ptr->m_path,
p_ptr->m_interface,
signalName,
callback,
SLOT(returnMethod(QDBusMessage)));
delete callback;
}
p_ptr->m_signalCallbacks.clear();
if (p_ptr->m_propertyConnected) {
p_ptr->m_connection.disconnect(p_ptr->m_service,
p_ptr->m_path,
PropertiesInterface,
PropertiesChanged,
p_ptr,
SLOT(onPropertiesChanged(QString, QVariantMap, QStringList)));
p_ptr->m_propertyConnected = false;
}
} |
Summary
Changes
Test plan
🤖 Generated with Claude Code