Пример #1
0
        private void CreateFileRecords()
        {
            folders = new List <FolderRecord>();
            files   = new List <FileRecord>();
            string       folder        = null;
            FolderRecord currentfolder = null;

            foreach (ListViewItem lvi in lvFiles.Items)
            {
                var newfolder = Path.GetDirectoryName(lvi.Text);
                if (newfolder != folder)
                {
                    currentfolder = new FolderRecord(newfolder);
                    folders.Add(currentfolder);
                    folder = newfolder;
                }
                var fr = new FileRecord(lvi);
                if (fr.size >= (1 << 30))
                {
                    MessageBox.Show("Error: File '" + fr.filepath + "' is too big to store in a BSA archive");
                    continue;
                }
                files.Add(fr);
                currentfolder.files.Add(fr);
            }
            var frc1 = new FolderRecordComparer();
            var frc2 = new FileRecordComparer();

            folders.Sort(frc1);
            foreach (var fr in folders)
            {
                fr.files.Sort(frc2);
            }
        }
Пример #2
0
        public void AddFile(string inputPath, string outputPath)
        {
            if (!File.Exists(inputPath))
            {
                throw new ArgumentException("File does not exist!", nameof(inputPath));
            }

            var input  = inputPath.MakePath();
            var output = outputPath.MakePath();

            var outputFolder = Path.GetDirectoryName(output);

            if (outputFolder == null)
            {
                throw new ArgumentException("Files in BSAs must have a parent-folder!", nameof(outputPath));
            }

            if (!Folders.TryGetValue(outputFolder, out var folderRecord))
            {
                folderRecord = new FolderRecord(outputFolder);
                Folders.Add(outputFolder, folderRecord);
            }

            var outputFileName = Path.GetFileName(output);
            var fileRecord     = new FileRecord(input, outputFileName, folderRecord);

            folderRecord.AddFile(fileRecord);
            Files.Add(fileRecord);
        }
Пример #3
0
        private static PwGroup CreateFolder(PwGroup groupAddTo, FolderRecord folderRecord)
        {
            PwGroup folder = new PwGroup(true, true);

            folder.Name                 = StringExt.GetValueOrEmpty(folderRecord.title);
            folder.CreationTime         = DateTimeExt.FromUnixTimeStamp(folderRecord.createdAt);
            folder.LastModificationTime = DateTimeExt.FromUnixTimeStamp(folderRecord.updatedAt);
            groupAddTo.AddGroup(folder, true);
            return(folder);
        }
Пример #4
0
        private void WriteFolderRecord(BinaryWriter bw, FolderRecord folderRecord, int index)
        {
            var offset = (uint)bw.BaseStream.Position;

            offset += (uint)FolderList.Skip(index).Select(x => (long)FolderRecord.SelfSize).Sum();
            offset += TotalFileNameLength;
            offset += (uint)FolderList.Take(index).Select(x => (long)x.FileRecordSize).Sum();

            bw.Write(folderRecord.Hash);
            bw.Write(folderRecord.Files.Count);
            bw.Write(offset);
        }
Пример #5
0
        internal static TES5FileRecordBlock Read(FolderRecord folderRecord)
        {
            var block = new TES5FileRecordBlock()
            {
                folderRecord = folderRecord
            };

            if (block.archive.hasDirectoryNames)
            {
                block.name = block.source.ReadString(1);
            }
            block.fileRecords = new FileRecord[folderRecord.fileCount];
            for (int i = 0; i < folderRecord.fileCount; i++)
            {
                block.fileRecords[i] = TES5FileRecord.Read(block);
            }
            return(block);
        }
Пример #6
0
        private static void ImportRecord(Node <BaseRecord> currentNode, PwGroup groupAddTo, PwDatabase pwStorage)
        {
            BaseRecord record = currentNode.AssociatedObject;

            if (record.GetType() == typeof(FolderRecord))
            {
                FolderRecord folderRecord = (FolderRecord)record;
                var          folder       = CreateFolder(groupAddTo, folderRecord);

                foreach (var node in currentNode.Nodes)
                {
                    ImportRecord(node, folder, pwStorage);
                }
            }
            else if (record.GetType() == typeof(GeneratedPasswordRecord))
            {
                // Don't import generated passwords - these are just generated passwords without a username
            }

            /*
             * else if (record.GetType() == typeof(BaseRecord))
             * {
             *  //Trace.WriteLine(String.Format("Error. Can't import unknown record type: {0}", record.RawJson));
             * }
             * else if (record.GetType() == typeof(UnknownRecord))
             * {
             *  //CreateUnknown(groupAddTo, pwStorage, record as UnknownRecord);
             * }
             */
            else
            {
                // Let the record create a password entry:
                PwEntry entry = record.CreatePwEntry(pwStorage);

                // If the record has created an entry, then add it to the group. If no entry was returned, then that record type is not supported yet.
                if (entry != null)
                {
                    groupAddTo.AddEntry(entry, true);
                }
                //else
                //    Trace.WriteLine("Entry could not be imported (did not return a valid entry): " + record.GetType().Name);
            }
        }
Пример #7
0
        public static async Task <BSA105> Open(FileInfo file)
        {
            using var stream = file.OpenRead();

            byte[] headerBytes = new byte[Header.size];
            await stream.ReadAsync(headerBytes);

            var header = new Header(headerBytes);

            byte[] recordsBytes = new byte[header.TotalRecordsSize];
            await stream.ReadAsync(recordsBytes);

            var folders   = new FolderRecord[header.folderCount];
            var filenames = new FileNameBlock(recordsBytes, header);

            for (int i = 0; i < header.folderCount; i++)
            {
                folders[i] = new FolderRecord(recordsBytes, i, header);
            }

            return(new BSA105(file, header, folders, filenames));
        }
Пример #8
0
		private static PwGroup CreateFolder(PwGroup groupAddTo, FolderRecord folderRecord)
		{
			PwGroup folder = new PwGroup(true, true);
			folder.Name = StringExt.GetValueOrEmpty(folderRecord.title);
			folder.CreationTime = DateTimeExt.FromUnixTimeStamp(folderRecord.createdAt);
			folder.LastModificationTime = DateTimeExt.FromUnixTimeStamp(folderRecord.updatedAt);
			groupAddTo.AddGroup(folder, true);
			return folder;
		}