DnsResolver.smali
.class public abstract Lcom/qiniu/android/dns/dns/DnsResolver;
.super Ljava/lang/Object;
.source "DnsResolver.java"
# interfaces
.implements Lcom/qiniu/android/dns/IResolver;
# annotations
.annotation system Ldalvik/annotation/MemberClasses;
value = {
Lcom/qiniu/android/dns/dns/DnsResolver$RequestCanceller;,
Lcom/qiniu/android/dns/dns/DnsResolver$ResponseComposition;
}
.end annotation
# static fields
.field private static defaultExecutorService:Ljava/util/concurrent/ExecutorService;
.field private static timeoutExecutorService:Ljava/util/concurrent/ScheduledExecutorService;
# instance fields
.field private final executorService:Ljava/util/concurrent/ExecutorService;
.field private final recordType:I
.field private final servers:[Ljava/lang/String;
.field protected final timeout:I
# direct methods
.method static constructor <clinit>()V
.registers 1
.line 22
invoke-static {}, Ljava/util/concurrent/Executors;->newSingleThreadScheduledExecutor()Ljava/util/concurrent/ScheduledExecutorService;
move-result-object v0
sput-object v0, Lcom/qiniu/android/dns/dns/DnsResolver;->timeoutExecutorService:Ljava/util/concurrent/ScheduledExecutorService;
.line 23
const/4 v0, 0x4
invoke-static {v0}, Ljava/util/concurrent/Executors;->newFixedThreadPool(I)Ljava/util/concurrent/ExecutorService;
move-result-object v0
sput-object v0, Lcom/qiniu/android/dns/dns/DnsResolver;->defaultExecutorService:Ljava/util/concurrent/ExecutorService;
return-void
.end method
.method public constructor <init>(Ljava/lang/String;)V
.registers 4
.param p1, "server" # Ljava/lang/String;
.line 32
const/4 v0, 0x1
const/16 v1, 0xa
invoke-direct {p0, p1, v0, v1}, Lcom/qiniu/android/dns/dns/DnsResolver;-><init>(Ljava/lang/String;II)V
.line 33
return-void
.end method
.method public constructor <init>(Ljava/lang/String;I)V
.registers 4
.param p1, "server" # Ljava/lang/String;
.param p2, "timeout" # I
.line 36
const/4 v0, 0x1
invoke-direct {p0, p1, v0, p2}, Lcom/qiniu/android/dns/dns/DnsResolver;-><init>(Ljava/lang/String;II)V
.line 37
return-void
.end method
.method public constructor <init>(Ljava/lang/String;II)V
.registers 7
.param p1, "server" # Ljava/lang/String;
.param p2, "recordType" # I
.param p3, "timeout" # I
.line 40
const/4 v0, 0x0
if-nez p1, :cond_5
move-object v1, v0
goto :goto_b
:cond_5
const/4 v1, 0x1
new-array v1, v1, [Ljava/lang/String;
const/4 v2, 0x0
aput-object p1, v1, v2
:goto_b
invoke-direct {p0, v1, p2, p3, v0}, Lcom/qiniu/android/dns/dns/DnsResolver;-><init>([Ljava/lang/String;IILjava/util/concurrent/ExecutorService;)V
.line 41
return-void
.end method
.method public constructor <init>([Ljava/lang/String;II)V
.registers 5
.param p1, "servers" # [Ljava/lang/String;
.param p2, "recordType" # I
.param p3, "timeout" # I
.line 43
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 44
iput p2, p0, Lcom/qiniu/android/dns/dns/DnsResolver;->recordType:I
.line 45
if-lez p3, :cond_9
move v0, p3
goto :goto_b
:cond_9
const/16 v0, 0xa
:goto_b
iput v0, p0, Lcom/qiniu/android/dns/dns/DnsResolver;->timeout:I
.line 46
iput-object p1, p0, Lcom/qiniu/android/dns/dns/DnsResolver;->servers:[Ljava/lang/String;
.line 47
const/4 v0, 0x0
iput-object v0, p0, Lcom/qiniu/android/dns/dns/DnsResolver;->executorService:Ljava/util/concurrent/ExecutorService;
.line 48
return-void
.end method
.method public constructor <init>([Ljava/lang/String;IILjava/util/concurrent/ExecutorService;)V
.registers 7
.param p1, "servers" # [Ljava/lang/String;
.param p2, "recordType" # I
.param p3, "timeout" # I
.param p4, "executorService" # Ljava/util/concurrent/ExecutorService;
.line 50
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 51
if-eqz p1, :cond_d
array-length v0, p1
const/4 v1, 0x1
if-le v0, v1, :cond_d
if-nez p4, :cond_d
.line 52
sget-object p4, Lcom/qiniu/android/dns/dns/DnsResolver;->defaultExecutorService:Ljava/util/concurrent/ExecutorService;
.line 54
:cond_d
iput p2, p0, Lcom/qiniu/android/dns/dns/DnsResolver;->recordType:I
.line 55
if-lez p3, :cond_13
move v0, p3
goto :goto_15
:cond_13
const/16 v0, 0xa
:goto_15
iput v0, p0, Lcom/qiniu/android/dns/dns/DnsResolver;->timeout:I
.line 56
iput-object p1, p0, Lcom/qiniu/android/dns/dns/DnsResolver;->servers:[Ljava/lang/String;
.line 57
iput-object p4, p0, Lcom/qiniu/android/dns/dns/DnsResolver;->executorService:Ljava/util/concurrent/ExecutorService;
.line 58
return-void
.end method
.method static synthetic access$000(Lcom/qiniu/android/dns/dns/DnsResolver;)[Ljava/lang/String;
.registers 2
.param p0, "x0" # Lcom/qiniu/android/dns/dns/DnsResolver;
.line 20
iget-object v0, p0, Lcom/qiniu/android/dns/dns/DnsResolver;->servers:[Ljava/lang/String;
return-object v0
.end method
.method private lookupHost(Ljava/lang/String;)Lcom/qiniu/android/dns/dns/DnsResponse;
.registers 3
.param p1, "host" # Ljava/lang/String;
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;
}
.end annotation
.line 81
iget v0, p0, Lcom/qiniu/android/dns/dns/DnsResolver;->recordType:I
invoke-direct {p0, p1, v0}, Lcom/qiniu/android/dns/dns/DnsResolver;->request(Ljava/lang/String;I)Lcom/qiniu/android/dns/dns/DnsResponse;
move-result-object v0
return-object v0
.end method
.method private request(Ljava/lang/String;I)Lcom/qiniu/android/dns/dns/DnsResponse;
.registers 21
.param p1, "host" # Ljava/lang/String;
.param p2, "recordType" # I
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;
}
.end annotation
.line 85
move-object/from16 v8, p0
move-object/from16 v9, p1
iget-object v0, v8, Lcom/qiniu/android/dns/dns/DnsResolver;->servers:[Ljava/lang/String;
if-eqz v0, :cond_b1
array-length v0, v0
if-eqz v0, :cond_b1
.line 89
if-eqz v9, :cond_a7
invoke-virtual/range {p1 .. p1}, Ljava/lang/String;->length()I
move-result v0
if-eqz v0, :cond_a7
.line 93
new-instance v0, Lcom/qiniu/android/dns/dns/DnsResolver$RequestCanceller;
invoke-direct {v0}, Lcom/qiniu/android/dns/dns/DnsResolver$RequestCanceller;-><init>()V
move-object v10, v0
.line 94
.local v10, "canceller":Lcom/qiniu/android/dns/dns/DnsResolver$RequestCanceller;
iget-object v0, v8, Lcom/qiniu/android/dns/dns/DnsResolver;->servers:[Ljava/lang/String;
array-length v0, v0
const/4 v1, 0x0
const/4 v2, 0x1
if-eq v0, v2, :cond_90
iget-object v0, v8, Lcom/qiniu/android/dns/dns/DnsResolver;->executorService:Ljava/util/concurrent/ExecutorService;
if-nez v0, :cond_26
goto/16 :goto_90
.line 104
:cond_26
new-instance v0, Lcom/qiniu/android/dns/dns/DnsResolver$ResponseComposition;
invoke-direct {v0}, Lcom/qiniu/android/dns/dns/DnsResolver$ResponseComposition;-><init>()V
move-object v11, v0
.line 107
.local v11, "responseComposition":Lcom/qiniu/android/dns/dns/DnsResolver$ResponseComposition;
sget-object v0, Lcom/qiniu/android/dns/dns/DnsResolver;->timeoutExecutorService:Ljava/util/concurrent/ScheduledExecutorService;
new-instance v2, Lcom/qiniu/android/dns/dns/DnsResolver$1;
invoke-direct {v2, v8, v11, v9}, Lcom/qiniu/android/dns/dns/DnsResolver$1;-><init>(Lcom/qiniu/android/dns/dns/DnsResolver;Lcom/qiniu/android/dns/dns/DnsResolver$ResponseComposition;Ljava/lang/String;)V
iget v3, v8, Lcom/qiniu/android/dns/dns/DnsResolver;->timeout:I
int-to-long v3, v3
sget-object v5, Ljava/util/concurrent/TimeUnit;->SECONDS:Ljava/util/concurrent/TimeUnit;
invoke-interface {v0, v2, v3, v4, v5}, Ljava/util/concurrent/ScheduledExecutorService;->schedule(Ljava/util/concurrent/Callable;JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;
.line 119
new-instance v0, Ljava/util/ArrayList;
invoke-direct {v0}, Ljava/util/ArrayList;-><init>()V
move-object v12, v0
.line 120
.local v12, "futures":Ljava/util/List;, "Ljava/util/List<Ljava/util/concurrent/Future<*>;>;"
iget-object v0, v8, Lcom/qiniu/android/dns/dns/DnsResolver;->servers:[Ljava/lang/String;
array-length v13, v0
const/4 v14, 0x0
:goto_45
if-ge v14, v13, :cond_6e
aget-object v15, v0, v14
.line 121
.local v15, "server":Ljava/lang/String;
iget-object v7, v8, Lcom/qiniu/android/dns/dns/DnsResolver;->executorService:Ljava/util/concurrent/ExecutorService;
new-instance v6, Lcom/qiniu/android/dns/dns/DnsResolver$2;
move-object v1, v6
move-object/from16 v2, p0
move-object v3, v10
move-object v4, v15
move-object/from16 v5, p1
move-object/from16 v16, v0
move-object v0, v6
move/from16 v6, p2
move/from16 v17, v13
move-object v13, v7
move-object v7, v11
invoke-direct/range {v1 .. v7}, Lcom/qiniu/android/dns/dns/DnsResolver$2;-><init>(Lcom/qiniu/android/dns/dns/DnsResolver;Lcom/qiniu/android/dns/dns/DnsResolver$RequestCanceller;Ljava/lang/String;Ljava/lang/String;ILcom/qiniu/android/dns/dns/DnsResolver$ResponseComposition;)V
invoke-interface {v13, v0}, Ljava/util/concurrent/ExecutorService;->submit(Ljava/lang/Runnable;)Ljava/util/concurrent/Future;
move-result-object v0
.line 151
.local v0, "future":Ljava/util/concurrent/Future;, "Ljava/util/concurrent/Future<*>;"
invoke-interface {v12, v0}, Ljava/util/List;->add(Ljava/lang/Object;)Z
.line 120
.end local v0 # "future":Ljava/util/concurrent/Future;, "Ljava/util/concurrent/Future<*>;"
.end local v15 # "server":Ljava/lang/String;
add-int/lit8 v14, v14, 0x1
move-object/from16 v0, v16
move/from16 v13, v17
goto :goto_45
.line 154
:cond_6e
monitor-enter v11
.line 156
:try_start_6f
invoke-virtual {v11}, Ljava/lang/Object;->wait()V
:try_end_72
.catch Ljava/lang/InterruptedException; {:try_start_6f .. :try_end_72} :catch_75
.catchall {:try_start_6f .. :try_end_72} :catchall_73
.line 159
goto :goto_7b
.line 160
:catchall_73
move-exception v0
goto :goto_8e
.line 157
:catch_75
move-exception v0
move-object v1, v0
move-object v0, v1
.line 158
.local v0, "e":Ljava/lang/InterruptedException;
:try_start_78
invoke-virtual {v0}, Ljava/lang/InterruptedException;->printStackTrace()V
.line 160
.end local v0 # "e":Ljava/lang/InterruptedException;
:goto_7b
monitor-exit v11
:try_end_7c
.catchall {:try_start_78 .. :try_end_7c} :catchall_73
.line 162
invoke-virtual {v10}, Lcom/qiniu/android/dns/dns/DnsResolver$RequestCanceller;->cancel()V
.line 164
iget-object v0, v11, Lcom/qiniu/android/dns/dns/DnsResolver$ResponseComposition;->exception:Ljava/io/IOException;
if-eqz v0, :cond_8b
iget-object v0, v11, Lcom/qiniu/android/dns/dns/DnsResolver$ResponseComposition;->response:Lcom/qiniu/android/dns/dns/DnsResponse;
if-eqz v0, :cond_88
goto :goto_8b
.line 165
:cond_88
iget-object v0, v11, Lcom/qiniu/android/dns/dns/DnsResolver$ResponseComposition;->exception:Ljava/io/IOException;
throw v0
.line 168
:cond_8b
:goto_8b
iget-object v0, v11, Lcom/qiniu/android/dns/dns/DnsResolver$ResponseComposition;->response:Lcom/qiniu/android/dns/dns/DnsResponse;
return-object v0
.line 160
:goto_8e
:try_start_8e
monitor-exit v11
:try_end_8f
.catchall {:try_start_8e .. :try_end_8f} :catchall_73
throw v0
.line 95
.end local v11 # "responseComposition":Lcom/qiniu/android/dns/dns/DnsResolver$ResponseComposition;
.end local v12 # "futures":Ljava/util/List;, "Ljava/util/List<Ljava/util/concurrent/Future<*>;>;"
:cond_90
:goto_90
const/4 v0, 0x0
.line 96
.local v0, "response":Lcom/qiniu/android/dns/dns/DnsResponse;
iget-object v2, v8, Lcom/qiniu/android/dns/dns/DnsResolver;->servers:[Ljava/lang/String;
array-length v3, v2
:goto_94
if-ge v1, v3, :cond_a4
aget-object v4, v2, v1
.line 97
.local v4, "server":Ljava/lang/String;
move/from16 v5, p2
invoke-virtual {v8, v10, v4, v9, v5}, Lcom/qiniu/android/dns/dns/DnsResolver;->request(Lcom/qiniu/android/dns/dns/DnsResolver$RequestCanceller;Ljava/lang/String;Ljava/lang/String;I)Lcom/qiniu/android/dns/dns/DnsResponse;
move-result-object v0
.line 98
if-eqz v0, :cond_a1
.line 99
goto :goto_a6
.line 96
.end local v4 # "server":Ljava/lang/String;
:cond_a1
add-int/lit8 v1, v1, 0x1
goto :goto_94
:cond_a4
move/from16 v5, p2
.line 102
:goto_a6
return-object v0
.line 89
.end local v0 # "response":Lcom/qiniu/android/dns/dns/DnsResponse;
.end local v10 # "canceller":Lcom/qiniu/android/dns/dns/DnsResolver$RequestCanceller;
:cond_a7
move/from16 v5, p2
.line 90
new-instance v0, Ljava/io/IOException;
const-string v1, "host can not empty"
invoke-direct {v0, v1}, Ljava/io/IOException;-><init>(Ljava/lang/String;)V
throw v0
.line 85
:cond_b1
move/from16 v5, p2
.line 86
new-instance v0, Ljava/io/IOException;
const-string/jumbo v1, "server can not empty"
invoke-direct {v0, v1}, Ljava/io/IOException;-><init>(Ljava/lang/String;)V
goto :goto_bd
:goto_bc
throw v0
:goto_bd
goto :goto_bc
.end method
# virtual methods
.method abstract request(Lcom/qiniu/android/dns/dns/DnsResolver$RequestCanceller;Ljava/lang/String;Ljava/lang/String;I)Lcom/qiniu/android/dns/dns/DnsResponse;
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;
}
.end annotation
.end method
.method public resolve(Lcom/qiniu/android/dns/Domain;Lcom/qiniu/android/dns/NetworkInfo;)[Lcom/qiniu/android/dns/Record;
.registers 10
.param p1, "domain" # Lcom/qiniu/android/dns/Domain;
.param p2, "info" # Lcom/qiniu/android/dns/NetworkInfo;
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;
}
.end annotation
.line 62
iget-object v0, p1, Lcom/qiniu/android/dns/Domain;->domain:Ljava/lang/String;
invoke-direct {p0, v0}, Lcom/qiniu/android/dns/dns/DnsResolver;->lookupHost(Ljava/lang/String;)Lcom/qiniu/android/dns/dns/DnsResponse;
move-result-object v0
.line 63
.local v0, "response":Lcom/qiniu/android/dns/dns/DnsResponse;
if-eqz v0, :cond_52
.line 67
invoke-virtual {v0}, Lcom/qiniu/android/dns/dns/DnsResponse;->getAnswerArray()Ljava/util/List;
move-result-object v1
.line 68
.local v1, "answers":Ljava/util/List;, "Ljava/util/List<Lcom/qiniu/android/dns/Record;>;"
if-eqz v1, :cond_50
invoke-interface {v1}, Ljava/util/List;->size()I
move-result v2
if-nez v2, :cond_15
goto :goto_50
.line 71
:cond_15
new-instance v2, Ljava/util/ArrayList;
invoke-direct {v2}, Ljava/util/ArrayList;-><init>()V
.line 72
.local v2, "records":Ljava/util/List;, "Ljava/util/List<Lcom/qiniu/android/dns/Record;>;"
invoke-interface {v1}, Ljava/util/List;->iterator()Ljava/util/Iterator;
move-result-object v3
:goto_1e
invoke-interface {v3}, Ljava/util/Iterator;->hasNext()Z
move-result v4
if-eqz v4, :cond_46
invoke-interface {v3}, Ljava/util/Iterator;->next()Ljava/lang/Object;
move-result-object v4
check-cast v4, Lcom/qiniu/android/dns/Record;
.line 73
.local v4, "record":Lcom/qiniu/android/dns/Record;
invoke-virtual {v4}, Lcom/qiniu/android/dns/Record;->isA()Z
move-result v5
if-nez v5, :cond_42
invoke-virtual {v4}, Lcom/qiniu/android/dns/Record;->isCname()Z
move-result v5
if-nez v5, :cond_42
invoke-virtual {v4}, Lcom/qiniu/android/dns/Record;->isAAAA()Z
move-result v5
if-nez v5, :cond_42
iget v5, v4, Lcom/qiniu/android/dns/Record;->type:I
iget v6, p0, Lcom/qiniu/android/dns/dns/DnsResolver;->recordType:I
if-ne v5, v6, :cond_45
.line 74
:cond_42
invoke-interface {v2, v4}, Ljava/util/List;->add(Ljava/lang/Object;)Z
.line 76
.end local v4 # "record":Lcom/qiniu/android/dns/Record;
:cond_45
goto :goto_1e
.line 77
:cond_46
const/4 v3, 0x0
new-array v3, v3, [Lcom/qiniu/android/dns/Record;
invoke-interface {v2, v3}, Ljava/util/List;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
move-result-object v3
check-cast v3, [Lcom/qiniu/android/dns/Record;
return-object v3
.line 69
.end local v2 # "records":Ljava/util/List;, "Ljava/util/List<Lcom/qiniu/android/dns/Record;>;"
:cond_50
:goto_50
const/4 v2, 0x0
return-object v2
.line 64
.end local v1 # "answers":Ljava/util/List;, "Ljava/util/List<Lcom/qiniu/android/dns/Record;>;"
:cond_52
new-instance v1, Ljava/io/IOException;
const-string/jumbo v2, "response is null"
invoke-direct {v1, v2}, Ljava/io/IOException;-><init>(Ljava/lang/String;)V
goto :goto_5c
:goto_5b
throw v1
:goto_5c
goto :goto_5b
.end method