System.Collections.Generic.ICollection.Add(Xfsa2DirectoryEntry)

Here are the examples of the csharp api System.Collections.Generic.ICollection.Add(Xfsa2DirectoryEntry) taken from open source projects. By voting up you can indicate which examples are most useful and appropriate.

1 Examples 7

19 Source : XFSA2.cs
with GNU General Public License v3.0
from FanTranslatorsInternational

private void BuildTables(IEnumerable<XfsaArchiveFileInfo<Xfsa2FileEntry>> files,
            out IList<Xfsa2DirectoryEntry> directoryEntries, out IList<uint> directoryHashes,
            out IList<XfsaArchiveFileInfo<Xfsa2FileEntry>> fileEntries, out Stream nameStream)
        {
            var groupedFiles = files.OrderBy(x => x.FilePath.GetDirectory())
                .GroupBy(x => x.FilePath.GetDirectory())
                .ToArray();

            var crc32 = Crc32.Default;
            var sjis = Encoding.GetEncoding("SJIS");

            nameStream = new MemoryStream();
            using var nameBw = new BinaryWriterX(nameStream, true);

            var fileInfos = new List<XfsaArchiveFileInfo<Xfsa2FileEntry>>();
            directoryEntries = new List<Xfsa2DirectoryEntry>();
            directoryHashes = new List<uint>();
            var fileOffset = 0;
            foreach (var fileGroup in groupedFiles)
            {
                var fileIndex = fileInfos.Count;
                var fileGroupEntries = fileGroup.ToArray();

                // Add directory entry first
                var directoryNameOffset = (int)nameBw.BaseStream.Position;
                var directoryName = fileGroup.Key.ToRelative().FullName;
                if (!string.IsNullOrEmpty(directoryName))
                    directoryName += "/";
                nameBw.WriteString(directoryName, sjis, false);

                var hash = crc32.ComputeValue(directoryName.ToLower(), sjis);
                var newDirectoryEntry = new Xfsa2DirectoryEntry
                {
                    crc32 = string.IsNullOrEmpty(fileGroup.Key.ToRelative().FullName) ? 0xFFFFFFFF : hash,

                    directoryCount = (short)groupedFiles.Count(gf => fileGroup.Key != gf.Key && gf.Key.IsInDirectory(fileGroup.Key, false)),

                    fileCount = (short)fileGroupEntries.Length,
                    FirstFileIndex = (short)fileIndex,

                    directoryNameOffset = directoryNameOffset,
                    fileNameStartOffset = (int)nameBw.BaseStream.Position
                };
                if (newDirectoryEntry.crc32 != 0xFFFFFFFF)
                    directoryHashes.Add(newDirectoryEntry.crc32);
                directoryEntries.Add(newDirectoryEntry);

                // Write file names in alphabetic order
                foreach (var fileEntry in fileGroupEntries)
                {
                    fileEntry.Entry.NameOffset = (int)(nameBw.BaseStream.Position - newDirectoryEntry.fileNameStartOffset);
                    fileEntry.Entry.crc32 = crc32.ComputeValue(fileEntry.FilePath.GetName().ToLower(), sjis);
                    fileEntry.Entry.FileOffset = fileOffset;
                    fileEntry.Entry.FileSize = (int)fileEntry.FileSize;

                    fileOffset = (int)((fileOffset + fileEntry.FileSize + 15) & ~15);

                    nameBw.WriteString(fileEntry.FilePath.GetName(), sjis, false);
                }

                // Add file entries in order of ascending hash
                fileInfos.AddRange(fileGroupEntries.OrderBy(x => x.Entry.crc32));
            }

            fileEntries = fileInfos;

            // Order directory entries by hash and set directoryIndex accordingly
            var directoryIndex = 0;
            directoryEntries = directoryEntries.OrderBy(x => x.crc32).Select(x =>
            {
                x.FirstDirectoryIndex = (short)directoryIndex;
                directoryIndex += x.directoryCount;
                return x;
            }).ToList();
        }