package tk.captainsplexx.Resource.CAS;
import java.util.ArrayList;
import tk.captainsplexx.Resource.FileHandler;
import tk.captainsplexx.Resource.FileSeeker;
public class CasCatManager {
public byte[] header = new byte[] {
(byte) 0x4E, (byte) 0x79, (byte) 0x61, (byte) 0x6E,
(byte) 0x4E, (byte) 0x79, (byte) 0x61, (byte) 0x6E,
(byte) 0x4E, (byte) 0x79, (byte) 0x61, (byte) 0x6E,
(byte) 0x4E, (byte) 0x79, (byte) 0x61, (byte) 0x6E}; // << NyanNyanNyanNyan >>
public ArrayList<CasCatEntry> entries;
public FileSeeker seeker;
public byte[] cat;
public boolean readCat(byte[] fileArray, String description) {
System.out.println("Reading "+description+" cas.cat file!");
for (int i = 0; i <header.length; i++){
if (header[i] != fileArray[i]){
System.err.println("given fileArray does not match header of cat.cas file :/");
return false;
}
}
entries = new ArrayList<CasCatEntry>();
seeker = new FileSeeker();
seeker.seek(16);
/* Starwars Battlefront contains the number of entries in a long behind the header!
* So, calculate number of entries by filesize, if there are 8 bytes left. Skip 8!
*
* SHA1 = 20 Bytes
* Offset = 4 Bytes
* ProcSize = 4 Bytes
* CasFile = 4 Bytes
* ------------------> Total Size = 32 Bytes == 0x20
* */
int dataSize = fileArray.length-header.length;
int leftOver = dataSize%0x20;
if (leftOver!=0){
System.out.println("New CasCat-File was detected (aka. 'Starwars Battlefront change')");
seeker.seek(leftOver);//Skip additional header data.
}
while (seeker.getOffset() < fileArray.length){
CasCatEntry en = new CasCatEntry();
en.setSHA1(FileHandler.readSHA1(fileArray, seeker));
en.setOffset(FileHandler.readInt(fileArray, seeker));
en.setProcSize(FileHandler.readInt(fileArray, seeker));
en.setCasFile(FileHandler.readInt(fileArray, seeker));
/*if (en.getSHA1().equalsIgnoreCase("337A2C248C20171E2575CADFFFAEF9805F0E255C")){
System.err.println("Found 337A2C248C20171E2575CADFFFAEF9805F0E255C SHA1!");
}
System.out.println(en.getSHA1());*/
entries.add(en);
}//EOF
System.out.println(entries.size()+" entries where found.");
return true;
}
public byte[] getCat(){
System.out.println("Generating cas.cat file with a size of: "+(entries.size()*32)+16+" Byte!");
seeker = new FileSeeker();
cat = new byte[(entries.size()*32)+16];
addBytes(header); //HEADER 16bytes
for (CasCatEntry e : entries){
addBytes(FileHandler.hexStringToByteArray(e.getSHA1())); //SHA1 20bytes
addBytes(toBytes(e.getOffset())); //OFFSET 4bytes
addBytes(toBytes(e.getProcSize())); //PROCSIZE 4bytes
addBytes(toBytes(e.getCasFile())); //CASFILE 4bytes
}
return cat;
}
void addBytes(byte[] arr){
for (Byte b : arr){
cat[seeker.getOffset()] = b;
seeker.seek(1);
}
}
byte[] toBytes(int i)
{
byte[] result = new byte[4]; //LITTLE
result[3] = (byte) (i >> 24);
result[2] = (byte) (i >> 16);
result[1] = (byte) (i >> 8);
result[0] = (byte) (i /*>> 0*/);
return result;
}
//DEBUG PRINT
public void dumpDebug(){
for (CasCatEntry e : entries){
System.out.println(e.getSHA1()+" "+e.getCasFile()+"\n");
}
}
//GETTER AND SETTERS
public ArrayList<CasCatEntry> getEntries() {
return entries;
}
}