【发布时间】:2012-07-19 18:57:48
【问题描述】:
我需要以编程方式将打印机添加到安装了 System V 过滤器的杯子中。现在我正在使用以下代码来创建添加打印机的请求:
pstRequest = ippNew();
pstRequest->request.op.operation_id = CUPS_ADD_PRINTER;
pstRequest->request.any.request_id = 1;
ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, "us-ascii");
ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, "en");
ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser());
ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_URI, "device-uri", NULL, szUri);
ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, szPrinterUri);
ippAddInteger(pstRequest, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", IPP_PRINTER_IDLE);
ippAddBoolean(pstRequest, IPP_TAG_PRINTER, "printer-is-accepting-jobs", true);
为了交流:
szUri = "serial:/dev/pts/12?baud=2400+bits=7+parity=none+flow=none";
szPrinterUri = "ipp://localhost/printers/myptr";
这似乎正确地将打印机添加到杯子系统,因为我可以使用以下命令向它发送打印:
lp -d myptr test.print
我的第一个想法是将我想用作过滤器的文件复制到/etc/cups/interfaces 目录中,并将其命名为myptr。我这样做了,给了它正确的用户、组和权限,但它似乎不起作用。我什至尝试在脚本前面加上sleep 60,但它从未出现在ps 中。
我尝试使用lpadmin 添加打印机,如下所示,它可以正常工作:
lpadmin -h localhost -p myptr2 -v "serial:/dev/pts/12?baud=2400+bits=7+parity=none+flow=none" -i /tmp/my.serial.filter
之后我必须致电cupsaccept 和cupsenable,但打印机工作正常,它通过我的过滤器发送打印。 lpadmin 正确地将 my.serial.filter 文件从 /tmp 复制到 /etc/cups/interfaces 并将其命名为 myptr2,就像我在我的程序中所做的那样,而且,对于我的一生,我找不到任何对过滤器的引用任何让我觉得我错过了一步的杯子配置文件。尽管如此,我使用lpadmin 添加的myptr2 打印机工作正常,而我使用API 添加的myptr 打印机虽然可以打印,但不通过过滤器打印。
在我进行的各种 Google 搜索中,我已经阅读了 CUPS Implementation 和 HTTP and IPP APIs Documentation,我最接近的是,在前者中,有一个对 CUPS-Add-Modify-Printer Operation 的评论内容如下:
CUPS-Add-Modify-Printer 请求可以选择后跟 PPD 文件或用于打印机的 System V 接口脚本。 “ppd-name”属性使用本地 CUPS PPD 文件覆盖附加到请求末尾的任何文件。
这导致我尝试使用
ippAddString(pstRequest, IPP_TAG_PRINTER, IPP_TAG_NAME, "ppd-name", NULL, szFilter);
将 szFilter 设置为 "/tmp/my.serial.filter" 和 "/etc/cups/interfaces/myptr"(当然,在单独的测试中),但无济于事。
谁能告诉我哪里出错了?
【问题讨论】: