package net.filebot.ui.transfer;
import static net.filebot.Settings.*;
import static net.filebot.util.FileUtilities.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import net.filebot.util.FileUtilities;
import net.filebot.util.TemporaryFolder;
public class ByteBufferTransferable implements Transferable {
protected final Map<String, ByteBuffer> vfs;
private FileTransferable transferable;
public ByteBufferTransferable(Map<String, ByteBuffer> vfs) {
this.vfs = vfs;
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
if (FileTransferable.isFileListFlavor(flavor)) {
try {
// create file for transfer on demand
if (transferable == null) {
transferable = createFileTransferable();
}
return transferable.getTransferData(flavor);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
throw new UnsupportedFlavorException(flavor);
}
protected FileTransferable createFileTransferable() throws IOException {
// remove invalid characters from file name
List<File> files = new ArrayList<File>();
for (Entry<String, ByteBuffer> entry : vfs.entrySet()) {
String name = entry.getKey();
ByteBuffer data = entry.getValue().duplicate();
// write temporary file
files.add(createTemporaryFile(name, data));
}
return new FileTransferable(files);
}
protected File createTemporaryFile(String name, ByteBuffer data) throws IOException {
// remove invalid characters from file name
String validFileName = validateFileName(name);
// create new temporary file in TEMP/APP_NAME [UUID]/dnd
File temporaryFile = TemporaryFolder.getFolder(getApplicationName()).subFolder("dnd").createFile(validFileName);
// write data to file
FileUtilities.writeFile(data, temporaryFile);
return temporaryFile;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] { DataFlavor.javaFileListFlavor, FileTransferable.uriListFlavor };
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return FileTransferable.isFileListFlavor(flavor);
}
}