このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
さて、サーバ側の実装の目処が付いた。
では、RFBSession に追加といきたいところだが、
RFBSession にあまりにも詰め込みすぎているため、
このまま進めると間違いなくスパゲティになる。
そこで先に RFBSession の整理からやろう。
まずは、最も低水準のインタフェースを定める。
========== RFBHandler.java ==========
package jp.loafer.rfb;
import java.io.IOException;
import jp.loafer.rfb.io.RFBInputStream;
import jp.loafer.rfb.io.RFBOutputStream;
/**
* ストリームより RFB メッセージを入出力し、
* 処理を行う汎用ハンドラのインタフェース。
* @author kes
*/
public interface RFBHandler {
/**
* ハンドラ固有の処理を実行する。
* @param context RFB コンテキスト。
* @param in RFB 入力ストリーム。
* @param out RFB 出力ストリーム。
* @throws IOException 入出力エラー。
*/
void execute(RFBContext context, RFBInputStream in,
RFBOutputStream out) throws IOException;
}
========== end of RFBHandler.java ==========
RFBHandler は RFB の処理を表す簡潔なインタフェースだ。
このインタフェースを実装したクラスを作るだけで、
単純に処理を幾つかのクラスに分ける事ができる。
例えば、RFBSession#processNullSecurity とか、
RFBSession#processProtocolVersion とかは、
RFBHandler#execute と同じシグネチャにしてあったため、
これらは容易に個別クラスに分けることができるはずだ。
次に、None セキュリティや、VNC 認証などの処理を表す、
SecurityHandler インタフェースを定める。
========== SecurityHandler .java ==========
package jp.loafer.rfb.server;
import jp.loafer.rfb.RFBHandler;
/**
* セキュリティ処理を表すインタフェース。
* @author kes
*/
public interface SecurityHandler extends RFBHandler {
/**
* 無効なセキュリティ処理。
*/
public static final int INVALID = 0;
/**
* 認証なし。
*/
public static final int NONE = 1;
/**
* VNC 認証。
*/
public static final int VNC_AUTHENTICATION = 2;
/**
* セキュリティ処理の種類を取得。
* @return セキュリティ処理の種類。
*/
int getType();
}
========== end of SecurityHandler.java ==========
SecurityHandler は RFBHandler の一種で、
セキュリティ処理を行うものだ。
セキュリティ処理には個別に種類を表す番号があるので、
それを返す getType メソッドを定義している。
これにより、RFBSession#processNullSecurity と
RFBSession#processVNCAuthentication が、
SecurityHandler 実装クラスに分解できるはずだ。