1

System V フィルターがインストールされているカップにプリンターをプログラムで追加する必要があります。現在、次のコードを使用して、プリンターを追加する要求を作成しています。

pstRequest = ippNew();

pstRequest->request.op.operation_id = CUPS_ADD_PRINTER;
pstRequest->request.any.request_id  = 1;

ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, "us-ascii");
ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, "en");

ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser());
ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_URI, "device-uri", NULL, szUri);
ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, szPrinterUri);
ippAddInteger(pstRequest, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", IPP_PRINTER_IDLE);
ippAddBoolean(pstRequest, IPP_TAG_PRINTER, "printer-is-accepting-jobs", true);

会話のために:

szUri        = "serial:/dev/pts/12?baud=2400+bits=7+parity=none+flow=none";
szPrinterUri = "ipp://localhost/printers/myptr";

次のコマンドを使用してプリンターに印刷を送信できるため、これはプリンターを cups システムに正しく追加しているように見えます。

lp -d myptr test.print

私が最初に考えたのは、フィルターとして使用したいファイルをディレクトリにコピーして、/etc/cups/interfacesそれを呼び出すことでしたmyptr。私はこれを行い、正しいユーザー、グループ、およびアクセス許可を与えましたが、機能していないようです。sleep 60スクリプトの先頭にa を貼り付けてみましたが、 には表示されませんでしたps

次のように使用してプリンターを追加しようとしましたが、lpadmin正しく動作します。

lpadmin -h localhost -p myptr2 -v "serial:/dev/pts/12?baud=2400+bits=7+parity=none+flow=none" -i /tmp/my.serial.filter

私は電話をしなければcupsacceptなりませんcupsenableが、プリンターは動作し、フィルターを通して印刷物を送ります。 私のプログラムで行ったのと同じように、からファイルをlpadmin正しくコピーして名前を付けます。私の人生では、カップ構成ファイルのいずれにもフィルターへの参照が見つからないため、欠落していると思われます。ステップ。それにもかかわらず、私が追加したプリンターは正しく動作し、API を使用して追加したプリンターは印刷されますが、フィルターを介して印刷されませmy.serial.filter/tmp/etc/cups/interfacesmyptr2myptr2lpadminmyptr

私が行ったさまざまな Google 検索の中で、CUPS の実装HTTP および IPP API のドキュメントを読みましたが、最も近いものは、前者にCUPS-Add-Modifyのコメントがあることでした。 - 読み取るプリンター操作:

CUPS-Add-Modify-Printer 要求の後には、必要に応じて、プリンターに使用される PPD ファイルまたは System V インターフェイス スクリプトを続けることができます。「ppd-name」属性は、リクエストの最後に添付されたファイルをローカル CUPS PPD ファイルで上書きします。

これにより、使用してみました

ippAddString(pstRequest, IPP_TAG_PRINTER, IPP_TAG_NAME, "ppd-name", NULL, szFilter);

szFilter を と の両方"/tmp/my.serial.filter"に設定して"/etc/cups/interfaces/myptr"(もちろん別々のテストで)、しかし役に立ちません。

どこが間違っているのか誰か教えてもらえますか?

4

1 に答える 1

1

さて、cups ソース リポジトリから lpadmin のソースを入手しましたが、その答えは、作成しようとしていたよりもはるかに簡単でした。どうやら、私は最初の投稿に十分な情報源を含めていませんでした。上記のコード スニペットの後、次のように呼び出していました。

pstHttpServer = httpConnectEncrypt("localhost", ippPort(), cupsEncryption());
pstResponse   = cupsDoFileRequest(pstHttpServer, pstRequest, "/admin/", NULL);
ippDelete(pstResponse);
httpClose(pstHttpServer);

(もちろん、適切なエラーチェックを使用して)

私の質問への答えは、NULLの 4 番目の引数として渡していたポインタにありますcupsDoFileRequest。前述のように、「CUPS-Add-Modify-Printer 要求の後に、オプションで PPD ファイルまたは System V インターフェイス スクリプトを続けることができます。」2つを結び付けていませんでしたが、その文は4番目の引数を参照しておりcupsDoFileRequest、フィルターのパスを配置"/tmp/my.serial.filter"すると、リクエストは成功し、 as にmy.serial.filter正しくコピーさ/etc/cups/interfacesmyptr、その後、すべての出力myptrが通過します予想通りのフィルター。

したがって、最終的な解決策は、pstResponse上記の行を次のように変更することです。

pstResponse   = cupsDoFileRequest(pstHttpServer, pstRequest, "/admin/", "/tmp/my.serial.filter");
于 2012-07-19T21:51:38.593 に答える