Ejemplo n.º 1
0
        /// <summary>
        /// Read the sequence data.
        /// </summary>
        /// <param name="br">The reader.</param>
        public void Read(BinaryDataReader br)
        {
            //Open file.
            FileReader FileReader = new FileReader();

            FileReader.OpenFile(br, out writeMode, out Version);

            //Data block.
            FileReader.OpenBlock(br, 0);

            //Get size.
            br.Position -= 4;
            uint size = br.ReadUInt32();

            //Read the sequence data. BE for WiiU and 3ds, LE for NX. Must therefore write a parser.
            List <byte> tempSeqData = br.ReadBytes((int)size - 8).ToList();

            //Trim data.
            bool foundEnd = false;

            while (!foundEnd)
            {
                //Remove padding stuff.
                if (tempSeqData[tempSeqData.Count - 1] == 0)
                {
                    tempSeqData.RemoveAt(tempSeqData.Count - 1);
                }

                //Found end.
                else
                {
                    foundEnd = true;
                }
            }

            //Close data block.
            FileReader.CloseBlock(br);

            //Label block.
            FileReader.OpenBlock(br, 1);

            //Open the reference table.
            FileReader.OpenReferenceTable(br, "Labels");

            //Go through all the references.
            Labels = new List <SequenceLabel>();
            for (int i = 0; i < FileReader.ReferenceTableCount("Labels"); i++)
            {
                //Reference is null.
                if (FileReader.ReferenceTableReferenceIsNull(i, "Labels"))
                {
                    Labels.Add(null);
                }

                //Label exist.
                else
                {
                    //Jump to label.
                    FileReader.ReferenceTableJumpToReference(br, i, "Labels");

                    //Start label info structure.
                    FileReader.StartStructure(br);

                    //Get reference to data.
                    FileReader.OpenReference(br, "ToSeqData");

                    //String size.
                    uint stringSize = br.ReadUInt32();

                    //String data.
                    string labelNow = new string(br.ReadChars((int)stringSize));

                    //Get label info.
                    Labels.Add(new SequenceLabel()
                    {
                        Offset = FileReader.ReferenceGetOffset("ToSeqData"), Label = labelNow
                    });

                    //Close reference.
                    FileReader.CloseReference("ToSeqData");

                    //End label info structure.
                    FileReader.EndStructure();
                }
            }

            //Close the reference table.
            FileReader.CloseReferenceTable("Labels");

            //Close label block.
            FileReader.CloseBlock(br);

            //Convert labels to dictionary.
            Dictionary <string, int> publicLabels = new Dictionary <string, int>();

            foreach (var e in Labels)
            {
                if (e != null)
                {
                    publicLabels.Add(e.Label, e.Offset);
                }
            }

            //Set sequence data.
            SequenceData = new SequenceData();
            SequenceData.PublicLabelOffsets = publicLabels;
            Syroot.BinaryData.ByteOrder bo = Syroot.BinaryData.ByteOrder.BigEndian;
            if (writeMode == WriteMode.NX || writeMode == WriteMode.C_BE)
            {
                bo = Syroot.BinaryData.ByteOrder.LittleEndian;
            }
            SequenceData.Read(tempSeqData.ToArray(), bo);
            goodData = tempSeqData.ToArray();

            //Close file.
            FileReader.CloseFile(br);
        }