public MegFileHolder Load(string filePath)
        {
            if (null == filePath || !StringUtility.HasText(filePath))
            {
                throw new ArgumentNullException(nameof(filePath));
            }

            if (!m_fileSystem.File.Exists(filePath))
            {
                throw new FileNotFoundException($"The file {filePath} does not exist.");
            }

            uint headerSize = GetMegFileHeaderSize(filePath);

            byte[] megFileHeader = new byte[headerSize];
            using (BinaryReader reader = new BinaryReader(m_fileSystem.FileStream.Create(filePath, FileMode.Open)))
            {
                reader.Read(megFileHeader, 0, megFileHeader.Length);
            }

            MegFileBuilder builder = new MegFileBuilder();
            MegFile        megFile = builder.FromBytes(megFileHeader);
            MegFileHolder  holder  = new MegFileHolder(m_fileSystem.Path.GetDirectoryName(filePath),
                                                       m_fileSystem.Path.GetFileNameWithoutExtension(filePath));

            for (int i = 0; i < megFile.Header.NumFiles; i++)
            {
                string fileName   = megFile.FileNameTable[i].FileName;
                uint   fileOffset = megFile.FileContentTable[i].FileStartOffsetInBytes;
                uint   fileSize   = megFile.FileContentTable[i].FileSizeInBytes;
                holder.Content.Add(new MegFileDataEntry(fileName, Convert.ToInt32(fileOffset), fileSize));
            }

            return(holder);
        }
        public void PackFilesAsMegArchive(string megArchiveName,
                                          IDictionary <string, string> packedFileNameToAbsoluteFilePathsMap, string targetDirectory)
        {
            if (!StringUtility.HasText(megArchiveName))
            {
                throw new ArgumentException(
                          "The provided argument is null, an empty string or only consists of whitespace.",
                          nameof(megArchiveName));
            }

            if (!packedFileNameToAbsoluteFilePathsMap.Any())
            {
                throw new ArgumentException(
                          "The provided argument does not contain any elements.",
                          nameof(packedFileNameToAbsoluteFilePathsMap));
            }

            if (!StringUtility.HasText(targetDirectory))
            {
                throw new ArgumentException(
                          "The provided argument is null, an empty string or only consists of whitespace.",
                          nameof(targetDirectory));
            }

            string        actualName    = StringUtility.RemoveFileExtension(megArchiveName);
            MegFileHolder megFileHolder = new MegFileHolder(targetDirectory, actualName);

            foreach ((string key, string value) in packedFileNameToAbsoluteFilePathsMap)
            {
                megFileHolder.Content.Add(new MegFileDataEntry(key, value));
            }

            MegFileBuilder builder   = new MegFileBuilder(m_fileSystem);
            MegFile        megFile   = builder.FromHolder(megFileHolder, out IList <string> filesToStream);
            string         writePath = m_fileSystem.Path.Combine(megFileHolder.FilePath, megFileHolder.FullyQualifiedName);

            CreateTargetDirectoryIfNotExists(megFileHolder.FilePath);
            using (BinaryWriter writer =
                       new BinaryWriter(m_fileSystem.FileStream.Create(writePath, FileMode.Create, FileAccess.Write,
                                                                       FileShare.None)))
            {
                writer.Write(megFile.ToBytes());
            }

            foreach (string file in filesToStream)
            {
                using Stream readStream  = m_fileSystem.File.OpenRead(file);
                using Stream writeStream =
                          m_fileSystem.FileStream.Create(writePath, FileMode.Append, FileAccess.Write, FileShare.None);
                byte[] buffer = new byte[BUFFER_SIZE];
                int    bytesRead;
                while ((bytesRead = readStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    writeStream.Write(buffer, 0, bytesRead);
                }
            }
        }
Example #3
0
        public void FromHolder_Test__FileHeaderIsBinaryEquivalent()
        {
            MegFileHolder megFileHolder = new MegFileHolder(BASE_PATH, "test");

            megFileHolder.Content.Add(new MegFileDataEntry("data/xml/campaignfiles.xml"));
            megFileHolder.Content.Add(new MegFileDataEntry("data/xml/gameobjectfiles.xml"));
            MegFileBuilder builder = new MegFileBuilder(m_fileSystem);
            MegFile        megFile = builder.FromHolder(megFileHolder);

            Assert.IsNotNull(megFile);
            m_fileSystem.File.WriteAllBytes(m_fileSystem.Path.Combine(BASE_PATH, megFileHolder.FileName + "." + megFileHolder.FileType.FileExtension), megFile.ToBytes());
            var f = m_fileSystem.File.ReadAllBytes(m_fileSystem.Path.Combine(BASE_PATH,
                                                                             megFileHolder.FileName + "." + megFileHolder.FileType.FileExtension));
        }
Example #4
0
        public void FromHolder_Test__FileHeaderIsConsistent()
        {
            MegFileHolder megFileHolder = new MegFileHolder(BASE_PATH, "test");

            megFileHolder.Content.Add(new MegFileDataEntry("data/xml/campaignfiles.xml"));
            megFileHolder.Content.Add(new MegFileDataEntry("data/xml/gameobjectfiles.xml"));
            MegFileBuilder builder = new MegFileBuilder(m_fileSystem);
            MegFile        megFile = builder.FromHolder(megFileHolder);

            Assert.IsNotNull(megFile);
            Assert.IsNotNull(megFile.Header);
            Assert.IsNotNull(megFile.FileContentTable);
            Assert.IsNotNull(megFile.FileNameTable);
            Assert.AreEqual(2u, megFile.Header.NumFiles);
            Assert.AreEqual(2u, megFile.Header.NumFileNames);
            Assert.AreEqual(40, megFile.FileContentTable.Size);
            Assert.AreEqual(58, megFile.FileNameTable.Size);
            Assert.IsTrue(megFile.FileNameTable.MegFileNameTableRecords[0].FileName.Equals("data/xml/gameobjectfiles.xml", StringComparison.InvariantCultureIgnoreCase));
            Assert.IsTrue(megFile.FileNameTable.MegFileNameTableRecords[1].FileName.Equals("data/xml/campaignfiles.xml", StringComparison.InvariantCultureIgnoreCase));
        }
        public void FromHolder_Test__FileHeaderIsBinaryEquivalent()
        {
            MegFileHolder megFileHolder =
                new MegFileHolder(TestConstants.BASE_PATH, "FromHolder_Test__FileHeaderIsBinaryEquivalent");

            megFileHolder.Content.Add(new MegFileDataEntry("data/xml/campaignfiles.xml",
                                                           TestConstants.FILE_PATH_CAMPAIGNFILES));
            megFileHolder.Content.Add(new MegFileDataEntry("data/xml/gameobjectfiles.xml",
                                                           TestConstants.FILE_PATH_GAMEOBJECTFILES));
            MegFileBuilder builder = new MegFileBuilder(m_fileSystem);
            MegFile        megFile = builder.FromHolder(megFileHolder);

            Assert.IsNotNull(megFile);
            m_fileSystem.File.WriteAllBytes(
                m_fileSystem.Path.Combine(TestConstants.BASE_PATH,
                                          megFileHolder.FullyQualifiedName), megFile.ToBytes());
            byte[] readMegFile = m_fileSystem.File.ReadAllBytes(m_fileSystem.Path.Combine(TestConstants.BASE_PATH,
                                                                                          megFileHolder.FullyQualifiedName));
            Assert.AreEqual(TestConstants.CONTENT_MEG_FILE_HEADER.Length, readMegFile.Length);
            for (int i = 0; i < TestConstants.CONTENT_MEG_FILE_HEADER.Length; i++)
            {
                Assert.AreEqual(TestConstants.CONTENT_MEG_FILE_HEADER[i], readMegFile[i]);
            }
        }