private byte[] GetFileDataFromArchive(VirtualFileDataInArchive archivedFile) { if (archivedFile.Type == FileType.Zap) { var zapData = CopyFileDataFromArchive(archivedFile); var jpgData = ConversionService.ConvertFromZapToJpg(zapData); return(jpgData); } else { var fileData = CopyFileDataFromArchive(archivedFile); return(fileData); } }
private byte[] CopyFileDataFromArchive(VirtualFileDataInArchive archiveIndex) { int bufferSize = (int)(archiveIndex.End - archiveIndex.Start) + 1; // assuming that any given file never has more bytes that max int size byte[] buffer = new byte[bufferSize]; FileStream fileStream = new FileStream(archiveIndex.ArchiveFilePath, FileMode.Open, FileAccess.Read); try { fileStream.Seek(archiveIndex.Start, SeekOrigin.Begin); fileStream.Read(buffer, 0, bufferSize); } finally { fileStream.Close(); } return(buffer); }
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); }