~~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~~