using System; using System.Collections.Generic; namespace Hack.Xenosaga.Common { public class listPathElement { private pathElement p_root; private List p_index; private Dictionary p_mappedIndex; public listPathElement() { p_root = new pathElement(true) { Name = "" }; p_index = new List(); p_mappedIndex = new Dictionary(); addToIndex(p_root); } public void addToIndex(pathElement entry) { if (p_mappedIndex.ContainsKey(entry.FullPath)) throw new Exception(String.Format("Entry {0} already exists", entry.FullPath)); p_mappedIndex.Add(entry.FullPath, entry); p_index.Add(entry); } public IEnumerable getEntries() { foreach (pathElement entry in p_index) yield return entry; } public pathElement Root { get { return p_root; } set { p_root = value; } } private static int CompareElementBySector(pathElement A, pathElement B) { if (A.Sector == B.Sector) return 0; else if (A.Sector > B.Sector) return 1; else if (A.Sector < B.Sector) return -1; else return 0; } private static int CompareElementById(pathElement A, pathElement B) { if (A.Id == B.Id) return 0; else if (A.Id > B.Id) return 1; else if (A.Id < B.Id) return -1; else return 0; } public void SortBySector() { p_index.Sort(CompareElementBySector); } public void SortById() { p_index.Sort(CompareElementById); } } public class pathElement { private int p_id; private bool p_isDirectory; private bool p_isCompressed; private string p_name; private UInt32 p_position; private UInt32 p_sector; private UInt32 p_sizeIn; private UInt32 p_sizeOut; private string p_fullPath; private int p_level; private pathElement p_parent; private List p_entries; public pathElement(bool isDirectory) { p_parent = null; p_isDirectory = isDirectory; if (isDirectory) p_entries = new List(); } public IEnumerable getEntries() { foreach (pathElement entry in p_entries) yield return entry; } public void addEntry(pathElement entry) { entry.Parent = this; p_entries.Add(entry); } private void computeFullPath() { p_fullPath = p_isDirectory ? p_name + "/" : p_name; pathElement parent = p_parent; while (parent != null) { p_fullPath = parent.Name + "/" + p_fullPath; parent = parent.Parent; } } public int Id { get { return p_id; } set { p_id = value; } } public int Level { get { return p_level; } set { p_level = value; } } public string Name { get { return p_name; } set { p_name = value; } } public UInt32 Position { get { return p_position; } set { p_position = value; } } public UInt32 Sector { get { return p_sector; } set { p_sector = value; } } public UInt32 SizeIn { get { return p_sizeIn; } set { p_sizeIn = value; } } public UInt32 SizeOut { get { return p_sizeOut; } set { p_sizeOut = value; } } public pathElement Parent { get { return p_parent; } private set { p_parent = value; } } public bool IsDirectory { get { return p_isDirectory; } private set { p_isDirectory = value; } } public bool IsCompressed { get { return p_isCompressed; } set { p_isCompressed = value; } } public string FullPath { get { if (p_fullPath == null) computeFullPath(); return p_fullPath; } } } }