/// <summary>
        /// Helper method for the treeification of a list of directory descriptors.
        /// </summary>
        /// <param name="directoryId"></param>
        /// <param name="context"></param>
        private void DeserializeTreeifyDirectoryDescriptor(
            uint directoryId,
            DeserializationContext context,
            ReleaseManifestDirectoryEntry parent = null)
        {
            // construct node at index
            var directoryDescriptor = context.DirectoryDescriptors[directoryId];
            var directoryNode       = new ReleaseManifestDirectoryEntry(directoryId, context.ReleaseManifest, directoryDescriptor, parent);

            context.directoryTable[directoryId] = directoryNode;

            // associate with directory's files
            // The if statement stops us from setting lastFileId to UINT32.MAX when we are
            // a childless dir 0
            if (directoryDescriptor.FileCount != 0)
            {
                var lastFileId = directoryDescriptor.FileStart + directoryDescriptor.FileCount - 1;
                for (var fileId = directoryDescriptor.FileStart; fileId <= lastFileId; fileId++)
                {
                    context.FileParentTable[fileId] = directoryNode;
                }
            }

            // load subdirectories
            var lastSubdirectoryId = directoryDescriptor.SubdirectoryStart + directoryDescriptor.SubdirectoryCount - 1;

            for (var subdirectoryId = directoryDescriptor.SubdirectoryStart; subdirectoryId <= lastSubdirectoryId; subdirectoryId++)
            {
                DeserializeTreeifyDirectoryDescriptor(subdirectoryId, context, directoryNode);
            }
        }
Beispiel #2
0
 private void SerializeDirectory(BinaryWriter writer, ReleaseManifestDirectoryEntry directory)
 {
     writer.Write((UInt32)directory.NameStringTableIndex);
     writer.Write((UInt32)directory.SubdirectoryStart);
     writer.Write((UInt32)directory.SubdirectoryCount);
     writer.Write((UInt32)directory.FileStart);
     writer.Write((UInt32)directory.FileCount);
 }
Beispiel #3
0
 internal ReleaseManifestFileEntry(
     uint fileId,
     ReleaseManifest releaseManifest,
     ReleaseManifestFileEntryDescriptor fileDescriptor,
     ReleaseManifestDirectoryEntry parent
     )
 {
     m_id = fileId;
     m_releaseManifest = releaseManifest;
     m_descriptor      = fileDescriptor;
     m_parent          = parent;
     parent.m_files.Add(this);
 }
        public ReleaseManifestRootDirectoryOverload(ReleaseManifestDirectoryEntry directory, string name)
        {
            this.directory = directory;
            this.name      = name;

            foreach (var subdirectory in directory.m_directories)
            {
                subdirectory.m_parent = this;
            }

            foreach (var file in directory.m_files)
            {
                file.m_parent = this;
            }
        }
Beispiel #5
0
        internal ReleaseManifestDirectoryEntry(
            uint directoryId,
            ReleaseManifest releaseManifest,
            ReleaseManifestDirectoryDescriptor descriptor,
            ReleaseManifestDirectoryEntry parent
            )
        {
            m_id = directoryId;
            m_releaseManifest = releaseManifest;
            m_descriptor      = descriptor;

            m_parent = parent;
            if (parent != null)
            {
                parent.m_directories.Add(this);
            }

            m_directories = new List <ReleaseManifestDirectoryEntry>((int)descriptor.SubdirectoryCount);
            m_files       = new List <ReleaseManifestFileEntry>((int)descriptor.FileCount);
        }