Merge branch 'pack-200' of git://github.com/Cosium/getdown
This commit is contained in:
@@ -5,52 +5,6 @@
|
|||||||
|
|
||||||
package com.threerings.getdown.data;
|
package com.threerings.getdown.data;
|
||||||
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Rectangle;
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.PrintStream;
|
|
||||||
import java.io.RandomAccessFile;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.net.MalformedURLException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.net.URLClassLoader;
|
|
||||||
import java.net.URLConnection;
|
|
||||||
import java.nio.channels.FileChannel;
|
|
||||||
import java.nio.channels.FileLock;
|
|
||||||
import java.nio.channels.OverlappingFileLockException;
|
|
||||||
import java.security.AllPermission;
|
|
||||||
import java.security.CodeSource;
|
|
||||||
import java.security.GeneralSecurityException;
|
|
||||||
import java.security.PermissionCollection;
|
|
||||||
import java.security.Permissions;
|
|
||||||
import java.security.Signature;
|
|
||||||
import java.security.cert.Certificate;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.EnumMap;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import javax.swing.JApplet;
|
|
||||||
|
|
||||||
import org.apache.commons.codec.binary.Base64;
|
|
||||||
|
|
||||||
import com.samskivert.io.StreamUtil;
|
import com.samskivert.io.StreamUtil;
|
||||||
import com.samskivert.text.MessageUtil;
|
import com.samskivert.text.MessageUtil;
|
||||||
import com.samskivert.util.ArrayUtil;
|
import com.samskivert.util.ArrayUtil;
|
||||||
@@ -58,13 +12,27 @@ import com.samskivert.util.RandomUtil;
|
|||||||
import com.samskivert.util.RunAnywhere;
|
import com.samskivert.util.RunAnywhere;
|
||||||
import com.samskivert.util.StringUtil;
|
import com.samskivert.util.StringUtil;
|
||||||
import com.threerings.getdown.launcher.RotatingBackgrounds;
|
import com.threerings.getdown.launcher.RotatingBackgrounds;
|
||||||
import com.threerings.getdown.util.ConfigUtil;
|
import com.threerings.getdown.util.*;
|
||||||
import com.threerings.getdown.util.ConnectionUtil;
|
import org.apache.commons.codec.binary.Base64;
|
||||||
import com.threerings.getdown.util.FileUtil;
|
|
||||||
import com.threerings.getdown.util.LaunchUtil;
|
import javax.swing.*;
|
||||||
import com.threerings.getdown.util.MetaProgressObserver;
|
import java.awt.*;
|
||||||
import com.threerings.getdown.util.ProgressObserver;
|
import java.io.*;
|
||||||
import com.threerings.getdown.util.VersionUtil;
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
import java.net.URLConnection;
|
||||||
|
import java.nio.channels.FileChannel;
|
||||||
|
import java.nio.channels.FileLock;
|
||||||
|
import java.nio.channels.OverlappingFileLockException;
|
||||||
|
import java.security.*;
|
||||||
|
import java.security.cert.Certificate;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import static com.threerings.getdown.Log.log;
|
import static com.threerings.getdown.Log.log;
|
||||||
|
|
||||||
@@ -626,10 +594,12 @@ public class Application
|
|||||||
_txtJvmArgs.clear();
|
_txtJvmArgs.clear();
|
||||||
|
|
||||||
// parse our code resources
|
// parse our code resources
|
||||||
if (ConfigUtil.getMultiValue(cdata, "code") == null) {
|
if (ConfigUtil.getMultiValue(cdata, "code") == null
|
||||||
|
&& ConfigUtil.getMultiValue(cdata, "ucode") == null) {
|
||||||
throw new IOException("m.missing_code");
|
throw new IOException("m.missing_code");
|
||||||
}
|
}
|
||||||
parseResources(cdata, "code", false, _codes);
|
parseResources(cdata, "code", false, _codes);
|
||||||
|
parseResources(cdata, "ucode", true, _codes);
|
||||||
|
|
||||||
// parse our non-code resources
|
// parse our non-code resources
|
||||||
parseResources(cdata, "resource", false, _resources);
|
parseResources(cdata, "resource", false, _resources);
|
||||||
@@ -639,6 +609,7 @@ public class Application
|
|||||||
for (String auxgroup : parseList(cdata, "auxgroups")) {
|
for (String auxgroup : parseList(cdata, "auxgroups")) {
|
||||||
ArrayList<Resource> codes = new ArrayList<Resource>();
|
ArrayList<Resource> codes = new ArrayList<Resource>();
|
||||||
parseResources(cdata, auxgroup + ".code", false, codes);
|
parseResources(cdata, auxgroup + ".code", false, codes);
|
||||||
|
parseResources(cdata, auxgroup + ".ucode", true, codes);
|
||||||
ArrayList<Resource> rsrcs = new ArrayList<Resource>();
|
ArrayList<Resource> rsrcs = new ArrayList<Resource>();
|
||||||
parseResources(cdata, auxgroup + ".resource", false, rsrcs);
|
parseResources(cdata, auxgroup + ".resource", false, rsrcs);
|
||||||
parseResources(cdata, auxgroup + ".uresource", true, rsrcs);
|
parseResources(cdata, auxgroup + ".uresource", true, rsrcs);
|
||||||
@@ -925,7 +896,7 @@ public class Application
|
|||||||
if (cpbuf.length() > 0) {
|
if (cpbuf.length() > 0) {
|
||||||
cpbuf.append(File.pathSeparator);
|
cpbuf.append(File.pathSeparator);
|
||||||
}
|
}
|
||||||
cpbuf.append(rsrc.getLocal().getAbsolutePath());
|
cpbuf.append(rsrc.getFinalTarget().getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
ArrayList<String> args = new ArrayList<String>();
|
ArrayList<String> args = new ArrayList<String>();
|
||||||
@@ -1030,7 +1001,7 @@ public class Application
|
|||||||
ArrayList<URL> jars = new ArrayList<URL>();
|
ArrayList<URL> jars = new ArrayList<URL>();
|
||||||
for (Resource rsrc : getActiveCodeResources()) {
|
for (Resource rsrc : getActiveCodeResources()) {
|
||||||
try {
|
try {
|
||||||
jars.add(new URL("file", "", rsrc.getLocal().getAbsolutePath()));
|
jars.add(new URL("file", "", rsrc.getFinalTarget().getAbsolutePath()));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace(System.err);
|
e.printStackTrace(System.err);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,26 +5,23 @@
|
|||||||
|
|
||||||
package com.threerings.getdown.data;
|
package com.threerings.getdown.data;
|
||||||
|
|
||||||
|
import com.samskivert.io.StreamUtil;
|
||||||
|
import com.samskivert.util.FileUtil;
|
||||||
|
import com.samskivert.util.StringUtil;
|
||||||
|
import com.threerings.getdown.util.ProgressObserver;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.jar.JarEntry;
|
import java.util.jar.JarEntry;
|
||||||
import java.util.jar.JarFile;
|
import java.util.jar.JarFile;
|
||||||
|
|
||||||
import com.samskivert.io.StreamUtil;
|
|
||||||
import com.samskivert.util.FileUtil;
|
|
||||||
import com.samskivert.util.StringUtil;
|
|
||||||
|
|
||||||
import com.threerings.getdown.util.ProgressObserver;
|
|
||||||
|
|
||||||
import static com.threerings.getdown.Log.log;
|
import static com.threerings.getdown.Log.log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -41,7 +38,17 @@ public class Resource
|
|||||||
_remote = remote;
|
_remote = remote;
|
||||||
_local = local;
|
_local = local;
|
||||||
_marker = new File(_local.getPath() + "v");
|
_marker = new File(_local.getPath() + "v");
|
||||||
|
|
||||||
_unpack = unpack;
|
_unpack = unpack;
|
||||||
|
_isJar = _local.getPath().endsWith(".jar");
|
||||||
|
_isPacked200Jar = _local.getPath().endsWith(".jar.pack") || _local.getPath().endsWith(".jar.pack.gz");
|
||||||
|
if(_unpack && _isJar){
|
||||||
|
_unpacked = _local.getParentFile();
|
||||||
|
} else if(_unpack && _isPacked200Jar){
|
||||||
|
String jarExtension = ".jar";
|
||||||
|
_unpacked = new File(_local.getParent(),
|
||||||
|
_local.getName().substring(0, _local.getName().lastIndexOf(jarExtension) + jarExtension.length()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -60,6 +67,24 @@ public class Resource
|
|||||||
return _local;
|
return _local;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the location of the unpacked resource
|
||||||
|
*/
|
||||||
|
public File getUnpacked(){
|
||||||
|
return _unpacked;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the final target of this resource, wheter it has been unpacked or not
|
||||||
|
*/
|
||||||
|
public File getFinalTarget(){
|
||||||
|
if(shouldUnpack()){
|
||||||
|
return getUnpacked();
|
||||||
|
} else{
|
||||||
|
return getLocal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the remote location of this resource.
|
* Returns the remote location of this resource.
|
||||||
*/
|
*/
|
||||||
@@ -132,12 +157,16 @@ public class Resource
|
|||||||
public boolean unpack ()
|
public boolean unpack ()
|
||||||
{
|
{
|
||||||
// sanity check
|
// sanity check
|
||||||
if (!_local.getPath().endsWith(".jar")) {
|
if (!_isJar && !_isPacked200Jar) {
|
||||||
log.warning("Requested to unpack non-jar file '" + _local + "'.");
|
log.warning("Requested to unpack non-jar file '" + _local + "'.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
return FileUtil.unpackJar(new JarFile(_local), _local.getParentFile());
|
if(_isJar){
|
||||||
|
return FileUtil.unpackJar(new JarFile(_local), _unpacked);
|
||||||
|
} else{
|
||||||
|
return com.threerings.getdown.util.FileUtil.unpackPacked200Jar(_local, _unpacked);
|
||||||
|
}
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
log.warning("Failed to create JarFile from '" + _local + "': " + ioe);
|
log.warning("Failed to create JarFile from '" + _local + "': " + ioe);
|
||||||
return false;
|
return false;
|
||||||
@@ -266,8 +295,8 @@ public class Resource
|
|||||||
|
|
||||||
protected String _path;
|
protected String _path;
|
||||||
protected URL _remote;
|
protected URL _remote;
|
||||||
protected File _local, _marker;
|
protected File _local, _marker, _unpacked;
|
||||||
protected boolean _unpack;
|
protected boolean _unpack, _isJar, _isPacked200Jar;
|
||||||
|
|
||||||
/** Used to sort the entries in a jar file. */
|
/** Used to sort the entries in a jar file. */
|
||||||
protected static final Comparator<JarEntry> ENTRY_COMP =
|
protected static final Comparator<JarEntry> ENTRY_COMP =
|
||||||
|
|||||||
@@ -5,17 +5,14 @@
|
|||||||
|
|
||||||
package com.threerings.getdown.util;
|
package com.threerings.getdown.util;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import com.samskivert.io.StreamUtil;
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.Reader;
|
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.jar.JarOutputStream;
|
||||||
import com.samskivert.io.StreamUtil;
|
import java.util.jar.Pack200;
|
||||||
|
import java.util.zip.GZIPInputStream;
|
||||||
|
|
||||||
import static com.threerings.getdown.Log.log;
|
import static com.threerings.getdown.Log.log;
|
||||||
|
|
||||||
@@ -96,4 +93,28 @@ public class FileUtil
|
|||||||
}
|
}
|
||||||
return lines;
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean unpackPacked200Jar(File packedJar, File target){
|
||||||
|
InputStream packedJarIs = null;
|
||||||
|
FileOutputStream extractedJarFileOs = null;
|
||||||
|
JarOutputStream jarOutputStream = null;
|
||||||
|
try{
|
||||||
|
extractedJarFileOs = new FileOutputStream(target);
|
||||||
|
jarOutputStream = new JarOutputStream(extractedJarFileOs);
|
||||||
|
packedJarIs = new FileInputStream(packedJar);
|
||||||
|
if(packedJar.getName().endsWith(".gz")){
|
||||||
|
packedJarIs = new GZIPInputStream(packedJarIs);
|
||||||
|
}
|
||||||
|
Pack200.Unpacker unpacker = Pack200.newUnpacker();
|
||||||
|
unpacker.unpack(packedJarIs, jarOutputStream);
|
||||||
|
return true;
|
||||||
|
} catch(IOException e){
|
||||||
|
log.warning("Failed to unpack packed 200 jar file", "jar", packedJar, "error", e);
|
||||||
|
return false;
|
||||||
|
} finally {
|
||||||
|
StreamUtil.close(jarOutputStream);
|
||||||
|
StreamUtil.close(extractedJarFileOs);
|
||||||
|
StreamUtil.close(packedJarIs);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user