Skip to content

fix: The CVTE customer requests to block irrelevant cameras.#453

Closed
lichaofan2008 wants to merge 1 commit intolinuxdeepin:release/eaglefrom
lichaofan2008:release/eagle
Closed

fix: The CVTE customer requests to block irrelevant cameras.#453
lichaofan2008 wants to merge 1 commit intolinuxdeepin:release/eaglefrom
lichaofan2008:release/eagle

Conversation

@lichaofan2008
Copy link
Contributor

The CVTE customer requests to block irrelevant cameras and retain only the camera named "Smart Camera : Smart Camera" for camera use.
CVTE客户要求屏蔽无关摄像头,只保留名为Smart Camera : Smart Camera的摄像头供相机使用。

Bug: https://pms.uniontech.com/bug-view-349401.html

The CVTE customer requests to block irrelevant cameras and retain only the camera named "Smart Camera : Smart Camera" for camera use.
CVTE客户要求屏蔽无关摄像头,只保留名为Smart Camera : Smart Camera的摄像头供相机使用。

Bug: https://pms.uniontech.com/bug-view-349401.html
Copy link

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @lichaofan2008, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@deepin-ci-robot
Copy link

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: lichaofan2008

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@deepin-ci-robot
Copy link

deepin pr auto review

这段代码实现了一个摄像头设备黑名单功能,用于过滤掉特定的摄像头设备。我将对这段代码进行审查,从语法逻辑、代码质量、代码性能和代码安全四个方面提出改进意见。

1. 语法逻辑审查

问题1:设备ID格式不一致
org.deepin.camera.encode.json中,黑名单条目使用小写十六进制(如"254a"),但在mainwindow.cppvideowidget.cpp中,设备ID被格式化为小写十六进制:

QString vid = QString("%1").arg(v4l2_devices[i].vendor, 4, 16, QLatin1Char('0'));

这可能导致匹配失败。

改进建议
统一设备ID的格式,建议全部使用小写或大写,并在比较时进行大小写不敏感匹配。

问题2:设备名称匹配可能不精确
黑名单条目中包含设备名称,但设备名称可能因驱动或系统版本不同而略有差异,导致匹配失败。

改进建议
考虑使用模糊匹配或正则表达式来匹配设备名称,或者只依赖VID和PID进行匹配。

2. 代码质量审查

问题1:重复代码
mainwindow.cppvideowidget.cpp中,都有类似的设备有效性检查代码:

QString vid = QString("%1").arg(v4l2_devices[i].vendor, 4, 16, QLatin1Char('0'));
QString pid = QString("%1").arg(v4l2_devices[i].product, 4, 16, QLatin1Char('0'));
if (!DataManager::instance()->isDeviceValid(vid, pid, v4l2_devices[i].name)) {
    // ...
}

改进建议
将这段逻辑封装为一个函数,例如在DataManager中添加一个重载的isDeviceValid函数,直接接受v4l2_dev_sys_data_t对象。

问题2:缺少错误处理
videowidget.cpp中,getFirstValidDevice函数在没有找到有效设备时返回空字符串,但调用方没有检查返回值。

改进建议
添加错误处理逻辑,确保在找不到有效设备时有适当的反馈。

问题3:日志级别不当
main.cpp中,使用qWarning()输出黑名单信息:

qWarning() << "deviceBlacklist:" << deviceBlacklist;

这可能会在正常情况下产生不必要的警告信息。

改进建议
使用qDebug()qInfo()代替qWarning()

3. 代码性能审查

问题1:频繁的字符串拼接
DataManager::isDeviceValid中,每次检查都需要拼接字符串:

return !m_deviceBlacklist.contains(vid + "," + pid + "," + name);

改进建议
考虑使用更高效的数据结构,如QSet<QString>,或者预处理黑名单,将VID、PID和名称分开存储。

问题2:多次调用get_device_list()
mainwindow.cppvideowidget.cpp中,多次调用get_device_list(),这可能导致性能问题。

改进建议
缓存get_device_list()的结果,避免重复调用。

4. 代码安全审查

问题1:设备名称未经验证
设备名称直接从系统获取,未进行验证或清理,可能存在安全风险。

改进建议
对设备名称进行验证或清理,确保不包含特殊字符或恶意内容。

问题2:黑名单配置可被修改
黑名单配置存储在JSON文件中,可以被用户或恶意程序修改。

改进建议
考虑对黑名单配置进行加密或签名验证,确保其完整性。

综合改进建议

基于以上审查,我提出以下综合改进建议:

  1. 统一设备ID格式
    DataManager中添加辅助函数,确保设备ID格式一致:

    QString formatDeviceId(uint id) {
        return QString("%1").arg(id, 4, 16, QLatin1Char('0')).toLower();
    }
  2. 封装设备有效性检查
    DataManager中添加重载函数:

    bool DataManager::isDeviceValid(const v4l2_dev_sys_data_t &device) {
        QString vid = formatDeviceId(device.vendor);
        QString pid = formatDeviceId(device.product);
        return isDeviceValid(vid, pid, device.name);
    }
  3. 优化黑名单数据结构
    使用更高效的数据结构存储黑名单:

    struct DeviceInfo {
        QString vid;
        QString pid;
        QString name;
    };
    QSet<DeviceInfo> m_deviceBlacklist;
  4. 添加错误处理
    videowidget.cpp中,添加对getFirstValidDevice返回值的检查:

    QString validDevice = getFirstValidDevice();
    if (validDevice.isEmpty()) {
        qCritical() << "No valid camera device found!";
        // 显示错误消息或采取其他适当措施
        return;
    }
  5. 改进日志记录
    使用适当的日志级别:

    qInfo() << "Device blacklist loaded:" << deviceBlacklist;
  6. 缓存设备列表
    在需要多次使用设备列表的地方,缓存结果:

    v4l2_device_list_t *devlist = get_device_list();
    // 使用devlist而不是多次调用get_device_list()

这些改进将提高代码的可读性、可维护性、性能和安全性。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants