| 25 | { |
| 26 | |
| 27 | QString GetMinecraftJarVersion(QString jarName) |
| 28 | { |
| 29 | QString version; |
| 30 | |
| 31 | // check if minecraft.jar exists |
| 32 | QFile jar(jarName); |
| 33 | if (!jar.exists()) |
| 34 | return version; |
| 35 | |
| 36 | // open minecraft.jar |
| 37 | QuaZip zip(&jar); |
| 38 | if (!zip.open(QuaZip::mdUnzip)) |
| 39 | return version; |
| 40 | |
| 41 | // open Minecraft.class |
| 42 | zip.setCurrentFile("net/minecraft/client/Minecraft.class", QuaZip::csSensitive); |
| 43 | QuaZipFile Minecraft(&zip); |
| 44 | if (!Minecraft.open(QuaZipFile::ReadOnly)) |
| 45 | return version; |
| 46 | |
| 47 | // read Minecraft.class |
| 48 | qint64 size = Minecraft.size(); |
| 49 | char *classfile = new char[size]; |
| 50 | Minecraft.read(classfile, size); |
| 51 | |
| 52 | // parse Minecraft.class |
| 53 | try |
| 54 | { |
| 55 | char *temp = classfile; |
| 56 | java::classfile MinecraftClass(temp, size); |
| 57 | java::constant_pool constants = MinecraftClass.constants; |
| 58 | for (java::constant_pool::container_type::const_iterator iter = constants.begin(); |
| 59 | iter != constants.end(); iter++) |
| 60 | { |
| 61 | const java::constant &constant = *iter; |
| 62 | if (constant.type != java::constant_type_t::j_string_data) |
| 63 | continue; |
| 64 | const std::string &str = constant.str_data; |
| 65 | qDebug() << QString::fromStdString(str); |
| 66 | if (str.compare(0, 20, "Minecraft Minecraft ") == 0) |
| 67 | { |
| 68 | version = str.substr(20).data(); |
| 69 | break; |
| 70 | } |
| 71 | } |
| 72 | } |
| 73 | catch (const java::classfile_exception &) { } |
| 74 | |
| 75 | // clean up |
| 76 | delete[] classfile; |
| 77 | Minecraft.close(); |
| 78 | zip.close(); |
| 79 | jar.close(); |
| 80 | |
| 81 | return version; |
| 82 | } |
| 83 | } |