Frame.smali
.class Lcom/facebook/stetho/websocket/Frame;
.super Ljava/lang/Object;
.source "SourceFile"
# static fields
.field public static final OPCODE_BINARY_FRAME:B = 0x2t
.field public static final OPCODE_CONNECTION_CLOSE:B = 0x8t
.field public static final OPCODE_CONNECTION_PING:B = 0x9t
.field public static final OPCODE_CONNECTION_PONG:B = 0xat
.field public static final OPCODE_TEXT_FRAME:B = 0x1t
# instance fields
.field public fin:Z
.field public hasMask:Z
.field public maskingKey:[B
.field public opcode:B
.field public payloadData:[B
.field public payloadLen:J
.field public rsv1:Z
.field public rsv2:Z
.field public rsv3:Z
# direct methods
.method public constructor <init>()V
.registers 1
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method private decodeFirstByte(B)V
.registers 5
and-int/lit16 v0, p1, 0x80
const/4 v1, 0x1
const/4 v2, 0x0
if-eqz v0, :cond_8
const/4 v0, 0x1
goto :goto_9
:cond_8
const/4 v0, 0x0
.line 1
:goto_9
iput-boolean v0, p0, Lcom/facebook/stetho/websocket/Frame;->fin:Z
and-int/lit8 v0, p1, 0x40
if-eqz v0, :cond_11
const/4 v0, 0x1
goto :goto_12
:cond_11
const/4 v0, 0x0
.line 2
:goto_12
iput-boolean v0, p0, Lcom/facebook/stetho/websocket/Frame;->rsv1:Z
and-int/lit8 v0, p1, 0x20
if-eqz v0, :cond_1a
const/4 v0, 0x1
goto :goto_1b
:cond_1a
const/4 v0, 0x0
.line 3
:goto_1b
iput-boolean v0, p0, Lcom/facebook/stetho/websocket/Frame;->rsv2:Z
and-int/lit8 v0, p1, 0x10
if-eqz v0, :cond_22
goto :goto_23
:cond_22
const/4 v1, 0x0
.line 4
:goto_23
iput-boolean v1, p0, Lcom/facebook/stetho/websocket/Frame;->rsv3:Z
and-int/lit8 p1, p1, 0xf
int-to-byte p1, p1
.line 5
iput-byte p1, p0, Lcom/facebook/stetho/websocket/Frame;->opcode:B
return-void
.end method
.method private decodeLength(BLjava/io/InputStream;)J
.registers 9
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;
}
.end annotation
const/16 v0, 0x7d
if-gt p1, v0, :cond_6
int-to-long p1, p1
return-wide p1
:cond_6
const/16 v0, 0x7e
const/16 v1, 0x8
if-ne p1, v0, :cond_1c
.line 1
invoke-static {p2}, Lcom/facebook/stetho/websocket/Frame;->readByteOrThrow(Ljava/io/InputStream;)B
move-result p1
and-int/lit16 p1, p1, 0xff
shl-int/2addr p1, v1
invoke-static {p2}, Lcom/facebook/stetho/websocket/Frame;->readByteOrThrow(Ljava/io/InputStream;)B
move-result p2
and-int/lit16 p2, p2, 0xff
or-int/2addr p1, p2
int-to-long p1, p1
return-wide p1
:cond_1c
const/16 v0, 0x7f
if-ne p1, v0, :cond_32
const-wide/16 v2, 0x0
const/4 p1, 0x0
:goto_23
if-ge p1, v1, :cond_31
.line 2
invoke-static {p2}, Lcom/facebook/stetho/websocket/Frame;->readByteOrThrow(Ljava/io/InputStream;)B
move-result v0
and-int/lit16 v0, v0, 0xff
int-to-long v4, v0
or-long/2addr v2, v4
shl-long/2addr v2, v1
add-int/lit8 p1, p1, 0x1
goto :goto_23
:cond_31
return-wide v2
.line 3
:cond_32
new-instance p2, Ljava/io/IOException;
const-string v0, "Unexpected length byte: "
.line 4
invoke-static {v0, p1}, Landroidx/appcompat/widget/h;->a(Ljava/lang/String;I)Ljava/lang/String;
move-result-object p1
.line 5
invoke-direct {p2, p1}, Ljava/io/IOException;-><init>(Ljava/lang/String;)V
throw p2
.end method
.method private static decodeMaskingKey(Ljava/io/InputStream;)[B
.registers 4
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;
}
.end annotation
const/4 v0, 0x4
new-array v1, v0, [B
const/4 v2, 0x0
invoke-static {p0, v1, v2, v0}, Lcom/facebook/stetho/websocket/Frame;->readBytesOrThrow(Ljava/io/InputStream;[BII)V
return-object v1
.end method
.method private encodeFirstByte()B
.registers 3
.line 1
iget-boolean v0, p0, Lcom/facebook/stetho/websocket/Frame;->fin:Z
if-eqz v0, :cond_8
const/16 v0, 0x80
int-to-byte v0, v0
goto :goto_9
:cond_8
const/4 v0, 0x0
.line 2
:goto_9
iget-boolean v1, p0, Lcom/facebook/stetho/websocket/Frame;->rsv1:Z
if-eqz v1, :cond_10
or-int/lit8 v0, v0, 0x40
int-to-byte v0, v0
.line 3
:cond_10
iget-boolean v1, p0, Lcom/facebook/stetho/websocket/Frame;->rsv2:Z
if-eqz v1, :cond_17
or-int/lit8 v0, v0, 0x20
int-to-byte v0, v0
.line 4
:cond_17
iget-boolean v1, p0, Lcom/facebook/stetho/websocket/Frame;->rsv3:Z
if-eqz v1, :cond_1e
or-int/lit8 v0, v0, 0x10
int-to-byte v0, v0
.line 5
:cond_1e
iget-byte v1, p0, Lcom/facebook/stetho/websocket/Frame;->opcode:B
and-int/lit8 v1, v1, 0xf
or-int/2addr v0, v1
int-to-byte v0, v0
return v0
.end method
.method private static encodeLength(J)[B
.registers 13
const/4 v0, 0x0
const/4 v1, 0x1
const-wide/16 v2, 0x7d
cmp-long v4, p0, v2
if-gtz v4, :cond_f
new-array v1, v1, [B
long-to-int p1, p0
int-to-byte p0, p1
aput-byte p0, v1, v0
return-object v1
:cond_f
const-wide/32 v2, 0xffff
const/4 v4, 0x3
const/4 v5, 0x2
const/16 v6, 0x8
const-wide/16 v7, 0xff
cmp-long v9, p0, v2
if-gtz v9, :cond_2f
new-array v2, v4, [B
const/16 v3, 0x7e
aput-byte v3, v2, v0
shr-long v3, p0, v6
and-long/2addr v3, v7
long-to-int v0, v3
int-to-byte v0, v0
aput-byte v0, v2, v1
and-long/2addr p0, v7
long-to-int p1, p0
int-to-byte p0, p1
aput-byte p0, v2, v5
return-object v2
:cond_2f
const/16 v2, 0x9
new-array v2, v2, [B
const/16 v3, 0x7f
aput-byte v3, v2, v0
const/16 v0, 0x38
shr-long v9, p0, v0
and-long/2addr v9, v7
long-to-int v0, v9
int-to-byte v0, v0
aput-byte v0, v2, v1
const/16 v0, 0x30
shr-long v0, p0, v0
and-long/2addr v0, v7
long-to-int v1, v0
int-to-byte v0, v1
aput-byte v0, v2, v5
const/16 v0, 0x28
shr-long v0, p0, v0
and-long/2addr v0, v7
long-to-int v1, v0
int-to-byte v0, v1
aput-byte v0, v2, v4
const/4 v0, 0x4
const/16 v1, 0x20
shr-long v3, p0, v1
and-long/2addr v3, v7
long-to-int v1, v3
int-to-byte v1, v1
aput-byte v1, v2, v0
const/4 v0, 0x5
const/16 v1, 0x18
shr-long v3, p0, v1
and-long/2addr v3, v7
long-to-int v1, v3
int-to-byte v1, v1
aput-byte v1, v2, v0
const/4 v0, 0x6
const/16 v1, 0x10
shr-long v3, p0, v1
and-long/2addr v3, v7
long-to-int v1, v3
int-to-byte v1, v1
aput-byte v1, v2, v0
const/4 v0, 0x7
shr-long v3, p0, v6
and-long/2addr v3, v7
long-to-int v1, v3
int-to-byte v1, v1
aput-byte v1, v2, v0
and-long/2addr p0, v7
long-to-int p1, p0
int-to-byte p0, p1
aput-byte p0, v2, v6
return-object v2
.end method
.method private static readByteOrThrow(Ljava/io/InputStream;)B
.registers 2
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;
}
.end annotation
.line 1
invoke-virtual {p0}, Ljava/io/InputStream;->read()I
move-result p0
const/4 v0, -0x1
if-eq p0, v0, :cond_9
int-to-byte p0, p0
return p0
.line 2
:cond_9
new-instance p0, Ljava/io/EOFException;
invoke-direct {p0}, Ljava/io/EOFException;-><init>()V
throw p0
.end method
.method private static readBytesOrThrow(Ljava/io/InputStream;[BII)V
.registers 6
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;
}
.end annotation
:goto_0
if-lez p3, :cond_12
.line 1
invoke-virtual {p0, p1, p2, p3}, Ljava/io/InputStream;->read([BII)I
move-result v0
const/4 v1, -0x1
if-eq v0, v1, :cond_c
sub-int/2addr p3, v0
add-int/2addr p2, v0
goto :goto_0
.line 2
:cond_c
new-instance p0, Ljava/io/EOFException;
invoke-direct {p0}, Ljava/io/EOFException;-><init>()V
throw p0
:cond_12
return-void
.end method
# virtual methods
.method public readFrom(Ljava/io/BufferedInputStream;)V
.registers 7
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;
}
.end annotation
.line 1
invoke-static {p1}, Lcom/facebook/stetho/websocket/Frame;->readByteOrThrow(Ljava/io/InputStream;)B
move-result v0
invoke-direct {p0, v0}, Lcom/facebook/stetho/websocket/Frame;->decodeFirstByte(B)V
.line 2
invoke-static {p1}, Lcom/facebook/stetho/websocket/Frame;->readByteOrThrow(Ljava/io/InputStream;)B
move-result v0
and-int/lit16 v1, v0, 0x80
const/4 v2, 0x0
if-eqz v1, :cond_12
const/4 v1, 0x1
goto :goto_13
:cond_12
const/4 v1, 0x0
.line 3
:goto_13
iput-boolean v1, p0, Lcom/facebook/stetho/websocket/Frame;->hasMask:Z
and-int/lit16 v0, v0, -0x81
int-to-byte v0, v0
.line 4
invoke-direct {p0, v0, p1}, Lcom/facebook/stetho/websocket/Frame;->decodeLength(BLjava/io/InputStream;)J
move-result-wide v0
iput-wide v0, p0, Lcom/facebook/stetho/websocket/Frame;->payloadLen:J
.line 5
iget-boolean v0, p0, Lcom/facebook/stetho/websocket/Frame;->hasMask:Z
if-eqz v0, :cond_27
invoke-static {p1}, Lcom/facebook/stetho/websocket/Frame;->decodeMaskingKey(Ljava/io/InputStream;)[B
move-result-object v0
goto :goto_28
:cond_27
const/4 v0, 0x0
:goto_28
iput-object v0, p0, Lcom/facebook/stetho/websocket/Frame;->maskingKey:[B
.line 6
iget-wide v0, p0, Lcom/facebook/stetho/websocket/Frame;->payloadLen:J
long-to-int v3, v0
new-array v3, v3, [B
iput-object v3, p0, Lcom/facebook/stetho/websocket/Frame;->payloadData:[B
long-to-int v1, v0
.line 7
invoke-static {p1, v3, v2, v1}, Lcom/facebook/stetho/websocket/Frame;->readBytesOrThrow(Ljava/io/InputStream;[BII)V
.line 8
iget-object p1, p0, Lcom/facebook/stetho/websocket/Frame;->maskingKey:[B
iget-object v0, p0, Lcom/facebook/stetho/websocket/Frame;->payloadData:[B
iget-wide v3, p0, Lcom/facebook/stetho/websocket/Frame;->payloadLen:J
long-to-int v1, v3
invoke-static {p1, v0, v2, v1}, Lcom/facebook/stetho/websocket/MaskingHelper;->unmask([B[BII)V
return-void
.end method
.method public writeTo(Ljava/io/BufferedOutputStream;)V
.registers 7
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;
}
.end annotation
.line 1
invoke-direct {p0}, Lcom/facebook/stetho/websocket/Frame;->encodeFirstByte()B
move-result v0
invoke-virtual {p1, v0}, Ljava/io/BufferedOutputStream;->write(I)V
.line 2
iget-wide v0, p0, Lcom/facebook/stetho/websocket/Frame;->payloadLen:J
invoke-static {v0, v1}, Lcom/facebook/stetho/websocket/Frame;->encodeLength(J)[B
move-result-object v0
.line 3
iget-boolean v1, p0, Lcom/facebook/stetho/websocket/Frame;->hasMask:Z
const/4 v2, 0x0
if-eqz v1, :cond_19
.line 4
aget-byte v1, v0, v2
or-int/lit16 v1, v1, 0x80
int-to-byte v1, v1
aput-byte v1, v0, v2
.line 5
:cond_19
array-length v1, v0
invoke-virtual {p1, v0, v2, v1}, Ljava/io/BufferedOutputStream;->write([BII)V
.line 6
iget-boolean v0, p0, Lcom/facebook/stetho/websocket/Frame;->hasMask:Z
if-nez v0, :cond_2a
.line 7
iget-object v0, p0, Lcom/facebook/stetho/websocket/Frame;->payloadData:[B
iget-wide v3, p0, Lcom/facebook/stetho/websocket/Frame;->payloadLen:J
long-to-int v1, v3
invoke-virtual {p1, v0, v2, v1}, Ljava/io/BufferedOutputStream;->write([BII)V
return-void
.line 8
:cond_2a
new-instance p1, Ljava/lang/UnsupportedOperationException;
const-string v0, "Writing masked data not implemented"
invoke-direct {p1, v0}, Ljava/lang/UnsupportedOperationException;-><init>(Ljava/lang/String;)V
throw p1
.end method