このアーカイブは同期化されません。 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 では、通信時のバージョンを元に
クラス自身で文字列の有無を自己管理させておく。