// Near Infinity - An Infinity Engine Browser and Editor
// Copyright (C) 2001 - 2005 Jon Olav Hauglid
// See LICENSE.txt for license information
package org.infinity.resource.key;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.SeekableByteChannel;
import java.nio.file.CopyOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.nio.file.StandardOpenOption;
import java.util.Locale;
import org.infinity.gui.BrowserMenuBar;
import org.infinity.resource.Profile;
import org.infinity.resource.ResourceFactory;
import org.infinity.util.io.ByteBufferInputStream;
import org.infinity.util.io.StreamUtils;
public final class FileResourceEntry extends ResourceEntry
{
private final boolean override;
private Path file;
public FileResourceEntry(Path file)
{
this(file, false);
}
public FileResourceEntry(Path file, boolean override)
{
this.file = file;
this.override = override;
}
@Override
public String toString()
{
return file.getFileName().toString().toUpperCase(Locale.ENGLISH);
}
public void deleteFile() throws IOException
{
Files.delete(file);
}
@Override
public Path getActualPath(boolean ignoreOverride)
{
return file;
}
@Override
public long getResourceSize(boolean ignoreOverride)
{
try {
return Files.size(file);
} catch (IOException e) {
e.printStackTrace();
}
return -1L;
}
@Override
public String getExtension()
{
String name = file.getFileName().toString();
return name.substring(name.lastIndexOf(".") + 1).toUpperCase(Locale.ENGLISH);
}
@Override
public ByteBuffer getResourceBuffer(boolean ignoreOverride) throws IOException
{
try (SeekableByteChannel ch = Files.newByteChannel(file, StandardOpenOption.READ)) {
ByteBuffer bb = StreamUtils.getByteBuffer((int)ch.size());
ch.read(bb);
bb.position(0);
return bb;
}
}
@Override
public InputStream getResourceDataAsStream(boolean ignoreOverride) throws IOException
{
return new ByteBufferInputStream(getResourceBuffer(ignoreOverride));
}
@Override
public int[] getResourceInfo(boolean ignoreOverride)
{
return getLocalFileInfo(file);
}
@Override
public String getResourceName()
{
return file.getFileName().toString();
}
@Override
public String getTreeFolder()
{
if ((BrowserMenuBar.getInstance() != null) &&
(BrowserMenuBar.getInstance().getOverrideMode() == BrowserMenuBar.OVERRIDE_IN_THREE) &&
hasOverride() &&
(ResourceFactory.getKeyfile().getExtensionType(getExtension()) != -1)) {
return getExtension();
} else if (hasOverride()) {
return Profile.getOverrideFolderName();
} else {
return file.getParent().getFileName().toString();
}
}
@Override
public boolean hasOverride()
{
return override;
}
public void renameFile(String newName, boolean overwrite) throws IOException
{
Path basePath = file.getParent();
CopyOption[] options = new CopyOption[overwrite ? 2 : 1];
options[0] = StandardCopyOption.ATOMIC_MOVE;
if (overwrite) {
options[1] = StandardCopyOption.REPLACE_EXISTING;
}
file = Files.move(file, basePath.resolve(newName), options);
}
}