Do not use the java checker during instance update

This commit is contained in:
Petr Mrázek 2014-01-14 01:13:35 +01:00
parent 4744ea07a8
commit 555cbe00ce
4 changed files with 112 additions and 94 deletions

View File

@ -27,6 +27,37 @@ import java.util.List;
public class Utils
{
/**
* Combine two parts of a path.
* @param path1
* @param path2
* @return the paths, combined
*/
public static String combine (String path1, String path2)
{
File file1 = new File(path1);
File file2 = new File(file1, path2);
return file2.getPath();
}
/**
* Join a list of strings into a string using a separator!
* @param strings the string list to join
* @param separator the glue
* @return the result.
*/
public static String join (List<String> strings, String separator)
{
StringBuilder sb = new StringBuilder();
String sep = "";
for(String s: strings)
{
sb.append(sep).append(s);
sep = separator;
}
return sb.toString();
}
/**
* Adds the specified library to the classpath
*

View File

@ -66,7 +66,11 @@ public class OneSixLauncher implements Launcher
return -1;
}
final ClassLoader cl = ClassLoader.getSystemClassLoader();
String property = System.getProperty("os.arch");
List<String> allNativePaths = new ArrayList<String>();
boolean is_64 = property.equalsIgnoreCase("x86_64") || property.equalsIgnoreCase("amd64");
allNativePaths.add(natives);
allNativePaths.add(Utils.combine(natives, is_64 ? "64" : "32"));
// print the pretty things
{
@ -74,6 +78,13 @@ public class OneSixLauncher implements Launcher
System.out.println(mainClass);
System.out.println();
System.out.println("Native paths:");
for (String s : allNativePaths)
{
System.out.println(s);
}
System.out.println();
System.out.println("Libraries:");
for (String s : libraries)
{
@ -96,8 +107,10 @@ public class OneSixLauncher implements Launcher
System.out.println();
}
final ClassLoader cl = ClassLoader.getSystemClassLoader();
// set up the natives path(s).
System.setProperty("java.library.path", natives );
System.setProperty("java.library.path", Utils.join(allNativePaths, String.valueOf(File.pathSeparatorChar)) );
Field fieldSysPath;
try
{

View File

@ -54,17 +54,7 @@ void OneSixUpdate::executeTask()
if (m_only_prepare)
{
/*
* FIXME: in offline mode, do not proceed!
*/
setStatus(tr("Testing the Java installation..."));
QString java_path = m_inst->settings().get("JavaPath").toString();
checker.reset(new JavaChecker());
connect(checker.get(), SIGNAL(checkFinished(JavaCheckResult)), this,
SLOT(checkFinishedOffline(JavaCheckResult)));
checker->path = java_path;
checker->performCheck();
prepareForLaunch();
return;
}
@ -83,46 +73,8 @@ void OneSixUpdate::executeTask()
}
else
{
checkJavaOnline();
}
}
void OneSixUpdate::checkJavaOnline()
{
setStatus(tr("Testing the Java installation..."));
QString java_path = m_inst->settings().get("JavaPath").toString();
checker.reset(new JavaChecker());
connect(checker.get(), SIGNAL(checkFinished(JavaCheckResult)), this,
SLOT(checkFinishedOnline(JavaCheckResult)));
checker->path = java_path;
checker->performCheck();
}
void OneSixUpdate::checkFinishedOnline(JavaCheckResult result)
{
if (result.valid)
{
java_is_64bit = result.is_64bit;
jarlibStart();
}
else
{
emitFailed("The java binary doesn't work. Check the settings and correct the problem");
}
}
void OneSixUpdate::checkFinishedOffline(JavaCheckResult result)
{
if (result.valid)
{
java_is_64bit = result.is_64bit;
prepareForLaunch();
}
else
{
emitFailed("The java binary doesn't work. Check the settings and correct the problem");
}
}
void OneSixUpdate::versionFileStart()
@ -130,7 +82,8 @@ void OneSixUpdate::versionFileStart()
QLOG_INFO() << m_inst->name() << ": getting version file.";
setStatus(tr("Getting the version files from Mojang..."));
QString urlstr = "http://" + URLConstants::AWS_DOWNLOAD_VERSIONS + targetVersion->descriptor() + "/" + targetVersion->descriptor() + ".json";
QString urlstr = "http://" + URLConstants::AWS_DOWNLOAD_VERSIONS +
targetVersion->descriptor() + "/" + targetVersion->descriptor() + ".json";
auto job = new NetJob("Version index");
job->addNetAction(ByteArrayDownload::make(QUrl(urlstr)));
specificVersionDownloadJob.reset(job);
@ -186,7 +139,7 @@ void OneSixUpdate::versionFileFinished()
}
inst->reloadFullVersion();
checkJavaOnline();
jarlibStart();
}
void OneSixUpdate::versionFileFailed()
@ -277,8 +230,6 @@ void OneSixUpdate::assetsFailed()
emitFailed("Failed to download assets!");
}
void OneSixUpdate::jarlibStart()
{
setStatus(tr("Getting the library files from Mojang..."));
@ -318,13 +269,12 @@ void OneSixUpdate::jarlibStart()
{
if (lib->hint() == "local")
continue;
QString subst = java_is_64bit ? "64" : "32";
QString storage = lib->storagePath();
QString dl = lib->downloadUrl();
storage.replace("${arch}", subst);
dl.replace("${arch}", subst);
QString raw_storage = lib->storagePath();
QString raw_dl = lib->downloadUrl();
auto f = [&](QString storage, QString dl)
{
auto entry = metacache->resolveEntry("libraries", storage);
if (entry->stale)
{
@ -337,6 +287,20 @@ void OneSixUpdate::jarlibStart()
jarlibDownloadJob->addNetAction(CacheDownload::make(dl, entry));
}
}
};
if (raw_storage.contains("${arch}"))
{
QString cooked_storage = raw_storage;
QString cooked_dl = raw_dl;
f(cooked_storage.replace("${arch}", "32"), cooked_dl.replace("${arch}", "32"));
cooked_storage = raw_storage;
cooked_dl = raw_dl;
f(cooked_storage.replace("${arch}", "64"), cooked_dl.replace("${arch}", "64"));
}
else
{
f(raw_storage, raw_dl);
}
}
// TODO: think about how to propagate this from the original json file... or IF AT ALL
QString forgeMirrorList = "http://files.minecraftforge.net/mirror-brand.list";
@ -388,7 +352,9 @@ void OneSixUpdate::prepareForLaunch()
auto libs_to_extract = version->getActiveNativeLibs();
// Acquire bag
bool success = ensureFolderPathExists(natives_dir_raw);
bool success = true;
success &= ensureFolderPathExists(natives_dir_raw + "/32");
success &= ensureFolderPathExists(natives_dir_raw + "/64");
if (!success)
{
emitFailed("Could not create the native library folder:\n" + natives_dir_raw +
@ -398,21 +364,37 @@ void OneSixUpdate::prepareForLaunch()
}
// Put swag in the bag
QString subst = java_is_64bit ? "64" : "32";
for (auto lib : libs_to_extract)
{
QString storage = lib->storagePath();
storage.replace("${arch}", subst);
auto f = [&](QString storage, QString arch = "")
{
QString path = "libraries/" + storage;
QLOG_INFO() << "Will extract " << path.toLocal8Bit();
if (JlCompress::extractWithExceptions(path, natives_dir_raw, lib->extract_excludes)
.isEmpty())
if (JlCompress::extractWithExceptions(path, natives_dir_raw + "/" + arch,
lib->extract_excludes).isEmpty())
{
emitFailed(
"Could not extract the native library:\n" + path +
"\nMake sure MultiMC has appropriate permissions and there is enough space "
"on the storage device.");
return false;
}
};
QString storage = lib->storagePath();
if (storage.contains("${arch}"))
{
QString cooked_storage = storage;
cooked_storage.replace("${arch}", "32");
if (!f(cooked_storage, "32"))
return;
cooked_storage = storage;
cooked_storage.replace("${arch}", "64");
if (!f(cooked_storage, "64"))
return;
}
else
{
if (!f(storage))
return;
}
}

View File

@ -21,7 +21,6 @@
#include "logic/net/NetJob.h"
#include "logic/tasks/Task.h"
#include "logic/JavaChecker.h"
class MinecraftVersion;
class BaseInstance;
@ -50,10 +49,6 @@ slots:
void assetsFinished();
void assetsFailed();
void checkJavaOnline();
void checkFinishedOnline(JavaCheckResult result);
void checkFinishedOffline(JavaCheckResult result);
// extract the appropriate libraries
void prepareForLaunch();
@ -65,7 +60,4 @@ private:
std::shared_ptr<MinecraftVersion> targetVersion;
BaseInstance *m_inst = nullptr;
bool m_only_prepare = false;
std::shared_ptr<JavaChecker> checker;
bool java_is_64bit = false;
};