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); } }
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); }
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); }
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); }
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); }
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); } }
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)); }
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; }