ctr_test_tools/TwlBkpCheck/Windows/TWLBackupBlock/Blocks.cs
n2460 feaf55c5d1 FalsifyTwlBackup:カテゴリ処理におけるマジックナンバーの排除、マルチコンテンツ対応
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_test_tools@30 6b0af911-cb57-b745-895f-eec5701120e1
2011-10-22 07:47:10 +00:00

105 lines
3.2 KiB
C#

using System;
using System.Diagnostics;
namespace TwlBackupBlock
{
/// <summary>
/// ブロックの集合です。
/// </summary>
public class Blocks : ICloneable
{
private const int NUM_BLOCKS = 14;
public Block banner;
public Block header;
public Block signature;
public Block tmd;
public Block[] content;
public Block saveData;
public Block subBanner;
/// <summary>
/// Blocksクラスの新しいインスタンスを初期化します。
/// </summary>
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();
}
saveData = new Block();
subBanner = new Block();
}
/// <summary>
/// 指定したインデックスのブロックにアクセスします。
/// </summary>
/// <param name="index">インデックス。</param>
/// <returns>指定したインデックスのブロック。</returns>
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 saveData;
case 13: return subBanner;
default:
Debug.Assert(false);
return null; // never reach
}
}
}
}
/// <summary>
/// ブロック数を取得します。
/// </summary>
public int Length
{
get
{
return NUM_BLOCKS;
}
}
/// <summary>
/// Blocksのディープコピーを作成します。
/// </summary>
/// <returns>Blocksのコピー</returns>
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.saveData = (Block)saveData.Clone();
newBlocks.subBanner = (Block)subBanner.Clone();
return newBlocks;
}
}
}