1 19 20 package com.izforge.izpack.panels; 21 22 import com.coi.tools.os.win.MSWinConstants; 23 import com.coi.tools.os.win.RegDataContainer; 24 import com.izforge.izpack.installer.InstallData; 25 import com.izforge.izpack.installer.InstallerFrame; 26 import com.izforge.izpack.util.AbstractUIHandler; 27 import com.izforge.izpack.util.os.RegistryDefaultHandler; 28 import com.izforge.izpack.util.os.RegistryHandler; 29 30 38 public class CheckedHelloPanel extends HelloPanel implements MSWinConstants 39 { 40 41 42 protected boolean abortInstallation; 43 44 50 public CheckedHelloPanel(InstallerFrame parent, InstallData idata) 51 { 52 super(parent, idata); 53 abortInstallation = isRegistered(); 54 } 55 56 64 protected boolean multipleInstall() throws Exception 65 { 66 RegistryHandler rh = RegistryDefaultHandler.getInstance(); 73 int oldVal = rh.getRoot(); String uninstallName = rh.getUninstallName(); 77 String oldInstallPath = "<not found>"; 78 while (true) { 80 81 if (uninstallName == null) break; String keyName = RegistryHandler.UNINSTALL_ROOT + uninstallName; 84 rh.setRoot(HKEY_LOCAL_MACHINE); 85 if (!rh.valueExist(keyName, "UninstallString")) 86 break; 90 95 String valString = rh.getValue(keyName, "UninstallString").getStringData(); 97 98 Object valObj = rh.getValue(keyName, "UninstallString").getDataAsObject(); 101 if(valObj instanceof String ) valString = (String ) valObj; 103 104 105 RegDataContainer val = rh.getValue(keyName, "UninstallString"); 108 int typeOfVal = val.getType(); 109 switch (typeOfVal) 110 { 111 case REG_EXPAND_SZ: 112 case REG_SZ: 113 valString = val.getStringData(); 114 break; 115 case REG_BINARY: 116 case REG_DWORD: 117 case REG_LINK: 118 case REG_MULTI_SZ: 119 throw new Exception ("Bad data type of chosen registry value " + keyName); 120 default: 121 throw new Exception ("Unknown data type of chosen registry value " + keyName); 122 } 123 int start = valString.lastIndexOf("-jar") + 5; 127 if (start < 5 || start >= valString.length()) 128 break; 130 String uPath = valString.substring(start).trim(); 131 if (uPath.startsWith("\"")) uPath = uPath.substring(1).trim(); 132 int end = uPath.indexOf("uninstaller"); 133 if (end < 0) 134 break; 136 oldInstallPath = uPath.substring(0, end - 1); 137 break; } 141 142 rh.setRoot(oldVal); 144 String noLuck = parent.langpack.getString("CheckedHelloPanel.productAlreadyExist0") 148 + oldInstallPath 149 + parent.langpack.getString("CheckedHelloPanel.productAlreadyExist1"); 150 return (askQuestion(parent.langpack.getString("installer.error"), noLuck, 151 AbstractUIHandler.CHOICES_YES_NO) == AbstractUIHandler.ANSWER_YES); 152 } 153 154 160 protected boolean isRegistered() 161 { 162 boolean retval = false; 163 try 164 { 165 RegistryHandler rh = RegistryDefaultHandler.getInstance(); 167 if (rh != null) 168 { 169 rh.verify(idata); 170 retval = rh.isProductRegistered(); 171 172 } 173 177 } 178 catch (Exception e) 179 { e.printStackTrace(); 182 } 183 return (retval); 184 } 185 186 191 public boolean isValidated() 192 { 193 return (!abortInstallation); 194 } 195 196 201 public void panelActivate() 202 { 203 if (abortInstallation) 204 { 205 parent.lockNextButton(); 206 try 207 { 208 if (multipleInstall()) 209 { 210 setUniqueUninstallKey(); 211 abortInstallation = false; 212 parent.unlockNextButton(); 213 } 214 } 215 catch (Exception e) 216 { 217 e.printStackTrace(); 219 } 220 221 } 222 RegistryHandler rh = RegistryDefaultHandler.getInstance(); 223 if( rh != null ) 224 idata.setVariable("UNINSTALL_NAME", rh.getUninstallName()); 225 } 226 227 231 private void setUniqueUninstallKey() throws Exception 232 { 233 RegistryHandler rh = RegistryDefaultHandler.getInstance(); 239 int oldVal = rh.getRoot(); if(oldVal > 100 ) return; 245 String uninstallName = rh.getUninstallName(); 246 int uninstallModifier = 1; 247 while (true) 248 { 249 if (uninstallName == null) break; String newUninstallName = uninstallName + "(" + Integer.toString(uninstallModifier) 252 + ")"; 253 String keyName = RegistryHandler.UNINSTALL_ROOT + newUninstallName; 255 rh.setRoot(HKEY_LOCAL_MACHINE); 256 if (!rh.keyExist(keyName)) 257 { rh.setUninstallName(newUninstallName); 260 emitNotification(parent.langpack 262 .getString("CheckedHelloPanel.infoOverUninstallKey") 263 + newUninstallName); 264 break; 267 } 268 uninstallModifier++; 269 } 270 } 271 272 } 273 | Popular Tags |