出力制御モジュール(Output)は、ノードに送出するデータを処理するためのモジュールです。
出力処理は入力処理に比べて単純で、送信データを受けたらバッファに取り込み、出力イベントが発生したら取り込んだデータを送出するのみです。
本モジュールのバッファ処理はBuffer(バッファ制御)を使用しています。
use BBS::IO::Output;
sub onconnect {
my $self = shift;
my $me = $self->from(); # 新たに接続したノードのノード番号を取得
my $out = new BBS::IO::Output(); # オブジェクトを作成する
$self->node($me)->{'_Output'} = $out; # オブジェクトをノードテーブルに保存
}
上記コードでは新たに接続したノードに対してオブジェクトを作成し、ノードテーブルに保存します。
作成したオブジェクトはノードテーブルに保管しておく方法が最も簡単でノードテーブルはノードが切断したとき、ノードテーブルに保持されていたパラメータがすべて自動廃棄されるので、オブジェクト自ら廃棄を行う必要がありません。
sub onsend {
my $self = shift;
my $data = shift; # 送信データを取得
my $to = shift; # 送信先ノード番号を取得
my $out = $self->node($to)->{'_Output'}; # 送信先ノードのデータ領域(ノードテーブル)からのオブジェクトを取得
$out->store( $data ); # 送信データを送信バッファに取り込む
}
上記コードではノードへ送出するデータを受け取るとモジュール内の送信バッファに取り込みます。
データを送出するために関数send()が呼び出されると、送信イベントが発生しonSendハンドラが呼び出されます。
onsendハンドラは送信データと送信先ノード番号が引数として設定されているので、ハンドラルーチンから受け取ります。
受け取った送出データは関数store()を呼び出してモジュール内の送信バッファに取り込みます。
sub output {
my $self = shift;
my $me = $self->from(); # 送信先データのノード番号を取得
my $out = $self->node($me)->{'_Output'}; # 送信先ノードのデータ領域(ノードテーブル)からオブジェクトを取得
my $data = $out->fetch(); # 入力制御オブジェクトの送信バッファから送出データを取得
return $data; # 送出データを返り値にセット
}
上記コードでは出力イベントが発生すると送信バッファからデータを取り出されます。
取り出したデータはハンドラの帰り値に設定してルーチンを抜けることで、呼び出し元のイベント処理にデータが渡ります。
イベント処理に渡されたデータはノードに送出します。