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')); this.Names.RemoveAt(this.Names.Count - 1); if (nameCount != this.Names.Count) { throw new InvalidNamesListException(); } 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]; }
public ReleaseManifestFolderEntry(string name, int nameIndex, ReleaseManifestFolderEntry parent) { this.Name = name; this.NameIndex = nameIndex; this.Parent = parent; }