Interrupt getdown's thread when the applet gets a stop message, and pick up on that from getdown so we don't keep working silently in the background and launch
This commit is contained in:
@@ -948,6 +948,7 @@ public class Application
|
||||
* validated" resources filled in.
|
||||
*/
|
||||
public List<Resource> verifyResources (ProgressObserver obs, int[] alreadyValid)
|
||||
throws InterruptedException
|
||||
{
|
||||
List<Resource> rsrcs = getAllResources();
|
||||
List<Resource> failures = new ArrayList<Resource>();
|
||||
@@ -960,6 +961,9 @@ public class Application
|
||||
|
||||
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.isMarkedValid()) {
|
||||
|
||||
@@ -377,13 +377,8 @@ public abstract class Getdown extends Thread
|
||||
_app.releaseLock();
|
||||
// Store the config modtime before waiting the delay amount of time
|
||||
long lastConfigModtime = config.lastModified();
|
||||
try {
|
||||
Log.info("Waiting " + _delay + " minutes before beginning actual work");
|
||||
Thread.sleep(_delay * 15 * 1000);
|
||||
} catch (InterruptedException ie) {
|
||||
Log.warning("Who dares disturb my slumber?");
|
||||
Log.logStackTrace(ie);
|
||||
}
|
||||
Log.info("Waiting " + _delay + " minutes before beginning actual work");
|
||||
Thread.sleep(_delay * 15 * 1000);
|
||||
if (lastConfigModtime < config.lastModified()) {
|
||||
Log.warning("getdown.txt was modified while getdown was waiting");
|
||||
throw new MultipleGetdownRunning();
|
||||
@@ -431,8 +426,12 @@ public abstract class Getdown extends Thread
|
||||
// Only launch if we aren't in silent mode. Some mystery program starting out
|
||||
// of the blue would be disconcerting.
|
||||
if (!_silent || _launchInSilent) {
|
||||
// One last check for the lock before launching. It'll already be held
|
||||
// unless we're in silent mode.
|
||||
if (Thread.interrupted()) {
|
||||
// One last interrupted check so we don't launch as the applet aborts
|
||||
throw new InterruptedException("m.applet_stopped");
|
||||
}
|
||||
// And another final check for the lock. It'll already be held unless
|
||||
// we're in silent mode.
|
||||
_app.lockForUpdates();
|
||||
launch();
|
||||
}
|
||||
@@ -526,7 +525,7 @@ public abstract class Getdown extends Thread
|
||||
* running with the necessary Java version.
|
||||
*/
|
||||
protected void updateJava ()
|
||||
throws IOException
|
||||
throws IOException, InterruptedException
|
||||
{
|
||||
Resource vmjar = _app.getJavaVMResource();
|
||||
if (vmjar == null) {
|
||||
@@ -581,7 +580,7 @@ public abstract class Getdown extends Thread
|
||||
* Called if the application is determined to be of an old version.
|
||||
*/
|
||||
protected void update ()
|
||||
throws IOException
|
||||
throws IOException, InterruptedException
|
||||
{
|
||||
// first clear all validation markers
|
||||
_app.clearValidationMarkers();
|
||||
@@ -638,7 +637,7 @@ public abstract class Getdown extends Thread
|
||||
* Called if the application is determined to require resource downloads.
|
||||
*/
|
||||
protected void download (List<Resource> resources)
|
||||
throws IOException
|
||||
throws IOException, InterruptedException
|
||||
{
|
||||
// create our user interface
|
||||
createInterface(false);
|
||||
@@ -660,6 +659,12 @@ public abstract class Getdown extends Thread
|
||||
}
|
||||
_lastCheck = percent;
|
||||
}
|
||||
if (Thread.currentThread().isInterrupted()) {
|
||||
// The applet interrupts when it stops, so abort the download and quit. Use
|
||||
// isInterrupted so the containing code can call interrupted outside of here
|
||||
// to check if this was the reason for aborting.
|
||||
return false;
|
||||
}
|
||||
setStatus("m.downloading", percent, remaining, true);
|
||||
if (percent > 0) {
|
||||
reportTrackingEvent("progress", percent);
|
||||
@@ -700,6 +705,9 @@ public abstract class Getdown extends Thread
|
||||
|
||||
// start the download and wait for it to complete
|
||||
if (!dl.download()) {
|
||||
if (Thread.interrupted()) {
|
||||
throw new InterruptedException("m.applet_stopped");
|
||||
}
|
||||
throw new MultipleGetdownRunning();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,6 +172,9 @@ public class GetdownApplet extends JApplet
|
||||
@Override // documentation inherited
|
||||
public void stop ()
|
||||
{
|
||||
// Interrupt the getdown thread to tell it to kill its current downloading or verifying
|
||||
// before launching
|
||||
_getdown.interrupt();
|
||||
// release the lock if the applet window is closed or replaced
|
||||
_getdown._app.releaseLock();
|
||||
}
|
||||
|
||||
@@ -97,6 +97,8 @@ m.default_install_error = the support section of the website
|
||||
|
||||
m.another_getdown_running = Multiple instances of this application's \
|
||||
installer are running. This one will stop and let another complete.
|
||||
|
||||
m.applet_stopped = Getdown's applet was told to stop working.
|
||||
|
||||
# application/digest errors
|
||||
m.missing_appbase = The configuration file is missing the 'appbase'.
|
||||
|
||||
Reference in New Issue
Block a user