private void AddAnyTiledImages(VirtualFolder parentFolder) { string tileLayoutPattern = @"_\d\d_\d\d\.\w\w\w"; var matches = parentFolder.Files.Where(x => Regex.IsMatch(x.Name, tileLayoutPattern)).ToList(); if (matches.Count < 1) { return; } List <IVirtualFileEntry> tiledImages = new List <IVirtualFileEntry>(); VirtualFileTiledImage tiledImage; foreach (var match in matches) { var startOfName = Regex.Split(match.Name, tileLayoutPattern)[0]; if (tiledImages.Any(x => x.Name == startOfName)) { // add to existing var existing = tiledImages.FirstOrDefault(x => x.Name == startOfName); tiledImage = existing.FileData as VirtualFileTiledImage; } else { // create a new one tiledImage = new VirtualFileTiledImage(); tiledImage.Type = FileType.Jpg; var file = new VirtualFileEntry(startOfName, tiledImage); tiledImages.Add(file); } tiledImage.Tiles.Add(match); } parentFolder.Files.InsertRange(0, tiledImages); }
private IVirtualFolder CreateListingForArchive(string filePath, long fileEnd, byte[] headerData, bool containsSubFolders = true) { var entries = ExtractFileEntriesFromArchive(headerData, containsSubFolders); var archiveFileName = Path.GetFileName(filePath); var rootFolder = new VirtualFolder(archiveFileName); VirtualFolder currentFolder = null; int nodeCount = 0; int imageCount = 1; int spotImageCount = 1; int videoCount = 1; foreach (var entry in entries) { string fileName = entry.Type.ToString(); // TRANSFORM FILE TYPE var fileType = FileType.Unknown; if (entry.Type == Myst3ResourceType.CubeFace || entry.Type == Myst3ResourceType.Frame || entry.Type == Myst3ResourceType.LocalizedFrame || entry.Type == Myst3ResourceType.SpotItem || entry.Type == Myst3ResourceType.LocalizedSpotItem ) { fileType = FileType.Jpg; } if (entry.Type == Myst3ResourceType.Movie || entry.Type == Myst3ResourceType.MultitrackMovie || entry.Type == Myst3ResourceType.DialogMovie || entry.Type == Myst3ResourceType.StillMovie) { fileType = FileType.Bink; } if (entry.Type == Myst3ResourceType.RawData) { // could be bitmap, //could be archetype ascii text file // could be xet file fileType = FileType.Bmp; // if it starts with BM, then it's a bmp // if it starts with XET it's a xet // if it starts with ASCII it's a text file } var fileContent = new VirtualFileDataInArchive(filePath, fileType, entry.Offset, entry.Offset + entry.Size); if (entry.Type == Myst3ResourceType.CubeFace) { if (entry.CubeFace == M3CubeFace.Back) // Back is always first { nodeCount++; spotImageCount = 1; } fileName += "_" + nodeCount.ToString().PadLeft(3, '0') + "_" + entry.CubeFace.ToString().ToLower(); } if (fileType == FileType.Bink) { fileName += "_" + videoCount.ToString().PadLeft(3, '0'); videoCount++; } if (fileType == FileType.Jpg && entry.Type != Myst3ResourceType.CubeFace) { if (entry.Type == Myst3ResourceType.SpotItem || entry.Type == Myst3ResourceType.LocalizedSpotItem) { fileName = nodeCount.ToString().PadLeft(3, '0') + "_SpotItem_" + spotImageCount; spotImageCount++; } else { fileName += "_" + imageCount.ToString().PadLeft(4, '0'); imageCount++; } } // create the listing //var vFile = new VirtualFileEntry(entry.Offset + "_" + (entry.Offset + entry.Size) + "_" + entry.Type, fileContent); var vFile = new VirtualFileEntry(fileName, fileContent); if (containsSubFolders) { if (!string.IsNullOrEmpty(entry.Folder)) { if (rootFolder.SubFolders.Any(x => x.Name.ToUpper() == entry.Folder.ToUpper())) { currentFolder = rootFolder.SubFolders.FirstOrDefault(x => x.Name.ToUpper() == entry.Folder.ToUpper()) as VirtualFolder; } else { currentFolder = new VirtualFolder(entry.Folder.ToUpper()); rootFolder.SubFolders.Add(currentFolder); } currentFolder.Files.Add(vFile); } else { rootFolder.Files.Add(vFile); } } else { rootFolder.Files.Add(vFile); } } return(rootFolder); }
private long ReadFileInfo(VirtualFolder parentFolder, FileStream fileStream, long fileStart, long startIndex) { long index = startIndex; var buffer = new byte[sizeof(uint)]; fileStream.Seek(index, SeekOrigin.Begin); fileStream.Read(buffer, 0, buffer.Length); index += sizeof(uint); var fileNameSize = BitConverter.ToUInt32(buffer, 0); if (fileNameSize > 512) { throw new Exception("FileNameSize Too Big"); } buffer = new byte[fileNameSize]; fileStream.Seek(index, SeekOrigin.Begin); fileStream.Read(buffer, 0, buffer.Length); index += buffer.Length; var FileName = Encoding.ASCII.GetString(buffer); buffer = new byte[sizeof(uint)]; fileStream.Seek(index, SeekOrigin.Begin); fileStream.Read(buffer, 0, buffer.Length); index += sizeof(uint); var FileSize = BitConverter.ToUInt32(buffer, 0); buffer = new byte[sizeof(uint)]; fileStream.Seek(index, SeekOrigin.Begin); fileStream.Read(buffer, 0, buffer.Length); index += sizeof(uint); var FileOffset = BitConverter.ToUInt32(buffer, 0); var fileType = FileType.Unknown; var fileNameLowercase = FileName.TrimEnd(new char[1] { '\0' }).ToLower(); if (fileNameLowercase.EndsWith(".jpg")) { fileType = FileType.Jpg; } else if (fileNameLowercase.EndsWith(".zap")) { fileType = FileType.Zap; } else if (fileNameLowercase.EndsWith(".m4b")) { fileType = FileType.M4B; } else if (fileNameLowercase.EndsWith(".bik")) { fileType = FileType.Bink; } else if (fileNameLowercase.EndsWith(".bin")) { fileType = FileType.Binary; } else { fileType = FileType.Unknown; } if (fileType == FileType.M4B) { var folder = ReadM4BFileData(fileStream, fileNameLowercase, fileStart + FileOffset, FileOffset + FileSize); parentFolder.SubFolders.Add(folder); } else { var totalStartOffset = fileStart + FileOffset; var totalEndOffset = fileStart + FileOffset + FileSize; var thisFile = new VirtualFileEntry(fileNameLowercase, new VirtualFileDataInArchive(fileStream.Name, fileType, totalStartOffset, totalEndOffset)); parentFolder.Files.Add(thisFile); } return(index); }