public void
messageFailed(
BuddyPluginBuddy buddy,
Throwable cause )
{
setResult( new IPCException( "Read failed", cause ));
}
protected void
setResult(
Object obj )
{
synchronized( result ){
if ( result_set ){
return;
}
result_set = true;
if ( !( result[0] instanceof byte[] )){
result[0] = obj;
}
result_sem.release();
}
}
});
}catch( Throwable e ){
result[0] = new IPCException( "Buddy torrent get failed", e );
result_sem.release();
}
}else{
result[0] = new IPCException( "Buddy is offline" );
result_sem.release();
}
// second try and get via magnet
final MagnetPlugin magnet_plugin = getMagnetPlugin();
if ( magnet_plugin == null ){
synchronized( result ){
if ( result[0] == null ){
result[0] = new IPCException( "Magnet plugin unavailable" );
}
}
result_sem.release();
}else{
new AEThread2( "BuddyPlugin:mag", true )
{
private boolean result_set;
public void
run()
{
try{
if ( buddy.isOnline( true )){
Thread.sleep(10*1000);
}
synchronized( result ){
if ( result[0] instanceof byte[] ){
setResult( null );
return;
}
}
byte[] torrent_data = magnet_plugin.download(
new MagnetPluginProgressListener()
{
public void
reportSize(
long size )
{
}
public void
reportActivity(
String str )
{
log( " MagnetDownload: " + str );
}
public void
reportCompleteness(
int percent )
{
}
public void
reportContributor(
InetSocketAddress address )
{
}
public boolean
verbose()
{
return( false );
}
},
hash,
"",
new InetSocketAddress[0],
timeout );
if ( torrent_data == null ){
setResult( new IPCException( "Magnet timeout" ));
}else{
log( " torrent downloaded from magnet" );
setResult( torrent_data );
}
}catch( Throwable e ){
setResult( new IPCException( "Magnet get failed", e ));
}
}
protected void
setResult(
Object obj )
{
synchronized( result ){
if ( result_set ){
return;
}
result_set = true;
if ( obj != null ){
if ( result[0] == null ||
( obj instanceof byte[] && !( result[0] instanceof byte[] ))){
result[0] = obj;
}
}
result_sem.release();
}
}
}.start();
}
long start = SystemTime.getMonotonousTime();
if ( result_sem.reserve(timeout )){
if ( !( result[0] instanceof byte[] )){
long rem = timeout - ( SystemTime.getMonotonousTime() - start );
if ( rem > 0 ){
result_sem.reserve(rem );
}
}
}
if ( result[0] == null ){
log( " torrent download timeout" );
throw( new IPCException( "Timeout" ));
}else if ( result[0] instanceof byte[] ){
return( new ByteArrayInputStream((byte[])result[0]));
}else{
IPCException error = (IPCException)result[0];
log( " torrent downloaded failed: " + Debug.getNestedExceptionMessage( error ));
throw( error );
}