FileDocCategorySizeDatePackage
TOTorrentCreateImpl.javaAPI DocAzureus 3.0.3.413165Wed Jan 10 23:10:36 GMT 2007org.gudy.azureus2.core3.torrent.impl

TOTorrentCreateImpl

public class TOTorrentCreateImpl extends TOTorrentImpl implements TOTorrentFileHasherListener

Fields Summary
protected File
torrent_base
protected long
piece_length
protected TOTorrentFileHasher
file_hasher
protected long
total_file_size
protected long
total_file_count
protected long
piece_count
protected boolean
add_other_hashes
protected List
progress_listeners
protected int
reported_progress
protected Set
ignore_set
protected boolean
cancelled
Constructors Summary
protected TOTorrentCreateImpl(File _torrent_base, URL _announce_url, boolean _add_other_hashes, long _piece_length)

		super( _torrent_base.getName(), _announce_url, _torrent_base.isFile());
			
		torrent_base		= _torrent_base;
		piece_length		= _piece_length;
		add_other_hashes	= _add_other_hashes;
	
protected TOTorrentCreateImpl(File _torrent_base, URL _announce_url, boolean _add_other_hashes, long _piece_min_size, long _piece_max_size, long _piece_num_lower, long _piece_num_upper)

		super( _torrent_base.getName(), _announce_url, _torrent_base.isFile());
		
		torrent_base		= _torrent_base;
		add_other_hashes	= _add_other_hashes;
		
		long	total_size = calculateTotalFileSize( _torrent_base );
		
		piece_length = getComputedPieceSize( total_size, _piece_min_size, _piece_max_size, _piece_num_lower, _piece_num_upper );
	
Methods Summary
protected voidaddListener(TOTorrentProgressListener listener)

		progress_listeners.add( listener );
	
protected longcalculateNumberOfPieces(java.io.File _file, long _piece_length)

		long	res = getPieceCount(calculateTotalFileSize( _file ), _piece_length );
		
		report( "Torrent.create.progress.piececount", ""+res );
		
		return( res );
	
protected longcalculateTotalFileSize(java.io.File file)

		if ( total_file_size == -1 ){
			
			total_file_size = getTotalFileSize( file );		
		}
		
		return( total_file_size );
	
protected voidcancel()

		if ( !cancelled ){
		
			report( "Torrent.create.progress.cancelled");

			cancelled	= true;
			
			if ( file_hasher != null ){
				
				file_hasher.cancel();
			}
		}
	
protected voidconstructFixed(java.io.File _torrent_base, long _piece_length)

		setIgnoreList();

		setCreationDate( SystemTime.getCurrentTime() / 1000);
		
		setCreatedBy( Constants.AZUREUS_NAME + "/" + Constants.AZUREUS_VERSION );
		
		setPieceLength( _piece_length );
		
		report( "Torrent.create.progress.piecelength", _piece_length );
		
		piece_count = calculateNumberOfPieces( _torrent_base,_piece_length );
		
		if ( piece_count == 0 ){
			
			throw( new TOTorrentException( "TOTorrentCreate: specified files have zero total length",
											TOTorrentException.RT_ZERO_LENGTH ));
		}
		
		report( "Torrent.create.progress.hashing");

		for (int i=0;i<progress_listeners.size();i++){
					
			((TOTorrentProgressListener)progress_listeners.get(i)).reportProgress( 0 );
		}
			
		boolean add_other_per_file_hashes 	= add_other_hashes&&!getSimpleTorrent();
		
		file_hasher = 
			new TOTorrentFileHasher(
					add_other_hashes,
					add_other_per_file_hashes,
					(int)_piece_length, 
					progress_listeners.size()==0?null:this );
		
		if ( cancelled ){
			
			throw( new TOTorrentException( 	"TOTorrentCreate: operation cancelled",
											TOTorrentException.RT_CANCELLED ));
		}
		
		if ( getSimpleTorrent()){
							
			long length = file_hasher.add( _torrent_base );
		
			setFiles( new TOTorrentFileImpl[]{ new TOTorrentFileImpl( this, 0, length, new byte[][]{ getName()})});
			
			setPieces( file_hasher.getPieces());

		}else{
		
			Vector	encoded = new Vector();
		
			processDir( file_hasher, _torrent_base, encoded, "" );
		
			TOTorrentFileImpl[] files = new TOTorrentFileImpl[ encoded.size()];
		
			encoded.copyInto( files );
		
			setFiles( files );
		}
										 
		setPieces( file_hasher.getPieces());
		
		if ( add_other_hashes ){
			
			byte[]	sha1_digest = file_hasher.getSHA1Digest();
			byte[]	ed2k_digest = file_hasher.getED2KDigest();
			
			addAdditionalInfoProperty( "sha1", sha1_digest );
			addAdditionalInfoProperty( "ed2k", ed2k_digest );
			
			//System.out.println( "overall:sha1 = " + ByteFormatter.nicePrint( sha1_digest, true));
			//System.out.println( "overall:ed2k = " + ByteFormatter.nicePrint( ed2k_digest, true));
		}
	
public static TOTorrentCreatorcreate(java.io.File _torrent_base, java.net.URL _announce_url, boolean _add_other_hashes, long _piece_length)

	
	  
	
								
									
								
								 
		
		 
	
		TOTorrentCreateImpl	t = 
			new TOTorrentCreateImpl(
					_torrent_base,
					_announce_url,
					_add_other_hashes,
					_piece_length );
		
		return( new TOTorrentCreatorImpl( t ));
	
public static TOTorrentCreatorcreate(java.io.File _torrent_base, java.net.URL _announce_url, boolean _add_other_hashes, long _piece_min_size, long _piece_max_size, long _piece_num_lower, long _piece_num_upper)

		TOTorrentCreateImpl	t = 
			new TOTorrentCreateImpl(
					_torrent_base,
					_announce_url,
					_add_other_hashes,
					_piece_min_size,
					_piece_max_size,
					_piece_num_lower,
					_piece_num_upper );
		
		return( new TOTorrentCreatorImpl( t ));
	
protected voidcreate()

		constructFixed( torrent_base, piece_length );
	
public static longgetComputedPieceSize(long total_size, long _piece_min_size, long _piece_max_size, long _piece_num_lower, long _piece_num_upper)

		long	piece_length = -1;
		
		long	current_piece_size = _piece_min_size;
		
		while( current_piece_size <= _piece_max_size ){
			
			long	pieces = total_size / current_piece_size;
			
			if ( pieces <= _piece_num_upper ){
				
				piece_length = current_piece_size;
				
				break;
			}
			
			current_piece_size = current_piece_size << 1;
		}
		
		// if we haven't set a piece length here then there are too many pieces even
		// at maximum piece size. Go for largest piece size
		
		if ( piece_length == -1 ){
			
			// just go for the maximum piece size
			
			piece_length = 	_piece_max_size;
		}
		
		return( piece_length );
	
public static longgetPieceCount(long total_size, long piece_size)

		return( (total_size + (piece_size-1))/piece_size );
	
public static longgetTorrentDataSizeFromFileOrDir(java.io.File file_or_dir)

		return( getTorrentDataSizeFromFileOrDirSupport( file_or_dir ));
	
protected static longgetTorrentDataSizeFromFileOrDirSupport(java.io.File file)

		String	name = file.getName();
		
		if ( name.equals( "." ) || name.equals( ".." )){
			
			return( 0 );
		}
		
		if ( !file.exists()){
		
			return(0);
		}
		
		if ( file.isFile()){
						
			return( file.length());
			
		}else{
			
			File[]	dir_files = file.listFiles();
			
			long	length = 0;
			
			for (int i=0;i<dir_files.length;i++){
				
				length += getTorrentDataSizeFromFileOrDirSupport( dir_files[i] );
			}
			
			return( length );
		}
	
protected longgetTotalFileSize(java.io.File file)

		report( "Torrent.create.progress.parsingfiles" );
		
		long res = getTotalFileSizeSupport( file );
		
		report( "Torrent.create.progress.totalfilesize", res );

		report( "Torrent.create.progress.totalfilecount", ""+total_file_count );
		
		return( res );
	
protected longgetTotalFileSizeSupport(java.io.File file)

		String	name = file.getName();
		
		if ( name.equals( "." ) || name.equals( ".." )){
																				
			return( 0 );
		}
		
		if ( !file.exists()){
			
			throw( new TOTorrentException( "TOTorrentCreate: file '" + file.getName() + "' doesn't exist",
											TOTorrentException.RT_FILE_NOT_FOUND ));
		}
		
		if ( file.isFile()){
			
			if ( !ignoreFile( name )){
				
				total_file_count++;
			
				return( file.length());
				
			}else{
				
				return( 0 );
			}
		}else{
			
			File[]	dir_files = file.listFiles();
		
			if ( dir_files == null ){
				
				throw( new TOTorrentException( "TOTorrentCreate: directory '" + file.getAbsolutePath() + "' returned error when listing files in it",
						TOTorrentException.RT_FILE_NOT_FOUND ));
				
			}
			
			long	length = 0;
			
			for (int i=0;i<dir_files.length;i++){
				
				length += getTotalFileSizeSupport( dir_files[i] );
			}
			
			return( length );
		}
	
protected booleanignoreFile(java.lang.String file)

		if ( ignore_set.contains(file.toLowerCase())){

			report( "Torrent.create.progress.ignoringfile", " '" + file + "'" );
			
			return( true );
		}
		
		return( false );
	
public voidpieceHashed(int piece_number)

		for (int i=0;i<progress_listeners.size();i++){
		
			int	this_progress = (int)((piece_number*100)/piece_count );
			
			if ( this_progress != reported_progress ){
				
				reported_progress = this_progress;
				
				((TOTorrentProgressListener)progress_listeners.get(i)).reportProgress( reported_progress );
			}
		}
	
protected voidprocessDir(TOTorrentFileHasher hasher, java.io.File dir, java.util.Vector encoded, java.lang.String root)

		File[]	dir_file_list = dir.listFiles();
		
		if ( dir_file_list == null ){
			
			throw( new TOTorrentException( "TOTorrentCreate: directory '" + dir.getAbsolutePath() + "' returned error when listing files in it",
					TOTorrentException.RT_FILE_NOT_FOUND ));
			
		}
			// sort contents so that multiple encodes of a dir always
			// generate same torrent
		
		List file_list = new ArrayList(Arrays.asList(dir_file_list));
		
		Collections.sort(file_list);
		
		long	offset	= 0;
		
		for (int i=0;i<file_list.size();i++){
			
			File	file = (File)file_list.get(i);
			
			String	file_name = file.getName();
			
			if ( !(file_name.equals( "." ) || file_name.equals( ".." ))){
				
				if ( file.isDirectory()){
					
					if ( root.length() > 0 ){
						
						file_name = root + File.separator + file_name ;
					}
					
					processDir( hasher, file, encoded, file_name );
					
				}else{
						
					if ( !ignoreFile( file_name )){
								
						if ( root.length() > 0 ){
						
							file_name = root + File.separator + file_name;
						}
						
						long length = hasher.add( file );
							
						TOTorrentFileImpl	tf = new TOTorrentFileImpl( this, offset, length, file_name);
						
						offset += length;
						
						if ( add_other_hashes ){
							
							byte[]	ed2k_digest	= hasher.getPerFileED2KDigest();
							byte[]	sha1_digest	= hasher.getPerFileSHA1Digest();
							
							//System.out.println( "file:ed2k = " + ByteFormatter.nicePrint( ed2k_digest, true ));
							//System.out.println( "file:sha1 = " + ByteFormatter.nicePrint( sha1_digest, true ));		
						
							tf.setAdditionalProperty( "sha1", sha1_digest );
							tf.setAdditionalProperty( "ed2k", ed2k_digest );
						}
						
						encoded.addElement( tf );
					}
				}
			}
		}
	
protected voidremoveListener(TOTorrentProgressListener listener)

		progress_listeners.remove( listener );
	
protected voidreport(java.lang.String resource_key)

		report( resource_key, null );
	
protected voidreport(java.lang.String resource_key, long bytes)

		if ( progress_listeners.size() > 0 ){
			
			report( resource_key, DisplayFormatters.formatByteCountToKiBEtc( bytes ));
		}
	
protected voidreport(java.lang.String resource_key, java.lang.String additional_text)

		if ( progress_listeners.size() > 0 ){
			
			String	prefix = MessageText.getString(resource_key);
			
			for (int i=0;i<progress_listeners.size();i++){
				
				((TOTorrentProgressListener)progress_listeners.get(i)).reportCurrentTask( prefix + (additional_text==null?"":additional_text ));
			}
		}
	
protected voidsetIgnoreList()

		try{
			ignore_set = TorrentUtils.getIgnoreSet();
			
		}catch( NoClassDefFoundError e ){
			
			return;
		}