2017-04-25 24 views
1

プリンタ状態の変更(紙詰まり、一時停止など)をリスンしようとしています。次のコードでは、「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

私はカップに慣れていませんが、ファイルディスクリプタ0を 'ippReadFile(int fd、ipp_t * ipp)'の最初の引数として渡していることに気づきました。ファイル記述子0は標準入力です。あなたのプログラムの標準入力に何かが現れると予想される理由はありますか?そうでなければ、あなたが記述したように、それがハングアップするのは驚くべきことではありません。 'ippRead(http、event)'を使ったらどうなるでしょうか? – MassPikeMike

+0

'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。それが完全に間違っているとは思えませんが、私はこれについて完全に間違っている可能性があります。 –

+0

私はコップに載っている本によると、CUPS:Michael SweetのCommon UNIX Printing System "Notifierは、CUPSがユーザーやプログラムにサーバー、プリンタ、ジョブの状態変化を通知する方法を提供しています。他のすべてのCUPSノーティファイアは標準入力ファイルでイベントを受け取る外部プログラムですが、CUPSサーバーでは内部的に実装されています。 –

答えて

0

Cコードを必要としない非常に基本的な例は、create-printer-subscriptionマクロに対してipptoolを使用してrss URIをイベントにサブスクライブすることです。これはpyipptoolで示されるアプローチです。

ipptoolは通常CUPSに同梱されていますが、最新のUbuntuバージョンではcups-ipp-utilsをインストールする必要があります。

まず、ソケットリスナーにイベントを送信する、...

python -m SimpleHTTPServer 9876 

第二のイベントを受け取ることができHTTPソケットリスナーを作成します。

ipptool -d recipient=rss://localhost:9876 ipp://localhost:631/printers /usr/share/cups/ipptool/create-printer-subscription.test 

最後に、プリンタを無効にするなどのイベントをトリガします。

cupsdisable PDFWriter # or some valid printer name 
cupsenable PDFWriter 

rss:// URIスキームはHTTPソケットサーバーに対してPUTのコマンドを使用します。 SimpleHTTPServerにはPUTコマンドの組み込みサポートがないため、501エラーが発生します。これらのコマンドを処理するようにHTTPリスナーをカスタマイズする必要がありますが、イベントが発生したことがわかります。

注、デフォルトcreate-printer-subscriptionマクロは、マクロのコピーを作成し、それを編集することによって調整することができるprinter-config-changedprinter-state-changedしかしnot printer-queue-order-changedのイベントを送信するように構成されています。

また、これにより、デフォルトのリース期間(86400 in the sourceとして定義され、1日である必要があります)に対してサブスクリプションがアクティブのままになります。追加のパラメータnotify-lease-durationをゼロの無期限サブスクリプションに指定することができます。

関連する問題