当前位置: 首页 > 知识库问答 >
问题:

如何使用杯子API添加System V过滤器?

柳联
2023-03-14

我需要以编程方式将打印机添加到安装了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

我的第一个想法是将我想用作过滤器的文件复制到目录中,并将其命名为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正确复制我的。电视连续剧将/tmp文件过滤到/etc/cups/interfaces中,并将其命名为myptr2,就像我在程序中所做的那样,而且,就我的一生而言,我在任何cups配置文件中都找不到任何对过滤器的引用,这让我觉得我错过了一个步骤。然而,我用lpadmin添加的myptr2打印机工作正常,我用API添加的myptr打印机在打印时不通过过滤器打印。

在我进行的各种谷歌搜索中,我阅读了CUPS实现以及HTTP和IPP API文档,最接近的是,在前者中,有一条关于CUPS添加修改打印机操作的评论,内容如下:

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/杯/接口/myptr"(当然,在单独的测试中),但没有用。

谁能告诉我哪里可能出错?


共有1个答案

施晗昱
2023-03-14

好的,我从cups源代码库中找到了lpadmin的源代码,答案比我想的要简单得多。显然,我在最初的帖子中没有包含足够的信息来源。在上面的代码片段之后,我调用了以下内容:

pstHttpServer = httpConnectEncrypt("localhost", ippPort(), cupsEncryption());
pstResponse   = cupsDoFileRequest(pstHttpServer, pstRequest, "/admin/", NULL);
ippDelete(pstResponse);
httpClose(pstHttpServer);

(当然还有适用的错误检查)

我的问题的答案在NULL指针中,我将其作为第四个参数传递给cusDoFileRequest。如上所述,“[t]CUPS-Add-Modify-Printer请求可以选择后跟PPD文件或System V接口脚本。”我没有将两者联系在一起,但这句话指的是丘比特多文件请求的第四个参数,其中,如果我放置过滤器的路径,"/tmp/my.serial.filter",请求成功,my.serial.filter作为myptr正确复制到/etc/杯/接口中,之后我所有打印到myptr的内容都按预期通过过滤器。

因此,最终的解决方案是将上面的PST响应行更改如下:

pstResponse   = cupsDoFileRequest(pstHttpServer, pstRequest, "/admin/", "/tmp/my.serial.filter");
 类似资料:
  • 它显示当我从选择选项中选择过滤器,但当我改变选择另一个值的过滤器它不重置表,但它追加新的结果与旧的结果它不应该过滤它应该过滤时,选择过滤器选项。 我的PHP从数据库中获取数据。 过滤超文本标记语言 AJAX调用脚本

  • 通过,我可以轻松地在方法中向添加一个筛选器。 如何使用添加筛选器?我必须使用XML吗? 为了帮助其他人更容易地理解Spring Web配置,我绘制了下面的插图。 比起记住那么多东西,查它还不那么痛苦。 和一篇关于Spring Web初始化的好文章: http://www.kubrynski.com/2014/01/commanding-spring-web-initialization.html

  • 问题内容: 我将jetty嵌入到我的应用程序中,并尝试找出如何添加servlet过滤器(用于cookie处理)。Wiki和javadoc的含义不明确,我缺少什么: 我在此找到的唯一信息是一个论坛帖子,建议对此文档进行改进。 问题答案: 更新:对于Jetty版本9.2.2: 原始答案=== 如果您不想使用web.xml,请使用以下命令: 如果确实要使用web.xml而不是addFilter()方法,

  • 我想知道,在spring boot中是否有类(用于web应用程序)的注释?也许是? 我想在我的项目中添加一个自定义筛选器。 spring boot参考指南提到了关于,但我不确定如何使用它。

  • 问题内容: 我想知道,中的类(对于Web应用程序)是否有任何注释?也许@Filter吧? 我想在项目中添加自定义过滤器。 《 Spring Boot参考指南 》提到了关于 ,但是我不确定如何使用它。 问题答案: 如果您要设置第三方过滤器,则可以使用FilterRegistrationBean。例如相当于web.xml 这些将是@Configuration文件中的两个bean 上面已经用spring

  • 我想在我的项目中添加一个自定义筛选器。 Spring Boot参考指南提到了关于,但我不确定如何使用它。