/// <summary>
 /// Creates a new <see cref="ReleaseManifestFolderEntry"/> from its name and its folder.
 /// </summary>
 /// <param name="name">Name of the folder.</param>
 /// <param name="nameIndex">Position of the name of the folder in <see cref="Names"/></param>
 /// <param name="folder"><see cref="ReleaseManifestFolderEntry"/> the new folder belongs to.</param>
 public ReleaseManifestFolderEntry(string name, int nameIndex, ReleaseManifestFolderEntry parent) : this()
 {
     this.Name      = name;
     this.NameIndex = nameIndex;
     this.Parent    = parent;
 }
Пример #2
0
        /// <summary>
        /// Parses Release Manifest File content from a previously initialized <see cref="BinaryReader"/>.
        /// </summary>
        /// <param name="br"><see cref="BinaryReader"/> instance holding Release Manifest File content.</param>
        private void Read(BinaryReader br)
        {
            string readMagic = Encoding.ASCII.GetString(br.ReadBytes(4));

            if (!String.Equals(readMagic, "RLSM"))
            {
                throw new InvalidMagicNumberException(readMagic);
            }
            this.MajorVersion = br.ReadInt16();
            this.MinorVersion = br.ReadInt16();

            int projectNameIndex = br.ReadInt32();

            this.ReleaseVersion = br.ReadUInt32();

            int folderCount = br.ReadInt32();

            List <ReleaseManifestFolderEntry> folders = new List <ReleaseManifestFolderEntry>();

            for (int i = 0; i < folderCount; i++)
            {
                folders.Add(new ReleaseManifestFolderEntry(br));
            }

            int fileCount = br.ReadInt32();

            List <ReleaseManifestFileEntry> files = new List <ReleaseManifestFileEntry>();

            for (int i = 0; i < fileCount; i++)
            {
                files.Add(new ReleaseManifestFileEntry(br));
            }

            int nameCount         = br.ReadInt32();
            int nameSectionLength = br.ReadInt32();

            this.Names.AddRange(Encoding.ASCII.GetString(br.ReadBytes(nameSectionLength)).Split('\0'));
            if (nameCount != this.Names.Count)
            {
                this.Names.RemoveRange(nameCount, this.Names.Count - nameCount);
            }

            this.ProjectName = this.Names[projectNameIndex];

            // Assigning names and parent/sub entries to all file and folder entries
            foreach (ReleaseManifestFolderEntry folderEntry in folders)
            {
                folderEntry.Name = this.Names[folderEntry.NameIndex];
                for (int i = 0; i < folderEntry.SubFolderCount; i++)
                {
                    folders[folderEntry.SubFolderStartIndex + i].Parent = folderEntry;
                    folderEntry._folders.Add(folders[folderEntry.SubFolderStartIndex + i]);
                }
                for (int i = 0; i < folderEntry.FileCount; i++)
                {
                    files[folderEntry.FileListStartIndex + i].Folder = folderEntry;
                    folderEntry._files.Add(files[folderEntry.FileListStartIndex + i]);
                }
            }
            foreach (ReleaseManifestFileEntry fileEntry in files)
            {
                fileEntry.Name = this.Names[fileEntry.NameIndex];
            }
            this.Project = folders[0];
        }