package ca.canuckcoding.webos; import ca.canuckcoding.utils.OnlineFile; import java.io.File; import java.util.ArrayList; import javax.swing.JOptionPane; import java.util.ResourceBundle; import java.text.MessageFormat; /** * @author Jason Robitaille */ public class Patcher { private WebOSConnection webOSCon; private ResourceBundle locale; private ArrayList<InstalledEntry> installed; private DeviceInfo info; public Patcher(WebOSConnection wc) { webOSCon = wc; locale = ResourceBundle.getBundle("ca/canuckcoding/webos/Locale"); installed = wc.listInstalled(); info = wc.getDeviceInfo(); } public boolean meetsRequirements(String ausmtUrl) { boolean result = false; boolean hasPatch = installed.contains(new InstalledEntry("org.webosinternals.patch")); boolean hasLsdiff = installed.contains(new InstalledEntry("org.webosinternals.lsdiff")); boolean hasAusmt = installed.contains(new InstalledEntry("org.webosinternals.ausmt")); if(!hasPatch || !hasLsdiff || !hasAusmt) { if(JOptionPane.showConfirmDialog(null, "<html><body width=\"300px\">" + locale.getString("PATCHING_REQUIRES_BOTH_GNU_PATCH_AND_LSDIFF_INSTALLED_TO_FUNCTION." + "_ONE_OR_BOTH_OF_THESE_ARE_MISSING_FROM_YOUR_DEVICE._WOULD_YOU_LIKE_TO_DOWNLOAD_AND_INSTALL_THEM_NOW?"), locale.getString("REQUIRED_COMPONENT_MISSING"), JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION) { JOptionPane.showMessageDialog(null, "<html>" + locale.getString("THIS_MAY_TAKE_UPTO_A_MINUTE_TO_COMPLETE,_SO_PLEASE_BE_PATIENT.")); boolean status = true; OnlineFile url = null; File local = null; if(!hasPatch) { url = new OnlineFile("http://ipkg.preware.net/feeds/webos-internals/" + info.arch() + "/org.webosinternals.patch_2.5.9-4_" + info.arch() + ".ipk"); local = url.download(); if(local!=null) { status |= webOSCon.install(local); if(status) { JOptionPane.showMessageDialog(null, locale.getString("GNU_PATCH_DOWNLOADED_AND_INSTALLED!")); } } } if(!hasLsdiff) { url = new OnlineFile("http://ipkg.preware.net/feeds/webos-internals/" + info.arch() + "/org.webosinternals.lsdiff_0.3.1-1_" + info.arch() + ".ipk"); local = url.download(); if(local!=null) { status |= webOSCon.install(local); if(status) { JOptionPane.showMessageDialog(null, locale.getString("LSDIFF_DOWNLOADED_AND_INSTALLED!")); } } } if(!hasAusmt) { url = new OnlineFile(ausmtUrl); local = url.download(); if(local!=null) { status |= webOSCon.install(local); if(status) { JOptionPane.showMessageDialog(null, locale.getString("AUSMT_DOWNLOADED_AND_INSTALLED!")); } } } result = status; } } else { result = true; } return result; } public boolean install(File file) { boolean result = false; PatchFile patch = new PatchFile(file); String appid = patch.getId(); if(installed.contains(new InstalledEntry(appid))) { if(uninstall(appid)) { result = doInstall(patch); } } else { result = doInstall(patch); } return result; } private boolean doInstall(PatchFile patch) { boolean result = false; patch.scan(); if(webOSCon.mkdir("/media/internal/.developer")) { String patchPath = "/media/internal/.developer/" + patch.getPatchFilename(); if(webOSCon.sendFile(patch, patchPath)) { try { String stdout = webOSCon.runProgram("/bin/sh", new String[] {"/var/" + ScriptType.Patch.filename(), patchPath, patch.getIdBase(), patch.getPatchName(), patch.getPatchVersion(info.version()), patch.getPatchAuthor(), patch.getPatchDescription()}); webOSCon.lunaRestart(); result = true; } catch(Exception e) { JOptionPane.showMessageDialog(null, MessageFormat.format( locale.getString("ERROR:_AN_ERROR_OCCURED_WHILE_ATTEMPTING_TO_APPLY_{0}"), new Object[] {patch.getPatchFilename()}) + "\n\n" + e.getMessage()); e.printStackTrace(); } } } return result; } public boolean uninstall(File file) { PatchFile patch = new PatchFile(file); return uninstall(patch.getId()); } public boolean uninstall(String id) { return webOSCon.uninstall(id); } }