Пример #1
0
        public void ParseFile(UTF_File acbFile, bool throwExIfNewColumn)
        {
            Version version = BigEndianConverter.UIntToVersion(acbFile.GetValue <uint>("Version", TypeFlag.UInt32, 0), true);

            AddVersion(version.ToString());

            //Parse tables
            foreach (var column in acbFile.Columns)
            {
#if !DEBUG
                if (ExcludedTables.Contains(column.Name))
                {
                    continue;
                }
#endif

                var tableColumn = (column.Rows[0].UtfTable != null) ? column.Rows[0].UtfTable : column.UtfTable;

                if (tableColumn != null)
                {
                    var table = GetTable(column.Name, throwExIfNewColumn);
                    table.SetExists(version);
                    table.ParseTable(tableColumn, column.Name, version, throwExIfNewColumn);
                }
            }

            //Check if they dont exist
            foreach (var table in Tables)
            {
#if !DEBUG
                if (ExcludedTables.Contains(table.Name))
                {
                    continue;
                }
#endif

                var utfColumn = acbFile.GetColumn(table.Name);

                if (utfColumn != null)
                {
                    byte[]   columnData  = (utfColumn.StorageFlag == StorageFlag.PerRow) ? utfColumn.Rows[0].Bytes : utfColumn.Bytes;
                    UTF_File columnTable = (utfColumn.StorageFlag == StorageFlag.PerRow) ? utfColumn.Rows[0].UtfTable : utfColumn.UtfTable;

                    if (columnTable == null && columnData == null)
                    {
                        continue;                                            //Table does not exist, but there is also no other data... skip
                    }
                    if (columnTable != null)
                    {
                        continue;                      //Table exists
                    }
                    //Handle StreamAwbHash table. This can be a UtfTable or a Byte array depending on ACB version, or if a stream AWB is present (can be null 16 bytes if there is no external AWB, even on newer versions with UtfTable)
                    if (columnTable == null && columnData != null && table.Name == "StreamAwbHash")
                    {
                        bool valid = true;

                        foreach (var _byte in columnData)
                        {
                            if (_byte != 0)
                            {
                                valid = false;
                            }
                        }

                        if (valid)
                        {
                            continue;
                        }
                    }
                }

                //Doesn't exist
                table.SetDoesNotExist(version);
            }


            //Parse all header columns
            Header.ParseTable(acbFile, "Header", version, throwExIfNewColumn);

            //Sort columns
            Sort();
        }