2007 年 2 月 8 日 23 時 59 分

ServerMessage インタフェース


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


後一歩なんだが、肝心のサーバメッセージをやってなかった。
ということで、暫くはクライアントの時と同じように、
メッセージクラスを設計していこう。

基本的なサーバは 4 個だけと少なめだが、
FramebufferUpdate メッセージには、
符号化方式というややこしい代物がついてくる。
これは RFB の目玉部分だから仕方ない。

    0 - FramebufferUpdate
    1 - SetColourMapEntries
    2 - Bell
    3 - ServerCutText

サーバメッセージはクライアントメッセージと同じく、
メッセージの長さは可変である。

まずは例によって、Message インタフェースを拡張した、
ServerMessage インタフェースを作る。

========== ServerMessage.java ==========

package jp.loafer.rfb.message.server;

import jp.loafer.rfb.message.Message;

/**
* サーバがクライアントに送る通常メッセージ。
* @author kes
*/
public interface ServerMessage extends Message {

    /**
     * フレームバッファの更新メッセージ。
     */
    public static final int FRAMEBUFFER_UPDATE = 0;   

    /**
     * カラーテーブ通知メッセージ。
     */
    public static final int SET_COLOR_MAP_ENTRIES = 1;   

    /**
     * ベル音通知メッセージ。
     */
    public static final int BELL = 2;   

    /**
     * サーバ側コピーメッセージ。
     */
    public static final int SERVER_CUT_TEXT = 3;   
   
    /**
     * メッセージの種類を取得。
     * @return メッセージの種類。
     */
    int getType();
   
}

========== end of ServerMessage.java ==========

ClientMessage と同じ考え方による実装だ。

この勢いで、既定の実装も用意してしまおう。

========== BaseServerMessage.java ==========

package jp.loafer.rfb.message.server;

import java.io.IOException;

import jp.loafer.rfb.RFBContext;
import jp.loafer.rfb.io.RFBInputStream;
import jp.loafer.rfb.io.RFBOutputStream;
import jp.loafer.rfb.message.Message;

/**
* BaseServerMessage クラス。
* @author kes
*/
public abstract class BaseServerMessage implements ServerMessage {

    /**
     * {@link BaseServerMessage} のインスタンスを作成。
     */
    public BaseServerMessage() {
        //
    }

    /**
     * @see Message#read(RFBContext, RFBInputStream)
     */
    public void read(RFBContext context, RFBInputStream in) throws IOException {
        int value = in.readU8();
        if (value != getType()) throw new IOException("Message type mismatch");
    }

    /**
     * @see Message#write(RFBContext, RFBOutputStream)
     */
    public void write(RFBContext context, RFBOutputStream out) throws IOException {
        out.writeU8((short)getType());
    }

}

========== end of BaseServerMessage.java ==========

サーバメッセージも、クライアントメッセージと同じく、
メッセージの先頭に種類を表す 1 バイトが存在する。
read や write の実装もほぼ同じだ。

しかし、こんなにも時間がかかるとは思わんかった。
だいぶ飽きてきたなぁ。いまさら中断できへんけど。



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