Exemplo n.º 1
0
        public byte[] GetEntryContent(XdbfEntry entry)
        {
            var contentAddress = GetRealAddress(entry.AddressSpecifier);

            BinMap.Add(contentAddress, entry.Length,
                       entry.IsSyncData ? "SyncData" : entry.IsSyncList ? "SyncList" : String.Empty,
                       entry.Type.ToString());
            return(Binary.ReadBytes(contentAddress, entry.Length));
        }
Exemplo n.º 2
0
        public void Parse()
        {
            if (IsParsed)
            {
                return;
            }

            foreach (var entry in CollectParseEntries())
            {
                var content = GetEntryContent(entry);
                AddEntry(entry, content);
            }
            IsParsed = true;
            BinMap.ClearCache();
        }
Exemplo n.º 3
0
        protected virtual void Initialize()
        {
            IsParsed     = false;
            Entries      = new List <XdbfEntry>();
            Achievements = new EntryList <AchievementEntry>(this);
            Images       = new EntryList <ImageEntry>(this);
            Settings     = new SettingList(this);
            Strings      = new EntryList <StringEntry>(this);
            TitlesPlayed = new EntryList <TitleEntry>(this);
            AvatarAwards = new EntryList <AvatarAwardEntry>(this);
            TheUnknowns  = new EntryList <ImageEntry>(this); //HACK

            var pos = HeaderSize;

            for (var i = 0; i < EntryTableLength; i++)
            {
                BinMap.Add(pos, EntrySize, String.Empty, "XdbfEntry", null, null, i >= EntryCount);
                if (i < EntryCount)
                {
                    var entry = ModelFactory.GetModel <XdbfEntry>(Binary.ReadBytes(pos, EntrySize));
                    if (entry.Type != EntryType.Unknown)
                    {
                        Entries.Add(entry);
                    }
                    BinMap.Add(pos, EntrySize, entry.Type.ToString(), "XdbfEntry", entry.Length, (entry.IsSyncList ? "SyncList" : entry.IsSyncData ? "SyncData" : String.Empty), i >= EntryCount);
                    //Debug.WriteLine("[{0}] {1}", entry.Id, entry.Type);
                }
                pos += EntrySize;
            }

            FreeSpace = new List <XdbfFreeSpaceEntry>();
            for (var i = 0; i < FreeSpaceTableLength; i++)
            {
                BinMap.Add(pos, FreeSpaceEntrySize, String.Empty, "XdbfFreeSpaceEntry", null, null,
                           i >= FreeSpaceTableEntryCount);
                if (i < FreeSpaceTableEntryCount)
                {
                    var entry = ModelFactory.GetModel <XdbfFreeSpaceEntry>(Binary.ReadBytes(pos, FreeSpaceEntrySize));
                    FreeSpace.Add(entry);
                    var contentAddress = GetRealAddress(entry.AddressSpecifier);
                    BinMap.Add(contentAddress, entry.Length, "<EMPTY>", "Unallocated content", null, null, true);
                }
                pos += FreeSpaceEntrySize;
            }
        }
Exemplo n.º 4
0
        public void Rebuild()
        {
            if (!IsParsed)
            {
                Parse();
            }

            _rebuildAddress = 0;
            _rebuildIndex   = 0;
            RewriteEntryList(Achievements, AchievementComparer.Instance);
            RewriteEntryList(Images);
            RewriteEntryList(Settings);
            RewriteEntryList(TitlesPlayed, TitleComparer.Instance);
            RewriteEntryList(Strings);
            RewriteEntryList(AvatarAwards);
            RewriteEntryList(TheUnknowns);
            EntryCount = _rebuildIndex;
            var eraser = new byte[(EntryTableLength - EntryCount) * EntrySize + FreeSpaceTableLength * FreeSpaceEntrySize];

            Binary.WriteBytes(HeaderSize + EntryCount * EntrySize, eraser, 0, eraser.Length);
            var freeSpaceAddress = GetRealAddress(_rebuildAddress);

            if (BinarySize == freeSpaceAddress)
            {
                Binary.EnsureBinarySize(BinarySize + 0x1000);
            }
            var freeSpaceLength = BinarySize - freeSpaceAddress;

            eraser = new byte[freeSpaceLength];
            Binary.WriteBytes(freeSpaceAddress, eraser, 0, eraser.Length);

            FreeSpaceTableEntryCount = 1;
            var freeSpaceEntry = FreeSpace[0];

            freeSpaceEntry.AddressSpecifier = freeSpaceLength;
            freeSpaceEntry.Length           = -1 * freeSpaceLength - 1;
            Binary.WriteBytes(HeaderSize + EntryTableLength * EntrySize, freeSpaceEntry.Binary.ReadAll(), 0, FreeSpaceEntrySize);
            BinMap = new BinMap();

            Initialize();
            Parse();
        }