TorDiscovery.smali
.class public Lorg/bitcoinj/net/discovery/TorDiscovery;
.super Ljava/lang/Object;
.source "TorDiscovery.java"
# interfaces
.implements Lorg/bitcoinj/net/discovery/PeerDiscovery;
# static fields
.field public static final MINIMUM_ROUTER_COUNT:I = 0x4
.field public static final MINIMUM_ROUTER_LOOKUP_COUNT:I = 0x6
.field public static final RECEIVE_RETRIES:I = 0x3
.field public static final RESOLVE_CNAME:I = 0x0
.field public static final RESOLVE_ERROR:I = 0xf0
.field public static final RESOLVE_IPV4:I = 0x4
.field public static final RESOLVE_IPV6:I = 0x6
.field public static final RESOLVE_STREAM_ID:I = 0x1000
.field public static final ROUTER_LOOKUP_COUNT:I = 0xa
.field private static final log:Lorg/slf4j/Logger;
# instance fields
.field private final hostNames:[Ljava/lang/String;
.field private final netParams:Lorg/bitcoinj/core/NetworkParameters;
.field private final pathChooser:Lcom/subgraph/orchid/circuits/path/d;
.field private threadPool:Lcom/google/common/util/concurrent/ad;
.field private final torClient:Lcom/subgraph/orchid/TorClient;
# direct methods
.method static constructor <clinit>()V
.registers 1
.prologue
.line 48
const-class v0, Lorg/bitcoinj/net/discovery/TorDiscovery;
invoke-static {v0}, Lorg/slf4j/LoggerFactory;->getLogger(Ljava/lang/Class;)Lorg/slf4j/Logger;
move-result-object v0
sput-object v0, Lorg/bitcoinj/net/discovery/TorDiscovery;->log:Lorg/slf4j/Logger;
return-void
.end method
.method public constructor <init>(Lorg/bitcoinj/core/NetworkParameters;Lcom/subgraph/orchid/TorClient;)V
.registers 4
.prologue
.line 71
invoke-virtual {p1}, Lorg/bitcoinj/core/NetworkParameters;->getDnsSeeds()[Ljava/lang/String;
move-result-object v0
invoke-direct {p0, v0, p1, p2}, Lorg/bitcoinj/net/discovery/TorDiscovery;-><init>([Ljava/lang/String;Lorg/bitcoinj/core/NetworkParameters;Lcom/subgraph/orchid/TorClient;)V
.line 72
return-void
.end method
.method public constructor <init>([Ljava/lang/String;Lorg/bitcoinj/core/NetworkParameters;Lcom/subgraph/orchid/TorClient;)V
.registers 6
.prologue
.line 81
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 82
iput-object p1, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->hostNames:[Ljava/lang/String;
.line 83
iput-object p2, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->netParams:Lorg/bitcoinj/core/NetworkParameters;
.line 85
iput-object p3, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->torClient:Lcom/subgraph/orchid/TorClient;
.line 1061
iget-object v0, p3, Lcom/subgraph/orchid/TorClient;->bBr:Lcom/subgraph/orchid/TorConfig;
.line 1109
iget-object v1, p3, Lcom/subgraph/orchid/TorClient;->bBs:Lcom/subgraph/orchid/j;
.line 86
invoke-static {v0, v1}, Lcom/subgraph/orchid/circuits/path/d;->a(Lcom/subgraph/orchid/TorConfig;Lcom/subgraph/orchid/j;)Lcom/subgraph/orchid/circuits/path/d;
move-result-object v0
iput-object v0, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->pathChooser:Lcom/subgraph/orchid/circuits/path/d;
.line 87
return-void
.end method
.method static synthetic access$000(Lorg/bitcoinj/net/discovery/TorDiscovery;)Lcom/subgraph/orchid/TorClient;
.registers 2
.prologue
.line 47
iget-object v0, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->torClient:Lcom/subgraph/orchid/TorClient;
return-object v0
.end method
.method static synthetic access$100(Lorg/bitcoinj/net/discovery/TorDiscovery;Lcom/subgraph/orchid/c;Ljava/lang/String;)Ljava/net/InetAddress;
.registers 4
.prologue
.line 47
invoke-direct {p0, p1, p2}, Lorg/bitcoinj/net/discovery/TorDiscovery;->lookup(Lcom/subgraph/orchid/c;Ljava/lang/String;)Ljava/net/InetAddress;
move-result-object v0
return-object v0
.end method
.method private declared-synchronized createThreadPool(I)V
.registers 4
.prologue
.line 239
monitor-enter p0
:try_start_1
new-instance v0, Lorg/bitcoinj/utils/ContextPropagatingThreadFactory;
const-string v1, "Tor DNS discovery"
invoke-direct {v0, v1}, Lorg/bitcoinj/utils/ContextPropagatingThreadFactory;-><init>(Ljava/lang/String;)V
.line 240
invoke-static {p1, v0}, Ljava/util/concurrent/Executors;->newFixedThreadPool(ILjava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ExecutorService;
move-result-object v0
.line 239
invoke-static {v0}, Lcom/google/common/util/concurrent/MoreExecutors;->c(Ljava/util/concurrent/ExecutorService;)Lcom/google/common/util/concurrent/ad;
move-result-object v0
iput-object v0, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->threadPool:Lcom/google/common/util/concurrent/ad;
:try_end_12
.catchall {:try_start_1 .. :try_end_12} :catchall_14
.line 241
monitor-exit p0
return-void
.line 239
:catchall_14
move-exception v0
monitor-exit p0
throw v0
.end method
.method private getCircuits(JLjava/util/concurrent/TimeUnit;Ljava/util/Set;)Ljava/util/List;
.registers 12
.annotation system Ldalvik/annotation/Signature;
value = {
"(J",
"Ljava/util/concurrent/TimeUnit;",
"Ljava/util/Set",
"<",
"Lcom/subgraph/orchid/v;",
">;)",
"Ljava/util/List",
"<",
"Lcom/subgraph/orchid/c;",
">;"
}
.end annotation
.prologue
const/4 v1, 0x1
const/4 v2, 0x0
const/4 v6, 0x6
.line 136
invoke-interface {p4}, Ljava/util/Set;->size()I
move-result v0
if-lt v0, v6, :cond_60
move v0, v1
:goto_a
const-string v3, "Set of {} routers is smaller than required minimum {}"
const/4 v4, 0x2
new-array v4, v4, [Ljava/lang/Object;
.line 137
invoke-interface {p4}, Ljava/util/Set;->size()I
move-result v5
invoke-static {v5}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v5
aput-object v5, v4, v2
invoke-static {v6}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v2
aput-object v2, v4, v1
.line 136
invoke-static {v0, v3, v4}, Lcom/google/common/base/n;->checkArgument(ZLjava/lang/String;[Ljava/lang/Object;)V
.line 138
invoke-interface {p4}, Ljava/util/Set;->size()I
move-result v0
invoke-direct {p0, v0}, Lorg/bitcoinj/net/discovery/TorDiscovery;->createThreadPool(I)V
.line 4088
:try_start_29
new-instance v1, Ljava/util/ArrayList;
invoke-direct {v1}, Ljava/util/ArrayList;-><init>()V
.line 142
new-instance v2, Ljava/util/concurrent/CountDownLatch;
const/4 v0, 0x6
invoke-direct {v2, v0}, Ljava/util/concurrent/CountDownLatch;-><init>(I)V
.line 143
invoke-interface {p4}, Ljava/util/Set;->iterator()Ljava/util/Iterator;
move-result-object v3
:goto_38
invoke-interface {v3}, Ljava/util/Iterator;->hasNext()Z
move-result v0
if-eqz v0, :cond_62
invoke-interface {v3}, Ljava/util/Iterator;->next()Ljava/lang/Object;
move-result-object v0
check-cast v0, Lcom/subgraph/orchid/v;
.line 144
iget-object v4, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->threadPool:Lcom/google/common/util/concurrent/ad;
new-instance v5, Lorg/bitcoinj/net/discovery/TorDiscovery$1;
invoke-direct {v5, p0, v0}, Lorg/bitcoinj/net/discovery/TorDiscovery$1;-><init>(Lorg/bitcoinj/net/discovery/TorDiscovery;Lcom/subgraph/orchid/v;)V
invoke-interface {v4, v5}, Lcom/google/common/util/concurrent/ad;->b(Ljava/util/concurrent/Callable;)Lcom/google/common/util/concurrent/y;
move-result-object v0
.line 150
new-instance v4, Lorg/bitcoinj/net/discovery/TorDiscovery$2;
invoke-direct {v4, p0, v2}, Lorg/bitcoinj/net/discovery/TorDiscovery$2;-><init>(Lorg/bitcoinj/net/discovery/TorDiscovery;Ljava/util/concurrent/CountDownLatch;)V
invoke-static {v0, v4}, Lcom/google/common/util/concurrent/r;->a(Lcom/google/common/util/concurrent/y;Lcom/google/common/util/concurrent/q;)V
.line 160
invoke-interface {v1, v0}, Ljava/util/List;->add(Ljava/lang/Object;)Z
:try_end_5a
.catchall {:try_start_29 .. :try_end_5a} :catchall_5b
goto :goto_38
.line 178
:catchall_5b
move-exception v0
invoke-direct {p0}, Lorg/bitcoinj/net/discovery/TorDiscovery;->shutdownThreadPool()V
throw v0
:cond_60
move v0, v2
.line 136
goto :goto_a
.line 163
:cond_62
:try_start_62
invoke-virtual {v2, p1, p2, p3}, Ljava/util/concurrent/CountDownLatch;->await(JLjava/util/concurrent/TimeUnit;)Z
:try_end_65
.catchall {:try_start_62 .. :try_end_65} :catchall_5b
move-result v2
.line 166
:try_start_66
new-instance v3, Ljava/util/ArrayList;
invoke-static {v1}, Lcom/google/common/util/concurrent/r;->l(Ljava/lang/Iterable;)Lcom/google/common/util/concurrent/y;
move-result-object v0
invoke-interface {v0}, Lcom/google/common/util/concurrent/y;->get()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/util/Collection;
invoke-direct {v3, v0}, Ljava/util/ArrayList;-><init>(Ljava/util/Collection;)V
.line 168
const/4 v0, 0x0
invoke-static {v0}, Ljava/util/Collections;->singleton(Ljava/lang/Object;)Ljava/util/Set;
move-result-object v0
invoke-interface {v3, v0}, Ljava/util/List;->removeAll(Ljava/util/Collection;)Z
.line 169
invoke-interface {p4}, Ljava/util/Set;->size()I
move-result v0
invoke-interface {v3}, Ljava/util/List;->size()I
move-result v1
sub-int v1, v0, v1
.line 170
if-lez v1, :cond_ab
sget-object v4, Lorg/bitcoinj/net/discovery/TorDiscovery;->log:Lorg/slf4j/Logger;
new-instance v5, Ljava/lang/StringBuilder;
const-string v0, "{} failures "
invoke-direct {v5, v0}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
if-eqz v2, :cond_af
const-string v0, ""
:goto_96
invoke-virtual {v5, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v0
const-string v2, "opening DNS lookup circuits"
invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
.line 171
invoke-static {v1}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v1
.line 170
invoke-interface {v4, v0, v1}, Lorg/slf4j/Logger;->warn(Ljava/lang/String;Ljava/lang/Object;)V
:try_end_ab
.catch Ljava/util/concurrent/ExecutionException; {:try_start_66 .. :try_end_ab} :catch_b2
.catchall {:try_start_66 .. :try_end_ab} :catchall_5b
.line 178
:cond_ab
invoke-direct {p0}, Lorg/bitcoinj/net/discovery/TorDiscovery;->shutdownThreadPool()V
.line 172
return-object v3
.line 170
:cond_af
:try_start_af
const-string v0, "(including timeout) "
:try_end_b1
.catch Ljava/util/concurrent/ExecutionException; {:try_start_af .. :try_end_b1} :catch_b2
.catchall {:try_start_af .. :try_end_b1} :catchall_5b
goto :goto_96
.line 173
:catch_b2
move-exception v0
.line 175
:try_start_b3
new-instance v1, Ljava/lang/RuntimeException;
invoke-direct {v1, v0}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V
throw v1
:try_end_b9
.catchall {:try_start_b3 .. :try_end_b9} :catchall_5b
.end method
.method private lookup(Lcom/subgraph/orchid/c;Ljava/lang/String;)Ljava/net/InetAddress;
.registers 7
.prologue
.line 245
const/16 v0, 0xb
const/16 v1, 0x1000
invoke-interface {p1}, Lcom/subgraph/orchid/c;->It()Lcom/subgraph/orchid/f;
move-result-object v2
invoke-interface {p1, v0, v1, v2}, Lcom/subgraph/orchid/c;->a(IILcom/subgraph/orchid/f;)Lcom/subgraph/orchid/t;
move-result-object v0
.line 246
invoke-interface {v0, p2}, Lcom/subgraph/orchid/t;->gm(Ljava/lang/String;)V
.line 247
invoke-interface {p1, v0}, Lcom/subgraph/orchid/c;->a(Lcom/subgraph/orchid/t;)V
.line 250
const/4 v0, 0x0
:goto_13
const/4 v1, 0x3
if-ge v0, v1, :cond_51
.line 251
invoke-interface {p1}, Lcom/subgraph/orchid/c;->Is()Lcom/subgraph/orchid/t;
move-result-object v1
.line 252
if-eqz v1, :cond_4e
.line 253
:cond_1c
invoke-interface {v1}, Lcom/subgraph/orchid/t;->Io()I
move-result v0
if-lez v0, :cond_51
.line 254
invoke-interface {v1}, Lcom/subgraph/orchid/t;->Ik()I
move-result v0
.line 255
invoke-interface {v1}, Lcom/subgraph/orchid/t;->Ik()I
move-result v2
.line 256
new-array v2, v2, [B
.line 257
invoke-interface {v1, v2}, Lcom/subgraph/orchid/t;->ah([B)V
.line 258
invoke-interface {v1}, Lcom/subgraph/orchid/t;->getInt()I
.line 260
if-eqz v0, :cond_38
const/16 v3, 0xf0
if-lt v0, v3, :cond_43
.line 262
:cond_38
new-instance v0, Ljava/lang/RuntimeException;
new-instance v1, Ljava/lang/String;
invoke-direct {v1, v2}, Ljava/lang/String;-><init>([B)V
invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V
throw v0
.line 263
:cond_43
const/4 v3, 0x4
if-eq v0, v3, :cond_49
const/4 v3, 0x6
if-ne v0, v3, :cond_1c
.line 264
:cond_49
invoke-static {v2}, Ljava/net/InetAddress;->getByAddress([B)Ljava/net/InetAddress;
move-result-object v0
return-object v0
.line 250
:cond_4e
add-int/lit8 v0, v0, 0x1
goto :goto_13
.line 270
:cond_51
new-instance v0, Ljava/lang/RuntimeException;
new-instance v1, Ljava/lang/StringBuilder;
const-string v2, "Could not look up "
invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v1, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V
throw v0
.end method
.method private lookupAddresses(JLjava/util/concurrent/TimeUnit;Ljava/util/List;)Ljava/util/Collection;
.registers 16
.annotation system Ldalvik/annotation/Signature;
value = {
"(J",
"Ljava/util/concurrent/TimeUnit;",
"Ljava/util/List",
"<",
"Lcom/subgraph/orchid/c;",
">;)",
"Ljava/util/Collection",
"<",
"Ljava/net/InetSocketAddress;",
">;"
}
.end annotation
.prologue
const/4 v1, 0x0
.line 183
invoke-interface {p4}, Ljava/util/List;->size()I
move-result v0
iget-object v2, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->hostNames:[Ljava/lang/String;
array-length v2, v2
mul-int/2addr v0, v2
invoke-direct {p0, v0}, Lorg/bitcoinj/net/discovery/TorDiscovery;->createThreadPool(I)V
.line 5088
:try_start_c
new-instance v3, Ljava/util/ArrayList;
invoke-direct {v3}, Ljava/util/ArrayList;-><init>()V
.line 187
invoke-interface {p4}, Ljava/util/List;->iterator()Ljava/util/Iterator;
move-result-object v4
:cond_15
invoke-interface {v4}, Ljava/util/Iterator;->hasNext()Z
move-result v0
if-eqz v0, :cond_3a
invoke-interface {v4}, Ljava/util/Iterator;->next()Ljava/lang/Object;
move-result-object v0
check-cast v0, Lcom/subgraph/orchid/c;
.line 188
iget-object v5, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->hostNames:[Ljava/lang/String;
array-length v6, v5
move v2, v1
:goto_25
if-ge v2, v6, :cond_15
aget-object v7, v5, v2
.line 189
iget-object v8, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->threadPool:Lcom/google/common/util/concurrent/ad;
new-instance v9, Lorg/bitcoinj/net/discovery/TorDiscovery$3;
invoke-direct {v9, p0, v0, v7}, Lorg/bitcoinj/net/discovery/TorDiscovery$3;-><init>(Lorg/bitcoinj/net/discovery/TorDiscovery;Lcom/subgraph/orchid/c;Ljava/lang/String;)V
invoke-interface {v8, v9}, Lcom/google/common/util/concurrent/ad;->b(Ljava/util/concurrent/Callable;)Lcom/google/common/util/concurrent/y;
move-result-object v7
invoke-interface {v3, v7}, Ljava/util/List;->add(Ljava/lang/Object;)Z
.line 188
add-int/lit8 v2, v2, 0x1
goto :goto_25
.line 198
:cond_3a
iget-object v0, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->threadPool:Lcom/google/common/util/concurrent/ad;
invoke-interface {v0, p1, p2, p3}, Lcom/google/common/util/concurrent/ad;->awaitTermination(JLjava/util/concurrent/TimeUnit;)Z
.line 200
invoke-interface {v3}, Ljava/util/List;->iterator()Ljava/util/Iterator;
move-result-object v2
:goto_43
invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z
move-result v0
if-eqz v0, :cond_5e
invoke-interface {v2}, Ljava/util/Iterator;->next()Ljava/lang/Object;
move-result-object v0
check-cast v0, Lcom/google/common/util/concurrent/y;
.line 201
invoke-interface {v0}, Lcom/google/common/util/concurrent/y;->isDone()Z
move-result v4
if-nez v4, :cond_5b
.line 202
add-int/lit8 v1, v1, 0x1
.line 203
const/4 v4, 0x1
invoke-interface {v0, v4}, Lcom/google/common/util/concurrent/y;->cancel(Z)Z
:cond_5b
move v0, v1
move v1, v0
.line 205
goto :goto_43
.line 206
:cond_5e
if-lez v1, :cond_6b
.line 207
sget-object v0, Lorg/bitcoinj/net/discovery/TorDiscovery;->log:Lorg/slf4j/Logger;
const-string v2, "{} DNS lookups timed out"
invoke-static {v1}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v1
invoke-interface {v0, v2, v1}, Lorg/slf4j/Logger;->warn(Ljava/lang/String;Ljava/lang/Object;)V
:try_end_6b
.catchall {:try_start_c .. :try_end_6b} :catchall_b4
.line 210
:cond_6b
:try_start_6b
new-instance v1, Ljava/util/ArrayList;
invoke-static {v3}, Lcom/google/common/util/concurrent/r;->l(Ljava/lang/Iterable;)Lcom/google/common/util/concurrent/y;
move-result-object v0
invoke-interface {v0}, Lcom/google/common/util/concurrent/y;->get()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/util/Collection;
invoke-direct {v1, v0}, Ljava/util/ArrayList;-><init>(Ljava/util/Collection;)V
.line 212
const/4 v0, 0x0
invoke-static {v0}, Ljava/util/Collections;->singleton(Ljava/lang/Object;)Ljava/util/Set;
move-result-object v0
invoke-interface {v1, v0}, Ljava/util/List;->removeAll(Ljava/util/Collection;)Z
.line 216
invoke-static {}, Lcom/google/common/collect/Maps;->newHashMap()Ljava/util/HashMap;
move-result-object v2
.line 218
invoke-interface {v1}, Ljava/util/List;->iterator()Ljava/util/Iterator;
move-result-object v1
:goto_8a
invoke-interface {v1}, Ljava/util/Iterator;->hasNext()Z
move-result v0
if-eqz v0, :cond_b9
invoke-interface {v1}, Ljava/util/Iterator;->next()Ljava/lang/Object;
move-result-object v0
check-cast v0, Lorg/bitcoinj/net/discovery/TorDiscovery$Lookup;
.line 219
new-instance v3, Ljava/net/InetSocketAddress;
iget-object v4, v0, Lorg/bitcoinj/net/discovery/TorDiscovery$Lookup;->address:Ljava/net/InetAddress;
iget-object v5, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->netParams:Lorg/bitcoinj/core/NetworkParameters;
invoke-virtual {v5}, Lorg/bitcoinj/core/NetworkParameters;->getPort()I
move-result v5
invoke-direct {v3, v4, v5}, Ljava/net/InetSocketAddress;-><init>(Ljava/net/InetAddress;I)V
.line 220
iget-object v0, v0, Lorg/bitcoinj/net/discovery/TorDiscovery$Lookup;->router:Lcom/subgraph/orchid/v;
invoke-interface {v0}, Lcom/subgraph/orchid/v;->JF()Lcom/subgraph/orchid/d/c;
move-result-object v0
invoke-interface {v2, v0, v3}, Ljava/util/Map;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
:try_end_ac
.catch Ljava/util/concurrent/ExecutionException; {:try_start_6b .. :try_end_ac} :catch_ad
.catchall {:try_start_6b .. :try_end_ac} :catchall_b4
goto :goto_8a
.line 224
:catch_ad
move-exception v0
.line 226
:try_start_ae
new-instance v1, Ljava/lang/RuntimeException;
invoke-direct {v1, v0}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V
throw v1
:try_end_b4
.catchall {:try_start_ae .. :try_end_b4} :catchall_b4
.line 229
:catchall_b4
move-exception v0
invoke-direct {p0}, Lorg/bitcoinj/net/discovery/TorDiscovery;->shutdownThreadPool()V
throw v0
.line 223
:cond_b9
:try_start_b9
invoke-interface {v2}, Ljava/util/Map;->values()Ljava/util/Collection;
:try_end_bc
.catch Ljava/util/concurrent/ExecutionException; {:try_start_b9 .. :try_end_bc} :catch_ad
.catchall {:try_start_b9 .. :try_end_bc} :catchall_b4
move-result-object v0
.line 229
invoke-direct {p0}, Lorg/bitcoinj/net/discovery/TorDiscovery;->shutdownThreadPool()V
.line 223
return-object v0
.end method
.method private declared-synchronized shutdownThreadPool()V
.registers 2
.prologue
.line 234
monitor-enter p0
:try_start_1
iget-object v0, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->threadPool:Lcom/google/common/util/concurrent/ad;
invoke-interface {v0}, Lcom/google/common/util/concurrent/ad;->shutdownNow()Ljava/util/List;
.line 235
const/4 v0, 0x0
iput-object v0, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->threadPool:Lcom/google/common/util/concurrent/ad;
:try_end_9
.catchall {:try_start_1 .. :try_end_9} :catchall_b
.line 236
monitor-exit p0
return-void
.line 234
:catchall_b
move-exception v0
monitor-exit p0
throw v0
.end method
# virtual methods
.method public getPeers(JJLjava/util/concurrent/TimeUnit;)[Ljava/net/InetSocketAddress;
.registers 11
.prologue
.line 101
iget-object v0, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->hostNames:[Ljava/lang/String;
if-nez v0, :cond_c
.line 102
new-instance v0, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;
const-string v1, "Unable to find any peers via DNS"
invoke-direct {v0, v1}, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;-><init>(Ljava/lang/String;)V
throw v0
.line 103
:cond_c
const-wide/16 v0, 0x0
cmp-long v0, p1, v0
if-eqz v0, :cond_27
.line 104
new-instance v0, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;
new-instance v1, Ljava/lang/StringBuilder;
const-string v2, "DNS seeds cannot filter by services: "
invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v1, p1, p2}, Ljava/lang/StringBuilder;->append(J)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-direct {v0, v1}, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;-><init>(Ljava/lang/String;)V
throw v0
.line 1164
:cond_27
new-instance v0, Ljava/util/HashSet;
invoke-direct {v0}, Ljava/util/HashSet;-><init>()V
.line 2088
new-instance v1, Ljava/util/ArrayList;
invoke-direct {v1}, Ljava/util/ArrayList;-><init>()V
.line 110
:goto_31
invoke-interface {v0}, Ljava/util/Set;->size()I
move-result v2
const/16 v3, 0xa
if-ge v2, v3, :cond_43
.line 111
iget-object v2, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->pathChooser:Lcom/subgraph/orchid/circuits/path/d;
invoke-virtual {v2, v1}, Lcom/subgraph/orchid/circuits/path/d;->ai(Ljava/util/List;)Lcom/subgraph/orchid/v;
move-result-object v2
.line 112
invoke-interface {v0, v2}, Ljava/util/Set;->add(Ljava/lang/Object;)Z
goto :goto_31
.line 116
:cond_43
:try_start_43
iget-object v1, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->torClient:Lcom/subgraph/orchid/TorClient;
.line 3061
iget-object v1, v1, Lcom/subgraph/orchid/TorClient;->bBr:Lcom/subgraph/orchid/TorConfig;
.line 117
invoke-interface {v1}, Lcom/subgraph/orchid/TorConfig;->Ke()J
move-result-wide v2
sget-object v1, Ljava/util/concurrent/TimeUnit;->MILLISECONDS:Ljava/util/concurrent/TimeUnit;
invoke-direct {p0, v2, v3, v1, v0}, Lorg/bitcoinj/net/discovery/TorDiscovery;->getCircuits(JLjava/util/concurrent/TimeUnit;Ljava/util/Set;)Ljava/util/List;
move-result-object v0
.line 118
invoke-interface {v0}, Ljava/util/List;->isEmpty()Z
move-result v1
if-eqz v1, :cond_81
.line 119
new-instance v0, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;
new-instance v1, Ljava/lang/StringBuilder;
const-string v2, "Failed to open any circuit within "
invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
.line 120
invoke-static {p3, p4}, Ljava/lang/String;->valueOf(J)Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
const-string v2, " "
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1, p5}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-direct {v0, v1}, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;-><init>(Ljava/lang/String;)V
throw v0
:try_end_7a
.catch Ljava/lang/InterruptedException; {:try_start_43 .. :try_end_7a} :catch_7a
.line 130
:catch_7a
move-exception v0
.line 131
new-instance v1, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;
invoke-direct {v1, v0}, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;-><init>(Ljava/lang/Throwable;)V
throw v1
.line 122
:cond_81
:try_start_81
invoke-direct {p0, p3, p4, p5, v0}, Lorg/bitcoinj/net/discovery/TorDiscovery;->lookupAddresses(JLjava/util/concurrent/TimeUnit;Ljava/util/List;)Ljava/util/Collection;
move-result-object v0
.line 124
invoke-interface {v0}, Ljava/util/Collection;->size()I
move-result v1
const/4 v2, 0x4
if-ge v1, v2, :cond_a5
.line 125
new-instance v1, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;
new-instance v2, Ljava/lang/StringBuilder;
const-string v3, "Unable to find enough peers via Tor - got "
invoke-direct {v2, v3}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-interface {v0}, Ljava/util/Collection;->size()I
move-result v0
invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-direct {v1, v0}, Lorg/bitcoinj/net/discovery/PeerDiscoveryException;-><init>(Ljava/lang/String;)V
throw v1
.line 3088
:cond_a5
new-instance v1, Ljava/util/ArrayList;
invoke-direct {v1}, Ljava/util/ArrayList;-><init>()V
.line 127
invoke-virtual {v1, v0}, Ljava/util/ArrayList;->addAll(Ljava/util/Collection;)Z
.line 128
invoke-static {v1}, Ljava/util/Collections;->shuffle(Ljava/util/List;)V
.line 129
invoke-virtual {v1}, Ljava/util/ArrayList;->size()I
move-result v0
new-array v0, v0, [Ljava/net/InetSocketAddress;
invoke-virtual {v1, v0}, Ljava/util/ArrayList;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
move-result-object v0
check-cast v0, [Ljava/net/InetSocketAddress;
:try_end_bc
.catch Ljava/lang/InterruptedException; {:try_start_81 .. :try_end_bc} :catch_7a
return-object v0
.end method
.method public declared-synchronized shutdown()V
.registers 2
.prologue
.line 275
monitor-enter p0
:try_start_1
iget-object v0, p0, Lorg/bitcoinj/net/discovery/TorDiscovery;->threadPool:Lcom/google/common/util/concurrent/ad;
if-eqz v0, :cond_8
.line 276
invoke-direct {p0}, Lorg/bitcoinj/net/discovery/TorDiscovery;->shutdownThreadPool()V
:try_end_8
.catchall {:try_start_1 .. :try_end_8} :catchall_a
.line 278
:cond_8
monitor-exit p0
return-void
.line 275
:catchall_a
move-exception v0
monitor-exit p0
throw v0
.end method