Browser transfer fixes

This commit is contained in:
crschnick
2025-12-09 16:33:54 +00:00
parent 4fbe658368
commit 6df9077cb9
2 changed files with 27 additions and 14 deletions
@@ -161,6 +161,12 @@ public class BrowserFileTransferOperation {
reinitFileSystemsIfNeeded();
if (target.getKind() != FileKind.DIRECTORY) {
throw new IllegalStateException("Target " + target.getPath() + " is not a directory");
}
BrowserFileSystemHelper.validateDirectoryPath(target.getFileSystem(), target.getPath(), true);
cancelled.set(false);
var same = files.getFirst().getFileSystem().equals(target.getFileSystem());
@@ -244,12 +250,6 @@ public class BrowserFileTransferOperation {
}
private void handleSingleAcrossFileSystems(FileEntry source) throws Exception {
if (target.getKind() != FileKind.DIRECTORY) {
throw new IllegalStateException("Target " + target.getPath() + " is not a directory");
}
BrowserFileSystemHelper.validateDirectoryPath(target.getFileSystem(), target.getPath(), true);
var flatFiles = new LinkedHashMap<FileEntry, FilePath>();
// Prevent dropping directory into itself
@@ -263,11 +263,14 @@ public class BrowserFileTransferOperation {
// Source might have been deleted meanwhile
var exists = source.getFileSystem().directoryExists(source.getPath());
if (!exists) {
progress.accept(BrowserTransferProgress.finished(source.getName(), 0));
return;
}
var directoryName = source.getPath().getFileName();
flatFiles.put(source, FilePath.of(directoryName));
if (!source.getPath().isRoot()) {
flatFiles.put(source, FilePath.of(directoryName));
}
var baseRelative = source.getPath().getParent().toDirectory();
var list = new ArrayList<FileEntry>();
@@ -288,16 +291,21 @@ public class BrowserFileTransferOperation {
list.add(fileEntry);
return true;
});
} else {
} else if (source.getKind() == FileKind.FILE) {
// Source might have been deleted meanwhile
var exists = source.getFileSystem().fileExists(source.getPath());
if (!exists) {
progress.accept(BrowserTransferProgress.finished(source.getName(), 0));
return;
}
flatFiles.put(source, FilePath.of(source.getPath().getFileName()));
// If we don't have a size, it doesn't matter that much as the total size is only for display
totalSize.addAndGet(source.getFileSizeLong().orElse(0));
} else {
// Unsupported type, e.g. a socket
progress.accept(BrowserTransferProgress.finished(source.getName(), 0));
return;
}
var originalSourceFs = flatFiles.keySet().iterator().next().getFileSystem();
@@ -106,13 +106,14 @@ public class BrowserTransferModel {
public void drop(BrowserFileSystemTabModel model, List<BrowserEntry> entries) {
synchronized (items) {
entries.forEach(entry -> {
var name = entry.getFileName();
var resolved = entry.getRawFileEntry().resolved();
var name = resolved.getName();
if (items.stream().anyMatch(item -> item.getName().equals(name))) {
return;
}
var fixedFile = OsFileSystem.ofLocal()
.makeFileSystemCompatible(entry.getRawFileEntry().getPath());
.makeFileSystemCompatible(resolved.getPath());
Path file = TEMP.resolve(fixedFile.getFileName());
var item = new Item(model, name, entry, file);
items.add(item);
@@ -145,7 +146,7 @@ public class BrowserTransferModel {
transferring.setValue(true);
var op = new BrowserFileTransferOperation(
BrowserLocalFileSystem.getLocalFileEntry(TEMP),
List.of(item.getBrowserEntry().getRawFileEntry()),
List.of(item.getBrowserEntry().getRawFileEntry().resolved()),
BrowserFileTransferMode.COPY,
false,
progress -> {
@@ -192,6 +193,7 @@ public class BrowserTransferModel {
var files = toMove.stream().map(item -> item.getLocalFile()).toList();
var downloads = getDownloadsTargetDirectory();
Files.createDirectories(downloads);
Path firstToOpen = null;
for (Path file : files) {
if (!Files.exists(file)) {
continue;
@@ -207,10 +209,13 @@ public class BrowserTransferModel {
} else {
Files.move(file, target, StandardCopyOption.REPLACE_EXISTING);
}
if (firstToOpen == null) {
firstToOpen = target;
}
}
if (open) {
DesktopHelper.browseFileInDirectory(
downloads.resolve(files.getFirst().getFileName()));
if (open && firstToOpen != null) {
DesktopHelper.browseFileInDirectory(firstToOpen);
}
}