@Override public void serialiseToBEncodedFile( File target_file ) throws TOTorrentException { // make sure pieces are current try{ getMonitor().enter(); boolean[] restored = restoreState( true, true ); delegate.serialiseToBEncodedFile( target_file ); if ( target_file.equals( file )){ fluff_dirty = false; } if ( restored[0] ){ discardPieces( SystemTime.getCurrentTime(), true ); } if ( restored[1] ){ for (Iterator it = torrentFluffKeyset.iterator(); it.hasNext();){ delegate.setAdditionalMapProperty( (String)it.next(), fluffThombstone ); } } }finally{ getMonitor().exit(); } }
@Override public void setDiscardFluff( boolean discard ) { if ( discard && !torrentFluffKeyset.isEmpty() ){ //System.out.println( "Discarded fluff for " + new String(getName())); try{ getMonitor().enter(); try{ // if file is out of sync with fluff then force a write if ( fluff_dirty ){ boolean[] restored = restoreState( true, true ); delegate.serialiseToBEncodedFile( file ); fluff_dirty = false; if ( restored[0] ){ discardPieces( SystemTime.getCurrentTime(), true ); } } for(Iterator it = torrentFluffKeyset.iterator();it.hasNext();){ delegate.setAdditionalMapProperty( (String)it.next(), fluffThombstone ); } }catch( Throwable e ){ Debug.printStackTrace( e ); } }finally{ getMonitor().exit(); } } }
@Override public Map serialiseToMap() throws TOTorrentException { // make sure pieces are current try{ getMonitor().enter(); boolean[] restored = restoreState( true, true ); Map result = delegate.serialiseToMap(); if ( restored[0] ){ discardPieces( SystemTime.getCurrentTime(), true ); } if ( restored[1]){ for (Iterator it = torrentFluffKeyset.iterator(); it.hasNext();){ delegate.setAdditionalMapProperty((String) it.next(), fluffThombstone); } } return( result ); }finally{ getMonitor().exit(); } }
@Override public Object getAdditionalProperty(String name) { if (torrentFluffKeyset.contains(name)) { try { getMonitor().enter(); Object result = delegate.getAdditionalProperty(name); if (result == fluffThombstone) { try { restoreState(false, true); Object res = delegate.getAdditionalProperty(name); //System.out.println( "Restored fluff for " + new String(getName()) + " to " + res ); return (res); } catch (Throwable e) { Debug.out("Property '" + name + " lost due to torrent read error", e); } } } finally { getMonitor().exit(); } } return delegate.getAdditionalProperty(name); }
@Override public Map getAdditionalMapProperty( String name ) { if (torrentFluffKeyset.contains(name)){ try{ getMonitor().enter(); Map result = delegate.getAdditionalMapProperty( name ); if ( result == fluffThombstone ){ try{ restoreState( false, true ); Map res = delegate.getAdditionalMapProperty( name ); //System.out.println( "Restored fluff for " + new String(getName()) + " to " + res ); return( res ); }catch( Throwable e ){ Debug.out( "Property '" + name + " lost due to torrent read error", e ); } } }finally{ getMonitor().exit(); } } return( delegate.getAdditionalMapProperty( name )); }
@Override public void serialiseToXMLFile( File target_file ) throws TOTorrentException { // make sure pieces are current try{ getMonitor().enter(); boolean[] restored = restoreState( true, true ); delegate.serialiseToXMLFile( target_file ); if ( restored[0] ){ discardPieces( SystemTime.getCurrentTime(), true ); } if ( restored[1]){ for (Iterator it = torrentFluffKeyset.iterator(); it.hasNext();){ delegate.setAdditionalMapProperty((String) it.next(), fluffThombstone); } } }finally{ getMonitor().exit(); } }
protected void discardPieces( long now, boolean force ) { // handle clock changes backwards if ( now < last_pieces_read_time && !force ){ last_pieces_read_time = now; }else{ try{ if( ( now - last_pieces_read_time > PIECE_HASH_TIMEOUT || force ) && delegate.getPieces() != null ){ try{ getMonitor().enter(); // System.out.println( "clearing pieces for '" + new String(getName()) + "'"); delegate.setPieces( null ); }finally{ getMonitor().exit(); } } }catch( Throwable e ){ Debug.printStackTrace(e); } } }
@Override public void removeAdditionalProperty( String name ) { if(delegate.getAdditionalProperty(name) == null) return; if ( torrentFluffKeyset.contains(name)){ //System.out.println( "Set fluff for " + new String(getName()) + " to " + value ); try{ getMonitor().enter(); delegate.removeAdditionalProperty( name ); fluff_dirty = true; }finally{ getMonitor().exit(); } }else{ delegate.removeAdditionalProperty( name ); } }
@Override public byte[][] getPieces() throws TOTorrentException { byte[][] res = delegate.getPieces(); last_pieces_read_time = SystemTime.getCurrentTime(); if ( res == null ){ // System.out.println( "recovering pieces for '" + new String(getName()) + "'"); try{ getMonitor().enter(); restoreState( true, false ); res = delegate.getPieces(); }finally{ getMonitor().exit(); } } return( res ); }
@Override public void setAdditionalProperty( String name, Object value ) { if ( torrentFluffKeyset.contains(name)){ //System.out.println( "Set fluff for " + new String(getName()) + " to " + value ); try{ getMonitor().enter(); delegate.setAdditionalProperty( name, value ); fluff_dirty = true; }finally{ getMonitor().exit(); } }else{ delegate.setAdditionalProperty( name, value ); } }
@Override public void setAdditionalMapProperty( String name, Map value ) { if ( torrentFluffKeyset.contains(name)){ //System.out.println( "Set fluff for " + new String(getName()) + " to " + value ); try{ getMonitor().enter(); delegate.setAdditionalMapProperty( name, value ); fluff_dirty = true; }finally{ getMonitor().exit(); } }else{ delegate.setAdditionalMapProperty( name, value ); } }
@Override public void removeAdditionalProperties() { try{ getMonitor().enter(); delegate.removeAdditionalProperties(); fluff_dirty = true; }finally{ getMonitor().exit(); } }