我正在嘗試偵聽打印機狀態更改(例如卡紙,暫停...)以下代碼給出了「錯誤的notify-recipient-uri」響應,然後鎖定了ippReadFile,並且在打印機暫停/取消暫停。CUPS狀態更改訂閱
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)'? – MassPikeMike
'ippRead(http,event)'不會鎖定,所以它只是無限循環。我從https://github.com/apple/cups/blob/master/notifier/testnotify.c和https://github.com/apple/cups/blob/master/test/create- printer-subscription.test。我完全有可能錯誤地做這件事,雖然我不認爲是這樣。 –
根據我在杯子上的書,Michael Sweet的CUPS:通用UNIX打印系統,「通知程序爲CUPS通知用戶或程序關於服務器,打印機或作業的狀態變化的方法.ippget通知方案在CUPS服務器內部實現,而所有其他CUPS通告程序是在其標準輸入文件上接收事件的外部程序。「 –