diff --git a/.reuse/dep5 b/.reuse/dep5 index b7d843d..218582e 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -19,7 +19,7 @@ Copyright: None License: CC0-1.0 # Project file -Files: *.pro *.pri *.qrc *.ts *.sh .tx/* +Files: *.pro *.pri *.qrc *.ts *.sh .tx/* src/Printer/policy/canon* Copyright: None License: CC0-1.0 diff --git a/src/Common/common.cpp b/src/Common/common.cpp index 6be7e1e..1090792 100644 --- a/src/Common/common.cpp +++ b/src/Common/common.cpp @@ -667,3 +667,19 @@ bool isIpv4Address(const QString &str) return reg.match(str).hasMatch(); } +int managerCanonPrinter(const QString &action, const QStringList &args) +{ + QDBusInterface interface("com.deepin.printer.manager", "/com/deepin/printer/manager", "com.deepin.printer.manager", QDBusConnection::systemBus()); + QDBusReply ret; + if (action == "add") { + ret = interface.call("CanonPrinterInstall", args); + } else { + ret = interface.call("CanonPrinterRemove", args); + } + + if (ret.isValid()) { + return ret; + } + + return 0; +} diff --git a/src/Common/common.h b/src/Common/common.h index ae7350e..14fafc0 100644 --- a/src/Common/common.h +++ b/src/Common/common.h @@ -75,4 +75,5 @@ typedef void (*pfWriteEventLog)(const std::string &); pfWriteEventLog getWriteEventLog(); void unloadEventLib(); +int managerCanonPrinter(const QString &action, const QStringList &args); #endif // COMMON_H diff --git a/src/Common/vendor/addprinter.cpp b/src/Common/vendor/addprinter.cpp index 598dc0a..83c923e 100644 --- a/src/Common/vendor/addprinter.cpp +++ b/src/Common/vendor/addprinter.cpp @@ -587,7 +587,14 @@ int AddCanonCAPTPrinter::addPrinter() } qCDebug(COMMONMOUDLE) << "ppdname : " << ppd_name << "printInfo: " << printInfo; - m_proc.start("pkexec", QStringList {g_captexec, m_printer.strName, ppd_name, printInfo}); + int ret = managerCanonPrinter("add", QStringList {m_printer.strName, ppd_name, printInfo}); + + m_proc.setProcessChannelMode(QProcess::ForwardedChannels); + if (ret != 0) { + emit m_proc.finished(ret, QProcess::CrashExit); + } else { + emit m_proc.finished(ret, QProcess::NormalExit); + } return 1; } diff --git a/src/Printer/Printer.pro b/src/Printer/Printer.pro index 87e919f..8852ae6 100644 --- a/src/Printer/Printer.pro +++ b/src/Printer/Printer.pro @@ -120,10 +120,13 @@ dconfigfile.files = $${PWD}/logconf/org.deepin.dde.printer.json debugconf.path = $${PREFIX}/share/deepin-debug-config/deepin-debug-config.d debugconf.files = $${PWD}/logconf/dde-printer_debug.json -logconf.path = $${PREFIX}//share/deepin-log-viewer/deepin-log.conf.d +logconf.path = $${PREFIX}/share/deepin-log-viewer/deepin-log.conf.d logconf.files = $${PWD}/logconf/dde-printer.json -INSTALLS += target desktop hicolor trans polkit dconfigfile debugconf logconf +canonscript.path = /opt/printer-drivers/cndrvcups-capt/ +canonscript.files = $${PWD}/policy/canon* + +INSTALLS += target desktop hicolor trans polkit dconfigfile debugconf logconf canonscript } #从debian/rules里面获取定义好的VERSION,然后转成字符串 diff --git a/src/Printer/policy/canonadd b/src/Printer/policy/canonadd new file mode 100755 index 0000000..bb525ed --- /dev/null +++ b/src/Printer/policy/canonadd @@ -0,0 +1,36 @@ +#! /bin/bash + +# 此脚本用于添加LBP capt系列打印机,脚本自带参数为3个 +# 参数1[打印机名称];参数2[打印机驱动文件路径];参数3[usb:打印机serial | net:ipaddr] + +if [[ $# -eq 0 ]]; then + echo "Usage add printer: $0 printer_name ppdfile usb:serialnumber [net:ipaddr]" + echo "example:" + echo " $0 LBP2900 CNCUPSLBP2900CAPTK.ppd [usb:0000XXXX | net:192.168.0.1]" + exit 0 +fi + +# 如果已经添加不再添加 +devinfo=${3:4} +ccpdadmin | grep -q $devinfo && exit 2 + +model_path=/usr/share/cups/model/ + +serial="" +if [[ $3 == "usb"* ]]; then + serial=/$devinfo +fi + +lpadmin -p $1 -v ccp://localhost:59687$serial -P "$model_path$2" -E || exit 1 +ccpdadmin | grep "invalid Spool Name" | awk '{print $3}' | while read -r name; do ccpdadmin -x $name; done + +if [[ $3 == "usb"* ]]; then + ccpdadmin -p $1 -o /dev/capt/$devinfo | grep -q $1 || exit 1 +else + ccpdadmin -p $1 -o $3 | grep -q $1 || exit 1 +fi + +systemctl restart ccpd.service +systemctl enable ccpd.service + +exit 0 diff --git a/src/Printer/policy/canonremove b/src/Printer/policy/canonremove new file mode 100755 index 0000000..a6b1c0b --- /dev/null +++ b/src/Printer/policy/canonremove @@ -0,0 +1,20 @@ +#! /bin/bash + +# 此脚本用于删除LBP capt系列打印机,脚本自带参数为1个 +# 参数1[打印机名称](删除对应名称的打印机) + +if [[ $# -eq 0 ]]; then + echo "Usage del printer: $0 printer_name" + echo "example:" + echo " $0 LBP2900" + exit 0 +fi + +ccpdadmin | grep "invalid Spool Name" | awk '{print $3}' | while read -r name; do ccpdadmin -x $name; done + +ccpdadmin -x $1 + +systemctl restart ccpd.service +systemctl enable ccpd.service + +exit 0 diff --git a/src/Printer/ui/dprintersshowwindow.cpp b/src/Printer/ui/dprintersshowwindow.cpp index 5920505..f0b7ecd 100644 --- a/src/Printer/ui/dprintersshowwindow.cpp +++ b/src/Printer/ui/dprintersshowwindow.cpp @@ -51,9 +51,9 @@ #define FAQDOCUMENT_MESSAGE QObject::tr("Help on adding and using printers") -static const QString canonRemove = "/opt/cndrvcups-capt/remove"; +static const QString canonRemove = "/opt/printer-drivers/cndrvcups-capt/canonremove"; -static bool isCanonCaptPrinter(QString printerName) +static bool isCanonCaptPrinter(const QString &printerName) { QString printerUri = getPrinterUri(printerName.toUtf8().data()); if (printerUri.contains("ccp://")) { @@ -767,9 +767,8 @@ void DPrintersShowWindow::deletePrinterClickSlot() if (isCanonCaptPrinter(printerName)) { // 判断是否canon capt打印机 QFile file(canonRemove); if (file.exists()) { - QProcess p; - ret = p.execute("pkexec", QStringList {canonRemove, printerName}); - if (ret != 0) { + int bret = managerCanonPrinter("remove", QStringList{printerName}); + if (bret != 0) { return; } } diff --git a/src/service/service.cpp b/src/service/service.cpp index 2b5b87e..f212197 100755 --- a/src/service/service.cpp +++ b/src/service/service.cpp @@ -32,3 +32,17 @@ void Service::LaunchAutoStart(const QString &filePath) QProcess::startDetached(scriptPath, QStringList() << "-c"); return; } + +int Service::CanonPrinterInstall(const QStringList &args) +{ + m_proc->start("/opt/printer-drivers/cndrvcups-capt/canonadd", args); + m_proc->waitForFinished(); + return m_proc->exitCode(); +} + +int Service::CanonPrinterRemove(const QStringList &args) +{ + m_proc->start("/opt/printer-drivers/cndrvcups-capt/canonremove", args); + m_proc->waitForFinished(); + return m_proc->exitCode(); +} diff --git a/src/service/service.h b/src/service/service.h index bed2f87..48a6ea9 100755 --- a/src/service/service.h +++ b/src/service/service.h @@ -22,6 +22,8 @@ class Service : public QObject public slots: void LaunchAutoStart(const QString &filePath); + int CanonPrinterInstall(const QStringList &args); + int CanonPrinterRemove(const QStringList &args); private: QProcess *m_proc;