Fall back to renames by copying if normal renaming fails as Windows XP decided

today that renaming is no longer allowed (at least in the directory in which
we're installing our games). Also nixed the old JavaScript bridge stuff which
we no longer use and was flaky in the first place.
This commit is contained in:
Michael Bayne
2007-04-13 18:48:23 +00:00
parent f62ebb1bfa
commit 424aa5cd24
6 changed files with 81 additions and 62 deletions
@@ -67,6 +67,7 @@ import org.apache.commons.io.IOUtils;
import com.threerings.getdown.Log;
import com.threerings.getdown.util.ConfigUtil;
import com.threerings.getdown.util.FileUtil;
import com.threerings.getdown.util.LaunchUtil;
import com.threerings.getdown.util.MetaProgressObserver;
import com.threerings.getdown.util.ProgressObserver;
@@ -1082,24 +1083,16 @@ public class Application
}
}
// Windows is a wonderful operating system, it won't let you rename a file overtop of
// another one; thus to avoid running the risk of getting royally fucked, we have to do
// this complicated backup bullshit; this way if the shit hits the fan before we get the
// new copy into place, we should be able to read from the backup copy; yay!
// move the old file to a _old version
File original = getLocalPath(path);
if (RunAnywhere.isWindows() && original.exists()) {
File backup = getLocalPath(path + "_old");
if (backup.exists() && !backup.delete()) {
Log.warning("Failed to delete " + backup + ".");
}
if (!original.renameTo(backup)) {
Log.warning("Failed to move " + original + " to backup. We will likely fail " +
"to replace it with " + target + ".");
if (original.exists()) {
if (!FileUtil.renameTo(original, getLocalPath(path + "_old"))) {
Log.warning("Failed to move " + original + " to backup.");
}
}
// now attempt to replace the current file with the new one
if (!target.renameTo(original)) {
// now move the temporary file over the original
if (!FileUtil.renameTo(target, original)) {
throw new IOException("Failed to rename(" + target + ", " + original + ")");
}
}
@@ -32,9 +32,6 @@ import java.io.FileOutputStream;
import java.io.File;
import java.io.PrintStream;
import netscape.javascript.JSObject;
import netscape.javascript.JSException;
import com.samskivert.util.RunAnywhere;
import com.samskivert.util.StringUtil;
@@ -125,17 +122,6 @@ public class GetdownApplet extends JApplet
protected void exit (int exitCode) {
// don't exit as we're in an applet
}
@Override protected void setStatus (
final String message, final int percent, final long remaining, boolean createUI)
{
super.setStatus(message, percent, remaining, createUI);
try {
JSObject.getWindow(GetdownApplet.this).call(
"getdownStatus", new Object[] { message, percent, remaining });
} catch (Throwable t) {
Log.warning("Failed to communicate status to JavaScript: " + t);
}
}
};
// set up our user interface immediately
@@ -33,6 +33,7 @@ import com.samskivert.io.StreamUtil;
import org.apache.commons.io.IOUtils;
import com.threerings.getdown.Log;
import com.threerings.getdown.util.FileUtil;
import com.threerings.getdown.util.ProgressObserver;
/**
@@ -166,7 +167,7 @@ public class Patcher
fout = null;
// move the current version of the jar to .old
if (!target.renameTo(otarget)) {
if (!FileUtil.renameTo(target, otarget)) {
System.err.println("Failed to .oldify '" + target + "'.");
return;
}
@@ -186,8 +187,7 @@ public class Patcher
} catch (IOException ioe) {
if (patcher == null) {
System.err.println("Failed to write patch file '" + patch +
"': " + ioe);
System.err.println("Failed to write patch file '" + patch + "': " + ioe);
} else {
System.err.println("Error patching '" + target + "': " + ioe);
}
@@ -0,0 +1,71 @@
//
// $Id$
//
// Getdown - application installer, patcher and launcher
// Copyright (C) 2004-2006 Three Rings Design, Inc.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 of the License, or (at your option)
// any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
// more details.
//
// You should have received a copy of the GNU General Public License along with
// this program; if not, write to the: Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
package com.threerings.getdown.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import com.samskivert.io.StreamUtil;
import org.apache.commons.io.IOUtils;
import com.threerings.getdown.Log;
/**
* File related utilities.
*/
public class FileUtil
{
/**
* Gets the specified source file to the specified destination file by hook or crook. Windows
* has all sorts of problems which we work around in this method.
*
* @return true if we managed to get the job done, false otherwise.
*/
public static boolean renameTo (File source, File dest)
{
// if we're on a civilized operating system we may be able to simple rename it
if (source.renameTo(dest)) {
return true;
}
// otherwise try copying the old data over the new
FileInputStream fin = null;
FileOutputStream fout = null;
try {
fin = new FileInputStream(source);
fout = new FileOutputStream(dest);
IOUtils.copy(fin, fout);
source.delete();
return true;
} catch (IOException ioe) {
Log.warning("Failed to copy " + source + " to " + dest + ": " + ioe);
return false;
} finally {
StreamUtil.close(fin);
StreamUtil.close(fout);
}
}
}
@@ -1,8 +0,0 @@
package netscape.javascript;
/**
* This just exists to compile against so that we don't have to link against plugin.jar
*/
public class JSException extends RuntimeException
{
}
@@ -1,23 +0,0 @@
package netscape.javascript;
import java.applet.Applet;
/**
* This just exists to compile against so that we don't have to link against plugin.jar
*/
public abstract class JSObject
{
public abstract Object call (String func, Object[] args) throws JSException;
public abstract Object eval (String code) throws JSException;
public abstract Object getMember (String name) throws JSException;
public abstract void setMember (String name, Object value) throws JSException;
public abstract void removeMember (String name) throws JSException;
public abstract Object getSlot (int slot) throws JSException;
public abstract void setSlot (int slot, Object value) throws JSException;
public static JSObject getWindow (Applet applet)
throws JSException
{
return null;
}
}