package org.limewire.ui.swing.browser;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.limewire.core.settings.MozillaSettings;
import org.limewire.io.Expand;
import org.limewire.io.IOUtils;
import org.limewire.util.CommonUtils;
import org.limewire.util.FileUtils;
import org.limewire.util.OSUtils;
import org.mozilla.browser.IMozillaWindow;
import org.mozilla.browser.IMozillaWindowFactory;
import org.mozilla.browser.MozillaConfig;
import org.mozilla.browser.MozillaInitialization;
import org.mozilla.browser.MozillaWindow;
import org.mozilla.browser.impl.WindowCreator;
public class LimeMozillaInitializer {
private static final Log LOG = LogFactory.getLog(LimeMozillaInitializer.class);
private LimeMozillaInitializer() {
}
public static boolean shouldInitialize() {
return (OSUtils.isWindows() || OSUtils.isLinux() || OSUtils.isMacOSX())
&& is32BitProcess() && MozillaSettings.USE_MOZILLA.getValue();
}
private static boolean is32BitProcess() {
return "i386".equals(OSUtils.getOSArch()) || "x86".equals(OSUtils.getOSArch());
}
public static void initialize() {
if (!shouldInitialize()) {
return;
}
File xulInstallPath = new File(CommonUtils.getUserSettingsDir(), "/browser");
// Check to see if the correct version of XUL exists.
File xulFile = new File(xulInstallPath, "xul-v2.0b2.5-do-not-remove");
if (!xulFile.exists()) {
if (LOG.isDebugEnabled())
LOG.debug("unzip xulrunner to " + xulInstallPath);
FileUtils.deleteRecursive(xulInstallPath);
InputStream in = null;
try {
in = new BufferedInputStream(CommonUtils.getResourceStream(getResourceName()));
Expand.expandFile(in, xulInstallPath, true, null);
xulFile.createNewFile();
} catch (IOException e) {
// This causes errors if the zip file can't be expanded for whatever reason.
// It sucks, but no need to report it to us... we fallback to using
// JEditorPane where we can.
// ErrorService.error(e);
} finally {
IOUtils.close(in);
}
}
installFlashLinux(xulInstallPath);
String newLibraryPath = System.getProperty("java.library.path") + File.pathSeparator
+ xulInstallPath.getAbsolutePath();
System.setProperty("java.library.path", newLibraryPath);
MozillaConfig.setXULRunnerHome(xulInstallPath);
File profileDir = new File(CommonUtils.getUserSettingsDir(), "/mozilla-profile");
profileDir.mkdirs();
MozillaConfig.setProfileDir(profileDir);
WindowCreator.setWindowFactory(new IMozillaWindowFactory() {
@Override
public IMozillaWindow create(boolean attachNewBrowserOnCreation) {
MozillaPopupPanel popupPanel = new MozillaPopupPanel(attachNewBrowserOnCreation);
MozillaWindow popupWindow = new MozillaWindow(popupPanel);
return popupWindow;
}
});
MozillaInitialization.initialize();
if (LOG.isDebugEnabled())
LOG.debug("Moz Summary: " + MozillaConfig.getConfigSummary());
}
private static void installFlashLinux(File xulInstallPath) {
//TODO move logic to .deb? or prompt before doing, this can be a security risk
File pluginsDir = new File(xulInstallPath, "/xulrunner/plugins");
if (OSUtils.isLinux()) {
for (File file : pluginsDir.listFiles()) {
if (file.isFile() && file.getName().contains("flash")) {
return;// flash already installed
}
}
File[] possibleFlashLocations = new File[] { new File("/usr/lib/flash-plugin/"), new File("/usr/lib/firefox/plugins"),
new File("/usr/lib/mozilla/plugins"), new File("/usr/lib/iceweasle"),
new File("/usr/lib/xulrunner"), new File(CommonUtils.getUserHomeDir(), "/.mozilla/plugins") };
for (File flashLocation : possibleFlashLocations) {
if (flashLocation.exists() && flashLocation.isDirectory()) {
boolean foundFlash = false;
for (File flashFile : flashLocation.listFiles()) {
if (flashFile.getName().contains("flash")) {
// TODO make sure we are not using a file we cannot
// support, ie 64 bit running in 32 bit jvm
File linkTarget = new File(pluginsDir, "/" + flashFile.getName());
// using a symlink instead of copying, debian had
// issues with copying the library.
try {
FileUtils.createSymbolicLink(flashFile, linkTarget);
foundFlash = true;
} catch (IOException e) {
LOG.debug(e.getMessage(), e);
} catch (InterruptedException e) {
LOG.debug(e.getMessage(), e);
}
// continue looping because there might be more than
// 1 file at this location for flash to work
}
}
if (foundFlash) {
// flash was found at another location and copied
break;
}
}
}
}
}
private static String getResourceName() {
if (OSUtils.isWindows()) {
return "xulrunner-win32.zip";
} else if (OSUtils.isLinux()) {
return "xulrunner-linux.zip";
} else if (OSUtils.isMacOSX()) {
return "xulrunner-macosx-i386.zip";
} else {
throw new IllegalStateException("no resource for OS: " + OSUtils.getOS());
}
}
}