プリンタ状態の変更(紙詰まり、一時停止など)をリスンしようとしています。次のコードでは、「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。それが完全に間違っているとは思えませんが、私はこれについて完全に間違っている可能性があります。 –
私はコップに載っている本によると、CUPS:Michael SweetのCommon UNIX Printing System "Notifierは、CUPSがユーザーやプログラムにサーバー、プリンタ、ジョブの状態変化を通知する方法を提供しています。他のすべてのCUPSノーティファイアは標準入力ファイルでイベントを受け取る外部プログラムですが、CUPSサーバーでは内部的に実装されています。 –