Bug 738421 - Close up ZipReader. r=cpeterson

This commit is contained in:
Wes Johnston 2012-03-23 17:07:10 -07:00
parent 6e90e43d7b
commit 1c604a679f
2 changed files with 57 additions and 30 deletions

View File

@ -274,6 +274,10 @@ public class Favicons {
Log.d(LOGTAG, "Downloading favicon for URL = " + mPageUrl +
" with favicon URL = " + mFaviconUrl);
if (mFaviconUrl.startsWith("jar:jar:")) {
return GeckoJarReader.getBitmapDrawable(mFaviconUrl);
}
// due to android bug 6066, we must download the entire image before using it
// http://code.google.com/p/android/issues/detail?id=6066
URLConnection urlConnection = null;
@ -294,8 +298,10 @@ public class Favicons {
byteStream = new ByteArrayInputStream(bytes);
image = (BitmapDrawable) Drawable.createFromStream(byteStream, "src");
}
} catch (IOException e) {
// just close up and return null
} catch (Exception e) {
Log.e(LOGTAG, "Error downloading favicon", e);
Log.e(LOGTAG, "Error reading favicon", e);
} finally {
if (urlConnection != null && urlConnection instanceof HttpURLConnection) {
HttpURLConnection httpConnection = (HttpURLConnection) urlConnection;
@ -312,11 +318,6 @@ public class Favicons {
}
}
if (image != null) {
Log.d(LOGTAG, "Downloaded favicon successfully for URL = " + mPageUrl);
saveFaviconToDb(image);
}
return image;
}
@ -373,6 +374,11 @@ public class Favicons {
image = downloadFavicon(faviconUrl);
}
if (image != null) {
Log.d(LOGTAG, "Downloaded favicon successfully for URL = " + mPageUrl);
saveFaviconToDb(image);
}
return image;
}

View File

@ -14,26 +14,60 @@ import java.util.zip.ZipEntry;
import java.io.InputStream;
import java.io.IOException;
import android.graphics.drawable.BitmapDrawable;
import android.util.Log;
/* Reads out of a multiple level deep jar file such as
* jar:jar:file:///data/app/org.mozilla.fennec.apk!/omni.ja!/chrome/chrome/content/branding/favicon32.png
*/
public class GeckoJarReader {
static private String LOGTAG = "GeckoJarReader";
private static String LOGTAG = "GeckoJarReader";
static public InputStream getStream(String url) {
public static BitmapDrawable getBitmapDrawable(String url) {
Stack<String> jarUrls = parseUrl(url);
ZipInputStream inputStream = null;
InputStream inputStream = null;
BitmapDrawable bitmap = null;
ZipFile zip = null;
try {
// Load the initial jar file as a zip
URL fileUrl = new URL(jarUrls.pop());
File file = new File(fileUrl.getPath());
zip = new ZipFile(file);
ZipEntry entry = null;
zip = getZipFile(jarUrls.pop());
inputStream = getStream(zip, jarUrls);
if (inputStream != null) {
bitmap = new BitmapDrawable(inputStream);
}
} catch (IOException ex) {
Log.e(LOGTAG, "Exception ", ex);
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch(IOException ex) {
Log.e(LOGTAG, "Error closing stream", ex);
}
}
if (zip != null) {
try {
zip.close();
} catch(IOException ex) {
Log.e(LOGTAG, "Error closing zip", ex);
}
}
}
return bitmap;
}
private static ZipFile getZipFile(String url) throws IOException {
URL fileUrl = new URL(url);
File file = new File(fileUrl.getPath());
return new ZipFile(file);
}
private static InputStream getStream(ZipFile zip, Stack<String> jarUrls) throws IOException {
ZipInputStream inputStream = null;
ZipEntry entry = null;
try {
// loop through children jar files until we reach the innermost one
while (jarUrls.peek() != null) {
String fileName = jarUrls.pop();
@ -59,26 +93,13 @@ public class GeckoJarReader {
}
}
} catch (EmptyStackException ex) {
Log.d(LOGTAG, "Reached Jar reader reached end of stack");
} catch (IOException ex) {
Log.e(LOGTAG, "Exception ", ex);
} catch (Exception ex) {
Log.e(LOGTAG, "Exception ", ex);
} finally {
if (zip != null) {
try {
zip.close();
} catch(IOException ex) {
Log.e(LOGTAG, "Error closing zip", ex);
}
}
Log.d(LOGTAG, "Jar reader reached end of stack");
}
return inputStream;
}
/* Searches through a ZipInputStream for an entry with a given name */
static private ZipEntry getEntryFromStream(ZipInputStream zipStream, String entryName) {
private static ZipEntry getEntryFromStream(ZipInputStream zipStream, String entryName) {
ZipEntry entry = null;
try {
@ -102,11 +123,11 @@ public class GeckoJarReader {
* omni.ja
* chrome/chrome/content/branding/favicon32.png
*/
static private Stack<String> parseUrl(String url) {
private static Stack<String> parseUrl(String url) {
return parseUrl(url, null);
}
static private Stack<String> parseUrl(String url, Stack<String> results) {
private static Stack<String> parseUrl(String url, Stack<String> results) {
if (results == null) {
results = new Stack<String>();
}