~~NOTOC~~ ---json { "canonical":"projects:bbs_pm:docs:bbs:io:output", "title":"Output", "description":"Output" } --- \\ ====== Output ====== 出力制御モジュール(Output)は、ノードに送出するデータを処理するためのモジュールです。\\ 出力処理は入力処理に比べて単純で、送信データを受けたらバッファに取り込み、出力イベントが発生したら取り込んだデータを送出するのみです。 本モジュールのバッファ処理は[[#|Buffer(バッファ制御)]]を使用しています。\\
^ 関数名 ^ 説明 ^ | [[.:new|new()]] | オブジェクトを作成します。 | | [[.:init|_init()]] | 属性を初期化します | | [[.:fetch|fetch()]] | 送信バッファからデータを抜き出します | | [[.:store|store()]] | 送信バッファにデータを取り込みます | | [[.:flush|flush()]] | 送信バッファを消去します | | [[.:len|len()]] | 送信バッファのデータ長を返します |
\\ ===== 使い方 ===== \\ ==== (1) 新たなクライアントが接続したらオブジェクトを作成しモジュールが使用できるよう準備します。 ==== use BBS::IO::Output; sub onconnect { my $self = shift; my $me = $self->from(); # 新たに接続したノードのノード番号を取得 my $out = new BBS::IO::Output(); # オブジェクトを作成する $self->node($me)->{'_Output'} = $out; # オブジェクトをノードテーブルに保存 } 上記コードでは新たに接続したノードに対してオブジェクトを作成し、ノードテーブルに保存します。\\ 作成したオブジェクトはノードテーブルに保管しておく方法が最も簡単でノードテーブルはノードが切断したとき、ノードテーブルに保持されていたパラメータがすべて自動廃棄されるので、オブジェクト自ら廃棄を行う必要がありません。\\ \\ ==== (2) 送信イベントが発生したら送信データを送信バッファに取り込みます。==== sub onsend { my $self = shift; my $data = shift; # 送信データを取得 my $to = shift; # 送信先ノード番号を取得 my $out = $self->node($to)->{'_Output'}; # 送信先ノードのデータ領域(ノードテーブル)からのオブジェクトを取得 $out->store( $data ); # 送信データを送信バッファに取り込む } 上記コードではノードへ送出するデータを受け取るとモジュール内の送信バッファに取り込みます。\\ データを送出するために関数send()が呼び出されると、送信イベントが発生しonSendハンドラが呼び出されます。\\ onsendハンドラは送信データと送信先ノード番号が引数として設定されているので、ハンドラルーチンから受け取ります。\\ 受け取った送出データは関数store()を呼び出してモジュール内の送信バッファに取り込みます。\\ \\ ==== (3) 出力イベントが発生したら送信バッファからデータを取り出します。==== sub output { my $self = shift; my $me = $self->from(); # 送信先データのノード番号を取得 my $out = $self->node($me)->{'_Output'}; # 送信先ノードのデータ領域(ノードテーブル)からオブジェクトを取得 my $data = $out->fetch(); # 入力制御オブジェクトの送信バッファから送出データを取得 return $data; # 送出データを返り値にセット } 上記コードでは出力イベントが発生すると送信バッファからデータを取り出されます。\\ 取り出したデータはハンドラの帰り値に設定してルーチンを抜けることで、呼び出し元のイベント処理にデータが渡ります。\\ イベント処理に渡されたデータはノードに送出します。 ~~DISCUSSION~~