/*
* IzPack - Copyright 2001-2008 Julien Ponge, All Rights Reserved.
*
* http://izpack.org/
* http://izpack.codehaus.org/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.izforge.izpack.uninstaller;
import com.izforge.izpack.util.Housekeeper;
import com.izforge.izpack.installer.PrivilegedRunner;
import javax.swing.*;
import java.lang.reflect.Method;
/**
* The uninstaller class.
*
* @author Julien Ponge
*/
public class Uninstaller
{
/**
* The main method (program entry point).
*
* @param args The arguments passed on the command line.
*/
public static void main(String[] args)
{
checkForPrivilegedExecution();
boolean cmduninstall = false;
for (String arg : args)
{
if (arg.equals("-c"))
{
cmduninstall = true;
}
}
if (cmduninstall)
{
System.out.println("Command line uninstaller.\n");
}
try
{
Class<Uninstaller> clazz = Uninstaller.class;
Method target;
if (cmduninstall)
{
target = clazz.getMethod("cmduninstall", new Class[]{String[].class});
}
else
{
target = clazz.getMethod("uninstall", new Class[]{String[].class});
}
new SelfModifier(target).invoke(args);
}
catch (Exception ioeOrTypo)
{
System.err.println(ioeOrTypo.getMessage());
ioeOrTypo.printStackTrace();
System.err.println("Unable to exec java as a subprocess.");
System.err.println("The uninstall may not fully complete.");
uninstall(args);
}
}
private static void checkForPrivilegedExecution()
{
if (System.getenv("izpack.mode") != null && System.getenv("izpack.mode").equals("privileged"))
{
// We have been launched through a privileged execution, so stop the checkings here!
return;
}
if (Uninstaller.class.getResource("/exec-admin") != null)
{
PrivilegedRunner runner = new PrivilegedRunner();
if (runner.isPlatformSupported() && runner.isElevationNeeded())
{
try
{
if (runner.relaunchWithElevatedRights() == 0)
{
System.exit(0);
}
else
{
throw new RuntimeException("Launching an uninstaller with elevated permissions failed.");
}
}
catch (Exception e)
{
e.printStackTrace();
JOptionPane.showMessageDialog(null, "The uninstaller could not launch itself with administrator permissions.\n" +
"The uninstallation will still continue but you may encounter problems due to insufficient permissions.");
}
}
else if (!runner.isPlatformSupported())
{
JOptionPane.showMessageDialog(null, "This uninstaller should be run by an administrator.\n" +
"The uninstallation will still continue but you may encounter problems due to insufficient permissions.");
}
}
}
public static void cmduninstall(String[] args)
{
try
{
UninstallerConsole uco = new UninstallerConsole();
boolean force = false;
for (String arg : args)
{
if (arg.equals("-f"))
{
force = true;
}
}
System.out.println("Force deletion: " + force);
uco.runUninstall(force);
}
catch (Exception err)
{
System.err.println("- Error -");
err.printStackTrace();
Housekeeper.getInstance().shutDown(0);
}
}
public static void uninstall(final String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
try
{
boolean displayForceOption = true;
boolean forceOptionState = false;
for (String arg : args)
{
if (arg.equals("-f"))
{
forceOptionState = true;
}
else if (arg.equals("-x"))
{
displayForceOption = false;
}
}
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
new UninstallerFrame(displayForceOption, forceOptionState);
}
catch (Exception err)
{
System.err.println("- Error -");
err.printStackTrace();
Housekeeper.getInstance().shutDown(0);
}
}
});
}
}