using System; using System.Diagnostics; namespace TwlBackupBlock { public enum BkpType { NORMAL, WITH_PRIVATE_SAVE, LEGACY }; /// /// ブロックの集合です。 /// public class Blocks : ICloneable { private const int NUM_BLOCKS = 15; public Block banner; public Block header; public Block signature; public Block tmd; public Block[] content; public Block publicSave; public Block subBanner; public Block privateSave; /// /// Blocksクラスの新しいインスタンスを初期化します。 /// public Blocks() { banner = new Block(); header = new Block(); signature = new Block(); tmd = new Block(); content = new Block[HeaderBody.MAX_CONTENTS]; for (int i = 0; i < HeaderBody.MAX_CONTENTS; i++) { content[i] = new Block(); } publicSave = new Block(); subBanner = new Block(); privateSave = new Block(); } /// /// 指定したインデックスのブロックにアクセスします。 /// /// インデックス。 /// 指定したインデックスのブロック。 public Block this[int index] { get { if (4 <= index && index < 4 + HeaderBody.MAX_CONTENTS) { return content[index - 4]; } else { switch (index) { case 0: return banner; case 1: return header; case 2: return signature; case 3: return tmd; case 12: return publicSave; case 13: return subBanner; case 14: return privateSave; default: Debug.Assert(false); return null; // never reach } } } } /// /// ブロック数を取得します。 /// public int Length { get { return NUM_BLOCKS; } } /// /// Blocksのディープコピーを作成します。 /// /// Blocksのコピー public object Clone() { Blocks newBlocks = new Blocks(); newBlocks.banner = (Block)banner.Clone(); newBlocks.header = (Block)header.Clone(); newBlocks.signature = (Block)signature.Clone(); newBlocks.tmd = (Block)tmd.Clone(); for (int i = 0; i < HeaderBody.MAX_CONTENTS; i++) { if (content[i].body != null) { newBlocks.content[i] = (Block)content[i].Clone(); } } newBlocks.publicSave = (Block)publicSave.Clone(); newBlocks.subBanner = (Block)subBanner.Clone(); if (privateSave.body != null) { newBlocks.privateSave = (Block)privateSave.Clone(); } return newBlocks; } } }