ConnectionHandler.smali
.class Lorg/bitcoinj/net/ConnectionHandler;
.super Ljava/lang/Object;
.source "ConnectionHandler.java"
# interfaces
.implements Lorg/bitcoinj/net/MessageWriteTarget;
# static fields
.field private static final BUFFER_SIZE_LOWER_BOUND:I = 0x1000
.field private static final BUFFER_SIZE_UPPER_BOUND:I = 0x10000
.field private static final OUTBOUND_BUFFER_BYTE_COUNT:I = 0x2000018
.field private static final log:Lorg/slf4j/Logger;
# instance fields
.field private final bytesToWrite:Ljava/util/LinkedList;
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/util/LinkedList",
"<",
"Ljava/nio/ByteBuffer;",
">;"
}
.end annotation
.end field
.field private bytesToWriteRemaining:J
.field private final channel:Ljava/nio/channels/SocketChannel;
.field private closeCalled:Z
.field private connectedHandlers:Ljava/util/Set;
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/util/Set",
"<",
"Lorg/bitcoinj/net/ConnectionHandler;",
">;"
}
.end annotation
.end field
.field connection:Lorg/bitcoinj/net/StreamConnection;
.field private final key:Ljava/nio/channels/SelectionKey;
.field private final lock:Ljava/util/concurrent/locks/ReentrantLock;
.field private final readBuff:Ljava/nio/ByteBuffer;
# direct methods
.method static constructor <clinit>()V
.registers 1
.prologue
.line 47
const-class v0, Lorg/bitcoinj/net/ConnectionHandler;
invoke-static {v0}, Lorg/slf4j/LoggerFactory;->getLogger(Ljava/lang/Class;)Lorg/slf4j/Logger;
move-result-object v0
sput-object v0, Lorg/bitcoinj/net/ConnectionHandler;->log:Lorg/slf4j/Logger;
return-void
.end method
.method private constructor <init>(Lorg/bitcoinj/net/StreamConnection;Ljava/nio/channels/SelectionKey;)V
.registers 6
.prologue
const/4 v2, 0x0
.line 74
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 56
const-string v0, "nioConnectionHandler"
invoke-static {v0}, Lorg/bitcoinj/utils/Threading;->lock(Ljava/lang/String;)Ljava/util/concurrent/locks/ReentrantLock;
move-result-object v0
iput-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->lock:Ljava/util/concurrent/locks/ReentrantLock;
.line 61
const/4 v0, 0x0
iput-boolean v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->closeCalled:Z
.line 63
const-wide/16 v0, 0x0
iput-wide v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->bytesToWriteRemaining:J
.line 64
new-instance v0, Ljava/util/LinkedList;
invoke-direct {v0}, Ljava/util/LinkedList;-><init>()V
iput-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->bytesToWrite:Ljava/util/LinkedList;
.line 75
iput-object p2, p0, Lorg/bitcoinj/net/ConnectionHandler;->key:Ljava/nio/channels/SelectionKey;
.line 76
invoke-virtual {p2}, Ljava/nio/channels/SelectionKey;->channel()Ljava/nio/channels/SelectableChannel;
move-result-object v0
check-cast v0, Ljava/nio/channels/SocketChannel;
invoke-static {v0}, Lcom/google/common/base/n;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/nio/channels/SocketChannel;
iput-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->channel:Ljava/nio/channels/SocketChannel;
.line 77
if-nez p1, :cond_2f
.line 78
iput-object v2, p0, Lorg/bitcoinj/net/ConnectionHandler;->readBuff:Ljava/nio/ByteBuffer;
.line 85
:goto_2e
return-void
.line 81
:cond_2f
iput-object p1, p0, Lorg/bitcoinj/net/ConnectionHandler;->connection:Lorg/bitcoinj/net/StreamConnection;
.line 82
invoke-interface {p1}, Lorg/bitcoinj/net/StreamConnection;->getMaxMessageSize()I
move-result v0
const/16 v1, 0x1000
invoke-static {v0, v1}, Ljava/lang/Math;->max(II)I
move-result v0
const/high16 v1, 0x10000
invoke-static {v0, v1}, Ljava/lang/Math;->min(II)I
move-result v0
invoke-static {v0}, Ljava/nio/ByteBuffer;->allocateDirect(I)Ljava/nio/ByteBuffer;
move-result-object v0
iput-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->readBuff:Ljava/nio/ByteBuffer;
.line 83
invoke-interface {p1, p0}, Lorg/bitcoinj/net/StreamConnection;->setWriteTarget(Lorg/bitcoinj/net/MessageWriteTarget;)V
.line 84
iput-object v2, p0, Lorg/bitcoinj/net/ConnectionHandler;->connectedHandlers:Ljava/util/Set;
goto :goto_2e
.end method
.method public constructor <init>(Lorg/bitcoinj/net/StreamConnection;Ljava/nio/channels/SelectionKey;Ljava/util/Set;)V
.registers 6
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Lorg/bitcoinj/net/StreamConnection;",
"Ljava/nio/channels/SelectionKey;",
"Ljava/util/Set",
"<",
"Lorg/bitcoinj/net/ConnectionHandler;",
">;)V"
}
.end annotation
.prologue
.line 88
invoke-static {p1}, Lcom/google/common/base/n;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v0
check-cast v0, Lorg/bitcoinj/net/StreamConnection;
invoke-direct {p0, v0, p2}, Lorg/bitcoinj/net/ConnectionHandler;-><init>(Lorg/bitcoinj/net/StreamConnection;Ljava/nio/channels/SelectionKey;)V
.line 93
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->lock:Ljava/util/concurrent/locks/ReentrantLock;
invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->lock()V
.line 95
:try_start_e
iput-object p3, p0, Lorg/bitcoinj/net/ConnectionHandler;->connectedHandlers:Ljava/util/Set;
.line 96
iget-boolean v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->closeCalled:Z
if-nez v0, :cond_1d
.line 97
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->connectedHandlers:Ljava/util/Set;
invoke-interface {v0, p0}, Ljava/util/Set;->add(Ljava/lang/Object;)Z
move-result v0
invoke-static {v0}, Lcom/google/common/base/n;->checkState(Z)V
:try_end_1d
.catchall {:try_start_e .. :try_end_1d} :catchall_23
.line 99
:cond_1d
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->lock:Ljava/util/concurrent/locks/ReentrantLock;
invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V
.line 100
return-void
.line 99
:catchall_23
move-exception v0
iget-object v1, p0, Lorg/bitcoinj/net/ConnectionHandler;->lock:Ljava/util/concurrent/locks/ReentrantLock;
invoke-virtual {v1}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V
throw v0
.end method
.method public constructor <init>(Lorg/bitcoinj/net/StreamConnectionFactory;Ljava/nio/channels/SelectionKey;)V
.registers 5
.prologue
.line 69
invoke-virtual {p2}, Ljava/nio/channels/SelectionKey;->channel()Ljava/nio/channels/SelectableChannel;
move-result-object v0
check-cast v0, Ljava/nio/channels/SocketChannel;
invoke-virtual {v0}, Ljava/nio/channels/SocketChannel;->socket()Ljava/net/Socket;
move-result-object v0
invoke-virtual {v0}, Ljava/net/Socket;->getInetAddress()Ljava/net/InetAddress;
move-result-object v1
invoke-virtual {p2}, Ljava/nio/channels/SelectionKey;->channel()Ljava/nio/channels/SelectableChannel;
move-result-object v0
check-cast v0, Ljava/nio/channels/SocketChannel;
invoke-virtual {v0}, Ljava/nio/channels/SocketChannel;->socket()Ljava/net/Socket;
move-result-object v0
invoke-virtual {v0}, Ljava/net/Socket;->getPort()I
move-result v0
invoke-interface {p1, v1, v0}, Lorg/bitcoinj/net/StreamConnectionFactory;->getNewConnection(Ljava/net/InetAddress;I)Lorg/bitcoinj/net/StreamConnection;
move-result-object v0
invoke-direct {p0, v0, p2}, Lorg/bitcoinj/net/ConnectionHandler;-><init>(Lorg/bitcoinj/net/StreamConnection;Ljava/nio/channels/SelectionKey;)V
.line 70
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->connection:Lorg/bitcoinj/net/StreamConnection;
if-nez v0, :cond_2f
.line 71
new-instance v0, Ljava/io/IOException;
const-string v1, "Parser factory.getNewConnection returned null"
invoke-direct {v0, v1}, Ljava/io/IOException;-><init>(Ljava/lang/String;)V
throw v0
.line 72
:cond_2f
return-void
.end method
.method private connectionClosed()V
.registers 5
.prologue
const/4 v0, 0x0
const/4 v1, 0x1
.line 185
iget-object v2, p0, Lorg/bitcoinj/net/ConnectionHandler;->lock:Ljava/util/concurrent/locks/ReentrantLock;
invoke-virtual {v2}, Ljava/util/concurrent/locks/ReentrantLock;->lock()V
.line 187
:try_start_7
iget-boolean v2, p0, Lorg/bitcoinj/net/ConnectionHandler;->closeCalled:Z
if-nez v2, :cond_2c
move v2, v1
.line 188
:goto_c
const/4 v3, 0x1
iput-boolean v3, p0, Lorg/bitcoinj/net/ConnectionHandler;->closeCalled:Z
:try_end_f
.catchall {:try_start_7 .. :try_end_f} :catchall_2e
.line 190
iget-object v3, p0, Lorg/bitcoinj/net/ConnectionHandler;->lock:Ljava/util/concurrent/locks/ReentrantLock;
invoke-virtual {v3}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V
.line 192
if-eqz v2, :cond_2b
.line 193
iget-object v2, p0, Lorg/bitcoinj/net/ConnectionHandler;->connectedHandlers:Ljava/util/Set;
if-eqz v2, :cond_22
iget-object v2, p0, Lorg/bitcoinj/net/ConnectionHandler;->connectedHandlers:Ljava/util/Set;
invoke-interface {v2, p0}, Ljava/util/Set;->remove(Ljava/lang/Object;)Z
move-result v2
if-eqz v2, :cond_23
:cond_22
move v0, v1
:cond_23
invoke-static {v0}, Lcom/google/common/base/n;->checkState(Z)V
.line 194
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->connection:Lorg/bitcoinj/net/StreamConnection;
invoke-interface {v0}, Lorg/bitcoinj/net/StreamConnection;->connectionClosed()V
.line 196
:cond_2b
return-void
:cond_2c
move v2, v0
.line 187
goto :goto_c
.line 190
:catchall_2e
move-exception v0
iget-object v1, p0, Lorg/bitcoinj/net/ConnectionHandler;->lock:Ljava/util/concurrent/locks/ReentrantLock;
invoke-virtual {v1}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V
throw v0
.end method
.method public static handleKey(Ljava/nio/channels/SelectionKey;)V
.registers 10
.prologue
const/4 v3, 0x1
const/4 v4, 0x0
.line 202
invoke-virtual {p0}, Ljava/nio/channels/SelectionKey;->attachment()Ljava/lang/Object;
move-result-object v0
check-cast v0, Lorg/bitcoinj/net/ConnectionHandler;
.line 204
if-nez v0, :cond_b
.line 238
:cond_a
:goto_a
return-void
.line 206
:cond_b
:try_start_b
invoke-virtual {p0}, Ljava/nio/channels/SelectionKey;->isValid()Z
move-result v1
if-nez v1, :cond_42
.line 207
invoke-virtual {v0}, Lorg/bitcoinj/net/ConnectionHandler;->closeConnection()V
:try_end_14
.catch Ljava/lang/Exception; {:try_start_b .. :try_end_14} :catch_15
goto :goto_a
.line 231
:catch_15
move-exception v1
move-object v2, v1
.line 234
invoke-static {v2}, Lcom/google/common/base/v;->getRootCause(Ljava/lang/Throwable;)Ljava/lang/Throwable;
move-result-object v1
.line 235
sget-object v5, Lorg/bitcoinj/net/ConnectionHandler;->log:Lorg/slf4j/Logger;
const-string v6, "Error handling SelectionKey: {} {}"
const/4 v7, 0x3
new-array v7, v7, [Ljava/lang/Object;
invoke-virtual {v1}, Ljava/lang/Object;->getClass()Ljava/lang/Class;
move-result-object v8
invoke-virtual {v8}, Ljava/lang/Class;->getName()Ljava/lang/String;
move-result-object v8
aput-object v8, v7, v4
invoke-virtual {v1}, Ljava/lang/Throwable;->getMessage()Ljava/lang/String;
move-result-object v4
if-eqz v4, :cond_8c
invoke-virtual {v1}, Ljava/lang/Throwable;->getMessage()Ljava/lang/String;
move-result-object v1
:goto_36
aput-object v1, v7, v3
const/4 v1, 0x2
aput-object v2, v7, v1
invoke-interface {v5, v6, v7}, Lorg/slf4j/Logger;->warn(Ljava/lang/String;[Ljava/lang/Object;)V
.line 236
invoke-virtual {v0}, Lorg/bitcoinj/net/ConnectionHandler;->closeConnection()V
goto :goto_a
.line 210
:cond_42
:try_start_42
invoke-virtual {p0}, Ljava/nio/channels/SelectionKey;->isReadable()Z
move-result v1
if-eqz v1, :cond_80
.line 212
iget-object v1, v0, Lorg/bitcoinj/net/ConnectionHandler;->channel:Ljava/nio/channels/SocketChannel;
iget-object v2, v0, Lorg/bitcoinj/net/ConnectionHandler;->readBuff:Ljava/nio/ByteBuffer;
invoke-virtual {v1, v2}, Ljava/nio/channels/SocketChannel;->read(Ljava/nio/ByteBuffer;)I
move-result v1
.line 213
if-eqz v1, :cond_a
.line 215
const/4 v2, -0x1
if-ne v1, v2, :cond_5c
.line 216
invoke-virtual {p0}, Ljava/nio/channels/SelectionKey;->cancel()V
.line 217
invoke-virtual {v0}, Lorg/bitcoinj/net/ConnectionHandler;->closeConnection()V
goto :goto_a
.line 221
:cond_5c
iget-object v1, v0, Lorg/bitcoinj/net/ConnectionHandler;->readBuff:Ljava/nio/ByteBuffer;
invoke-virtual {v1}, Ljava/nio/ByteBuffer;->flip()Ljava/nio/Buffer;
.line 223
iget-object v1, v0, Lorg/bitcoinj/net/ConnectionHandler;->connection:Lorg/bitcoinj/net/StreamConnection;
invoke-static {v1}, Lcom/google/common/base/n;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v1
check-cast v1, Lorg/bitcoinj/net/StreamConnection;
iget-object v2, v0, Lorg/bitcoinj/net/ConnectionHandler;->readBuff:Ljava/nio/ByteBuffer;
invoke-interface {v1, v2}, Lorg/bitcoinj/net/StreamConnection;->receiveBytes(Ljava/nio/ByteBuffer;)I
move-result v1
.line 224
iget-object v2, v0, Lorg/bitcoinj/net/ConnectionHandler;->readBuff:Ljava/nio/ByteBuffer;
invoke-virtual {v2}, Ljava/nio/ByteBuffer;->position()I
move-result v2
if-ne v2, v1, :cond_8a
move v1, v3
:goto_78
invoke-static {v1}, Lcom/google/common/base/n;->checkState(Z)V
.line 227
iget-object v1, v0, Lorg/bitcoinj/net/ConnectionHandler;->readBuff:Ljava/nio/ByteBuffer;
invoke-virtual {v1}, Ljava/nio/ByteBuffer;->compact()Ljava/nio/ByteBuffer;
.line 229
:cond_80
invoke-virtual {p0}, Ljava/nio/channels/SelectionKey;->isWritable()Z
move-result v1
if-eqz v1, :cond_a
.line 230
invoke-direct {v0}, Lorg/bitcoinj/net/ConnectionHandler;->tryWriteBytes()V
:try_end_89
.catch Ljava/lang/Exception; {:try_start_42 .. :try_end_89} :catch_15
goto :goto_a
:cond_8a
move v1, v4
.line 224
goto :goto_78
.line 235
:cond_8c
const-string v1, ""
goto :goto_36
.end method
.method private setWriteOps()V
.registers 3
.prologue
.line 106
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->key:Ljava/nio/channels/SelectionKey;
iget-object v1, p0, Lorg/bitcoinj/net/ConnectionHandler;->key:Ljava/nio/channels/SelectionKey;
invoke-virtual {v1}, Ljava/nio/channels/SelectionKey;->interestOps()I
move-result v1
or-int/lit8 v1, v1, 0x4
invoke-virtual {v0, v1}, Ljava/nio/channels/SelectionKey;->interestOps(I)Ljava/nio/channels/SelectionKey;
.line 108
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->key:Ljava/nio/channels/SelectionKey;
invoke-virtual {v0}, Ljava/nio/channels/SelectionKey;->selector()Ljava/nio/channels/Selector;
move-result-object v0
invoke-virtual {v0}, Ljava/nio/channels/Selector;->wakeup()Ljava/nio/channels/Selector;
.line 109
return-void
.end method
.method private tryWriteBytes()V
.registers 7
.prologue
.line 113
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->lock:Ljava/util/concurrent/locks/ReentrantLock;
invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->lock()V
.line 116
:try_start_5
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->bytesToWrite:Ljava/util/LinkedList;
invoke-virtual {v0}, Ljava/util/LinkedList;->iterator()Ljava/util/Iterator;
move-result-object v1
.line 117
:goto_b
invoke-interface {v1}, Ljava/util/Iterator;->hasNext()Z
move-result v0
if-eqz v0, :cond_37
.line 118
invoke-interface {v1}, Ljava/util/Iterator;->next()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/nio/ByteBuffer;
.line 119
iget-wide v2, p0, Lorg/bitcoinj/net/ConnectionHandler;->bytesToWriteRemaining:J
iget-object v4, p0, Lorg/bitcoinj/net/ConnectionHandler;->channel:Ljava/nio/channels/SocketChannel;
invoke-virtual {v4, v0}, Ljava/nio/channels/SocketChannel;->write(Ljava/nio/ByteBuffer;)I
move-result v4
int-to-long v4, v4
sub-long/2addr v2, v4
iput-wide v2, p0, Lorg/bitcoinj/net/ConnectionHandler;->bytesToWriteRemaining:J
.line 120
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->hasRemaining()Z
move-result v0
if-nez v0, :cond_34
.line 121
invoke-interface {v1}, Ljava/util/Iterator;->remove()V
:try_end_2c
.catchall {:try_start_5 .. :try_end_2c} :catchall_2d
goto :goto_b
.line 132
:catchall_2d
move-exception v0
iget-object v1, p0, Lorg/bitcoinj/net/ConnectionHandler;->lock:Ljava/util/concurrent/locks/ReentrantLock;
invoke-virtual {v1}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V
throw v0
.line 123
:cond_34
:try_start_34
invoke-direct {p0}, Lorg/bitcoinj/net/ConnectionHandler;->setWriteOps()V
.line 128
:cond_37
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->bytesToWrite:Ljava/util/LinkedList;
invoke-virtual {v0}, Ljava/util/LinkedList;->isEmpty()Z
move-result v0
if-eqz v0, :cond_4c
.line 129
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->key:Ljava/nio/channels/SelectionKey;
iget-object v1, p0, Lorg/bitcoinj/net/ConnectionHandler;->key:Ljava/nio/channels/SelectionKey;
invoke-virtual {v1}, Ljava/nio/channels/SelectionKey;->interestOps()I
move-result v1
and-int/lit8 v1, v1, -0x5
invoke-virtual {v0, v1}, Ljava/nio/channels/SelectionKey;->interestOps(I)Ljava/nio/channels/SelectionKey;
:try_end_4c
.catchall {:try_start_34 .. :try_end_4c} :catchall_2d
.line 132
:cond_4c
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->lock:Ljava/util/concurrent/locks/ReentrantLock;
invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V
.line 133
return-void
.end method
# virtual methods
.method public closeConnection()V
.registers 3
.prologue
.line 174
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->lock:Ljava/util/concurrent/locks/ReentrantLock;
invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->isHeldByCurrentThread()Z
move-result v0
if-nez v0, :cond_15
const/4 v0, 0x1
:goto_9
invoke-static {v0}, Lcom/google/common/base/n;->checkState(Z)V
.line 176
:try_start_c
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->channel:Ljava/nio/channels/SocketChannel;
invoke-virtual {v0}, Ljava/nio/channels/SocketChannel;->close()V
:try_end_11
.catch Ljava/io/IOException; {:try_start_c .. :try_end_11} :catch_17
.line 180
invoke-direct {p0}, Lorg/bitcoinj/net/ConnectionHandler;->connectionClosed()V
.line 181
return-void
.line 174
:cond_15
const/4 v0, 0x0
goto :goto_9
.line 177
:catch_17
move-exception v0
.line 178
new-instance v1, Ljava/lang/RuntimeException;
invoke-direct {v1, v0}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V
throw v1
.end method
.method public writeBytes([B)V
.registers 10
.prologue
const/4 v2, 0x0
.line 138
const/4 v1, 0x1
.line 139
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->lock:Ljava/util/concurrent/locks/ReentrantLock;
invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->lock()V
.line 146
:try_start_7
iget-wide v4, p0, Lorg/bitcoinj/net/ConnectionHandler;->bytesToWriteRemaining:J
array-length v0, p1
int-to-long v6, v0
add-long/2addr v4, v6
const-wide/32 v6, 0x2000018
cmp-long v0, v4, v6
if-lez v0, :cond_36
.line 147
new-instance v0, Ljava/io/IOException;
const-string v3, "Outbound buffer overflowed"
invoke-direct {v0, v3}, Ljava/io/IOException;-><init>(Ljava/lang/String;)V
throw v0
:try_end_1b
.catch Ljava/io/IOException; {:try_start_7 .. :try_end_1b} :catch_1b
.catch Ljava/nio/channels/CancelledKeyException; {:try_start_7 .. :try_end_1b} :catch_54
.catchall {:try_start_7 .. :try_end_1b} :catchall_6a
.line 153
:catch_1b
move-exception v0
.line 154
:try_start_1c
iget-object v3, p0, Lorg/bitcoinj/net/ConnectionHandler;->lock:Ljava/util/concurrent/locks/ReentrantLock;
invoke-virtual {v3}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V
:try_end_21
.catchall {:try_start_1c .. :try_end_21} :catchall_6a
.line 156
:try_start_21
sget-object v1, Lorg/bitcoinj/net/ConnectionHandler;->log:Lorg/slf4j/Logger;
const-string v3, "Error writing message to connection, closing connection"
invoke-interface {v1, v3, v0}, Lorg/slf4j/Logger;->warn(Ljava/lang/String;Ljava/lang/Throwable;)V
.line 157
invoke-virtual {p0}, Lorg/bitcoinj/net/ConnectionHandler;->closeConnection()V
.line 158
throw v0
:try_end_2c
.catchall {:try_start_21 .. :try_end_2c} :catchall_2c
.line 166
:catchall_2c
move-exception v0
move v1, v2
:goto_2e
if-eqz v1, :cond_35
.line 167
iget-object v1, p0, Lorg/bitcoinj/net/ConnectionHandler;->lock:Ljava/util/concurrent/locks/ReentrantLock;
invoke-virtual {v1}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V
:cond_35
throw v0
.line 150
:cond_36
:try_start_36
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->bytesToWrite:Ljava/util/LinkedList;
array-length v3, p1
invoke-static {p1, v3}, Ljava/util/Arrays;->copyOf([BI)[B
move-result-object v3
invoke-static {v3}, Ljava/nio/ByteBuffer;->wrap([B)Ljava/nio/ByteBuffer;
move-result-object v3
invoke-virtual {v0, v3}, Ljava/util/LinkedList;->offer(Ljava/lang/Object;)Z
.line 151
iget-wide v4, p0, Lorg/bitcoinj/net/ConnectionHandler;->bytesToWriteRemaining:J
array-length v0, p1
int-to-long v6, v0
add-long/2addr v4, v6
iput-wide v4, p0, Lorg/bitcoinj/net/ConnectionHandler;->bytesToWriteRemaining:J
.line 152
invoke-direct {p0}, Lorg/bitcoinj/net/ConnectionHandler;->setWriteOps()V
:try_end_4e
.catch Ljava/io/IOException; {:try_start_36 .. :try_end_4e} :catch_1b
.catch Ljava/nio/channels/CancelledKeyException; {:try_start_36 .. :try_end_4e} :catch_54
.catchall {:try_start_36 .. :try_end_4e} :catchall_6a
.line 167
iget-object v0, p0, Lorg/bitcoinj/net/ConnectionHandler;->lock:Ljava/util/concurrent/locks/ReentrantLock;
invoke-virtual {v0}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V
return-void
.line 159
:catch_54
move-exception v0
.line 160
:try_start_55
iget-object v3, p0, Lorg/bitcoinj/net/ConnectionHandler;->lock:Ljava/util/concurrent/locks/ReentrantLock;
invoke-virtual {v3}, Ljava/util/concurrent/locks/ReentrantLock;->unlock()V
:try_end_5a
.catchall {:try_start_55 .. :try_end_5a} :catchall_6a
.line 162
:try_start_5a
sget-object v1, Lorg/bitcoinj/net/ConnectionHandler;->log:Lorg/slf4j/Logger;
const-string v3, "Error writing message to connection, closing connection"
invoke-interface {v1, v3, v0}, Lorg/slf4j/Logger;->warn(Ljava/lang/String;Ljava/lang/Throwable;)V
.line 163
invoke-virtual {p0}, Lorg/bitcoinj/net/ConnectionHandler;->closeConnection()V
.line 164
new-instance v1, Ljava/io/IOException;
invoke-direct {v1, v0}, Ljava/io/IOException;-><init>(Ljava/lang/Throwable;)V
throw v1
:try_end_6a
.catchall {:try_start_5a .. :try_end_6a} :catchall_2c
.line 166
:catchall_6a
move-exception v0
goto :goto_2e
.end method