/*
NativeTextFile.java
(c) 2008-2015 Edward Swartz
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/epl-v10.html
*/
package v9t9.common.files;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import ejs.base.utils.Check;
public class NativeTextFile implements NativeFile {
private File file;
private IEmulatedDisk disk;
public NativeTextFile(IEmulatedDisk disk, File file) {
this.disk = disk;
Check.checkArg(file);
this.file = file;
}
/* (non-Javadoc)
* @see v9t9.common.files.IEmulatedFile#getDisk()
*/
@Override
public IEmulatedDisk getDisk() {
return disk;
}
@Override
public String toString() {
return file.getAbsolutePath() + " (text)";
}
@Override
public String getFileName() {
return file.getName().toUpperCase();
}
@Override
public File getFile() {
return file;
}
@Override
public int getFileSize() {
return (int) Math.min(file.length(), Integer.MAX_VALUE);
}
@Override
public int readContents(byte[] contents, int contentOffset, int offset, int length) throws IOException {
// FileInputStream fis = new FileInputStream(file);
// int size = (int) file.length() - offset;
// size = Math.min(size, length);
//
// Check.checkArg((size < (long)Integer.MAX_VALUE));
// CompatUtils.skipFully(fis, offset);
// int ret = fis.read(contents, contentOffset, size);
// fis.close();
RandomAccessFile raf = new RandomAccessFile(file, "r");
raf.seek(offset);
int ret = raf.read(contents, contentOffset, length);
raf.close();
return ret;
}
@Override
public int writeContents(byte[] contents, int contentOffset, int offset, int length) throws IOException {
RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.seek(offset);
raf.write(contents, contentOffset, length);
raf.close();
return length;
}
/* (non-Javadoc)
* @see v9t9.engine.files.NativeFile#setLength(int)
*/
@Override
public void setFileSize(int size) throws IOException {
RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.setLength(size);
raf.close();
}
/* (non-Javadoc)
* @see v9t9.engine.files.NativeFile#flush()
*/
@Override
public void flush() throws IOException {
}
/* (non-Javadoc)
* @see v9t9.engine.files.NativeFile#validate()
*/
@Override
public void validate() throws InvalidFDRException {
}
/* (non-Javadoc)
* @see v9t9.engine.files.NativeFile#getFDRFlags()
*/
@Override
public int getFlags() {
int flags = FDR.ff_variable;
if (!file.canWrite())
flags |= FDR.ff_protected;
return flags;
}
/* (non-Javadoc)
* @see v9t9.engine.files.NativeFile#getSectorsUsed()
*/
@Override
public int getSectorsUsed() {
return (getFileSize() + 255) / 256;
}
/* (non-Javadoc)
* @see v9t9.engine.files.IFDRInfo#getByteOffset()
*/
@Override
public int getByteOffset() {
return getFileSize() % 256;
}
/* (non-Javadoc)
* @see v9t9.engine.files.IFDRInfo#getNumberRecords()
*/
@Override
public int getNumberRecords() {
return getSectorsUsed();
}
/* (non-Javadoc)
* @see v9t9.engine.files.IFDRInfo#getRecordLength()
*/
@Override
public int getRecordLength() {
return 80;
}
/* (non-Javadoc)
* @see v9t9.engine.files.IFDRInfo#getRecordsPerSector()
*/
@Override
public int getRecordsPerSector() {
return 3;
}
/* (non-Javadoc)
* @see v9t9.common.files.IFDRInfo#getContentSectors()
*/
@Override
public int[] getContentSectors() {
int[] secs = new int[getSectorsUsed()];
for (int i = 0; i < secs.length; i++) {
secs[i] = i * 256;
}
return secs;
}
/* (non-Javadoc)
* @see v9t9.common.files.IFDRInfo#getComment()
*/
@Override
public String getComment() {
return null;
}
}