このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
今日から、1 つずつクライアントメッセージを紹介しよう。
まずは SetPixelFormat メッセージだ。
これは種類 0 番のクライアントメッセージで、
クライアントが画素形式を変更する際に送られる。
このメッセージは 20 バイト固定長で、
以下のような構造を持つ。
U8 messageType; // 常に 0
U8 reserved[3]; // 3 バイトの詰め物
PIXEL_FORMAT format; // クライアントの望む画素形式
画素形式は、初期化時にサーバから送られる、
ServerInit メッセージにて既定値が決定されるのだが、
クライアントがそれを望まない場合、
SetPixelFormat を送ることで形式を自由に変える事ができる。
========== SetPixelFormatMessage.java ==========
package jp.loafer.rfb.message.client;
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.PixelFormat;
/**
* SetPixelFormat クライアントメッセージ。
* @author kes
*/
public class SetPixelFormatMessage extends BaseClientMessage {
/**
* 永続化用既定コンストラクタ。
*/
public SetPixelFormatMessage() {
format = new PixelFormat();
}
/**
* SetPixelFormat メッセージを作成。
* @param format 画素形式。
*/
public SetPixelFormatMessage(PixelFormat format) {
if (format == null)
throw new IllegalArgumentException("format must not be null");
this.format = format;
}
/**
* 画素形式を取得。
* @return 画素形式。
*/
public PixelFormat getFormat() {
return format;
}
/**
* @see ClientMessage#getType()
*/
public int getType() {
return ClientMessage.SET_PIXEL_FORMAT;
}
/**
* @see ClientMessage#read(RFBContext, RFBInputStream)
*/
@Override
public void read(RFBContext context, RFBInputStream in) throws IOException {
super.read(context, in);
in.readU8();
in.readU8();
in.readU8();
format = in.readMessage(context, PixelFormat.class);
}
/**
* @see ClientMessage#write(RFBContext, RFBOutputStream)
*/
@Override
public void write(RFBContext context, RFBOutputStream out) throws IOException {
super.write(context, out);
out.writeU8(0);
out.writeU8(0);
out.writeU8(0);
out.writeMessage(context, format);
}
private PixelFormat format;
}
========== end of SetPixelFormatMessage.java ==========
これを受け取ったサーバは、メッセージの内容に沿って、
送信する画素形式を変更しなければならない。
また、RFB の仕様によればなんとサーバには拒否権がない。
ということは、サーバはあらゆる画素形式に
対応しなければならない事になる。