Я пытаюсь прослушать изменения состояния принтера (например, замятие бумаги, пауза...) Следующий код дает ответ «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
. Любые идеи о том, как заставить это работать?
ippReadFile(int fd, ipp_t *ipp)
. Дескриптор файла 0 является стандартным вводом. Есть ли причина ожидать, что что-нибудь появится на стандартном вводе вашей программы? Иначе неудивительно, что он завис бы, как вы описали. Что, если бы вы использовалиippRead(http, event)
? - person MassPikeMike   schedule 26.04.2017ippRead(http, event)
не блокируется, поэтому он просто зацикливается бесконечно. Я получил этот код с github.com/apple/cups/ blob/master/notifier/testnotify.c и github.com/apple/cups/blob/master/test/ . Вполне возможно, что я делаю это совершенно неправильно, хотя я не думаю, что это так. - person Kyle Berezin   schedule 27.04.2017