package jpcsp.util;
import static jpcsp.filesystems.umdiso.ISectorDevice.sectorLength;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.HashMap;
public class UmdBufferMerge {
public static void main(String[] args) {
File fileToc1 = new File("tmp/umdbuffer1.toc");
File fileIso1 = new File("tmp/umdbuffer1.iso");
File fileToc2 = new File("tmp/umdbuffer2.toc");
File fileIso2 = new File("tmp/umdbuffer2.iso");
File fileToc = new File("tmp/umdbuffer.toc");
File fileIso = new File("tmp/umdbuffer.iso");
try {
FileOutputStream fosToc = new FileOutputStream(fileToc);
FileOutputStream fosIso = new FileOutputStream(fileIso);
FileInputStream fisToc1 = new FileInputStream(fileToc1);
FileInputStream fisIso1 = new FileInputStream(fileIso1);
FileInputStream fisToc2 = new FileInputStream(fileToc2);
DataOutput toc = new DataOutputStream(fosToc);
DataOutput iso = new DataOutputStream(fosIso);
DataInput toc1 = new DataInputStream(fisToc1);
DataInput iso1 = new DataInputStream(fisIso1);
DataInput toc2 = new DataInputStream(fisToc2);
RandomAccessFile iso2 = new RandomAccessFile(fileIso2, "r");
int numSectors = toc1.readInt();
int numSectorsMerge = toc2.readInt();
toc.writeInt(Math.max(numSectors, numSectorsMerge));
HashMap<Integer, Integer> tocHashMap = new HashMap<Integer, Integer>();
for (int i = 4; i < fileToc1.length(); i += 8) {
int sectorNumber = toc1.readInt();
int bufferedSectorNumber = toc1.readInt();
tocHashMap.put(sectorNumber, bufferedSectorNumber);
toc.writeInt(sectorNumber);
toc.writeInt(bufferedSectorNumber);
}
byte[] buffer = new byte[sectorLength];
for (int i = 0; i < fileIso1.length(); i += buffer.length) {
iso1.readFully(buffer);
iso.write(buffer);
}
int nextFreeBufferedSectorNumber = (int) (fileIso1.length() / sectorLength);
for (int i = 4; i < fileToc2.length(); i += 8) {
int sectorNumber = toc2.readInt();
int bufferedSectorNumber = toc2.readInt();
if (!tocHashMap.containsKey(sectorNumber)) {
iso2.seek(bufferedSectorNumber * (long) sectorLength);
iso2.readFully(buffer);
iso.write(buffer);
toc.writeInt(sectorNumber);
toc.writeInt(nextFreeBufferedSectorNumber);
tocHashMap.put(sectorNumber, nextFreeBufferedSectorNumber);
nextFreeBufferedSectorNumber++;
}
}
fosToc.close();
fosIso.close();
fisToc1.close();
fisIso1.close();
fisToc2.close();
iso2.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}