104 lines
3.4 KiB
Java
104 lines
3.4 KiB
Java
/*
|
|
* AppleCommander - An Apple ][ image utility.
|
|
* Copyright (C) 2019-2022 by Robert Greene and others
|
|
* robgreene at users.sourceforge.net
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
package io.github.applecommander.filters;
|
|
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.UncheckedIOException;
|
|
|
|
import com.webcodepro.applecommander.storage.FileEntry;
|
|
import com.webcodepro.applecommander.storage.FileFilter;
|
|
import com.webcodepro.applecommander.storage.os.dos33.DosFileEntry;
|
|
import com.webcodepro.applecommander.storage.os.prodos.ProdosFileEntry;
|
|
|
|
import io.github.applecommander.applesingle.AppleSingle;
|
|
|
|
/**
|
|
* A FileFilter to write each file to an independent AppleSingle file.
|
|
*/
|
|
public class AppleSingleFileFilter implements FileFilter {
|
|
@Override
|
|
public byte[] filter(FileEntry fileEntry) {
|
|
try {
|
|
AppleSingle.Builder builder = AppleSingle.builder()
|
|
.dataFork(fileEntry.getFileData())
|
|
.realName(fileEntry.getFilename());
|
|
if (fileEntry instanceof ProdosFileEntry) {
|
|
handleProDOS(builder, (ProdosFileEntry)fileEntry);
|
|
}
|
|
else if (fileEntry instanceof DosFileEntry) {
|
|
handleDOS(builder, (DosFileEntry)fileEntry);
|
|
}
|
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
|
builder.build().save(baos);
|
|
return baos.toByteArray();
|
|
} catch (IOException e) {
|
|
throw new UncheckedIOException(e);
|
|
}
|
|
}
|
|
protected void handleProDOS(AppleSingle.Builder builder, ProdosFileEntry prodos) {
|
|
// We can't get the "access" byte so reconstructing it...
|
|
int access = (prodos.canDestroy() ? 0x80 : 0x00)
|
|
| (prodos.canRename() ? 0x40 : 0x00)
|
|
| (prodos.canWrite() ? 0x02 : 0x00)
|
|
| (prodos.canRead() ? 0x01 : 0x00);
|
|
builder.access(access);
|
|
builder.auxType(prodos.getAuxiliaryType());
|
|
builder.creationDate(prodos.getCreationDate().toInstant());
|
|
builder.fileType(prodos.getFiletypeByte());
|
|
builder.modificationDate(prodos.getLastModificationDate().toInstant());
|
|
}
|
|
protected void handleDOS(AppleSingle.Builder builder, DosFileEntry dos) {
|
|
switch (dos.getFiletype()) {
|
|
// 0x00 T
|
|
case "T":
|
|
builder.fileType(0x04); // TXT
|
|
break;
|
|
// 0x01 I
|
|
case "I":
|
|
builder.fileType(0xfa); // INT
|
|
break;
|
|
// 0x02 A
|
|
case "A":
|
|
builder.fileType(0xfc); // BAS
|
|
break;
|
|
// 0x04 B
|
|
case "B":
|
|
builder.fileType(0x06); // BIN
|
|
//builder.auxType(???) // FIXME address is not exposed?
|
|
break;
|
|
// The rest we just default
|
|
default:
|
|
builder.fileType(0xf1); // $F1 (???)
|
|
break;
|
|
}
|
|
builder.access(dos.isLocked() ? 0x01 : 0xc3);
|
|
}
|
|
|
|
@Override
|
|
public String getSuggestedFileName(FileEntry fileEntry) {
|
|
String fileName = fileEntry.getFilename().trim();
|
|
if (!fileName.toLowerCase().endsWith(".as")) {
|
|
fileName = fileName + ".as";
|
|
}
|
|
return fileName;
|
|
}
|
|
}
|