TcpProxyServer.smali
.class public Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;
.super Ljava/lang/Thread;
.source "TcpProxyServer.java"
# static fields
.field private static final CRITICAL_ERRORS_SLEEP:I = 0xbb8
.field private static final DEBUG:Z
.field private static final GC_REPETITION_TIME:I = 0xea60
.field private static final LOCAL_RECEIVE_BUFFER_SIZE:I = 0x2000
.field private static final MAX_CRITICAL_COUNT:I = 0x14
.field private static final SESSIONS_TERMINATION_TIMEOUT:I = 0x4e20
.field private static final TAG:Ljava/lang/String; = "QbSdk"
.field private static final TCP_PROXY_SERVER_PORT:I = 0x539
# instance fields
.field private mAppIdentifier:Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;
.field private mConnections:Ljava/util/Set;
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/util/Set",
"<",
"Ljava/lang/ref/WeakReference",
"<",
"Ljava/nio/channels/SocketChannel;",
">;>;"
}
.end annotation
.end field
.field private mContext:Landroid/content/Context;
.field private mKeepRunning:Z
.field private mLastGarbageCollectionTime:J
.field private mServerSocketChannel:Ljava/nio/channels/ServerSocketChannel;
.field private mSessionsThreadPool:Ljava/util/concurrent/ExecutorService;
# direct methods
.method static constructor <clinit>()V
.registers 1
.prologue
.line 48
sget-boolean v0, Lcom/quickbird/sdk/QuickBird;->SDK_DEBUG:Z
sput-boolean v0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->DEBUG:Z
return-void
.end method
.method public constructor <init>(Landroid/content/Context;)V
.registers 5
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;
}
.end annotation
.prologue
.line 67
invoke-direct {p0}, Ljava/lang/Thread;-><init>()V
.line 69
iput-object p1, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mContext:Landroid/content/Context;
.line 70
invoke-static {}, Ljava/util/concurrent/Executors;->newCachedThreadPool()Ljava/util/concurrent/ExecutorService;
move-result-object v0
iput-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mSessionsThreadPool:Ljava/util/concurrent/ExecutorService;
.line 71
new-instance v0, Ljava/util/concurrent/ConcurrentHashMap;
invoke-direct {v0}, Ljava/util/concurrent/ConcurrentHashMap;-><init>()V
invoke-static {v0}, Ljava/util/Collections;->newSetFromMap(Ljava/util/Map;)Ljava/util/Set;
move-result-object v0
iput-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mConnections:Ljava/util/Set;
.line 72
new-instance v0, Ljava/util/Date;
invoke-direct {v0}, Ljava/util/Date;-><init>()V
invoke-virtual {v0}, Ljava/util/Date;->getTime()J
move-result-wide v0
iput-wide v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mLastGarbageCollectionTime:J
.line 73
new-instance v0, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;
iget-object v1, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mContext:Landroid/content/Context;
invoke-direct {v0, v1}, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;-><init>(Landroid/content/Context;)V
iput-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mAppIdentifier:Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;
.line 76
:try_start_2a
invoke-static {}, Ljava/nio/channels/ServerSocketChannel;->open()Ljava/nio/channels/ServerSocketChannel;
move-result-object v0
iput-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mServerSocketChannel:Ljava/nio/channels/ServerSocketChannel;
.line 77
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mServerSocketChannel:Ljava/nio/channels/ServerSocketChannel;
invoke-virtual {v0}, Ljava/nio/channels/ServerSocketChannel;->socket()Ljava/net/ServerSocket;
move-result-object v0
const/4 v1, 0x1
invoke-virtual {v0, v1}, Ljava/net/ServerSocket;->setReuseAddress(Z)V
.line 78
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mServerSocketChannel:Ljava/nio/channels/ServerSocketChannel;
invoke-virtual {v0}, Ljava/nio/channels/ServerSocketChannel;->socket()Ljava/net/ServerSocket;
move-result-object v0
new-instance v1, Ljava/net/InetSocketAddress;
const/16 v2, 0x539
invoke-direct {v1, v2}, Ljava/net/InetSocketAddress;-><init>(I)V
invoke-virtual {v0, v1}, Ljava/net/ServerSocket;->bind(Ljava/net/SocketAddress;)V
.line 79
const/4 v0, 0x1
iput-boolean v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mKeepRunning:Z
:try_end_4d
.catch Ljava/io/IOException; {:try_start_2a .. :try_end_4d} :catch_4e
.line 84
return-void
.line 80
:catch_4e
move-exception v0
.line 81
sget-object v1, Lcom/quickbird/mini/vpn/vpn/ErrorStorage$ErrorType;->TCP_SERVER_BIND_FAILED:Lcom/quickbird/mini/vpn/vpn/ErrorStorage$ErrorType;
iget-object v2, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mContext:Landroid/content/Context;
invoke-static {v1, v2}, Lcom/quickbird/mini/vpn/vpn/ErrorStorage;->incrementCounter(Lcom/quickbird/mini/vpn/vpn/ErrorStorage$ErrorType;Landroid/content/Context;)I
.line 82
new-instance v1, Ljava/io/IOException;
invoke-virtual {v0}, Ljava/io/IOException;->getMessage()Ljava/lang/String;
move-result-object v0
invoke-direct {v1, v0}, Ljava/io/IOException;-><init>(Ljava/lang/String;)V
throw v1
.end method
.method private acceptLoop()V
.registers 12
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/lang/Exception;
}
.end annotation
.prologue
const/4 v10, 0x1
.line 89
:cond_1
:goto_1
iget-boolean v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mKeepRunning:Z
if-eqz v0, :cond_8a
.line 91
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mServerSocketChannel:Ljava/nio/channels/ServerSocketChannel;
invoke-virtual {v0}, Ljava/nio/channels/ServerSocketChannel;->accept()Ljava/nio/channels/SocketChannel;
move-result-object v0
.line 92
invoke-virtual {v0}, Ljava/nio/channels/SocketChannel;->socket()Ljava/net/Socket;
move-result-object v1
.line 93
invoke-virtual {v1, v10}, Ljava/net/Socket;->setKeepAlive(Z)V
.line 94
invoke-virtual {v1, v10}, Ljava/net/Socket;->setReuseAddress(Z)V
.line 95
const/16 v2, 0x2000
invoke-virtual {v1, v2}, Ljava/net/Socket;->setReceiveBufferSize(I)V
.line 96
new-instance v2, Ljava/lang/ref/WeakReference;
invoke-direct {v2, v0}, Ljava/lang/ref/WeakReference;-><init>(Ljava/lang/Object;)V
.line 98
new-instance v3, Lcom/quickbird/sdk/utils/ProxyReportMgr$ProxyReportInfo;
invoke-direct {v3}, Lcom/quickbird/sdk/utils/ProxyReportMgr$ProxyReportInfo;-><init>()V
.line 99
invoke-static {}, Landroid/os/SystemClock;->elapsedRealtime()J
move-result-wide v4
iput-wide v4, v3, Lcom/quickbird/sdk/utils/ProxyReportMgr$ProxyReportInfo;->localRequestTime:J
.line 100
invoke-direct {p0, v1}, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->getSocketApp(Ljava/net/Socket;)Ljava/lang/String;
move-result-object v4
.line 101
invoke-static {}, Landroid/os/SystemClock;->elapsedRealtime()J
move-result-wide v6
iget-wide v8, v3, Lcom/quickbird/sdk/utils/ProxyReportMgr$ProxyReportInfo;->localRequestTime:J
sub-long/2addr v6, v8
iput-wide v6, v3, Lcom/quickbird/sdk/utils/ProxyReportMgr$ProxyReportInfo;->jniParseAppinfoTime:J
.line 102
iput v10, v3, Lcom/quickbird/sdk/utils/ProxyReportMgr$ProxyReportInfo;->jniParseAppinfoCount:I
.line 104
sget-boolean v5, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->DEBUG:Z
if-eqz v5, :cond_63
.line 105
const-string v5, "QbSdk"
new-instance v6, Ljava/lang/StringBuilder;
invoke-direct {v6}, Ljava/lang/StringBuilder;-><init>()V
const-string v7, "Socket accept by app : "
invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v6
invoke-virtual {v6, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v6
const-string v7, " : "
invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v6
invoke-virtual {v1}, Ljava/net/Socket;->getPort()I
move-result v1
invoke-virtual {v6, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v5, v1}, Lcom/quickbird/sdk/utils/QBLogger;->d(Ljava/lang/String;Ljava/lang/String;)V
.line 108
:cond_63
iget-object v1, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mConnections:Ljava/util/Set;
invoke-interface {v1, v2}, Ljava/util/Set;->add(Ljava/lang/Object;)Z
.line 110
new-instance v1, Lcom/quickbird/mini/vpn/proxy/TcpProxySession;
iget-object v2, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mContext:Landroid/content/Context;
invoke-direct {v1, v0, v4, v2, v3}, Lcom/quickbird/mini/vpn/proxy/TcpProxySession;-><init>(Ljava/nio/channels/SocketChannel;Ljava/lang/String;Landroid/content/Context;Lcom/quickbird/sdk/utils/ProxyReportMgr$ProxyReportInfo;)V
.line 111
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mSessionsThreadPool:Ljava/util/concurrent/ExecutorService;
invoke-interface {v0, v1}, Ljava/util/concurrent/ExecutorService;->execute(Ljava/lang/Runnable;)V
.line 113
invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
move-result-wide v0
.line 114
iget-wide v2, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mLastGarbageCollectionTime:J
sub-long v2, v0, v2
const-wide/32 v4, 0xea60
cmp-long v2, v2, v4
if-lez v2, :cond_1
.line 115
invoke-direct {p0}, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->collectGarbage()V
.line 116
iput-wide v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mLastGarbageCollectionTime:J
goto/16 :goto_1
.line 119
:cond_8a
return-void
.end method
.method private collectGarbage()V
.registers 3
.prologue
.line 123
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mConnections:Ljava/util/Set;
invoke-interface {v0}, Ljava/util/Set;->iterator()Ljava/util/Iterator;
move-result-object v1
.line 124
:cond_6
:goto_6
invoke-interface {v1}, Ljava/util/Iterator;->hasNext()Z
move-result v0
if-eqz v0, :cond_24
.line 125
invoke-interface {v1}, Ljava/util/Iterator;->next()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/lang/ref/WeakReference;
invoke-virtual {v0}, Ljava/lang/ref/WeakReference;->get()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/nio/channels/SocketChannel;
.line 126
if-eqz v0, :cond_6
invoke-virtual {v0}, Ljava/nio/channels/SocketChannel;->isOpen()Z
move-result v0
if-nez v0, :cond_6
.line 127
invoke-interface {v1}, Ljava/util/Iterator;->remove()V
goto :goto_6
.line 130
:cond_24
return-void
.end method
.method private getSocketApp(Ljava/net/Socket;)Ljava/lang/String;
.registers 3
.prologue
.line 134
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mAppIdentifier:Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;
invoke-virtual {v0, p1}, Lcom/quickbird/mini/vpn/proxy/identify/AppIdentifier;->identifyBySocket(Ljava/net/Socket;)Ljava/lang/String;
move-result-object v0
return-object v0
.end method
.method private safeCloseServerSocket()V
.registers 3
.prologue
.line 140
:try_start_0
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mServerSocketChannel:Ljava/nio/channels/ServerSocketChannel;
if-eqz v0, :cond_9
.line 141
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mServerSocketChannel:Ljava/nio/channels/ServerSocketChannel;
invoke-virtual {v0}, Ljava/nio/channels/ServerSocketChannel;->close()V
:try_end_9
.catch Ljava/io/IOException; {:try_start_0 .. :try_end_9} :catch_a
.line 146
:cond_9
:goto_9
return-void
.line 142
:catch_a
move-exception v0
.line 143
sget-object v0, Lcom/quickbird/mini/vpn/vpn/ErrorStorage$ErrorType;->TCP_SERVER_SOCKET_CLOSE_FAILED:Lcom/quickbird/mini/vpn/vpn/ErrorStorage$ErrorType;
iget-object v1, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mContext:Landroid/content/Context;
invoke-static {v0, v1}, Lcom/quickbird/mini/vpn/vpn/ErrorStorage;->incrementCounter(Lcom/quickbird/mini/vpn/vpn/ErrorStorage$ErrorType;Landroid/content/Context;)I
goto :goto_9
.end method
.method private terminateSessions()Z
.registers 6
.prologue
.line 150
const/4 v1, 0x0
.line 152
:try_start_1
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mConnections:Ljava/util/Set;
invoke-interface {v0}, Ljava/util/Set;->isEmpty()Z
move-result v0
if-nez v0, :cond_40
.line 153
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mConnections:Ljava/util/Set;
invoke-interface {v0}, Ljava/util/Set;->iterator()Ljava/util/Iterator;
move-result-object v2
.line 154
:cond_f
:goto_f
invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z
move-result v0
if-eqz v0, :cond_40
.line 155
invoke-interface {v2}, Ljava/util/Iterator;->next()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/lang/ref/WeakReference;
invoke-virtual {v0}, Ljava/lang/ref/WeakReference;->get()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/nio/channels/SocketChannel;
.line 156
if-eqz v0, :cond_f
invoke-virtual {v0}, Ljava/nio/channels/SocketChannel;->isOpen()Z
:try_end_26
.catch Ljava/lang/InterruptedException; {:try_start_1 .. :try_end_26} :catch_36
move-result v3
if-eqz v3, :cond_f
.line 158
:try_start_29
invoke-virtual {v0}, Ljava/nio/channels/SocketChannel;->close()V
:try_end_2c
.catch Ljava/io/IOException; {:try_start_29 .. :try_end_2c} :catch_2d
.catch Ljava/lang/InterruptedException; {:try_start_29 .. :try_end_2c} :catch_36
goto :goto_f
.line 159
:catch_2d
move-exception v0
.line 160
:try_start_2e
sget-object v0, Lcom/quickbird/mini/vpn/vpn/ErrorStorage$ErrorType;->TCP_SESSION_SOCKET_CLOSE_FAILED:Lcom/quickbird/mini/vpn/vpn/ErrorStorage$ErrorType;
iget-object v3, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mContext:Landroid/content/Context;
invoke-static {v0, v3}, Lcom/quickbird/mini/vpn/vpn/ErrorStorage;->incrementCounter(Lcom/quickbird/mini/vpn/vpn/ErrorStorage$ErrorType;Landroid/content/Context;)I
:try_end_35
.catch Ljava/lang/InterruptedException; {:try_start_2e .. :try_end_35} :catch_36
goto :goto_f
.line 172
:catch_36
move-exception v0
.line 173
sget-object v0, Lcom/quickbird/mini/vpn/vpn/ErrorStorage$ErrorType;->TCP_SESSION_TERMINATE_FAILED:Lcom/quickbird/mini/vpn/vpn/ErrorStorage$ErrorType;
iget-object v2, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mContext:Landroid/content/Context;
invoke-static {v0, v2}, Lcom/quickbird/mini/vpn/vpn/ErrorStorage;->incrementCounter(Lcom/quickbird/mini/vpn/vpn/ErrorStorage$ErrorType;Landroid/content/Context;)I
:cond_3e
move v0, v1
.line 175
:goto_3f
return v0
.line 165
:cond_40
:try_start_40
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mSessionsThreadPool:Ljava/util/concurrent/ExecutorService;
if-eqz v0, :cond_3e
.line 166
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mSessionsThreadPool:Ljava/util/concurrent/ExecutorService;
invoke-interface {v0}, Ljava/util/concurrent/ExecutorService;->shutdown()V
.line 167
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mSessionsThreadPool:Ljava/util/concurrent/ExecutorService;
const-wide/16 v2, 0x4e20
sget-object v4, Ljava/util/concurrent/TimeUnit;->MICROSECONDS:Ljava/util/concurrent/TimeUnit;
invoke-interface {v0, v2, v3, v4}, Ljava/util/concurrent/ExecutorService;->awaitTermination(JLjava/util/concurrent/TimeUnit;)Z
move-result v0
if-eqz v0, :cond_3e
.line 168
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mSessionsThreadPool:Ljava/util/concurrent/ExecutorService;
invoke-interface {v0}, Ljava/util/concurrent/ExecutorService;->shutdownNow()Ljava/util/List;
:try_end_5a
.catch Ljava/lang/InterruptedException; {:try_start_40 .. :try_end_5a} :catch_36
.line 169
const/4 v0, 0x1
goto :goto_3f
.end method
# virtual methods
.method public finalize()V
.registers 1
.prologue
.line 181
invoke-direct {p0}, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->safeCloseServerSocket()V
.line 182
invoke-direct {p0}, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->terminateSessions()Z
.line 183
return-void
.end method
.method public run()V
.registers 4
.prologue
.line 188
.line 190
:try_start_0
invoke-direct {p0}, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->acceptLoop()V
:try_end_3
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_3} :catch_4
.line 214
:cond_3
:goto_3
return-void
.line 191
:catch_4
move-exception v0
.line 196
:try_start_5
invoke-virtual {p0}, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->finalize()V
.line 197
const-wide/16 v0, 0xbb8
invoke-static {v0, v1}, Ljava/lang/Thread;->sleep(J)V
.line 198
iget-boolean v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mKeepRunning:Z
if-eqz v0, :cond_3
.line 199
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mServerSocketChannel:Ljava/nio/channels/ServerSocketChannel;
invoke-virtual {v0}, Ljava/nio/channels/ServerSocketChannel;->isOpen()Z
move-result v0
if-nez v0, :cond_3
.line 200
invoke-static {}, Ljava/nio/channels/ServerSocketChannel;->open()Ljava/nio/channels/ServerSocketChannel;
move-result-object v0
iput-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mServerSocketChannel:Ljava/nio/channels/ServerSocketChannel;
.line 201
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mServerSocketChannel:Ljava/nio/channels/ServerSocketChannel;
invoke-virtual {v0}, Ljava/nio/channels/ServerSocketChannel;->socket()Ljava/net/ServerSocket;
move-result-object v0
const/4 v1, 0x1
invoke-virtual {v0, v1}, Ljava/net/ServerSocket;->setReuseAddress(Z)V
.line 202
iget-object v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mServerSocketChannel:Ljava/nio/channels/ServerSocketChannel;
invoke-virtual {v0}, Ljava/nio/channels/ServerSocketChannel;->socket()Ljava/net/ServerSocket;
move-result-object v0
new-instance v1, Ljava/net/InetSocketAddress;
const/16 v2, 0x539
invoke-direct {v1, v2}, Ljava/net/InetSocketAddress;-><init>(I)V
invoke-virtual {v0, v1}, Ljava/net/ServerSocket;->bind(Ljava/net/SocketAddress;)V
.line 203
sget-object v0, Lcom/quickbird/mini/vpn/vpn/ErrorStorage$ErrorType;->TCP_SERVER_REOPEN:Lcom/quickbird/mini/vpn/vpn/ErrorStorage$ErrorType;
iget-object v1, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mContext:Landroid/content/Context;
invoke-static {v0, v1}, Lcom/quickbird/mini/vpn/vpn/ErrorStorage;->incrementCounter(Lcom/quickbird/mini/vpn/vpn/ErrorStorage$ErrorType;Landroid/content/Context;)I
:try_end_40
.catch Ljava/lang/Exception; {:try_start_5 .. :try_end_40} :catch_41
goto :goto_3
.line 206
:catch_41
move-exception v0
.line 207
invoke-virtual {v0}, Ljava/lang/Exception;->printStackTrace()V
goto :goto_3
.end method
.method public shutDown()V
.registers 2
.prologue
.line 218
const/4 v0, 0x0
iput-boolean v0, p0, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->mKeepRunning:Z
.line 219
invoke-virtual {p0}, Lcom/quickbird/mini/vpn/proxy/TcpProxyServer;->finalize()V
.line 220
return-void
.end method