2007 年 1 月 5 日 22 時 58 分

SetPixelFormat メッセージ


このアーカイブは同期化されません。 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 の仕様によればなんとサーバには拒否権がない。
ということは、サーバはあらゆる画素形式に
対応しなければならない事になる。



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