📄 totorrentimpl.java
字号:
public byte[]
getHash()
throws TOTorrentException
{
if ( torrent_hash == null ){
Map root = serialiseToMap();
Map info = (Map)root.get( TK_INFO );
setHashFromInfo( info );
}
return( torrent_hash );
}
public HashWrapper
getHashWrapper()
throws TOTorrentException
{
if ( torrent_hash_wrapper == null ){
getHash();
}
return( torrent_hash_wrapper );
}
public boolean
hasSameHashAs(
TOTorrent other )
{
try{
byte[] other_hash = other.getHash();
return( Arrays.equals( getHash(), other_hash ));
}catch( TOTorrentException e ){
Debug.printStackTrace( e );
return( false );
}
}
protected void
setHashFromInfo(
Map info )
throws TOTorrentException
{
try{
SHA1Hasher s = new SHA1Hasher();
torrent_hash = s.calculateHash(BEncoder.encode(info));
torrent_hash_wrapper = new HashWrapper( torrent_hash );
}catch( Throwable e ){
throw( new TOTorrentException( "Failed to calculate hash: " + Debug.getNestedExceptionMessage(e),
TOTorrentException.RT_HASH_FAILS ));
}
}
public void
setPrivate(
boolean _private_torrent )
throws TOTorrentException
{
additional_info_properties.put( TK_PRIVATE, new Long(_private_torrent?1:0));
// update torrent hash
torrent_hash = null;
getHash();
}
public boolean
getPrivate()
{
Object o = additional_info_properties.get( TK_PRIVATE );
if ( o instanceof Long ){
return(((Long)o).intValue() != 0 );
}
return( false );
}
public TOTorrentAnnounceURLGroup
getAnnounceURLGroup()
{
return( announce_group );
}
protected void
addTorrentAnnounceURLSet(
URL[] urls )
{
announce_group.addSet( new TOTorrentAnnounceURLSetImpl( this, urls ));
}
public long
getSize()
{
long res = 0;
for (int i=0;i<files.length;i++){
res += files[i].getLength();
}
return( res );
}
public long
getPieceLength()
{
return( piece_length );
}
protected void
setPieceLength(
long _length )
{
piece_length = _length;
}
public int
getNumberOfPieces()
{
// to support buggy torrents with extraneous pieces (they seem to exist) we calculate
// the required number of pieces rather than the using the actual. Note that we
// can't adjust the pieces array itself as this results in incorrect torrent hashes
// being derived later after a save + restore
if ( number_of_pieces == 0 ){
number_of_pieces = (int)((getSize() + (piece_length-1)) / piece_length );
}
return( number_of_pieces );
}
public byte[][]
getPieces()
{
return( pieces );
}
public void
setPieces(
byte[][] _pieces )
{
pieces = _pieces;
}
public TOTorrentFile[]
getFiles()
{
return( files );
}
protected void
setFiles(
TOTorrentFileImpl[] _files )
{
files = _files;
}
protected boolean
getSimpleTorrent()
{
return( simple_torrent );
}
protected void
setSimpleTorrent(
boolean _simple_torrent )
{
simple_torrent = _simple_torrent;
}
protected Map
getAdditionalProperties()
{
return( additional_properties );
}
public void
setAdditionalStringProperty(
String name,
String value )
{
try{
setAdditionalByteArrayProperty( name, writeStringToMetaData( value ));
}catch( TOTorrentException e ){
// hide encoding exceptions as default encoding must be available
Debug.printStackTrace( e );
}
}
public String
getAdditionalStringProperty(
String name )
{
try{
return( readStringFromMetaData( getAdditionalByteArrayProperty(name)));
}catch( TOTorrentException e ){
// hide encoding exceptions as default encoding must be available
Debug.printStackTrace( e );
return( null );
}
}
public void
setAdditionalByteArrayProperty(
String name,
byte[] value )
{
additional_properties.put( name, value );
}
public void
setAdditionalProperty(
String name,
Object value )
{
if ( name instanceof String ){
setAdditionalStringProperty(name,(String)value);
}else{
additional_properties.put( name, value );
}
}
public byte[]
getAdditionalByteArrayProperty(
String name )
{
Object obj = additional_properties.get( name );
if ( obj instanceof byte[] ){
return((byte[])obj);
}
return( null );
}
public void
setAdditionalLongProperty(
String name,
Long value )
{
additional_properties.put( name, value );
}
public Long
getAdditionalLongProperty(
String name )
{
Object obj = additional_properties.get( name );
if ( obj instanceof Long ){
return((Long)obj);
}
return( null );
}
public void
setAdditionalListProperty(
String name,
List value )
{
additional_properties.put( name, value );
}
public List
getAdditionalListProperty(
String name )
{
Object obj = additional_properties.get( name );
if ( obj instanceof List ){
return((List)obj);
}
return( null );
}
public void
setAdditionalMapProperty(
String name,
Map value )
{
additional_properties.put( name, value );
}
public Map
getAdditionalMapProperty(
String name )
{
Object obj = additional_properties.get( name );
if ( obj instanceof Map ){
return((Map)obj);
}
return( null );
}
public Object
getAdditionalProperty(
String name )
{
return(additional_properties.get( name ));
}
public void
removeAdditionalProperty(
String name )
{
additional_properties.remove( name );
}
public void
removeAdditionalProperties()
{
Map new_props = new HashMap();
Iterator it = additional_properties.keySet().iterator();
while( it.hasNext()){
String key = (String)it.next();
if ( TK_ADDITIONAL_OK_ATTRS.contains(key)){
new_props.put( key, additional_properties.get( key ));
}
}
additional_properties = new_props;
}
protected void
addAdditionalProperty(
String name,
Object value )
{
additional_properties.put( name, value );
}
protected void
addAdditionalInfoProperty(
String name,
Object value )
{
additional_info_properties.put( name, value );
}
protected Map
getAdditionalInfoProperties()
{
return( additional_info_properties );
}
protected String
readStringFromMetaData(
Map meta_data,
String name )
throws TOTorrentException
{
Object obj = meta_data.get(name);
if ( obj instanceof byte[]){
return(readStringFromMetaData((byte[])obj));
}
return( null );
}
protected String
readStringFromMetaData(
byte[] value )
throws TOTorrentException
{
try{
if ( value == null ){
return( null );
}
return( new String(value, Constants.DEFAULT_ENCODING ));
}catch( UnsupportedEncodingException e ){
throw( new TOTorrentException( "Unsupported encoding for '" + value + "'",
TOTorrentException.RT_UNSUPPORTED_ENCODING));
}
}
protected void
writeStringToMetaData(
Map meta_data,
String name,
String value )
throws TOTorrentException
{
meta_data.put( name, writeStringToMetaData( value ));
}
protected byte[]
writeStringToMetaData(
String value )
throws TOTorrentException
{
try{
return( value.getBytes( Constants.DEFAULT_ENCODING ));
}catch( UnsupportedEncodingException e ){
throw( new TOTorrentException( "Unsupported encoding for '" + value + "'",
TOTorrentException.RT_UNSUPPORTED_ENCODING));
}
}
protected URL
anonymityTransform(
URL url )
{
/*
* hmm, doing this is harder than it looks as we have issues hosting
* (both starting tracker instances and also short-cut loopback for seeding
* leave as is for the moment
if ( HostNameToIPResolver.isNonDNSName( url.getHost())){
// remove the port as it is uninteresting and could leak information about the
// tracker
String url_string = url.toString();
String port_string = ":" + (url.getPort()==-1?url.getDefaultPort():url.getPort());
int port_pos = url_string.indexOf( ":" + url.getPort());
if ( port_pos != -1 ){
try{
return( new URL( url_string.substring(0,port_pos) + url_string.substring(port_pos+port_string.length())));
}catch( MalformedURLException e){
Debug.printStackTrace(e);
}
}
}
*/
return( url );
}
public void
print()
{
try{
byte[] hash = getHash();
System.out.println( "name = " + torrent_name );
System.out.println( "announce url = " + announce_url );
System.out.println( "announce group = " + announce_group.getAnnounceURLSets().length );
System.out.println( "creation date = " + creation_date );
System.out.println( "creation by = " + created_by );
System.out.println( "comment = " + comment );
System.out.println( "hash = " + ByteFormatter.nicePrint( hash ));
System.out.println( "piece length = " + getPieceLength() );
System.out.println( "pieces = " + getNumberOfPieces() );
Iterator info_it = additional_info_properties.keySet().iterator();
while( info_it.hasNext()){
String key = (String)info_it.next();
Object value = additional_info_properties.get( key );
try{
System.out.println( "info prop '" + key + "' = '" +
( value instanceof byte[]?new String((byte[])value, Constants.DEFAULT_ENCODING):value.toString()) + "'" );
}catch( UnsupportedEncodingException e){
System.out.println( "info prop '" + key + "' = unsupported encoding!!!!");
}
}
Iterator it = additional_properties.keySet().iterator();
while( it.hasNext()){
String key = (String)it.next();
Object value = additional_properties.get( key );
try{
System.out.println( "prop '" + key + "' = '" +
( value instanceof byte[]?new String((byte[])value, Constants.DEFAULT_ENCODING):value.toString()) + "'" );
}catch( UnsupportedEncodingException e){
System.out.println( "prop '" + key + "' = unsupported encoding!!!!");
}
}
if ( pieces == null ){
System.out.println( "\tpieces = null" );
}else{
for (int i=0;i<pieces.length;i++){
System.out.println( "\t" + ByteFormatter.nicePrint(pieces[i]));
}
}
for (int i=0;i<files.length;i++){
byte[][]path_comps = files[i].getPathComponents();
String path_str = "";
for (int j=0;j<path_comps.length;j++){
try{
path_str += (j==0?"":File.separator) + new String( path_comps[j], Constants.DEFAULT_ENCODING );
}catch( UnsupportedEncodingException e ){
System.out.println( "file - unsupported encoding!!!!");
}
}
System.out.println( "\t" + path_str + " (" + files[i].getLength() + ")" );
}
}catch( TOTorrentException e ){
Debug.printStackTrace( e );
}
}
public AEMonitor
getMonitor()
{
return( this_mon );
}
/* (non-Javadoc)
* @see org.gudy.azureus2.core3.logging.LogRelation#getLogRelationText()
*/
public String getRelationText() {
return "Torrent: '" + new String(torrent_name) + "'";
}
/* (non-Javadoc)
* @see org.gudy.azureus2.core3.logging.LogRelation#queryForClass(java.lang.Class)
*/
public Object[] getQueryableInterfaces() {
// yuck
try {
return new Object[] { AzureusCoreFactory.getSingleton()
.getGlobalManager().getDownloadManager(this) };
} catch (Exception e) {
}
return null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -