2006 年 12 月 25 日 23 時 7 分

SecurityResultMessage クラス


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


バージョンによる分岐が多くなると、
コードが見づらくなってしまうため、
意味のある単位でまとめることができるデータ構造は、
独立させたクラスにしておくほうが好ましい。

そこで、ハンドシェイクの実装を行う前に、
明確な定義がある SecurityResult メッセージを、
独立したクラスにしておこう。

========== SecurityResultMessage.java ==========

package jp.loafer.rfb.message;

import java.io.IOException;

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

/**
* SecurityResult メッセージクラス。
* @author kes
*/
public class SecurityResultMessage implements Message {
   
    /**
     * 成功を表すステータス。
     */
    public static final int STATUS_OK = 0;

    /**
     * 失敗を表すステータス。
     */
    public static final int STATUS_FAILED = 1;

    /**
     * 永続化用既定コンストラクタ。
     */
    public SecurityResultMessage() {
        status = STATUS_OK;
        errorMessage = null;
    }

    /**
     * 主に成功を表す SecurityResult メッセージを作成。
     * エラーメッセージは使用しない。
     * @param status ステータスを表す STATUS_XXX 定数。
     */
    public SecurityResultMessage(int status) {
        this.status = status;
        this.errorMessage = null;
    }

    /**
     * 主に失敗を表す SecurityResult メッセージを作成。
     * @param status ステータスを表す STATUS_XXX 定数。
     * @param errorMessage エラーメッセージ。
     */
    public SecurityResultMessage(int status, String errorMessage) {
        this.status = status;
        this.errorMessage = errorMessage;
    }

    /**
     * ステータスを取得。
     * @return STATUS_XXX 定数。
     */
    public int getStatus() {
        return status;
    }

    /**
     * エラーメッセージを取得。
     * エラーメッセージは RFB 3.8 以降でしか存在しない。
     * @return エラーメッセージ。
     */
    public String getErrorMessage() {
        return errorMessage;
    }

    /**
     * @see Message#read(RFBContext, RFBInputStream)
     */
    public void read(int version, RFBInputStream in) throws IOException {

        status = in.readS32(); // U32
        if (status != STATUS_OK && status != STATUS_FAILED) {
            throw new IOException("Invalid status code.");
        }

        // エラーメッセージは 3.8 以降
        errorMessage = null;
        if (context.getVersion() >= 3008) {
            errorMessage = in.readString();
        }

    }

    /**
     * @see Message#write(RFBContext, RFBOutputStream)
     */
    public void write(int version, RFBOutputStream out) throws IOException {
       
        out.writeS32(status); // U32
       
        // エラーメッセージは 3.8 以降
        if (status != STATUS_OK && context.getVersion() >= 3008) {
            out.writeString(errorMessage);
        }

    }

    private int status;
    private String errorMessage;

}

========== end of SecurityResultMessage.java ==========

SecurityResult メッセージはどのバージョンにもあるが、
エラーメッセージを持つのは RFB 3.8 以降だけである。

メッセージクラスはデータの構造を管理するため、
read/write では、通信時のバージョンを元に
クラス自身で文字列の有無を自己管理させておく。



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