Example #1
0
 public IFFNode(String ID, Byte[] Data, IFFNode[] Children)
 {
     this.m_ID = ID;
     this.m_Data = Data;
     this.m_Parent = null;
     this.m_Children = new List<IFFNode>(Children);
 }
Example #2
0
 public IFFNode(String ID, Byte[] Data, IFFNode Parent, IFFNode[] Children)
 {
     this.m_ID = ID;
     this.m_Data = Data;
     this.m_Parent = Parent;
     if (Children == null) {
       this.m_Children = new List<IFFNode>();
     } else {
       this.m_Children = new List<IFFNode>(Children);
     }
 }
Example #3
0
 public IFFNode()
 {
     this.m_ID = String.Empty;
     this.m_Data = null;
     this.m_Parent = null;
     this.m_Children = new List<IFFNode>();
 }
Example #4
0
 public IFFNode(String ID, Byte[] Data, IFFNode Parent)
 {
     this.m_ID = ID;
     this.m_Data = Data;
     this.m_Parent = Parent;
     this.m_Children = new List<IFFNode>();
 }
Example #5
0
        private void ParseStream(Stream Stream)
        {
            Stream.Seek(0L, SeekOrigin.Begin);
              BinaryReader binaryReader = new BinaryReader(Stream);

              String ID = new String(binaryReader.ReadChars(4));
              Int32 Length;
              Byte[] Data;

              Byte[] buffer = binaryReader.ReadBytes(4);
              if (Utilities.IsAlpha(buffer)) {
            ID += new String(Encoding.ASCII.GetChars(buffer));
            buffer = binaryReader.ReadBytes(4);
              }

              if (!ID.Contains("FORM")) {
            throw new IOException("File does not contain valid FORM data.");
              }

              Length = Utilities.EndianFlip(BitConverter.ToInt32(buffer, 0));
              Data = binaryReader.ReadBytes((Int32)(Stream.Length - Stream.Position));

              Stream.Seek(0, SeekOrigin.Begin);
              buffer = binaryReader.ReadBytes((Int32)Stream.Length);

              binaryReader.Close();
              Stream.Close();

              IFFNode iffNode = new IFFNode(ID, Data);

              this.m_Node = iffNode;
              ParseNode(iffNode);

              if (this.IsDataTable) {
            this.m_DataTable = new IFFDataTable(this);
              } else {
            this.m_DataTable = null;
              }
        }
Example #6
0
        private void ParseNode(IFFNode iffNode)
        {
            MemoryStream memoryStream = new MemoryStream(iffNode.Data);
              BinaryReader binaryReader = new BinaryReader(memoryStream);

              while (memoryStream.Position < memoryStream.Length) {
            String ID = new String(binaryReader.ReadChars(4));

            IFFNode iffChild = new IFFNode();
            if (memoryStream.Position < memoryStream.Length) {
              Int32 Length = 0;
              Byte[] Data = new Byte[0];

              try {
            Byte[] buffer1 = binaryReader.ReadBytes(4);
            if (Utilities.IsAlpha(buffer1)) {
              ID += new String(Encoding.ASCII.GetChars(buffer1));
              buffer1 = binaryReader.ReadBytes(4);
            }
            Length = Utilities.EndianFlip(BitConverter.ToInt32(buffer1, 0));
            Data = binaryReader.ReadBytes(Length);
              } catch {
            iffChild.Children = new List<IFFNode>();
            iffChild.Data = null;
            iffChild.ID = ID;
            iffChild.Parent = iffNode;

            iffNode.Children.Add(iffChild);
              }

              iffChild.Children = new List<IFFNode>();
              iffChild.Data = Data;
              iffChild.ID = ID;
              iffChild.Parent = iffNode;

              iffNode.Children.Add(iffChild);

              if (iffChild.ID.Contains("FORM")) {
            ParseNode(iffChild);
              }
            } else {
              iffChild.Children = new List<IFFNode>();
              iffChild.Data = null;
              iffChild.ID = ID;
              iffChild.Parent = iffNode;

              iffNode.Children.Add(iffChild);
            }
              }

              binaryReader.Close();
              memoryStream.Close();
        }
Example #7
0
        private Byte[] ParseChildren(IFFNode[] iffNodes)
        {
            List<Byte[]> listByteArrays = new List<Byte[]>();
              foreach (IFFNode iffChunk in iffNodes) {
            listByteArrays.Add(ParseChild(iffChunk));
              }
              listByteArrays.Reverse();

              List<Byte> listBytes = new List<Byte>();
              foreach (Byte[] byteArray in listByteArrays.ToArray()) {
            listBytes.AddRange(byteArray);
              }
              listByteArrays.Clear();

              Byte[] returnValue = listBytes.ToArray();
              listBytes.Clear();

              return returnValue;
        }
Example #8
0
        private Byte[] ParseChild(IFFNode iffNode)
        {
            Byte[] childrenBytes = null;
              if (iffNode.Children.Count > 0) {
            List<IFFNode> tempChildren = new List<IFFNode>();
            tempChildren.AddRange(iffNode.Children.ToArray());
            tempChildren.Reverse();

            childrenBytes = ParseChildren(tempChildren.ToArray());

            tempChildren.Clear();
              }

              Int32 Length = 0;
              if (childrenBytes != null) {
            Length += childrenBytes.Length;
              }
              if ((iffNode.Data != null) && (!iffNode.ID.Contains("FORM"))) {
            Length += iffNode.Data.Length;
              }

              MemoryStream memoryStream = new MemoryStream();
              BinaryWriter binaryWriter = new BinaryWriter(memoryStream);

              binaryWriter.Write(Encoding.ASCII.GetBytes(iffNode.ID));
              if (Length > 0) {
            binaryWriter.Write(Utilities.EndianFlip(Length));
            if ((iffNode.Data != null) && (!iffNode.ID.Contains("FORM"))) {
              binaryWriter.Write(iffNode.Data);
            }
            if (childrenBytes != null) {
              binaryWriter.Write(childrenBytes);
            }
              }

              Byte[] returnValue = memoryStream.ToArray();
              binaryWriter.Close();
              memoryStream.Close();

              return returnValue;
        }
Example #9
0
 public void Close()
 {
     this.m_Filename = String.Empty;
       this.m_Node = null;
 }