package pl.asiekierka.AsieLauncher.launcher;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import pl.asiekierka.AsieLauncher.common.Utils;
public class Repacker {
private String jarFilename;
private HashMap<String, String> fileMap;
public Repacker(String _jarFilename) {
jarFilename=_jarFilename;
}
private void mergeJarFiles(String patchName, ZipInputStream in, ZipOutputStream out) throws ZipException, IOException {
ZipEntry entry = in.getNextEntry();
while(entry != null) {
String name = entry.getName();
if(!name.startsWith("META-INF")) {
if(fileMap.get(name).equals(patchName)) {
ZipEntry destEntry = new ZipEntry (entry.getName());
destEntry.setTime(entry.getTime());
destEntry.setExtra(entry.getExtra());
destEntry.setComment(entry.getComment());
out.putNextEntry(destEntry);
Utils.copyStream(in, out);
out.closeEntry();
}
}
entry = in.getNextEntry();
}
}
private String merge(String jarFile, String[] patches, String outFile) throws ZipException, IOException {
fileMap = new HashMap<String, String>();
// Generate filemap.
try {
for(String s: Utils.getZipList(jarFile)) {
fileMap.put(s, jarFile);
}
} catch(ZipException e) {
new File(jarFile).delete();
e.printStackTrace();
return "Corrupted file - restart AsieLauncher!";
}
for(String p: patches) {
for(String s: Utils.getZipList(p)) {
if(fileMap.containsKey(s)) {
fileMap.remove(s);
}
fileMap.put(s, p);
}
}
// Then finally do the merge.
File fJarFile = new File(jarFile);
File fOutFile = new File(outFile);
ZipOutputStream outStream = new ZipOutputStream(new FileOutputStream(fOutFile));
ZipInputStream jarInStream = new ZipInputStream(new FileInputStream(fJarFile));
mergeJarFiles(jarFile, jarInStream, outStream);
Utils.close(jarInStream);
// Apply file patches
for(String patch: patches) {
File patchFile = new File(patch);
ZipInputStream patchIn = new ZipInputStream(new FileInputStream(patchFile));
mergeJarFiles(patch, patchIn, outStream);
Utils.close(patchIn);
}
Utils.close(outStream);
return null;
}
public String repackJar(String mcFile, String[] patches) {
try {
File fMCFile = new File(jarFilename);
if(fMCFile.exists()) fMCFile.delete();
else {
fMCFile.getParentFile().mkdirs();
}
String mergeError = merge(mcFile, patches, jarFilename);
if(mergeError != null) return mergeError;
} catch(Exception e) { e.printStackTrace(); return "Repacking error!"; }
return null;
}
}