Added support for a "check_unpacked" flag that causes resources to be

unpacked on initial install (even though the resources are already
validated).
This commit is contained in:
Andrzej Kapolka
2011-06-10 01:56:09 +00:00
parent 35245d4d44
commit 686c1f1a3a
2 changed files with 63 additions and 4 deletions
@@ -1063,9 +1063,11 @@ public class Application
*
* @param alreadyValid if non-null a 1 element array that will have the number of "already
* validated" resources filled in.
* @param unpacked a set to populate with unpacked resources.
*/
public List<Resource> verifyResources (ProgressObserver obs, int[] alreadyValid)
throws InterruptedException
public List<Resource> verifyResources (
ProgressObserver obs, int[] alreadyValid, Set<Resource> unpacked)
throws InterruptedException
{
List<Resource> rsrcs = getAllResources();
List<Resource> failures = new ArrayList<Resource>();
@@ -1095,11 +1097,16 @@ public class Application
try {
if (_digest.validateResource(rsrc, mpobs)) {
// unpack this resource if appropriate
if (noUnpack || !rsrc.shouldUnpack() || rsrc.unpack()) {
if (noUnpack || !rsrc.shouldUnpack()) {
// finally note that this resource is kosher
rsrc.markAsValid();
continue;
}
if (rsrc.unpack()) {
unpacked.add(rsrc);
rsrc.markAsValid();
continue;
}
log.info("Failure unpacking resource", "rsrc", rsrc);
}
@@ -1116,6 +1123,40 @@ public class Application
return (failures.size() == 0) ? null : failures;
}
/**
* Unpacks the resources that require it (we know that they're valid).
*
* @param unpacked a set of resources to skip because they're already unpacked.
*/
public void unpackResources (ProgressObserver obs, Set<Resource> unpacked)
throws InterruptedException
{
List<Resource> rsrcs = getActiveResources();
// total up the file size of the resources to unpack
long totalSize = 0L;
for (Iterator<Resource> it = rsrcs.iterator(); it.hasNext(); ) {
Resource rsrc = it.next();
if (rsrc.shouldUnpack() && !unpacked.contains(rsrc)) {
totalSize += rsrc.getLocal().length();
} else {
it.remove();
}
}
MetaProgressObserver mpobs = new MetaProgressObserver(obs, totalSize);
for (Resource rsrc : rsrcs) {
if (Thread.interrupted()) {
throw new InterruptedException("m.applet_stopped");
}
mpobs.startElement(rsrc.getLocal().length());
if (!rsrc.unpack()) {
log.info("Failure unpacking resource", "rsrc", rsrc);
}
mpobs.progress(100);
}
}
/**
* Clears all validation marker files.
*/
@@ -51,10 +51,12 @@ import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Map;
import java.util.Iterator;
import java.util.List;
import java.util.ResourceBundle;
import java.util.Set;
import ca.beq.util.win32.registry.RegistryKey;
import ca.beq.util.win32.registry.RegistryValue;
@@ -404,6 +406,9 @@ public abstract class Getdown extends Thread
// time through
int[] alreadyValid = new int[1];
// we'll keep track of all the resources we unpack
Set<Resource> unpacked = new HashSet<Resource>();
for (int ii = 0; ii < MAX_LOOPS; ii++) {
// if we aren't running in a JVM that meets our version requirements, either
// complain or attempt to download and install the appropriate version
@@ -431,9 +436,22 @@ public abstract class Getdown extends Thread
// now verify our resources...
setStatus("m.validating", -1, -1L, false);
List<Resource> failures = _app.verifyResources(_progobs, alreadyValid);
List<Resource> failures = _app.verifyResources(_progobs, alreadyValid, unpacked);
if (failures == null) {
log.info("Resources verified.");
// if we were downloaded in full from another service (say, Steam), we may
// not have unpacked all of our resources yet
if (Boolean.getBoolean("check_unpacked")) {
File ufile = _app.getLocalPath("unpacked.dat");
if (!ufile.exists()) {
log.info("Performing initial unpack.");
setStatus("m.validating", -1, -1L, true);
_app.unpackResources(_progobs, unpacked);
ufile.createNewFile();
}
}
// Only launch if we aren't in silent mode. Some mystery program starting out
// of the blue would be disconcerting.
if (!_silent || _launchInSilent) {