diff --git a/pom.xml b/pom.xml index 0036fbb..5ee2728 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 GraxCode JByteMod - 1.8.0 + 1.8.3 jar UTF-8 diff --git a/src/main/java/me/grax/jbytemod/utils/task/LoadTask.java b/src/main/java/me/grax/jbytemod/utils/task/LoadTask.java index c702ac3..8dbe470 100644 --- a/src/main/java/me/grax/jbytemod/utils/task/LoadTask.java +++ b/src/main/java/me/grax/jbytemod/utils/task/LoadTask.java @@ -99,6 +99,7 @@ private void readJar(JarFile jar, JarEntry en, Map classes, M try { final ClassNode cn = ASMUtils.getNode(bytes); if (cn != null) { // && (cn.name.equals("java/lang/Object") ? true : cn.superName != null) + cn.innerPath = en.getName(); classes.put(cn.name, cn); } } catch (Exception e) { diff --git a/src/main/java/me/grax/jbytemod/utils/task/SaveTask.java b/src/main/java/me/grax/jbytemod/utils/task/SaveTask.java index 69e5add..846927f 100644 --- a/src/main/java/me/grax/jbytemod/utils/task/SaveTask.java +++ b/src/main/java/me/grax/jbytemod/utils/task/SaveTask.java @@ -1,19 +1,17 @@ package me.grax.jbytemod.utils.task; -import java.io.File; -import java.nio.file.Files; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingWorker; - -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.tree.ClassNode; - import me.grax.jbytemod.JByteMod; import me.grax.jbytemod.JarArchive; import me.grax.jbytemod.ui.PageEndPanel; import me.lpk.util.JarUtils; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.tree.ClassNode; + +import javax.swing.*; +import java.io.File; +import java.nio.file.Files; +import java.util.List; +import java.util.Map; public class SaveTask extends SwingWorker { @@ -53,12 +51,17 @@ protected Void doInBackground() throws Exception { ClassNode node = classes.get(s); ClassWriter writer = new ClassWriter(flags); node.accept(writer); - outputBytes.put(s + ".class", writer.toByteArray()); - publish((int) ((i++ / size) * 50d)); + String name; + if (node.innerPath != null && !node.innerPath.isEmpty()) { + name = node.innerPath; + } else { + name = s + ".class"; + } + outputBytes.put(name, writer.toByteArray()); + publish((int) ((i++ / size) * 20d)); } - publish(50); JByteMod.LOGGER.log("Saving.."); - JarUtils.saveAsJar(outputBytes, output.getAbsolutePath()); + JarUtils.saveAsJar(outputBytes, output.getAbsolutePath(), process -> publish((int) (20d + process*80d))); JByteMod.LOGGER.log("Saving successful!"); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/me/lpk/util/JarUtils.java b/src/main/java/me/lpk/util/JarUtils.java index f935ed9..084e206 100644 --- a/src/main/java/me/lpk/util/JarUtils.java +++ b/src/main/java/me/lpk/util/JarUtils.java @@ -1,5 +1,8 @@ package me.lpk.util; +import org.apache.commons.io.IOUtils; +import org.objectweb.asm.tree.ClassNode; + import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -8,16 +11,15 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Consumer; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; import java.util.stream.Stream; +import java.util.zip.CRC32; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; -import org.apache.commons.io.IOUtils; -import org.objectweb.asm.tree.ClassNode; - public class JarUtils { /** * Creates a map of for a given jar file @@ -125,13 +127,34 @@ public static Map loadNonClassEntries(File jarFile) throws IOExc * @param fileName */ public static void saveAsJar(Map outBytes, String fileName) { + saveAsJar(outBytes, fileName, null); + } + public static void saveAsJar(Map outBytes, String fileName, Consumer progress) { try { JarOutputStream out = new JarOutputStream(new java.io.FileOutputStream(fileName)); + double i = 1; + double size = outBytes.size(); for (String entry : outBytes.keySet()) { - out.putNextEntry(new ZipEntry(entry)); - if (!entry.endsWith("/")) + JarEntry jarEntry = new JarEntry(entry); + + if (entry.endsWith("/")) { + out.putNextEntry(jarEntry); + } else { + byte[] content = outBytes.get(entry); + if (entry.endsWith(".jar")) { + jarEntry.setMethod(JarEntry.STORED); + jarEntry.setSize(content.length); + jarEntry.setCompressedSize(content.length); + CRC32 crc32 = new CRC32(); + crc32.update(content); + jarEntry.setCrc(crc32.getValue()); + } + out.putNextEntry(jarEntry); out.write(outBytes.get(entry)); + } out.closeEntry(); + if (progress != null) + progress.accept(i++/size); } out.close(); } catch (IOException e) { diff --git a/src/main/java/me/lpk/util/drop/JarDropHandler.java b/src/main/java/me/lpk/util/drop/JarDropHandler.java index 699a129..93f2ad2 100644 --- a/src/main/java/me/lpk/util/drop/JarDropHandler.java +++ b/src/main/java/me/lpk/util/drop/JarDropHandler.java @@ -1,12 +1,11 @@ package me.lpk.util.drop; +import javax.swing.*; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.io.File; import java.util.List; -import javax.swing.TransferHandler; - public class JarDropHandler extends TransferHandler { private static final long serialVersionUID = 1232L; private final IDropUser user; @@ -37,10 +36,7 @@ public boolean importData(TransferHandler.TransferSupport info) { } user.preLoadJars(id); for (File jar : data) { - if (jar.getName().toLowerCase().endsWith(".jar")) { - user.onJarLoad(id, jar); - break; - } + user.onJarLoad(id, jar); } return true; } diff --git a/src/main/java/org/objectweb/asm/tree/ClassNode.java b/src/main/java/org/objectweb/asm/tree/ClassNode.java index 3ac53d4..71f35a8 100644 --- a/src/main/java/org/objectweb/asm/tree/ClassNode.java +++ b/src/main/java/org/objectweb/asm/tree/ClassNode.java @@ -66,6 +66,11 @@ public class ClassNode extends ClassVisitor { */ public String name; + /** + * The internal path of the jar file. + */ + public String innerPath; + /** * The signature of the class. May be null. */