【发布时间】:2017-04-25 21:31:31
【问题描述】:
我正在尝试监听打印机状态变化(例如卡纸、暂停...) 以下代码给出“Bad notify-recipient-uri”响应,然后锁定 ippReadFile 并且在打印机暂停时不释放/未暂停。
int main()
{
http_t *http = httpConnectEncrypt(cupsServer(), ippPort(),
cupsEncryption());
ipp_t *request = ippNewRequest(IPP_CREATE_PRINTER_SUBSCRIPTION);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, "ipp://localhost:631/printers/Generic-text-only");
ippAddString(request, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI, "notify-recipient-uri",
NULL, "cups_test://");
ippAddString(request, IPP_TAG_SUBSCRIPTION, IPP_TAG_KEYWORD, "notify-events",
NULL, "printer-state-changed");
ipp_t *response = cupsDoRequest(http, request, "/");
while (1)
{
ipp_state_t state;
ipp_t *event = ippNew();
while ((state = ippReadFile(0, event)) != IPP_DATA)
{
printf("%s\n","Got Data");
}
printf("%s\n","Repeating");
ippDelete(event);
}
}
筛选完打印机属性后,我发现notify-schemes-supported 属性设置为“dbus”。我无法使用IPP_SET_PRINTER_ATTRIBUTES 更改属性。关于如何让它发挥作用的任何想法?
【问题讨论】:
-
我对杯子不太熟悉,但我注意到您将文件描述符 0 作为第一个参数传递给
ippReadFile(int fd, ipp_t *ipp)。文件描述符 0 是标准输入。是否有理由期望程序的标准输入中出现任何内容?否则,正如您所描述的,它会挂起也就不足为奇了。如果您使用ippRead(http, event)会怎样? -
ippRead(http, event)没有锁定,所以它只是无限循环。如果这段代码来自 github.com/apple/cups/blob/master/notifier/testnotify.c 和 github.com/apple/cups/blob/master/test/… ,我会得到一些。我完全有可能完全错了,尽管我不认为是这样。 -
根据我的一本关于杯子的书,CUPS:Michael Sweet 的通用 UNIX 打印系统,“通知程序为 CUPS 提供了一种通知用户或程序有关服务器、打印机或一项工作。ippget 通知方案是在 CUPS 服务器内部实现的,而所有其他 CUPS 通知程序都是在其标准输入文件上接收事件的外部程序。"
-
“在他们的标准输入上接收事件”肯定会让你的程序听起来像是在标准输入上得到一些东西,所以也许你在正确的轨道上。祝你好运。
-
我放弃了。我为此浪费了将近一个月的时间。令人惊讶的是,它只需要 3 行代码和一些谷歌搜索就可以弄清楚如何获取打印机状态,但上帝禁止你想锁定它。我将制作一个每 10 秒询问一次状态的程序,然后我会将其发布为答案。