コード例 #1
0
ファイル: SPD.cs プロジェクト: zeroark/PersonaEditor
        private void Read(StreamFile streamFile)
        {
            streamFile.Stream.Position = streamFile.Position;

            using (BinaryReader reader = new BinaryReader(streamFile.Stream, Encoding.ASCII, true))
            {
                if (reader.ReadInt32() != MagicNumber)
                {
                    throw new Exception("SPD: wrong Magic Number");
                }
                if (reader.ReadInt32() != 0x2)
                {
                }
                if (reader.ReadInt32() != streamFile.Size)
                {
                }
                if (reader.ReadInt32() != 0)
                {
                }
                if (reader.ReadInt32() != 0x20)
                {
                }
                ushort TextureCount       = reader.ReadUInt16();
                ushort KeyCount           = reader.ReadUInt16();
                int    TextureKeyPosition = reader.ReadInt32();
                int    KeyPosition        = reader.ReadInt32();

                ReadTexture(streamFile, TextureKeyPosition, TextureCount);
                ReadKey(streamFile, KeyPosition, KeyCount);
            }
        }
コード例 #2
0
        public StreamResult GetVideo()
        {
            try
            {
                StreamFile sf = new StreamFile();
                bool       containHeaderInfo = HttpContext.Request.Headers.ContainsKey("Accept");

                if (containHeaderInfo)
                {
                    Microsoft.Extensions.Primitives.StringValues headers;
                    if (HttpContext.Request.Headers.TryGetValue("Accept", out headers))
                    {
                        // Check for vide and wild card. Only firefox had the actual video type
                        if (headers.ToString().Contains("video") || headers.ToString().Contains("*/*"))
                        {
                            StreamResult sr = sf.GetVideoStream();
                            return((sr == null) ? sf.GetEmptyStream() : sr);
                        }
                    }
                }

                return(sf.GetEmptyStream());
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
コード例 #3
0
        public override void DoEncoded(IStreamEncoder encoder, Action action)
        {
            // Encode the data into a stream
            Stream encoded = null;

            using (MemoryStream memStream = new MemoryStream()) {
                // Stream key
                string key = CurrentPointer.ToString() + "_decoded";

                // Add the stream
                StreamFile sf = new StreamFile(key, memStream, Context)
                {
                    Endianness = currentFile.Endianness
                };
                Context.AddFile(sf);

                DoAt(sf.StartPointer, () => {
                    action();
                    memStream.Position = 0;
                    encoded            = encoder.EncodeStream(memStream);
                });

                Context.RemoveFile(sf);
            }
            // Turn stream into array & write bytes
            if (encoded != null)
            {
                using (MemoryStream ms = new MemoryStream()) {
                    encoded.CopyTo(ms);
                    writer.Write(ms.ToArray());
                }
                encoded.Close();
            }
        }
コード例 #4
0
        /// <summary>
        /// Creates a <see cref="MemoryFileSystem"/> based on the given <see cref="Stream"/>.
        /// </summary>
        /// <param name="streamFile">The in-memory file to add to the file system.</param>
        /// <param name="streamManager">The stream manager for this file system.</param>
        /// <returns>The created <see cref="IFileSystem"/> for this stream.</returns>
        public static IFileSystem CreateMemoryFileSystem(StreamFile streamFile, IStreamManager streamManager)
        {
            var stream    = streamFile.Stream;
            var directory = streamFile.Path.GetDirectory();

            // 1. Create file system
            var fileSystem = new MemoryFileSystem(streamManager);

            if (!directory.IsEmpty && !fileSystem.DirectoryExists(directory))
            {
                fileSystem.CreateDirectory(directory);
            }

            var createdStream = fileSystem.OpenFile(streamFile.Path.ToAbsolute(), FileMode.CreateNew, FileAccess.Write, FileShare.Write);

            // 2. Copy data
            var bkPos = stream.Position;

            stream.Position = 0;
            stream.CopyTo(createdStream);
            stream.Position        = bkPos;
            createdStream.Position = 0;
            createdStream.Close();

            return(fileSystem);
        }
コード例 #5
0
ファイル: TBL.cs プロジェクト: zeroark/PersonaEditor
        private void Read(StreamFile streamFile, string name)
        {
            GetType(streamFile);

            int index = 0;

            streamFile.Stream.Position = streamFile.Position;
            using (BinaryReader reader = Utilities.IO.OpenReadFile(streamFile.Stream, IsLittleEndian))
                do
                {
                    int Size = reader.ReadInt32();

                    if (streamFile.Position + streamFile.Size < Size + streamFile.Stream.Position)
                    {
                        throw new Exception("TBL error");
                    }

                    byte[]   tempdata = reader.ReadBytes(Size);
                    FileType fileType = Utilities.PersonaFile.GetFileType(tempdata);
                    string   ext      = Path.GetExtension(name);
                    string   tempName = name.Substring(0, name.Length - ext.Length) + "(" + index++.ToString().PadLeft(2, '0') + ")";
                    if (fileType == FileType.Unknown)
                    {
                        tempName += ".DAT";
                    }
                    else
                    {
                        tempName += "." + fileType.ToString();
                    }

                    SubFiles.Add(Utilities.PersonaFile.OpenFile(tempName, tempdata, fileType == FileType.Unknown ? FileType.DAT : fileType));
                    reader.BaseStream.Position += Utilities.Utilities.Alignment(reader.BaseStream.Position - streamFile.Position, 16);
                } while (streamFile.Stream.Position < streamFile.Position + streamFile.Size);
        }
コード例 #6
0
        public void Length_GivenAFileStream_ReturnsLength()
        {
            using var fs = File.Open(@"./Binaries/pidgin.exe", FileMode.Open);
            var file = new StreamFile(fs);

            Assert.Equal(60176, file.Length);
        }
コード例 #7
0
        public void AsSpan_GivenAStream_ReturnsSpan()
        {
            var file = new StreamFile(_ms);

            var s = file.AsSpan(2, 2);

            Assert.Equal(0x22, s[0]);
            Assert.Equal(0x33, s[1]);
        }
コード例 #8
0
ファイル: SPD.cs プロジェクト: zeroark/PersonaEditor
        private void ReadKey(StreamFile streamFile, int pos, int count)
        {
            streamFile.Stream.Position = streamFile.Position + pos;

            using (BinaryReader reader = new BinaryReader(streamFile.Stream, Encoding.ASCII, true))
                for (int i = 0; i < count; i++)
                {
                    KeyList.Add(new SPDKey(reader));
                }
        }
コード例 #9
0
        private void Read(StreamFile streamFile)
        {
            GetEndian(streamFile);

            streamFile.Stream.Position = streamFile.Position;
            using (BinaryReader reader = Utilities.IO.OpenReadFile(streamFile.Stream, IsLittleEndian))
            {
                if (reader.ReadInt32() != HeaderNumber)
                {
                    throw new Exception("FTD: header read error");
                }

                if (reader.ReadUInt32() != MagicNumber)
                {
                    throw new Exception("FTD: wrong magic number");
                }

                if (reader.ReadInt32() > streamFile.Size)
                {
                    throw new Exception("FTD: wrong file size");
                }

                int entryCount = reader.ReadInt32();

                List <int> Entry = new List <int>();
                for (int i = 0; i < entryCount; i++)
                {
                    Entry.Add(reader.ReadInt32());
                }

                foreach (var a in Entry)
                {
                    streamFile.Stream.Position = a + 4;
                    int size  = reader.ReadInt32();
                    int count = reader.ReadInt32();
                    streamFile.Stream.Position += 4;
                    if (size % count != 0)
                    {
                        throw new Exception("FTD: Hm...");
                    }

                    byte[] data = reader.ReadBytes(size);

                    int subEntry_Size = size / count;

                    byte[][] entries = new byte[count][];
                    for (int i = 0; i < count; i++)
                    {
                        entries[i] = data.SubArray(i * subEntry_Size, subEntry_Size);
                    }

                    Entries.Add(entries);
                }
            }
        }
コード例 #10
0
        public static StreamFile AddStreamFile(this Context context, string name, Stream stream, BinaryFile.Endian endianness = BinaryFile.Endian.Little, bool recreateOnWrite = true)
        {
            var file = new StreamFile(name, stream, context)
            {
                Endianness      = endianness,
                RecreateOnWrite = recreateOnWrite
            };

            context.AddFile(file);

            return(file);
        }
コード例 #11
0
 private void Read(StreamFile streamFile)
 {
     streamFile.Stream.Position = streamFile.Position;
     using (BinaryReader reader = new BinaryReader(streamFile.Stream, Encoding.ASCII, true))
     {
         uint ty = reader.ReadUInt32();
         if (ty != MagicNumber)
         {
             throw new Exception("DDS: wrong Magic Number");
         }
         else
         {
             ReadT1(reader);
         }
     }
 }
コード例 #12
0
    public static T ReadStreamData <T>(this Context context, Stream stream, string name = "Stream", Endian?endian = null, bool leaveOpen = false, Action <T>?onPreSerialize = null)
        where T : BinarySerializable, new()
    {
        BinaryFile file = new StreamFile(context, name, stream, endian, leaveOpen: leaveOpen);

        context.AddFile(file);

        try
        {
            return(FileFactory.Read <T>(context, name, (_, o) => onPreSerialize?.Invoke(o)));
        }
        finally
        {
            context.RemoveFile(file);
        }
    }
コード例 #13
0
    public static void WriteStreamData <T>(this Context context, Stream stream, T obj, string name = "Stream", Endian?endian = null, bool leaveOpen = false)
        where T : BinarySerializable, new()
    {
        BinaryFile file = new StreamFile(context, name, stream, endian, leaveOpen: leaveOpen);

        context.AddFile(file);

        try
        {
            FileFactory.Write(context, name, obj);
        }
        finally
        {
            context.RemoveFile(file);
        }
    }
コード例 #14
0
        public void WriteByte_GivenAStreamAndOffset_WritesByteAtOffset()
        {
            var buff = new byte[]
            {
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
            };

            using var ms = new MemoryStream(buff);
            var sf = new StreamFile(ms);

            sf.WriteByte(2, 0xff);

            Assert.Equal(0xff, buff[2]);
        }
コード例 #15
0
        /// <inheritdoc />
        public async Task <LoadResult> LoadFile(StreamFile streamFile, LoadFileContext loadFileContext)
        {
            ContractAssertions.IsNotNull(_fileState, "fileState");

            // 1. Load file
            var loadResult = await _parentFileManager.LoadFile(streamFile, loadFileContext);

            if (!loadResult.IsSuccessful)
            {
                return(loadResult);
            }

            // 2. Add file to loaded files
            _loadedFiles.Add(loadResult.LoadedFileState);

            return(loadResult);
        }
コード例 #16
0
ファイル: TBL.cs プロジェクト: zeroark/PersonaEditor
        private void GetType(StreamFile streamFile)
        {
            try
            {
                streamFile.Stream.Position = streamFile.Position;
                using (BinaryReader reader = Utilities.IO.OpenReadFile(streamFile.Stream, true))
                    do
                    {
                        int Size = reader.ReadInt32();

                        if (streamFile.Position + streamFile.Size < Size + streamFile.Stream.Position)
                        {
                            throw new Exception("TBL error");
                        }

                        reader.BaseStream.Position += Size;
                        reader.BaseStream.Position += Utilities.Utilities.Alignment(reader.BaseStream.Position - streamFile.Position, 16);
                    } while (streamFile.Stream.Position < streamFile.Position + streamFile.Size);
                IsLittleEndian = true;
            }
            catch
            {
                try
                {
                    streamFile.Stream.Position = streamFile.Position;
                    using (BinaryReader reader = Utilities.IO.OpenReadFile(streamFile.Stream, false))
                        do
                        {
                            int Size = reader.ReadInt32();

                            if (streamFile.Position + streamFile.Size < Size + streamFile.Stream.Position)
                            {
                                throw new Exception("TBL error");
                            }

                            reader.BaseStream.Position += Size;
                            reader.BaseStream.Position += Utilities.Utilities.Alignment(reader.BaseStream.Position - streamFile.Position, 16);
                        } while (streamFile.Stream.Position < streamFile.Position + streamFile.Size);
                    IsLittleEndian = false;
                }
                catch
                {
                    throw new Exception("TBL error");
                }
            }
        }
コード例 #17
0
        public void ReadUnicodeString_GivenAStream_ReturnsAString()
        {
            var buff = new byte[] {
                0x00, 0x00, // garbage
                0x68, 0x00, // h
                0x65, 0x00, // e
                0x6c, 0x00, // l
                0x6c, 0x00, // l
                0x6f, 0x00, // o
                0x00, 0x00, // string termination
                0x11, 0x22  // garbage
            };

            using var ms = new MemoryStream(buff);
            var file = new StreamFile(ms);

            Assert.Equal("hello", file.ReadUnicodeString(2));
        }
コード例 #18
0
        public void WriteUShort_GivenAStreamAndOffset_WritesUShortAtOffset()
        {
            var buff = new byte[]
            {
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
            };

            using var ms = new MemoryStream(buff);
            var sf = new StreamFile(ms);

            sf.WriteUShort(2, 0x1122);

            Assert.Equal(0x22, buff[2]);
            Assert.Equal(0x11, buff[3]);
        }
コード例 #19
0
ファイル: SPD.cs プロジェクト: zeroark/PersonaEditor
        private void ReadTexture(StreamFile streamFile, int pos, int count)
        {
            streamFile.Stream.Position = streamFile.Position + pos;

            using (BinaryReader reader = new BinaryReader(streamFile.Stream, Encoding.ASCII, true))
                for (int i = 0; i < count; i++)
                {
                    streamFile.Stream.Position += 8;
                    long texPos  = reader.ReadUInt32();
                    int  texSize = reader.ReadInt32();
                    streamFile.Stream.Position += 16;
                    string name = Encoding.ASCII.GetString(reader.ReadBytes(16)).TrimEnd('\0');

                    long tempPos = streamFile.Stream.Position;
                    streamFile.Stream.Position = texPos;
                    SubFiles.Add(Utilities.PersonaFile.OpenFile(name + ".dds", reader.ReadBytes(texSize), Interfaces.FileType.DDS));
                    streamFile.Stream.Position = tempPos;
                }
        }
コード例 #20
0
        private MediaTrack[] MapTextTracks(string textTracks)
        {
            List <MediaTrack> tracks = new List <MediaTrack>();

            if (!string.IsNullOrEmpty(textTracks))
            {
                string[] tracksInfo = textTracks.Split(Constants.MultiItemsSeparator);
                foreach (string trackInfo in tracksInfo)
                {
                    MediaTrack track     = new MediaTrack();
                    string[]   textTrack = trackInfo.Split(Constants.MultiItemSeparator);
                    track.Type     = textTrack[0];
                    track.Source   = textTrack[1];
                    track.Language = StreamFile.GetLanguageCode(track.Source);
                    tracks.Add(track);
                }
            }
            return(tracks.ToArray());
        }
コード例 #21
0
        private void GetEndian(StreamFile streamFile)
        {
            streamFile.Stream.Position = streamFile.Position + 4;
            byte[] magicnum = new byte[4];
            streamFile.Stream.Read(magicnum, 0, 4);

            if (BitConverter.ToUInt32(magicnum, 0) == MagicNumber)
            {
                IsLittleEndian = true;
            }
            else if (BitConverter.ToUInt32(magicnum.Reverse().ToArray(), 0) == MagicNumber)
            {
                IsLittleEndian = false;
            }
            else
            {
                throw new Exception("FTD: wrong magic number");
            }
        }
コード例 #22
0
        public Mp3Tagger()
        {
            Receive <dynamic>(message =>
            {
                // NOTE: gettting stack overflow here!
                var streamFile = new StreamFile(message.Resource, message.Path);

                var f       = File.Create(streamFile);
                f.Tag.Album = message.Album;
                // f.Tag.AlbumArtists = new[] {message.Artist};
                f.Tag.Title = message.Track;


                //f.Tag.Pictures = new IPicture[new Picture()];
                f.Save();

                var buffer = new byte[streamFile.ReadStream.Length];

                streamFile.ReadStream.Read(buffer, 0, Convert.ToInt32(streamFile.ReadStream.Length));
            });
        }
コード例 #23
0
        /// <summary>
        /// Get <see cref="StreamFile"/> object from EPGStation's recorded file <see cref="Program"/>.
        /// </summary>
        /// <param name="body"></param>
        /// <param name="mEPG">A working access to EPGStation.</param>
        /// <returns></returns>
        public static StreamFile GetStreamFileObj(this Program body, EPGAccess mEPG)
        {
            if (body == null)
            {
                return(null);
            }
            StreamFile mFile = new StreamFile();

            mFile.ChannelName    = mEPG.GetChannelNameByID(body.channelId);
            mFile.Content        = body.description;
            mFile.Infomation     = body.extended;
            mFile.Title          = body.name;
            mFile.recTitle       = body.name;
            mFile.recKeyWord     = "EPGStation " + body.id.ToString();
            mFile.recSubTitle    = body.videoResolution + body.videoResolution + body.videoType;
            mFile.recKeywordInfo = string.Format("Error:E({0})D({1})S({2})", body.errorCnt, body.dropCnt, body.scramblingCnt);
            mFile.Genre          = body.Genre;
            mFile.StartTime      = GetTimeFromUNIXTime(body.startAt);
            mFile.EndTime        = GetTimeFromUNIXTime(body.endAt);
            mFile.FilePath       = System.IO.Path.Combine(mEPG.BaseFolder, System.Web.HttpUtility.UrlDecode(body.filename));
            mFile.EPGStation     = new EPGMetaFile(mEPG, body);
            return(mFile);
        }
コード例 #24
0
ファイル: StreamFile.cs プロジェクト: GCLemon/Altseed2-csharp
        static void Main(string[] args)
        {
            // Altseed を初期化します。
            if (!Engine.Initialize("StaticFile", 640, 480, new Configuration()))
            {
                return;
            }

            // ファイルを読み込みます。
            var streamFile = StreamFile.Create(@"TestData\IO\test.txt");

            // メインループ。
            // Altseed のウインドウが閉じられると終了します。
            while (Engine.DoEvents())
            {
                // Altseedを更新します。
                Engine.Update();

                // 1バイト読み込む
                var size = streamFile.Read(1);

                // バイト配列をUTF8として、string型に変換します。
                var text = Encoding.UTF8.GetString(streamFile.TempBuffer);

                // コンソールに出力します。
                Console.WriteLine(text);

                // 新たに読み込んだデータが0なら終了させます。
                if (size == 0)
                {
                    break;
                }
            }

            // Altseed の終了処理をします。
            Engine.Terminate();
        }
コード例 #25
0
        public void WriteULong_GivenAStreamAndOffset_WritesULongAtOffset()
        {
            var buff = new byte[]
            {
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
            };

            using var ms = new MemoryStream(buff);
            var sf = new StreamFile(ms);

            sf.WriteULong(2, 0x1122334455667788);

            Assert.Equal(0x88, buff[2]);
            Assert.Equal(0x77, buff[3]);
            Assert.Equal(0x66, buff[4]);
            Assert.Equal(0x55, buff[5]);
            Assert.Equal(0x44, buff[6]);
            Assert.Equal(0x33, buff[7]);
            Assert.Equal(0x22, buff[8]);
            Assert.Equal(0x11, buff[9]);
        }
コード例 #26
0
 /// <inheritdoc />
 public Task <LoadResult> LoadFile(StreamFile streamFile)
 {
     return(LoadFile(streamFile, new LoadFileContext()));
 }
コード例 #27
0
    /// <summary>
    /// Writes the files to the archive
    /// </summary>
    /// <param name="generator">The generator</param>
    /// <param name="archive">The loaded archive data</param>
    /// <param name="outputFileStream">The file output stream for the archive</param>
    /// <param name="files">The files to include</param>
    public void WriteArchive(IDisposable?generator, object archive, ArchiveFileStream outputFileStream, IList <ArchiveFileItem> files)
    {
        Logger.Info("A CNT archive is being repacked...");

        // Get the archive data
        var data = (CNT)archive;

        // Create the file generator
        using ArchiveFileGenerator <CNT_File> fileGenerator = new();

        // Get files and entries
        var archiveFiles = files.Select(x => new
        {
            Entry    = (CNT_File)x.ArchiveEntry,
            FileItem = x
        }).ToArray();

        // Set files and directories
        data.Directories = files.Select(x => x.Directory).Distinct().Where(x => !x.IsNullOrWhiteSpace()).ToArray();
        data.Files       = archiveFiles.Select(x => x.Entry).ToArray();

        // Set the directory indexes
        foreach (var file in archiveFiles)
        {
            // Set the directory index
            file.Entry.DirectoryIndex = file.FileItem.Directory == String.Empty ? -1 : data.Directories.FindItemIndex(x => x == file.FileItem.Directory);
        }

        BinaryFile binaryFile = new StreamFile(Context, outputFileStream.Name, outputFileStream.Stream, leaveOpen: true);

        try
        {
            Context.AddFile(binaryFile);

            // Initialize the data
            data.Init(binaryFile.StartPointer);

            // Set the current pointer position to the header size
            data.RecalculateSize();
            uint pointer = (uint)data.Size;

            // Disable checksum
            data.IsChecksumUsed = false;

            // NOTE: We can't disable the XOR key entirely as that would disable it for the file bytes too, which would require them all to be decrypted
            // Reset XOR keys
            data.StringsXORKey = 0;

            // Load each file
            foreach (var file in archiveFiles)
            {
                // Get the file entry
                CNT_File entry = file.Entry;

                // Reset checksum and XOR key
                entry.FileChecksum       = 0;
                entry.Pre_FileNameXORKey = 0;

                // Add to the generator
                fileGenerator.Add(entry, () =>
                {
                    // Get the file stream to write to the archive
                    Stream fileStream = file.FileItem.GetFileData(generator).Stream;

                    // Set the pointer
                    entry.FileOffset = pointer;

                    // Update the pointer by the file size
                    pointer += entry.FileSize;

                    // Invoke event
                    OnWritingFileToArchive?.Invoke(this, new ValueEventArgs <ArchiveFileItem>(file.FileItem));

                    return(fileStream);
                });
            }

            // Make sure we have a generator for each file
            if (fileGenerator.Count != data.Files.Length)
            {
                throw new Exception("The .cnt file can't be serialized without a file generator for each file");
            }

            // Write the file contents
            foreach (CNT_File file in data.Files)
            {
                // Get the file stream
                using Stream fileStream = fileGenerator.GetFileStream(file);

                // Set the position to the pointer
                outputFileStream.Stream.Position = file.FileOffset;

                // Write the contents from the generator
                fileStream.CopyTo(outputFileStream.Stream);
            }

            outputFileStream.Stream.Position = 0;

            // Serialize the data
            FileFactory.Write(Context, binaryFile.FilePath, data);

            Logger.Info("The CNT archive has been repacked");
        }
        finally
        {
            Context.RemoveFile(binaryFile);
        }
    }
コード例 #28
0
 /// <inheritdoc />
 public Task <LoadResult> LoadFile(StreamFile streamFile, Guid pluginId)
 {
     return(LoadFile(streamFile, new LoadFileContext {
         PluginId = pluginId
     }));
 }
コード例 #29
0
    /// <summary>
    /// Writes the files to the archive
    /// </summary>
    /// <param name="generator">The generator</param>
    /// <param name="archive">The loaded archive data</param>
    /// <param name="outputFileStream">The file output stream for the archive</param>
    /// <param name="files">The files to include</param>
    public void WriteArchive(IDisposable?generator, object archive, ArchiveFileStream outputFileStream, IList <ArchiveFileItem> files)
    {
        Logger.Info("An R1 PC archive is being repacked...");

        // Get the archive data
        var data = (PC_FileArchive)archive;

        // Create the file generator
        using ArchiveFileGenerator <PC_FileArchiveEntry> fileGenerator = new();

        // Get files and entries
        var archiveFiles = files.Select(x => new
        {
            Entry    = (PC_FileArchiveEntry)x.ArchiveEntry,
            FileItem = x
        }).ToArray();

        // Set files and directories
        data.Entries = archiveFiles.Select(x => x.Entry).ToArray();

        BinaryFile binaryFile = new StreamFile(Context, outputFileStream.Name, outputFileStream.Stream, leaveOpen: true);

        try
        {
            Context.AddFile(binaryFile);

            // Initialize the data
            data.Init(binaryFile.StartPointer);

            // Set the current pointer position to the header size
            data.RecalculateSize();
            uint pointer = (uint)data.Size;

            // Load each file
            foreach (var file in archiveFiles)
            {
                // Process the file name
                file.Entry.FileName = ProcessFileName(file.Entry.FileName);

                // Get the file entry
                PC_FileArchiveEntry entry = file.Entry;

                // Add to the generator
                fileGenerator.Add(entry, () =>
                {
                    // Get the file stream to write to the archive
                    Stream fileStream = file.FileItem.GetFileData(generator).Stream;

                    // Set the pointer
                    entry.FileOffset = pointer;

                    // Update the pointer by the file size
                    pointer += entry.FileSize;

                    // Invoke event
                    OnWritingFileToArchive?.Invoke(this, new ValueEventArgs <ArchiveFileItem>(file.FileItem));

                    return(fileStream);
                });
            }

            // Make sure we have a generator for each file
            if (fileGenerator.Count != data.Entries.Length)
            {
                throw new Exception("The .dat file can't be serialized without a file generator for each file");
            }

            // Write the file contents
            foreach (PC_FileArchiveEntry file in data.Entries)
            {
                // Get the file stream
                using Stream fileStream = fileGenerator.GetFileStream(file);

                // Set the position to the pointer
                outputFileStream.Stream.Position = file.FileOffset;

                // Write the contents from the generator
                fileStream.CopyTo(outputFileStream.Stream);
            }

            outputFileStream.Stream.Position = 0;

            // Serialize the data
            FileFactory.Write(Context, binaryFile.FilePath, data);

            Logger.Info("The R1 PC archive has been repacked");
        }
        finally
        {
            Context.RemoveFile(binaryFile);
        }
    }
コード例 #30
0
ファイル: IO.cs プロジェクト: GCLemon/Altseed2-csharp
        public void StreamFileBase()
        {
            Assert.True(Engine.Initialize("Altseed2 C# Engine", 800, 600, new Configuration()));

            // pack files
            Assert.True(Engine.File.Pack("../../Core/TestData/IO/", "pack.pack"));
            Assert.True(Engine.File.PackWithPassword("../../Core/TestData/IO/pack/", "password.pack", "altseed"));

            // add package
            Assert.True(Engine.File.AddRootPackage("pack.pack"));

            // create static file, and compare no-package and package without password
            StreamFile test = null;

            Assert.AreNotEqual(test = StreamFile.Create("../../Core/TestData/IO/test.txt"), null);
            Assert.False(test.IsInPackage);
            StreamFile testPack = null;

            Assert.AreNotEqual(testPack = StreamFile.Create("test.txt"), null);
            Assert.True(testPack.IsInPackage);
            Assert.AreEqual(test.Size, testPack.Size);
            Assert.AreEqual(test.TempBufferSize, 0);
            Assert.AreEqual(testPack.TempBufferSize, 0);
            for (int i = 0; i < test.Size; i++)
            {
                Assert.AreEqual(test.Read(1), 1);
                Assert.AreEqual(testPack.Read(1), 1);
                Assert.AreEqual(test.TempBufferSize, i + 1);
                Assert.AreEqual(testPack.TempBufferSize, i + 1);
                Assert.AreEqual(test.TempBuffer, test.TempBuffer);
            }

            // add package
            Assert.True(Engine.File.AddRootPackageWithPassword("password.pack", "altseed"));

            // clear cache
            Engine.Resources.Clear();

            StreamFile testPack2 = null;

            Assert.AreNotEqual(testPack2 = StreamFile.Create("test.txt"), null);
            Assert.True(testPack2.IsInPackage);
            Assert.AreNotEqual(testPack, testPack2);
            Assert.AreNotEqual(testPack.Size, testPack2.Size);

            // create static file, and compare no-package and package with password
            StreamFile test3 = null;

            Assert.AreNotEqual(test3 = StreamFile.Create("../../Core/TestData/IO/pack/test.txt"), null);
            Assert.AreEqual(test3.Size, testPack2.Size);
            Assert.AreEqual(test3.Size, testPack2.Size);
            Assert.AreEqual(test3.TempBufferSize, 0);
            Assert.AreEqual(testPack2.TempBufferSize, 0);
            for (int i = 0; i < test3.Size; i++)
            {
                Assert.AreEqual(test3.Read(1), 1);
                Assert.AreEqual(testPack2.Read(1), 1);
                Assert.AreEqual(test3.TempBufferSize, i + 1);
                Assert.AreEqual(testPack2.TempBufferSize, i + 1);
            }

            Engine.Terminate();
        }