2007 年 1 月 22 日 23 時 50 分

RFBDisplay インタフェース


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


メイン処理を RFBHandler だけで表現するには厳しいので、
上位水準のクラスを抽出していこう。

メイン処理においては、クライアントとサーバは、
任意にメッセージを交換するモードに突入する。

普通にメイン処理を実装した場合、
RFBInputStream からメッセージを読み出し、
その種類に基づいて処理を行うことになる。

この段階では、クライアントが送るメッセージに順番がない。
そのため、サーバがメッセージを読み出す際には、
RFBInputStream の先読みを利用して種類を判別し、
それに応じた適切なインスタンスを読み出す必要がある。

また、サーバはメッセージを読み出した後、
それに応じた処理を行うことになるので、
結果的に switch 等で分岐することになる。

恐らくここまではほとんどのサーバ実装で必要になるはずだ。
そこで、メッセージの読み出しを行い、
種類に応じてメソッドに振り分けるクラスを作ればよい。

まずは、サーバ側の仮想画面を表すインタフェースを作る。

========== RFBDisplay.java ==========

package jp.loafer.rfb.server;

import java.io.IOException;

import jp.loafer.rfb.RFBContext;
import jp.loafer.rfb.io.RFBOutputStream;
import jp.loafer.rfb.message.PixelFormat;
import jp.loafer.rfb.message.client.*;

/**
* サーバ側主処理を表すインタフェース。
* @author kes
*/
public interface RFBDisplay {

    /**
     * 仮想画面の初期化。
     * @param context 通信コンテキスト。
     * @param out 出力用ストリーム。
     * @throws IOException 入出力エラー。
     */
    void initialize(RFBContext context, RFBOutputStream out) throws IOException;

    /**
     * 仮想画面の幅を取得。
     * @return 仮想画面の幅。
     */
    public int getWidth();

    /**
     * 仮想画面の高さを取得。
     * @return 仮想画面の高さ。
     */
    public int getHeight();

    /**
     * 仮想画面の名前を取得。
     * @return 仮想画面の名前。
     */
    public String getName();

    /**
     * 仮想画面の既定の画素形式を取得。
     * @return 仮想画面の既定の画素形式。
     */
    public PixelFormat getDefaultPixelFormat();

    /**
     * SetPixelFormat メッセージの処理。
     * @param message メッセージ固有のデータ。
     * @throws IOException 入出力エラー。
     */
    void handleSetPixelFormat(SetPixelFormatMessage message) throws IOException;
   
    /**
     * FixColourMapEntries メッセージの処理。
     * @param message メッセージ固有のデータ。
     * @throws IOException 入出力エラー。
     */
    void handleFixColorMapEntries(FixColorMapEntriesMessage message) throws IOException;

    /**
     * SetEncodings メッセージの処理。
     * @param message メッセージ固有のデータ。
     * @throws IOException 入出力エラー。
     */
    void handleSetEncodings(SetEncodingsMessage message) throws IOException;

    /**
     * FramebufferUpdateRequest メッセージの処理。
     * @param message メッセージ固有のデータ。
     * @throws IOException 入出力エラー。
     */
    void handleFramebufferUpdateRequest(FramebufferUpdateRequestMessage message) throws IOException;

    /**
     * KeyEvent メッセージの処理。
     * @param message メッセージ固有のデータ。
     * @throws IOException 入出力エラー。
     */
    void handleKeyEvent(KeyEventMessage message) throws IOException;

    /**
     * PointerEvent メッセージの処理。
     * @param message メッセージ固有のデータ。
     * @throws IOException 入出力エラー。
     */
    void handlePointerEvent(PointerEventMessage message) throws IOException;

    /**
     * ClientCutText メッセージの処理。
     * @param message メッセージ固有のデータ。
     * @throws IOException 入出力エラー。
     */
    void handleClientCutText(ClientCutTextMessage message) throws IOException;

    /**
     * 未知のメッセージの処理。
     * @param message メッセージ固有のデータ。
     * @throws IOException 入出力エラー。
     */
    void handleCustomMessage(ClientMessage message) throws IOException;
   
}

========== end of RFBDisplay.java ==========

RFBDisplay は初期化時に使うサーバの属性取得メソッドと、
クライアントから受け取ったメッセージを処理する、
個別の処理系メソッドを持つ。

このインタフェースを使ってサーバを実装すれば、
メッセージの読み取り処理の実装を分離する事ができる。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.