Output

出力制御モジュール(Output)は、ノードに送出するデータを処理するためのモジュールです。

出力処理は入力処理に比べて単純で、送信データを受けたらバッファに取り込み、出力イベントが発生したら取り込んだデータを送出するのみです。

本モジュールのバッファ処理はBuffer(バッファ制御)を使用しています。

関数名 説明
new() オブジェクトを作成します。
_init() 属性を初期化します
fetch() 送信バッファからデータを抜き出します
store() 送信バッファにデータを取り込みます
flush() 送信バッファを消去します
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;                                # 送出データを返り値にセット
}

上記コードでは出力イベントが発生すると送信バッファからデータを取り出されます。

取り出したデータはハンドラの帰り値に設定してルーチンを抜けることで、呼び出し元のイベント処理にデータが渡ります。
イベント処理に渡されたデータはノードに送出します。