[printing-japan] Bi-di資料

Yasumasa TORATANI toratani.yasumasa @ canon.co.jp
2003年 12月 4日 (木) 15:54:46 PST


虎谷です。

On Thu, 04 Dec 2003 14:33:42 +0900
Masaki IWATA <iwata @ axe-inc.co.jp> wrote:

> アックスの岩田です。
> 
> 虎谷 樣
> 
> Bi-di API のことでお尋ね致します。
> まだ、根本的な理解が不足しておりますので、間抜けなことも
> 訊いてしまうと思いますが、お許し下さい。

いえいえ。
抜けを指摘して頂けると有り難いです。
宜しくお願い致します。

> また、既に議論されている内容がございましたら、過去ログの
> 参照箇所を教えて頂ければ幸いです。

この辺りは、以前のミーティングで議論したことなので、ログには
残ってないかもしれません。

逆に以前のミーティングで話したことと違っていたら、指摘して
もらえると助かります >皆様

> --
> 
> bidiNew() には、引数にプリンタポートの fd が含まれていない
> ようなのですが、どのように制御されるのでしょうか?

プリンタポートは、Bi-di Plug-inの呼び元がオープンして、
bidiNew関数の引数として渡します。
通常の場合、fdRead == fdWriteとなりますが、それらが異なる場合も
想定して、2つのfdをbidiNew関数に渡すようにしています。

> BiDiC 型の定義の記述が見当たらないのですが、実装依存という
> ことでしょうか?

はい。実装依存です。

> また、BiDiC 型はポインタでしょうか?
>   BiDiC bidiNew(...);
> という定義と、
>   void bidiDestroy(BiDiC *pBiDiC);
> という利用法に、若干とまどっております。

すみません。誤記です。
   BiDiC *bidiNew(...);
が正しいです。修正します。

> bidiNew() で指定する fdRead,fdWrite と、bidiGetReadFD(),
> bidiGetWriteFD() で取得する fd の関係は、どのようになって
> いるのでしょうか?

共有ライブラリ型の Bi-di Plug-in module を bidiNewで指定する場合
bidiNewで与える fdRead,  fdWrite は、bidiGetReadFD, bitiGetWriteFD
関数で取得される fd と同じになります。

一方、プロセス型の Bi-di Plug-in moduleを bidiNewで指定する場合
bidiNewで与える fdRead, fdWrite は、Bi-di Plug-inプロセスに引き
継がれ、さらにBi-di Plug-inプロセスと呼び元のプロセスの間に
4つのパイプが構築されます。そのパイプの呼び元側のデータ転送用の
fd が、bidiGetReadFDと bidiGetWriteFD関数で返ることになります。

> bidiGetReadFD() によって取得する fd によってデータを受け取
> る場合と、bidiStartRead(),bidiRead(),bidiEndRead() コマンド
> 群を利用する場合の相関関係はどのようになっているのでしょう?
> 併用/同時使用は可能なのでしょうか?
> また、fd を利用する場合も、bidiStartRead(),bidiEndRead() を
> 発行する必要があるということでしょうか?
> 
> Write 系も同様でしょうか?

併用は可能と言えば可能です。

例えば共有ライブラリ型の Bi-di Plug-inの場合、bidiGetReadFDから
取得した fd から直接データをリードすると、プリンタからの生の
ステータスデータを取得できるでしょう。
一方、bidiRead関数を通した場合は、Printer MIB XML形式で
ステータス情報が呼び元に返ります。

しかし、プリンタから生のステータスをreadした後、bidiRead関数を
用いてステータスをreadする際に、正しくステータスが読み込めるか
否かは、実装依存になると思います。

そのような意味で、bidiGetReadFDや、bidiGetWriteFDによって
取得された fd を直接使うのは、好ましくないでしょう。それらの fd は
select による処理の分岐だけに用いるのが良いと思います。

> また、process タイプの場合
> 
> コマンドラインオプションの説明で、
>   ・これらのパイプは、Bi-di Plug-in module process の起動に
>     先だって呼び元によって生成されなければならない。
>   ・呼び元は Data Reading Pipe の file descripter を bidiGe-
>     tReadFD 関数で、Data Writing Pipe の dile descripter を
>     bidiGetWriteFD 関数で取得する。
> とありますが、これも相関関係が掴めません。

呼び元は、プロセス型の Bi-di Plug-inをforkする前に、それと
通信するための4つのパイプを生成して、Bi-di Plug-in moduleを
execする際に、生成したディスクリプタの値を引数で渡し、呼び元
には、bidiGetReadFD, bidiGetWriteFDによって、Data Reading Pipe
と Data Writing Pipe のfdを返す、ということです。
(ラッパーが返します)

> コマンド送受のパイプの説明で、
>   ・Command Writing Pipe および Command Reading Pipe は呼び
>     元からは直接は参照されず、Bi-di Plug-in API の内部処理
>     において利用される。
> という文章の意図するものがよく解らないのですが、これは、ラッ
> パーが処理するから意識する必要がない、という意味でしょうか?
> ( process タイプ Bi-di 用のラッパーもあるのですよね?)

そのとおりです。

> ところで、ジョブのキャンセル処理なのですが、bidiCancelJob()
> は、CUPS からのキャンセル指示のためにあるものだと思うのです
> が、これをプリンタステータスユーティリティからも指示できる
> ようにするというような予定があるのでしょうか?

CUPSからということは、Type Aですよね。

CUPS からジョブのキャンセルが発行されると、backendには
SIGTERMが発行されます。backendは、SIGTERMを受信したら
ジョブのキャンセル処理を実行するようにします。

ジョブのキャンセル処理では、bidiCancelJob、bidiEndJob, 
bidiDestroyが呼ばれなければなりません。

-----------------------------------------
Yasumasa TORATANI
Computer Technology Development Dept. 12
CANON INC. Shimomaruko Office, Japan





More information about the Printing-japan mailing list