コード例 #1
0
        public async Task ParExtractTest(string inFile, string expectedDirParent)
        {
            using FileStream fileStream = new FileStream(inFile, FileMode.Open, FileAccess.Read);
            ParFile parFile = new ParFile(fileStream);
            await parFile.ExtractAll("temp_par");

            bool eq = Compare.CompareDirectories(expectedDirParent + inFile.Substring(inFile.LastIndexOf('/'))[0..^ 4] + "_par", "temp_par");
コード例 #2
0
ファイル: UIComponent.cs プロジェクト: faraplay/ImasArchiveS
        private UIComponent(ParFile parFile)
        {
            this.parFile = parFile;
            var entryNames = parFile.Entries.Select(entry => entry.FileName).Where(name => name.EndsWith(".pau"));

            Count          = entryNames.Count();
            _subNames      = new List <string>(Count);
            _subcomponents = new List <UISubcomponent>(Count);
            foreach (string entryName in entryNames)
            {
                _subNames.Add(entryName[..^ 4]);
コード例 #3
0
        public void DeployProcessArchive(byte[] processArchiveBytes)
        {
            ParFile parFile = new ParFile(processArchiveBytes);

            MyProcessDefinitionBuilder builder           = new MyProcessDefinitionBuilder(parFile.ProcessDefinition);
            ProcessDefinitionImpl      processDefinition = builder.BuildProcessDefinition();

            using (ISession session = NHibernateHelper.OpenSession())
            {
                DbSession nhSession = new DbSession(session);
                repository.Save(processDefinition, nhSession);
            }
        }
コード例 #4
0
        public void ExtractFile(string inputFile, string outputPath)
        {
            var fileName  = Path.GetFileName(inputFile);
            var extension = Path.GetExtension(inputFile);

            if (fileName == "ui_e.par" || fileName == "ui_c.par")
            {
                UIParFile.Extract(inputFile, outputPath);
            }
            else if (extension.StartsWith(".par"))
            {
                ParFile.Extract(inputFile, outputPath);
            }
        }
コード例 #5
0
ファイル: ParModel.cs プロジェクト: faraplay/ImasArchiveS
 public ParModel(IReport parent, Stream stream, string fileName, IGetFileName getFileName)
     : base(parent, fileName, getFileName)
 {
     try
     {
         _parFile = new ParFile(stream);
         SetBrowserEntries();
     }
     catch
     {
         Dispose();
         throw;
     }
 }
コード例 #6
0
ファイル: ParModel.cs プロジェクト: faraplay/ImasArchiveS
 public ParModel(IReport parent, ParFile parFile, string fileName, IGetFileName getFileName)
     : base(parent, fileName, getFileName)
 {
     try
     {
         _parFile = parFile;
         SetBrowserEntries();
     }
     catch
     {
         Dispose();
         throw;
     }
 }
コード例 #7
0
        public void RepackFile(string inputPath, string outputFile, bool compress)
        {
            var fileName  = Path.GetFileName(outputFile);
            var extension = Path.GetExtension(outputFile);

            if (fileName == "ui_e.par" || fileName == "ui_c.par")
            {
                UIParFile.Repack(inputPath, outputFile, compress);
            }
            else if (extension.StartsWith(".par"))
            {
                ParFile.Repack(inputPath, outputFile, compress);
            }
        }
コード例 #8
0
        private async Task <EntryStack> GetEntryRecursive(string fileName, EntryStack stack)
        {
            int parIndex = fileName.IndexOf("_par/");
            int ptaIndex = fileName.IndexOf("_pta/");
            int index;

            if (parIndex == -1)
            {
                index = ptaIndex;
            }
            else if (ptaIndex == -1)
            {
                index = parIndex;
            }
            else
            {
                index = Math.Min(parIndex, ptaIndex);
            }

            if (index == -1)
            {
                ContainerEntry entry = GetEntry(fileName);
                if (entry == null)
                {
                    stack.Dispose();
                    return(null);
                }
                stack.Entry = entry;
                return(stack);
            }
            else
            {
                ContainerEntry entry = GetEntry(fileName.Substring(0, index) + '.' + fileName.Substring(index + 1, 3));
                if (entry == null)
                {
                    stack.Dispose();
                    return(null);
                }
                Stream stream = await entry.GetData();

                stack.Push(stream);
                ParFile parFile = new ParFile(stream);
                stack.Push(parFile);
                return(await parFile.GetEntryRecursive(fileName.Substring(index + 5)));
            }
        }
コード例 #9
0
        public static async Task <SpriteSheetSource> CreateImageSource(ParFile parFile)
        {
            SpriteSheetSource imageSource = new SpriteSheetSource(parFile);

            foreach (ParEntry entry in parFile.Entries)
            {
                try
                {
                    imageSource.filenames.Add(entry.FileName);
                    GTF gtf = GTF.CreateFromGtfStream(await entry.GetData());
                    imageSource.gtfs.Add(gtf);
                }
                catch (Exception)
                {
                    throw;
                }
            }
            return(imageSource);
        }
コード例 #10
0
        public static async Task <UISubcomponent> CreateComponent(ParFile componentPar, string name)
        {
            UISubcomponent component = new UISubcomponent(name)
            {
                pauStream = await componentPar.GetEntry(name + ".pau").GetData()
            };

            component.ReadPauStream();
            component.ptaFile = new ParFile(await componentPar.GetEntry(name + ".pta").GetData());
            await component.LoadImageSource();

            var animationsEntry = componentPar.GetEntry(name + ".par");

            if (animationsEntry != null)
            {
                component.animationsPar = new ParFile(await animationsEntry.GetData());
                await component.ReadAnimations();
            }
            return(component);
        }
コード例 #11
0
ファイル: SllzTests.cs プロジェクト: Vanillepanda/ParManager
        public void TestSllz(byte compressorVersion)
        {
            const string sampleText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed pulvinar leo nec pulvinar pellentesque. Sed id dui et nisl tincidunt dignissim. Suspendisse ullamcorper eget ipsum et vehicula. Maecenas scelerisque dapibus rutrum. Suspendisse tincidunt dictum maximus. Ut rhoncus, lorem scelerisque euismod rhoncus, nunc augue egestas magna, ac mattis elit sapien eu erat. Pellentesque auctor in erat id molestie. Nam vehicula odio eget ipsum porta euismod. Donec eget placerat turpis. Aliquam erat volutpat. Etiam faucibus ligula sit amet ante tincidunt, sit amet efficitur justo lobortis. Nam volutpat augue at purus viverra tincidunt. Nam sapien eros, fringilla sollicitudin semper sed, bibendum eu nisl.\nPellentesque mattis, sem a placerat dictum, risus nisl faucibus odio, quis blandit est erat sed tellus. Mauris iaculis odio sed leo suscipit ultrices. Nunc leo purus, tempor at lobortis vel, molestie pellentesque dui. Sed ac nunc et metus placerat euismod non vel nisl. Proin fringilla viverra aliquet. Pellentesque scelerisque fermentum eleifend. Quisque rutrum orci nulla, sed ullamcorper nulla porttitor nec. Fusce elementum a nulla et ultricies. Pellentesque bibendum blandit leo nec gravida. Donec egestas vitae tellus id auctor.\nMorbi ultrices maximus mattis. Aliquam lobortis at lectus ut scelerisque. Morbi sem tortor, blandit non risus vel, commodo interdum neque. Fusce eu hendrerit mauris, in venenatis est. Vivamus vulputate placerat justo at condimentum. Proin porttitor ac velit quis pretium. Proin vitae lacus sit amet felis aliquam tempor. Fusce dignissim mi id dui imperdiet, nec commodo neque malesuada. Nullam tincidunt augue pellentesque aliquam fringilla. Sed placerat, nibh id fermentum volutpat, ligula felis sagittis lectus, vel semper ipsum arcu at ipsum. Etiam posuere tincidunt augue non gravida. Vivamus posuere posuere dui, a semper urna imperdiet a. Proin quis odio condimentum, pulvinar ipsum vitae, eleifend lorem. Praesent vel iaculis nisi. Aliquam imperdiet eleifend nisi a imperdiet. Mauris vel aliquam quam, ac imperdiet elit.\nVivamus semper odio nec scelerisque porttitor. Quisque ut pulvinar tortor, et consectetur sapien. Fusce neque nulla, laoreet tincidunt risus sit amet, dignissim condimentum enim. Donec dui libero, pulvinar a nibh eget, varius convallis diam. Donec rhoncus elit vel nibh varius, at rhoncus justo consectetur. Pellentesque congue feugiat pulvinar. Donec aliquet sapien ut egestas feugiat. Praesent rhoncus libero libero, non auctor tellus fermentum at. Nunc mollis ornare lacus, et sodales enim rhoncus non. Curabitur vitae dui finibus, varius ex quis, pellentesque ipsum. Etiam metus diam, porttitor in odio vel, suscipit malesuada odio. Nullam eget leo tortor. Duis id posuere augue. Vivamus consequat libero ipsum, nec efficitur ante maximus ullamcorper. Praesent consequat tristique lectus, in aliquam libero hendrerit ac.\nDuis nec felis risus. Pellentesque sit amet massa id lorem ullamcorper rhoncus dignissim pellentesque felis. Suspendisse vitae magna ut ex sodales porta. Proin facilisis augue consectetur ante feugiat vestibulum. Maecenas imperdiet enim nunc, a tincidunt eros luctus et. Nunc gravida, odio eget cursus efficitur, nulla mauris rhoncus mi, rutrum ullamcorper ante ante vitae elit. Quisque vel lacinia justo, in vestibulum nisi. Nam quis maximus ligula, eget ornare mi. Etiam porttitor orci non nulla vestibulum, vitae eleifend nulla pellentesque. Vestibulum eu orci quam. Nullam id tellus viverra, finibus purus et, iaculis diam. Sed ut volutpat eros. In vitae ultrices nibh.";

            byte[] buffer = Encoding.ASCII.GetBytes(sampleText);

            DataStream dataStream = DataStreamFactory.FromArray(buffer, 0, buffer.Length);

            using var binaryFormat = new ParFile(dataStream);

            var parameters = new CompressorParameters
            {
                Endianness = 0x00,
                Version    = compressorVersion,
            };

            var compressedBinaryFormat   = (ParFile)ConvertFormat.With <Compressor, CompressorParameters>(parameters, binaryFormat);
            var decompressedBinaryFormat = (ParFile)ConvertFormat.With <Decompressor>(compressedBinaryFormat);

            Assert.IsTrue(compressedBinaryFormat.Stream.Length < decompressedBinaryFormat.Stream.Length);
            Assert.IsTrue(dataStream.Compare(decompressedBinaryFormat.Stream));
        }
コード例 #12
0
        public NodeContainerFormat Convert(BinaryFormat source)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            source.Stream.Position = 0;

            var result = new NodeContainerFormat();

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            var reader = new DataReader(source.Stream)
            {
                DefaultEncoding = Encoding.GetEncoding(1252),
                Endianness      = EndiannessMode.BigEndian,
            };

            string magicId = reader.ReadString(4);

            if (magicId == "SLLZ")
            {
                var subStream  = new DataStream(source.Stream, 0, source.Stream.Length);
                var compressed = new ParFile(subStream);
                source = (ParFile)ConvertFormat.With <Sllz.Decompressor>(compressed);
                source.Stream.Position = 0;

                reader = new DataReader(source.Stream)
                {
                    DefaultEncoding = Encoding.GetEncoding(1252),
                    Endianness      = EndiannessMode.BigEndian,
                };

                magicId = reader.ReadString(4);
            }

            if (magicId != "PARC")
            {
                throw new FormatException("PARC: Bad magic Id.");
            }

            result.Root.Tags["PlatformId"] = reader.ReadByte();
            byte endianness = reader.ReadByte();

            result.Root.Tags["Endianness"]   = endianness;
            result.Root.Tags["SizeExtended"] = reader.ReadByte();
            result.Root.Tags["Relocated"]    = reader.ReadByte();

            if (endianness == 0x00)
            {
                reader.Endianness = EndiannessMode.LittleEndian;
            }

            result.Root.Tags["Version"]  = reader.ReadInt32();
            result.Root.Tags["DataSize"] = reader.ReadInt32();

            int totalFolderCount = reader.ReadInt32();
            int folderInfoOffset = reader.ReadInt32();
            int totalFileCount   = reader.ReadInt32();
            int fileInfoOffset   = reader.ReadInt32();

            var folderNames = new string[totalFolderCount];

            for (var i = 0; i < totalFolderCount; i++)
            {
                folderNames[i] = reader.ReadString(0x40).TrimEnd('\0');
                if (folderNames[i].Length < 1)
                {
                    folderNames[i] = ".";
                }
            }

            var fileNames = new string[totalFileCount];

            for (var i = 0; i < totalFileCount; i++)
            {
                fileNames[i] = reader.ReadString(0x40).TrimEnd('\0');
            }

            reader.Stream.Seek(folderInfoOffset);
            var folders = new Node[totalFolderCount];

            for (var i = 0; i < totalFolderCount; i++)
            {
                folders[i] = new Node(folderNames[i], new NodeContainerFormat())
                {
                    Tags =
                    {
                        ["FolderCount"]      = reader.ReadInt32(),
                        ["FirstFolderIndex"] = reader.ReadInt32(),
                        ["FileCount"]        = reader.ReadInt32(),
                        ["FirstFileIndex"]   = reader.ReadInt32(),
                        ["Attributes"]       = reader.ReadInt32(),
                        ["Unused1"]          = reader.ReadInt32(),
                        ["Unused2"]          = reader.ReadInt32(),
                        ["Unused3"]          = reader.ReadInt32(),
                    },
                };
            }

            reader.Stream.Seek(fileInfoOffset);
            var files = new Node[totalFileCount];

            for (var i = 0; i < totalFileCount; i++)
            {
                uint  compressionFlag = reader.ReadUInt32();
                uint  size            = reader.ReadUInt32();
                uint  compressedSize  = reader.ReadUInt32();
                uint  baseOffset      = reader.ReadUInt32();
                int   attributes      = reader.ReadInt32();
                uint  extendedOffset  = reader.ReadUInt32();
                ulong timestamp       = reader.ReadUInt64();

                long offset = ((long)extendedOffset << 32) | baseOffset;
                var  file   = new ParFile(source.Stream, offset, compressedSize)
                {
                    CanBeCompressed  = false, // Don't try to compress if the original was not compressed.
                    IsCompressed     = compressionFlag == 0x80000000,
                    DecompressedSize = size,
                    Attributes       = attributes,
                    Timestamp        = timestamp,
                };

                files[i] = new Node(fileNames[i], file)
                {
                    Tags = { ["Timestamp"] = timestamp, },
                };
            }

            BuildTree(folders[0], folders, files, this.parameters);

            result.Root.Add(folders[0]);

            return(result);
        }
コード例 #13
0
        private Node ProcessDirectory(
            uint directoryIndex,
            DataReader reader,
            ParIndex index,
            ref bool[] processedDirectories)
        {
            if (processedDirectories[directoryIndex])
            {
                return(null);
            }

            _ = reader.Stream.Seek(0x20 + (directoryIndex * 0x40), System.IO.SeekOrigin.Begin);
            string name = reader.ReadString(0x40).TrimEnd('\0');

            if (string.IsNullOrEmpty(name))
            {
                name = ".";
            }

            _ = reader.Stream.Seek(index.DirectoryStartOffset + (directoryIndex * 0x20), System.IO.SeekOrigin.Begin);
            var directoryInfo = reader.Read <ParDirectoryInfo>() as ParDirectoryInfo;

            var directory = new Node(name, new NodeContainerFormat())
            {
                Tags =
                {
                    ["SubdirectoryCount"]      = directoryInfo.SubdirectoryCount,
                    ["SubdirectoryStartIndex"] = directoryInfo.SubdirectoryStartIndex,
                    ["FileCount"]      = directoryInfo.FileCount,
                    ["FileStartIndex"] = directoryInfo.FileStartIndex,
                    ["RawAttributes"]  = directoryInfo.RawAttributes,
                },
            };

            for (uint i = directoryInfo.SubdirectoryStartIndex;
                 i < directoryInfo.SubdirectoryStartIndex + directoryInfo.SubdirectoryCount;
                 i++)
            {
                Node child = ProcessDirectory(i, reader, index, ref processedDirectories);
                if (child != null)
                {
                    directory.Add(child);
                }
            }

            for (uint i = directoryInfo.FileStartIndex;
                 i < directoryInfo.FileStartIndex + directoryInfo.FileCount;
                 i++)
            {
                _ = reader.Stream.Seek(0x20 + (0x40 * index.DirectoryCount) + (i * 0x40), System.IO.SeekOrigin.Begin);
                string fileName = reader.ReadString(0x40).TrimEnd('\0');

                _ = reader.Stream.Seek(index.FileStartOffset + (i * 0x20), System.IO.SeekOrigin.Begin);

                var fileInfo = reader.Read <ParFileInfo>() as ParFileInfo;

                long       offset       = ((long)fileInfo.ExtendedOffset << 32) | fileInfo.DataOffset;
                DataStream stream       = DataStreamFactory.FromStream(reader.Stream, offset, fileInfo.CompressedSize);
                var        binaryFormat = new ParFile(fileInfo, stream);
                var        file         = new Node(fileName, binaryFormat)
                {
                    Tags =
                    {
                        ["RawAttributes"] = fileInfo.RawAttributes,
                        ["Timestamp"]     = fileInfo.Timestamp,
                    },
                };
                directory.Add(file);
            }

            processedDirectories[directoryIndex] = true;
            return(directory);
        }
コード例 #14
0
        static void Test1(string[] args)
        {
            if (args.Length != 1)
            {
                Console.WriteLine("IrbisInteropTester <irbis_server.ini>");
                return;
            }

            try
            {
                string   fileName = args[0];
                Encoding encoding = IrbisEncoding.Ansi;
                IniFile  iniFile  = new IniFile
                                    (
                    fileName,
                    encoding,
                    false
                                    );
                ServerIniFile serverIni = new ServerIniFile
                                          (
                    iniFile
                                          );

                string systemPath = serverIni.SystemPath
                                    .ThrowIfNull("systemPath not set");
                Console.WriteLine("SystemPath={0}", systemPath);

                string dataPath = serverIni.DataPath
                                  .ThrowIfNull("dataPath not set");
                Console.WriteLine("DataPath={0}", dataPath);

                int interopVersion = Irbis65Dll.InteropVersion();
                Console.WriteLine("InteropVersion={0}", interopVersion);

                StringBuilder dllVersion = new StringBuilder(100);
                Irbis65Dll.IrbisDllVersion(dllVersion, dllVersion.Capacity);
                Console.WriteLine("Irbis64.dll version={0}", dllVersion);

                string uctab   = serverIni.UpperCaseTable;
                string lctab   = string.Empty;
                string actab   = serverIni.AlphabetTablePath;
                string execDir = systemPath;
                string dataDir = dataPath;
                int    retCode = Irbis65Dll.IrbisUatabInit(uctab, lctab, actab, execDir, dataDir);
                Console.WriteLine("IrbisUatabInit={0}", retCode);
                HandleRetCode(retCode);
                //DumpAddress(new IntPtr(retCode), 192);

                string depositPath = Path.GetFullPath
                                     (
                    Path.Combine
                    (
                        dataPath,
                        "Deposit"
                    )
                                     );
                Console.WriteLine("DepositPath={0}", depositPath);
                retCode = Irbis65Dll.IrbisInitDeposit(depositPath);
                Console.WriteLine("IrbisInitDeposit({0})={1}", depositPath, retCode);
                HandleRetCode(retCode);

                Irbis65Dll.IrbisSetOptions(-1, 0, 0);
                Console.WriteLine("IrbisSetOptions(-1,0,0)");

                IntPtr space = Irbis65Dll.IrbisInit();
                Console.WriteLine("IrbisInit=0x{0:X8}", space.ToInt32());
                //DumpAddress(space, 256);

                string mainIni = Path.GetFullPath
                                 (
                    Path.Combine
                    (
                        systemPath,
                        "irbisc.ini"
                    )
                                 );
                Irbis65Dll.IrbisMainIniInit(mainIni);
                Console.WriteLine("IrbisMainIniInit({0})", mainIni);

                string ibisParPath = Path.Combine
                                     (
                    dataPath,
                    "ibis.par"
                                     );
                ParFile ibisPar = ParFile.ParseFile(ibisParPath);
                string  mstPath = ibisPar.MstPath
                                  .ThrowIfNull("mstPath not set");
                mstPath = Path.GetFullPath
                          (
                    Path.Combine(systemPath, mstPath)
                          );
                mstPath = Path.Combine
                          (
                    mstPath,
                    "ibis"
                          );

                retCode = Irbis65Dll.IrbisInitMst(space, mstPath, 1);
                Console.WriteLine("IrbisInitMst({0})={1}", mstPath, retCode);
                HandleRetCode(retCode);

                string termPath = ibisPar.IfpPath
                                  .ThrowIfNull("ibisPar.IfpPath not set");
                termPath = Path.GetFullPath
                           (
                    Path.Combine(systemPath, termPath)
                           );
                termPath = Path.Combine
                           (
                    termPath,
                    "ibis"
                           );
                retCode = Irbis65Dll.IrbisInitTerm(space, termPath);
                Console.WriteLine("IrbisInitTerm({0})={1}", termPath, retCode);
                HandleRetCode(retCode);

                retCode = Irbis65Dll.IrbisIsDbLocked(space);
                Console.WriteLine("IrbisIsDbLocked={0}", retCode);
                HandleRetCode(retCode);

                int maxMfn = Irbis65Dll.IrbisMaxMfn(space);
                Console.WriteLine("MaxMFN={0}", maxMfn);
                HandleRetCode(maxMfn);

                int mfn = 1;
                retCode = Irbis65Dll.IrbisRecord(space, 0, mfn);
                Console.WriteLine("IrbisRecord({0})={1}", mfn, retCode);
                HandleRetCode(retCode);

                mfn = Irbis65Dll.IrbisMfn(space, 0);
                Console.WriteLine("IrbisMfn={0}", mfn);
                HandleRetCode(mfn);

                retCode = Irbis65Dll.IrbisNFields(space, 0);
                Console.WriteLine("IrbisNFields={0}", retCode);
                HandleRetCode(retCode);

                int isLocked     = Irbis65Dll.IrbisIsLocked(space, 0);
                int isDeleted    = Irbis65Dll.IrbisIsDeleted(space, 0);
                int isActualized = Irbis65Dll.IrbisIsActualized(space, 0);
                Console.WriteLine("Locked={0}, Deleted={1}, Actualized={2}",
                                  isLocked, isDeleted, isActualized);
                HandleRetCode(isLocked);
                HandleRetCode(isDeleted);
                HandleRetCode(isActualized);

                isLocked = Irbis65Dll.IrbisIsRealyLocked(space, mfn);
                Console.WriteLine("IrbisIsReallyLocked={0}", isLocked);
                HandleRetCode(isLocked);

                int version = Irbis65Dll.IrbisReadVersion(space, mfn);
                Console.WriteLine("IrbisReadVersion={0}", version);
                HandleRetCode(version);

                //string rawRecordText = Irbis65Dll.GetRawRecordText(space);
                //Console.WriteLine(rawRecordText);

                string pftPath = ibisPar.PftPath
                                 .ThrowIfNull("pftPath not set");
                pftPath = Path.GetFullPath
                          (
                    Path.Combine
                    (
                        systemPath,
                        pftPath
                    )
                          );
                Console.WriteLine("PftPath={0}", pftPath);
                //string briefPath = Path.Combine
                //    (
                //        pftPath,
                //        "brief"
                //    );

                //int retcode = Irbis65Dll.IrbisInitPft(space, "@" + briefPath);
                //Console.WriteLine("IrbisInitPft({0})={1}", briefPath, retcode);
                //HandleRetCode(retcode);

                //Irbis65Dll.IrbisInitUactab(space);
                //Console.WriteLine("IrbisInitUactab");

                //retcode = Irbis65Dll.IrbisFormat
                //    (
                //        space,
                //        0 /*номер полки*/,
                //        1,
                //        0,
                //        32000 /*размер буфера*/,
                //        "IRBIS64"
                //    );
                //Console.WriteLine("IrbisFormat={0}", retcode);
                //HandleRetCode(retcode);

                //string formattedRecord = Irbis65Dll.GetFormattedRecord(space);
                //Console.WriteLine(formattedRecord);

                Encoding utf  = Encoding.UTF8;
                byte[]   term = new byte[512];
                string   text = "K=";
                utf.GetBytes(text, 0, text.Length, term, 0);
                retCode = Irbis65Dll.IrbisFind(space, term);
                Console.WriteLine("IrbisFind={0}", retCode);
                for (int i = 0; i < 10; i++)
                {
                    retCode = Irbis65Dll.IrbisNextTerm(space, term);
                    if (retCode < 0)
                    {
                        break;
                    }
                    text = FromBytes(utf, term);
                    int nposts = Irbis65Dll.IrbisNPosts(space);
                    Console.Write("{0,-8} {1}:", nposts, text);
                    for (int j = 0; j < nposts; j++)
                    {
                        Irbis65Dll.IrbisNextPost(space);
                        mfn = Irbis65Dll.IrbisPosting(space, 1);
                        Console.Write
                        (
                            "{0}{1}",
                            j == 0 ? " " : ", ",
                            mfn
                        );
                    }
                    Console.WriteLine();
                }

                Irbis65Dll.IrbisClose(space);
                Console.WriteLine("Closed");
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
            }
        }
コード例 #15
0
        public NodeContainerFormat Convert(BinaryFormat source)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            source.Stream.Position = 0;

            var result = new NodeContainerFormat();

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            var reader = new DataReader(source.Stream)
            {
                DefaultEncoding = Encoding.GetEncoding(1252),
                Endianness      = EndiannessMode.BigEndian,
            };

            string magicId = reader.ReadString(4);

            if (magicId == "SLLZ")
            {
                var subStream  = new DataStream(source.Stream, 0, source.Stream.Length);
                var compressed = new ParFile(subStream);
                source = (ParFile)ConvertFormat.With <Sllz.Decompressor>(compressed);
                source.Stream.Position = 0;

                reader = new DataReader(source.Stream)
                {
                    DefaultEncoding = Encoding.GetEncoding(1252),
                    Endianness      = EndiannessMode.BigEndian,
                };

                magicId = reader.ReadString(4);
            }

            if (magicId != "PARC")
            {
                throw new FormatException("PARC: Bad magic Id.");
            }

            result.Root.Tags["Unknown#1"] = reader.ReadInt32();
            result.Root.Tags["Unknown#2"] = reader.ReadInt32();
            result.Root.Tags["Unknown#3"] = reader.ReadInt32();

            int totalFolderCount = reader.ReadInt32();
            int folderInfoOffset = reader.ReadInt32();
            int totalFileCount   = reader.ReadInt32();
            int fileInfoOffset   = reader.ReadInt32();

            var folderNames = new string[totalFolderCount];

            for (int i = 0; i < totalFolderCount; i++)
            {
                folderNames[i] = reader.ReadString(0x40).TrimEnd('\0');
            }

            var fileNames = new string[totalFileCount];

            for (int i = 0; i < totalFileCount; i++)
            {
                fileNames[i] = reader.ReadString(0x40).TrimEnd('\0');
            }

            reader.Stream.Seek(folderInfoOffset);
            var folders = new Node[totalFolderCount];

            for (int i = 0; i < totalFolderCount; i++)
            {
                folders[i] = new Node(folderNames[i], new NodeContainerFormat())
                {
                    Tags =
                    {
                        ["FolderCount"]      = reader.ReadInt32(),
                        ["FirstFolderIndex"] = reader.ReadInt32(),
                        ["FileCount"]        = reader.ReadInt32(),
                        ["FirstFileIndex"]   = reader.ReadInt32(),
                        ["Attributes"]       = reader.ReadInt32(),
                        ["Unknown2"]         = reader.ReadInt32(),
                        ["Unknown3"]         = reader.ReadInt32(),
                        ["Unknown4"]         = reader.ReadInt32(),
                    },
                };
            }

            reader.Stream.Seek(fileInfoOffset);
            var files = new Node[totalFileCount];

            for (int i = 0; i < totalFileCount; i++)
            {
                uint compressionFlag = reader.ReadUInt32();
                uint size            = reader.ReadUInt32();
                uint compressedSize  = reader.ReadUInt32();
                uint offset          = reader.ReadUInt32();
                int  attributes      = reader.ReadInt32();
                int  unknown2        = reader.ReadInt32();
                int  unknown3        = reader.ReadInt32();
                int  date            = reader.ReadInt32();

                var file = new ParFile(source.Stream, offset, compressedSize)
                {
                    CanBeCompressed  = false, // Don't try to compress if the original was not compressed.
                    IsCompressed     = compressionFlag == 0x80000000,
                    DecompressedSize = size,
                    Attributes       = attributes,
                    Unknown2         = unknown2,
                    Unknown3         = unknown3,
                    Date             = date,
                };

                files[i] = new Node(fileNames[i], file)
                {
                    Tags = { ["Date"] = date, },
                };
            }

            BuildTree(folders[0], folders, files, this.parameters);

            result.Root.Add(folders[0]);

            return(result);
        }
コード例 #16
0
        /// <summary>
        /// Converts a NodeContainerFormat into a BinaryFormat.
        /// </summary>
        /// <param name="source">Input format.</param>
        /// <returns>The node container format.</returns>
        /// <exception cref="ArgumentNullException">Thrown if source is null.</exception>
        public virtual BinaryFormat Convert(NodeContainerFormat source)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            // Reorder nodes
            source.Root.SortChildren((x, y) =>
                                     string.CompareOrdinal(x.Name.ToLowerInvariant(), y.Name.ToLowerInvariant()));

            // Fill node indexes
            FillNodeIndexes(source.Root);

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            DataStream stream = _writerParameters.OutputStream ?? DataStreamFactory.FromMemory();

            stream.Position = 0;

            var writer = new DataWriter(stream)
            {
                DefaultEncoding = Encoding.GetEncoding(1252),
                Endianness      = _writerParameters.Endianness == Endianness.LittleEndian
                    ? EndiannessMode.LittleEndian
                    : EndiannessMode.BigEndian,
            };

            var  directories = new List <Node>();
            var  files       = new List <Node>();
            uint fileOffset  = 0;
            uint maxFileSize = 0;

            foreach (Node node in Navigator.IterateNodes(source.Root))
            {
                if (!node.IsContainer)
                {
                    uint compressedSize = (uint)node.Stream.Length;
                    fileOffset = RoundSize(fileOffset, compressedSize);
                    if (compressedSize > maxFileSize)
                    {
                        maxFileSize = compressedSize;
                    }

                    files.Add(node);
                }
                else
                {
                    directories.Add(node);
                }
            }

            if (maxFileSize >= 0xFFFFFFFF)
            {
                throw new FormatException("Can not add files over 4GB");
            }

            var header = new FileHeader
            {
                Magic        = "PARC",
                PlatformId   = _writerParameters.PlatformId,
                Endianness   = _writerParameters.Endianness,
                SizeExtended = 0,
                Relocated    = 0,
                Version      = _writerParameters.Version,
                Size         = 0,
            };

            uint directoryStartOffset = (uint)(0x20 + (0x40 * (directories.Count + files.Count)));
            uint fileStartOffset      = (uint)(directoryStartOffset + (0x20 * directories.Count));
            var  index = new ParIndex
            {
                DirectoryCount       = (uint)directories.Count,
                DirectoryStartOffset = directoryStartOffset,
                FileCount            = (uint)files.Count,
                FileStartOffset      = fileStartOffset,
            };

            uint headerSize = RoundSize((uint)((0x20 * files.Count) + fileStartOffset));

            writer.Stream.SetLength(RoundSize(fileOffset + headerSize));

            uint currentOffset = headerSize;

            if (_writerParameters.WriteDataSize)
            {
                header.Size = headerSize + fileOffset;
            }

            writer.WriteOfType(header);
            writer.WriteOfType(index);

            for (int i = 0; i < directories.Count; i++)
            {
                Node node = directories[i];
                writer.Write(node.Name, 0x40, false);

                long returnPosition = writer.Stream.Position;
                _ = writer.Stream.Seek(directoryStartOffset + (i * 0x20), System.IO.SeekOrigin.Begin);

                var directoryInfo = new ParDirectoryInfo
                {
                    SubdirectoryCount      = (uint)node.Tags["SubdirectoryCount"],
                    SubdirectoryStartIndex = (uint)node.Tags["SubdirectoryStartIndex"],
                    FileCount      = (uint)node.Tags["FileCount"],
                    FileStartIndex = (uint)node.Tags["FileStartIndex"],
                    RawAttributes  = (uint)node.Tags["RawAttributes"],
                };

                writer.WriteOfType(directoryInfo);
                writer.WritePadding(0x00, 0x20);

                _ = writer.Stream.Seek(returnPosition, System.IO.SeekOrigin.Begin);
            }

            for (int i = 0; i < files.Count; i++)
            {
                Node node = files[i];
                writer.Write(node.Name, 0x40, false);

                long returnPosition = writer.Stream.Position;
                _ = writer.Stream.Seek(fileStartOffset + (i * 0x20), System.IO.SeekOrigin.Begin);

                ParFile file = node.GetFormatAs <ParFile>();
                currentOffset                = RoundOffset(currentOffset, file.FileInfo.CompressedSize);
                file.FileInfo.DataOffset     = currentOffset;
                file.FileInfo.ExtendedOffset = 0;

                if (node.Tags.ContainsKey("RawAttributes"))
                {
                    file.FileInfo.RawAttributes = node.Tags["RawAttributes"];
                }
                else if (node.Tags.ContainsKey("FileInfo"))
                {
                    FileInfo info = node.Tags["FileInfo"];
                    file.FileInfo.RawAttributes = (uint)info.Attributes;
                }
                else
                {
                    file.FileInfo.RawAttributes = 0x20;
                }

                if (node.Tags.ContainsKey("Timestamp"))
                {
                    file.FileInfo.Timestamp = node.Tags["Timestamp"];
                }
                else if (node.Tags.ContainsKey("FileInfo"))
                {
                    DateTime baseDate = new DateTime(1970, 1, 1);
                    FileInfo info     = node.Tags["FileInfo"];
                    file.FileInfo.Timestamp = (uint)(info.LastWriteTime - baseDate).TotalSeconds;
                }
                else
                {
                    DateTime baseDate = new DateTime(1970, 1, 1);
                    file.FileInfo.Timestamp = (uint)(DateTime.Now - baseDate).TotalSeconds;
                }

                writer.WriteOfType(file.FileInfo);

                _ = writer.Stream.Seek(currentOffset, SeekOrigin.Begin);
                node.Stream.WriteTo(writer.Stream);

                currentOffset += file.FileInfo.CompressedSize;

                _ = writer.Stream.Seek(returnPosition, System.IO.SeekOrigin.Begin);
            }

            return(new BinaryFormat(stream));
        }
コード例 #17
0
        public ParFile Convert(NodeContainerFormat source)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            DataStream dataStream = string.IsNullOrEmpty(this.parameters.OutputPath) ? DataStreamFactory.FromMemory() : DataStreamFactory.FromFile(this.parameters.OutputPath, FileOpenMode.Write);

            var writer = new DataWriter(dataStream)
            {
                DefaultEncoding = Encoding.GetEncoding(1252),
                Endianness      = EndiannessMode.BigEndian,
            };

            var folders = new List <Node>();
            var files   = new List <Node>();

            if (this.parameters.IncludeDots)
            {
                var parFolderRootNode = new Node(".", new NodeContainerFormat());
                source.MoveChildrenTo(parFolderRootNode);
                folders.Add(parFolderRootNode);
            }

            GetFoldersAndFiles(source.Root, folders, files, this.parameters);
            CompressFiles(files, this.parameters.CompressorVersion);

            int  headerSize        = 32 + (64 * folders.Count) + (64 * files.Count);
            int  folderTableOffset = headerSize;
            int  fileTableOffset   = folderTableOffset + (folders.Count * 32);
            long dataPosition      = fileTableOffset + (files.Count * 32);

            dataPosition = Align(dataPosition, 2048);

            writer.Write("PARC", 4, false);

            if (source.Root.Tags.ContainsKey("PlatformId"))
            {
                writer.Write((byte)source.Root.Tags["PlatformId"]);
            }
            else
            {
                writer.Write((byte)0x02);
            }

            if (source.Root.Tags.ContainsKey("Endianness"))
            {
                var endianness = (byte)source.Root.Tags["Endianness"];
                writer.Write(endianness);
                writer.Endianness = endianness == 0x00 ? EndiannessMode.LittleEndian : EndiannessMode.BigEndian;
            }
            else
            {
                writer.Write((byte)0x01);
            }

            writer.Write((ushort)0x0000); // extended size and relocated

            if (source.Root.Tags.ContainsKey("Version"))
            {
                writer.Write((int)source.Root.Tags["Version"]);
            }
            else
            {
                writer.Write(0x00020001);
            }

            writer.Write(0x00000000); // data size

            writer.Write(folders.Count);
            writer.Write(folderTableOffset);
            writer.Write(files.Count);
            writer.Write(fileTableOffset);

            WriteNames(writer, folders);
            WriteNames(writer, files);

            WriteFolders(writer, folders);
            WriteFiles(writer, files, dataPosition);

            dataStream.Seek(0, SeekMode.End);
            writer.WritePadding(0, 2048);

            var result = new ParFile(dataStream)
            {
                CanBeCompressed = false,
            };

            return(result);
        }
コード例 #18
0
 private SpriteSheetSource(ParFile gtfSource)
 {
     this.gtfSource = gtfSource;
 }