VFSのアップデート

VFSをアップデートするサンプルコードである。
本サンプルコードでは、「BUDAへのファイルの追加」で追加した次のファイルを用いて、VFSのアップデートと解除を交互に行っている。
  • <bluray.bindingunit.root> / <organization_id> / <disc_id> / BUDA.test
  • <bluray.bindingunit.root> / <organization_id> / BUDA.test2

 

また、BUDAに書き込んだファイルがVirtual Packageのルートディレクトリにマッピングされるよう、BUMFには以下のものを使用している。

sample.xmf

<?xml version="1.0" encoding="UTF-8"?>
 
<bumf:manifest xmlns:bumf="urn:BDA:bdmv;manifest"
	ID="0x00000001"
	orgID="0x7fff0001"
	discID="0x00000000000000000000000000000001" >
<Assets>
   <Asset VPFilename="BUDA.test">
      <BUDAFile name="7fff0001/1/BUDA.test"></BUDAFile>
   </Asset>
   <Asset VPFilename="BUDA.test2">
      <BUDAFile name="7fff0001/BUDA.test2"></BUDAFile>
   </Asset>
</Assets>
 
</bumf:manifest>

 

本サンプルコードが意図したとおりに動作するために必要な条件を以下にリストアップする。

 

Main.java

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.io.File;
import javax.tv.service.selection.ServiceContextFactory;
import javax.tv.xlet.Xlet;
import javax.tv.xlet.XletContext;
import org.bluray.ti.Title;
import org.bluray.ti.selection.TitleContext;
import org.bluray.vfs.VFSManager;
import org.havi.ui.HScene;
import org.havi.ui.HSceneFactory;
import org.havi.ui.HScreen;
 
public class Main implements Xlet {
    private XletContext  xc;
    String media_root = System.getProperty("bluray.vfs.root");
    String BUMFDir = media_root+File.separator+"Upload";
    Graphics g = null;
    int x = 100, y = 100;
 
    public void initXlet(XletContext context) {
        xc = context;
        boolean isUpdated = false; // アップデート済みかどうかを示すフラグ
 
        try {
            Font font = new Font(null, java.awt.Font.BOLD, 48);
            HScene hs= HSceneFactory.getInstance().getFullScreenScene(
                    HScreen.getDefaultHScreen().getDefaultHGraphicsDevice());
            hs.setFont(font);
            hs.setVisible(true);
            g = hs.getGraphics();
            g.setColor(Color.white);
            // Virtual Packageのルート直下にあるディレクトリ/ファイルのリスト作成
            String[] flist = new File(media_root+File.separator).list();
            String s = "Files/Directories under /: ";
            for( int i = 0; i < flist.length; i++ ){
                s += (flist[i]+" ");
                if( flist[i].equals("BUDA.test")) isUpdated = true; // BUDA.testがあったらアップデート済みと判断
            }
            g.drawString(s, x, y); y += 50;
            // VFSManagerを取得
            VFSManager manager = VFSManager.getInstance();
            if( isUpdated ){
                // アップデート済みならアップデートを解除
                g.drawString("Start cancelling updated VFS...", x, y); y+=50;Thread.sleep(1000);
                manager.requestUpdating(null, null, true);
            } else {
                // 未アップデートなら、/UpdateにあるBUMFとBUSFを使ってアップデート
                g.drawString("Start updating VFS...", x, y); y+=50;Thread.sleep(1000);
                manager.requestUpdating(BUMFDir + File.separator + "sample.xml",
                        BUMFDir + File.separator + "sample.sf", true);
            }
        } catch (Throwable e) {
        }
    }
 
    public void startXlet() {
        try {
        	// アップデートを有効にするため、同一タイトルをリスタート(別タイトルへの切り替えでもよい)
            TitleContext tc = (TitleContext)ServiceContextFactory.getInstance().getServiceContext(xc);
            Title t = (Title) tc.getService();
            g.drawString("Restarting the title " + t.getLocator() + "...", x, y); y+=50; Thread.sleep(1000);
            tc.start(t, true); // trueでなければリスタートしない
        } catch (Throwable e) {
        }
    }
    public void pauseXlet() {}
    public void destroyXlet(boolean unconditional) {}
}

関連する項目

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

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