/*
* InstallThread.java
*
* Originally written by Slava Pestov for the jEdit installer project. This work
* has been placed into the public domain. You may use this work in any way and
* for any purpose you wish.
*
* THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, NOT EVEN THE
* IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, ASSUMES
* _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE RESULTING FROM THE USE, MODIFICATION,
* OR REDISTRIBUTION OF THIS SOFTWARE.
*/
package installer;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Vector;
/*
* The thread that performs installation.
*/
public class InstallThread extends Thread
{
public InstallThread(Install installer, Progress progress,
String installDir, OperatingSystem.OSTask[] osTasks,
int size, Vector components)
{
super("Install thread");
this.installer = installer;
this.progress = progress;
this.installDir = installDir;
this.osTasks = osTasks;
this.size = size;
this.components = components;
}
public void run()
{
progress.setMaximum(size * 1024);
//return value ignored : already signalled in ServerKiller
progress.message("stopping any jEdit server");
ServerKiller.quitjEditServer();
try
{
// install user-selected packages
for(int i = 0; i < components.size(); i++)
{
String comp = (String)components.elementAt(i);
progress.message("Installing " + comp);
installComponent(comp);
}
// do operating system specific stuff (creating startup
// scripts, installing man pages, etc.)
for(int i = 0; i < osTasks.length; i++)
{
progress.message("Performing task " +
osTasks[i].getName());
osTasks[i].perform(installDir,components);
}
}
catch(FileNotFoundException fnf)
{
progress.error("The installer could not create the "
+ "destination directory.\n"
+ "Maybe you do not have write permission?");
return;
}
catch(IOException io)
{
progress.error(io.toString());
return;
}
progress.done();
}
// private members
private Install installer;
private Progress progress;
private String installDir;
private OperatingSystem.OSTask[] osTasks;
private int size;
private Vector components;
private void installComponent(String name) throws IOException
{
InputStream in = new BufferedInputStream(
getClass().getResourceAsStream(name + ".tar.bz2"));
// skip header bytes
// maybe should check if they're valid or not?
in.read();
in.read();
TarInputStream tarInput = new TarInputStream(
new CBZip2InputStream(in));
TarEntry entry;
String fileName = null;
while((entry = tarInput.getNextEntry()) != null)
{
if(entry.isDirectory())
{
fileName = null;
continue;
}
if (fileName == null)
{
fileName = entry.getName();
if (fileName.equals("././@LongLink"))
{
fileName = new BufferedReader(new InputStreamReader(tarInput)).readLine();
if(fileName == null)
{
// missing filename ??
throw new IOException("Invalid or corrupt contents: file in tar with long filename but no filename found");
}
// bug #3837 - can't install because long file name ends with \0
while(!fileName.isEmpty() && fileName.charAt(fileName.length()-1) == 0){
fileName = fileName.substring(0, fileName.length()-1);
}
if(fileName.isEmpty())
{
// filename consists in '\0's ??
throw new IOException("Invalid or corrupt contents: file in tar with long filename but empty filename found");
}
continue;
}
}
//System.err.println(fileName);
String outfile = installDir + File.separatorChar
+ fileName.replace('/',File.separatorChar);
installer.copy(tarInput,outfile,progress);
fileName = null;
}
tarInput.close();
}
}
¤ Dauer der Verarbeitung: 0.25 Sekunden
(vorverarbeitet)
¤
|
Haftungshinweis
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.
|