Mercurial > repos > RelicTools > RelicTools
diff ChunkyFolder.cs @ 0:82db9430c2e4 default tip
Initial commit under GPLv3
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sat, 06 Oct 2018 19:49:25 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ChunkyFolder.cs Sat Oct 06 19:49:25 2018 +0100 @@ -0,0 +1,203 @@ +// This file is a part of the Relic Tools and is copyright 2006-2018 IBBoard. +// +// The file and the library/program it is in are licensed under the GNU GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license. +using System; +using System.IO; +using System.Text; +using IBBoard.Relic.RelicTools.Collections; + +namespace IBBoard.Relic.RelicTools +{ + /// <summary> + /// Summary description for ChunkyFolder. + /// </summary> + public class ChunkyFolder : ChunkyChunk + { + ChunkyCollection children; + + public ChunkyFolder(string ID_in, int version_in, string name_in, byte[] innerData):base(ChunkyChunkType.Folder, ID_in, version_in, name_in) + { + children = new ChunkyCollection(this); + MemoryStream ms = new MemoryStream(innerData, false); + BinaryReader br = new BinaryReader(ms); + + ChunkyChunk chunk = null; + ChunkyDataATTR attr = null; + ChunkyDataINFOTPAT info = null; + + int pos = 0; + + while (pos<innerData.Length) + { + br.BaseStream.Seek(pos, SeekOrigin.Begin); + chunk = RelicChunkReader.ReadChunkyChunk(br.ReadBytes(innerData.Length-pos), ID_in); + children.Add(chunk); + + if (chunk is ChunkyDataATTR) + { + attr = (ChunkyDataATTR)chunk; + } + else if (chunk is ChunkyDataINFOTPAT) + { + info = (ChunkyDataINFOTPAT)chunk; + } + else if (attr!=null && chunk is ChunkyDataDATA) + { + ((ChunkyDataDATA)chunk).Attributes = attr; + } + else if (info!=null && chunk is ChunkyDataLayer) + { + ((ChunkyDataLayer)chunk).Info = info; + } + + pos+=chunk.Length; + } + + } + + public ChunkyFolder(string ID_in, int version_in, string name_in):base(ChunkyChunkType.Folder, ID_in, version_in, name_in) + { + children = new ChunkyCollection(this); + } + + public ChunkyCollection Children + { + get { return children; } + } + + public override byte[] GetBytes() + { + byte[] file = new byte[this.Length]; + byte[] temp; + int pos = 0; + + System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); + + enc.GetBytes("FOLD"+id).CopyTo(file,0); + pos+= 8; + + BitConverter.GetBytes(version).CopyTo(file, pos); + pos+=4; + BitConverter.GetBytes(DataLength).CopyTo(file, pos); + pos+=4; + BitConverter.GetBytes(NameDataLength).CopyTo(file, pos); + pos+=4; + temp = this.GetNameBytes(); + temp.CopyTo(file,pos); + pos+=temp.Length; + + int childCount = this.children.Count; + + for (int i = 0; i<childCount; i++) + { + temp = children[i].GetBytes(); + temp.CopyTo(file, pos); + pos+= temp.Length; + } + + return file; + } + + public override int DataLength + { + get + { + int length = 0; + + int childCount = this.children.Count; + + for (int i = 0; i<childCount; i++) + { + length+= children[i].Length; + } + + return length; + } + } + + public override int Length + { + get + { + int length = 20; + + if (name!="") + { + //names are padded with a single null if they exist + length += name.Length + 1; + } + + length+= DataLength; + + return length; + } + } + + public int Save(string path) + { + int saves = 0; + ChunkyData data; + + foreach (ChunkyChunk child in children) + { + if (child is ChunkyFolder) + { + saves+= ((ChunkyFolder)child).Save(path); + } + else if (child is ChunkyData) + { + data = (ChunkyData)child; + if (data.Savable && data.Save(path)) + { + saves++; + } + } + } + + return saves; + } + + public override bool Savable + { + get + { + foreach (ChunkyChunk chunk in children) + { + if (chunk.Savable) + { + return true; + } + } + + return false; + } + } + + public override string GetValidationString() + { + int childCount = Children.Count; + + if (childCount>0) + { + StringBuilder sb = new StringBuilder("FOLD"+ID+"[ "); + + childCount--; + + for (int i = 0; i<childCount; i++) + { + sb.Append(Children[i].GetValidationString()+" "); + } + + sb.Append(Children[childCount].GetValidationString()); + + sb.Append(" ]"); + + return sb.ToString(); + } + else + { + return "FOLD"+ID+"[ ]"; + } + } + } +}