Ejemplo n.º 1
0
 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);
     }
 }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }