package com.limegroup.gnutella.util;
import java.io.File;
import com.bitzi.util.Base32;
import com.limegroup.gnutella.xml.LimeXMLUtils;
/**
* Support methods for the unpacking and launching of pmf file types.
*
* See PackagedMediaFileLauncher in the gui for more information.
*/
public class PackagedMediaFileUtils {
/**
* Ensure that the PMF File is properly expanded and return the index file.
*/
public static File preparePMFFile(String fname) {
File lfile = null;
// Ensure there is a temp dir
String home = System.getProperty("user.home");
String temp = home + File.separator + ".temp";
File ftemp = new File(temp);
ftemp.mkdir();
// Ensure the file exists
File ffname = new File(fname);
if ( !ffname.exists() )
return lfile;
// Ensure there is a file specific unpack dir
String file = temp + File.separator + getUnpackDirectory(ffname);
File ffile = new File(file);
ffile.mkdir();
try {
// If the file is already unpacked then don't bother unpacking
lfile = createIndexFileHandle(ffile);
if ( !lfile.exists() ) {
lfile = null;
Expand.expandFile(ffname, ffile);
// Get the index file from unpacked directory
lfile = createIndexFileHandle(ffile);
}
} catch (Throwable t) {
t.printStackTrace();
}
return lfile;
}
/**
* Look to see if there is an index.htm? file available
*/
private static File createIndexFileHandle(File dir) {
File lfile = new File(dir, "index.html");
if ( !lfile.exists() ) {
lfile = new File(dir, "index.htm");
}
return lfile;
}
/**
* Create the unpack directory and its name based on file contents
*/
private static String getUnpackDirectory(File pmfFile) {
// Compute a quick hash of the file for added uniqueness
// Use the first 6 excoded chars of the hash as the end of the
// unpack directory name
String hash;
try {
byte hbytes[] = LimeXMLUtils.hashFile(pmfFile);
if (hbytes == null || hbytes.length <= 0 )
throw new Exception();
hash = Base32.encode(hbytes);
hash = hash.substring(0,6);
} catch (Exception hashFailed) {
hash = "";
}
// Limit Long file names for temp unpack directory
String fullname = pmfFile.getName();
if ( fullname.length() > 24 )
fullname = fullname.substring(0,24);
return fullname + hash;
}
}