Xlet間の通信

Xlet間の通信機構であるIXC (Inter Xlet Communication)のサンプルコード。

 

セキュリティ上、異なるXletは別のクラスローダによりロードされることになっており、別のXletのメソッドや変数を直接参照することはできない。その代わりとしてIXC(Inter Xlet Communication)という仕組みを使い、インタフェースを公開したり、公開されたインタフェースを通じてメソッド呼び出しなどを行うことが可能となっている(署名つきXletに限る)。

 

本サンプルは以下のJavaプログラムで構成され、MyLoggerインタフェースを通じてMainがMonitorにログ出力をさせるようになっている。
  • MyLogger.java: 公開インタフェースであるMyLoggerの定義。
  • Monitor.java: MyLoggerインタフェースを実装するXlet。Title unbound application
  • Main.java:MyLoggerインタフェースを通じてMonitor xletの機能を呼び出すXlet
なお、BD-J Object fileには「Title unbound application用設定」と同じものを使用。

 

MyLogger.java

import java.rmi.Remote;
 
// java.rmi.Remoteインタフェースを継承
public interface MyLogger extends Remote {
    // logを出力するメソッド
    public void log(String s) throws java.rmi.RemoteException;
    static public final int C = 9999;
}

 

Monitor.java

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.rmi.RemoteException;
 
import javax.tv.service.SIManager;
import javax.tv.service.selection.ServiceContextFactory;
import javax.tv.xlet.Xlet;
import javax.tv.xlet.XletContext;
 
import org.bluray.net.BDLocator;
import org.bluray.ti.Title;
import org.bluray.ti.selection.TitleContext;
import org.dvb.io.ixc.IxcRegistry;
import org.havi.ui.HScene;
import org.havi.ui.HSceneFactory;
import org.havi.ui.HScreen;
 
// 公開するインタフェースであるMyLoggerを実装
public class Monitor implements Xlet, MyLogger {
    int x=100, y=100;
    Graphics g = null;
    public void initXlet(XletContext xc){
        try {
            IxcRegistry.bind( xc, "Logger", this ); // インタフェースを公開
            HScene hs= HSceneFactory.getInstance().getFullScreenScene(
                    HScreen.getDefaultHScreen().getDefaultHGraphicsDevice());
            Font font = new Font(null, java.awt.Font.BOLD, 48);
            hs.setFont(font);
            hs.setVisible(true);
            g = hs.getGraphics();
 
            TitleContext tc = (TitleContext) ServiceContextFactory.getInstance().getServiceContext(xc);
            SIManager sim = SIManager.createInstance();
            Title t = (Title)sim.getService(new BDLocator("bd://1"));
            tc.select(t);
        } catch (Throwable thr){
        }
    }
    public void startXlet(){    }
    public void pauseXlet(){    }
    public void destroyXlet(boolean unconditional){}
    // 公開するインタフェースを実装
    public void log(String s) throws RemoteException {
        g.setColor(Color.white);
        g.drawString(s, x, y); y+=50;
    }
}

 

Main.java

import javax.tv.xlet.Xlet;
import javax.tv.xlet.XletContext;
import org.dvb.io.ixc.IxcRegistry;
 
public class Main implements Xlet{
    MyLogger r = null;;
    // インタフェースのIDは実装しているクラスの/organization_id/application_id/インタフェースIDで示す
    final String LOGGER = "/7fff0001/4000/Logger";
    public void initXlet(XletContext xc){
        try {
            do { // 目的とするインタフェースが公開されるまで待つ
                String[] ss = IxcRegistry.list(xc); // インタフェースのリストを取得
                for(int i = 0; i < ss.length; i++  ){
                    if( ss[i].equals(LOGGER) ){
                        r = (MyLogger) IxcRegistry.lookup(xc, LOGGER); // インタフェースを取得
                        break;
                    }
                }
            } while( r == null);
            r.log("initXlet"); // インタフェースを使用
        } catch (Throwable thr){
        }
    }
    public void startXlet(){
        try {
            r.log("startXlet"+Integer.toString(r.C)); // クラス変数Cを参照
        } catch (Throwable thr){
        }
    }
    public void pauseXlet(){    }
    public void destroyXlet(boolean unconditional){
        try {
            r.log("destroyXlet");
        } catch (Throwable thr){
        }
    }
}

関連する項目

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください