/*
IndexSector.java
(c) 2013 Ed 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.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @author ejs
*
*/
public class IndexSector {
public static IndexSector create(byte[] sec1) {
IndexSector index = new IndexSector();
for (int i = 0; i < sec1.length; i += 2) {
int sec = ((sec1[i + 0] & 0xff) << 8) | (sec1[i + 1] & 0xff);
if (sec != 0)
index.entries.add(sec);
}
return index;
}
private List<Integer> entries;
public IndexSector() {
entries = new ArrayList<Integer>();
}
public byte[] toBytes() {
byte[] sec = new byte[256];
int i = 0;
for (Integer n : entries) {
sec[i] = (byte) (n >> 8);
sec[i + 1] = (byte) (int) n;
i += 2;
}
return sec;
}
public void remove(int indexSector) {
entries.remove((Integer) indexSector);
}
public void add(int indexSector, String fileName, Catalog prevCatalog) throws IOException {
CatalogEntry exist = prevCatalog.findEntry(fileName);
if (exist != null) {
int existIndex = entries.indexOf(exist.indexSector);
if (existIndex < 0)
throw new IOException("inconsistent directory: entry " + exist + " not in index sector");
// replace
entries.set(existIndex, indexSector);
return;
}
if (entries.size() >= 128) {
throw new IOException("directory full");
}
// insert in order
for (CatalogEntry entry : prevCatalog.getEntries()) {
if (entry.getFile().getFileName().compareTo(fileName) > 0) {
int entIndex = entries.indexOf(entry.indexSector);
if (entIndex < 0)
throw new IOException("inconsistent directory: entry " + exist + " not in index sector");
// insert
entries.add(entIndex, indexSector);
return;
}
}
entries.add(indexSector);
}
}