OutboundFlowController.smali

.class Lio/grpc/okhttp/OutboundFlowController;
.super Ljava/lang/Object;
.source "OutboundFlowController.java"


# annotations
.annotation system Ldalvik/annotation/MemberClasses;
    value = {
        Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;,
        Lio/grpc/okhttp/OutboundFlowController$WriteStatus;
    }
.end annotation


# instance fields
.field private final connectionState:Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;

.field private final frameWriter:Lio/grpc/okhttp/internal/framed/FrameWriter;

.field private initialWindowSize:I

.field private final transport:Lio/grpc/okhttp/OkHttpClientTransport;


# direct methods
.method constructor <init>(Lio/grpc/okhttp/OkHttpClientTransport;Lio/grpc/okhttp/internal/framed/FrameWriter;)V
    .registers 5

    .line 1
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    const v0, 0xffff

    .line 2
    iput v0, p0, Lio/grpc/okhttp/OutboundFlowController;->initialWindowSize:I

    .line 3
    new-instance v0, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;

    const/4 v1, 0x0

    invoke-direct {v0, p0, v1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;-><init>(Lio/grpc/okhttp/OutboundFlowController;I)V

    iput-object v0, p0, Lio/grpc/okhttp/OutboundFlowController;->connectionState:Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;

    const-string v0, "transport"

    .line 4
    invoke-static {p1, v0}, Lcom/google/common/base/r;->a(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

    check-cast p1, Lio/grpc/okhttp/OkHttpClientTransport;

    iput-object p1, p0, Lio/grpc/okhttp/OutboundFlowController;->transport:Lio/grpc/okhttp/OkHttpClientTransport;

    const-string p1, "frameWriter"

    .line 5
    invoke-static {p2, p1}, Lcom/google/common/base/r;->a(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

    check-cast p2, Lio/grpc/okhttp/internal/framed/FrameWriter;

    iput-object p2, p0, Lio/grpc/okhttp/OutboundFlowController;->frameWriter:Lio/grpc/okhttp/internal/framed/FrameWriter;

    return-void
.end method

.method static synthetic access$100(Lio/grpc/okhttp/OutboundFlowController;)I
    .registers 1

    .line 1
    iget p0, p0, Lio/grpc/okhttp/OutboundFlowController;->initialWindowSize:I

    return p0
.end method

.method static synthetic access$200(Lio/grpc/okhttp/OutboundFlowController;)Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
    .registers 1

    .line 1
    iget-object p0, p0, Lio/grpc/okhttp/OutboundFlowController;->connectionState:Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;

    return-object p0
.end method

.method static synthetic access$300(Lio/grpc/okhttp/OutboundFlowController;)Lio/grpc/okhttp/internal/framed/FrameWriter;
    .registers 1

    .line 1
    iget-object p0, p0, Lio/grpc/okhttp/OutboundFlowController;->frameWriter:Lio/grpc/okhttp/internal/framed/FrameWriter;

    return-object p0
.end method

.method private state(Lio/grpc/okhttp/OkHttpClientStream;)Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
    .registers 3

    .line 1
    invoke-virtual {p1}, Lio/grpc/okhttp/OkHttpClientStream;->getOutboundFlowState()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;

    if-nez v0, :cond_10

    .line 2
    new-instance v0, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;

    invoke-direct {v0, p0, p1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;-><init>(Lio/grpc/okhttp/OutboundFlowController;Lio/grpc/okhttp/OkHttpClientStream;)V

    .line 3
    invoke-virtual {p1, v0}, Lio/grpc/okhttp/OkHttpClientStream;->setOutboundFlowState(Ljava/lang/Object;)V

    :cond_10
    return-object v0
.end method

.method private writeStreams()V
    .registers 10

    .line 1
    iget-object v0, p0, Lio/grpc/okhttp/OutboundFlowController;->transport:Lio/grpc/okhttp/OkHttpClientTransport;

    invoke-virtual {v0}, Lio/grpc/okhttp/OkHttpClientTransport;->getActiveStreams()[Lio/grpc/okhttp/OkHttpClientStream;

    move-result-object v0

    .line 2
    iget-object v1, p0, Lio/grpc/okhttp/OutboundFlowController;->connectionState:Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;

    invoke-virtual {v1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->window()I

    move-result v1

    .line 3
    array-length v2, v0

    :goto_d
    const/4 v3, 0x0

    if-lez v2, :cond_48

    if-lez v1, :cond_48

    int-to-float v4, v1

    int-to-float v5, v2

    div-float/2addr v4, v5

    float-to-double v4, v4

    .line 4
    invoke-static {v4, v5}, Ljava/lang/Math;->ceil(D)D

    move-result-wide v4

    double-to-int v4, v4

    const/4 v5, 0x0

    :goto_1c
    if-ge v3, v2, :cond_46

    if-lez v1, :cond_46

    .line 5
    aget-object v6, v0, v3

    .line 6
    invoke-direct {p0, v6}, Lio/grpc/okhttp/OutboundFlowController;->state(Lio/grpc/okhttp/OkHttpClientStream;)Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;

    move-result-object v7

    .line 7
    invoke-virtual {v7}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->unallocatedBytes()I

    move-result v8

    invoke-static {v8, v4}, Ljava/lang/Math;->min(II)I

    move-result v8

    invoke-static {v1, v8}, Ljava/lang/Math;->min(II)I

    move-result v8

    if-lez v8, :cond_38

    .line 8
    invoke-virtual {v7, v8}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->allocateBytes(I)V

    sub-int/2addr v1, v8

    .line 9
    :cond_38
    invoke-virtual {v7}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->unallocatedBytes()I

    move-result v7

    if-lez v7, :cond_43

    add-int/lit8 v7, v5, 0x1

    .line 10
    aput-object v6, v0, v5

    move v5, v7

    :cond_43
    add-int/lit8 v3, v3, 0x1

    goto :goto_1c

    :cond_46
    move v2, v5

    goto :goto_d

    .line 11
    :cond_48
    new-instance v0, Lio/grpc/okhttp/OutboundFlowController$WriteStatus;

    const/4 v1, 0x0

    invoke-direct {v0, p0, v1}, Lio/grpc/okhttp/OutboundFlowController$WriteStatus;-><init>(Lio/grpc/okhttp/OutboundFlowController;Lio/grpc/okhttp/OutboundFlowController$1;)V

    .line 12
    iget-object v1, p0, Lio/grpc/okhttp/OutboundFlowController;->transport:Lio/grpc/okhttp/OkHttpClientTransport;

    invoke-virtual {v1}, Lio/grpc/okhttp/OkHttpClientTransport;->getActiveStreams()[Lio/grpc/okhttp/OkHttpClientStream;

    move-result-object v1

    array-length v2, v1

    :goto_55
    if-ge v3, v2, :cond_6a

    aget-object v4, v1, v3

    .line 13
    invoke-direct {p0, v4}, Lio/grpc/okhttp/OutboundFlowController;->state(Lio/grpc/okhttp/OkHttpClientStream;)Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;

    move-result-object v4

    .line 14
    invoke-virtual {v4}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->allocatedBytes()I

    move-result v5

    invoke-virtual {v4, v5, v0}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->writeBytes(ILio/grpc/okhttp/OutboundFlowController$WriteStatus;)I

    .line 15
    invoke-virtual {v4}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->clearAllocatedBytes()V

    add-int/lit8 v3, v3, 0x1

    goto :goto_55

    .line 16
    :cond_6a
    invoke-virtual {v0}, Lio/grpc/okhttp/OutboundFlowController$WriteStatus;->hasWritten()Z

    move-result v0

    if-eqz v0, :cond_73

    .line 17
    invoke-virtual {p0}, Lio/grpc/okhttp/OutboundFlowController;->flush()V

    :cond_73
    return-void
.end method


# virtual methods
.method data(ZILokio/Buffer;Z)V
    .registers 7

    const-string v0, "source"

    .line 1
    invoke-static {p3, v0}, Lcom/google/common/base/r;->a(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

    .line 2
    iget-object v0, p0, Lio/grpc/okhttp/OutboundFlowController;->transport:Lio/grpc/okhttp/OkHttpClientTransport;

    invoke-virtual {v0, p2}, Lio/grpc/okhttp/OkHttpClientTransport;->getStream(I)Lio/grpc/okhttp/OkHttpClientStream;

    move-result-object p2

    if-nez p2, :cond_e

    return-void

    .line 3
    :cond_e
    invoke-direct {p0, p2}, Lio/grpc/okhttp/OutboundFlowController;->state(Lio/grpc/okhttp/OkHttpClientStream;)Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;

    move-result-object p2

    .line 4
    invoke-virtual {p2}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->writableWindow()I

    move-result v0

    .line 5
    invoke-virtual {p2}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->hasFrame()Z

    move-result v1

    .line 6
    invoke-virtual {p2, p3, p1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->newFrame(Lokio/Buffer;Z)Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState$Frame;

    move-result-object p1

    if-nez v1, :cond_2f

    .line 7
    invoke-virtual {p1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState$Frame;->size()I

    move-result p2

    if-lt v0, p2, :cond_2f

    .line 8
    invoke-virtual {p1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState$Frame;->write()V

    if-eqz p4, :cond_2e

    .line 9
    invoke-virtual {p0}, Lio/grpc/okhttp/OutboundFlowController;->flush()V

    :cond_2e
    return-void

    .line 10
    :cond_2f
    invoke-virtual {p1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState$Frame;->enqueue()V

    if-nez v1, :cond_44

    if-gtz v0, :cond_37

    goto :goto_44

    .line 11
    :cond_37
    invoke-virtual {p1, v0}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState$Frame;->split(I)Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState$Frame;

    move-result-object p1

    invoke-virtual {p1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState$Frame;->write()V

    if-eqz p4, :cond_43

    .line 12
    invoke-virtual {p0}, Lio/grpc/okhttp/OutboundFlowController;->flush()V

    :cond_43
    return-void

    :cond_44
    :goto_44
    if-eqz p4, :cond_49

    .line 13
    invoke-virtual {p0}, Lio/grpc/okhttp/OutboundFlowController;->flush()V

    :cond_49
    return-void
.end method

.method flush()V
    .registers 3

    .line 1
    :try_start_0
    iget-object v0, p0, Lio/grpc/okhttp/OutboundFlowController;->frameWriter:Lio/grpc/okhttp/internal/framed/FrameWriter;

    invoke-interface {v0}, Lio/grpc/okhttp/internal/framed/FrameWriter;->flush()V
    :try_end_5
    .catch Ljava/io/IOException; {:try_start_0 .. :try_end_5} :catch_6

    return-void

    :catch_6
    move-exception v0

    .line 2
    new-instance v1, Ljava/lang/RuntimeException;

    invoke-direct {v1, v0}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V

    throw v1
.end method

.method initialOutboundWindowSize(I)V
    .registers 7

    if-ltz p1, :cond_31

    .line 1
    iget v0, p0, Lio/grpc/okhttp/OutboundFlowController;->initialWindowSize:I

    sub-int v0, p1, v0

    .line 2
    iput p1, p0, Lio/grpc/okhttp/OutboundFlowController;->initialWindowSize:I

    .line 3
    iget-object p1, p0, Lio/grpc/okhttp/OutboundFlowController;->transport:Lio/grpc/okhttp/OkHttpClientTransport;

    invoke-virtual {p1}, Lio/grpc/okhttp/OkHttpClientTransport;->getActiveStreams()[Lio/grpc/okhttp/OkHttpClientStream;

    move-result-object p1

    array-length v1, p1

    const/4 v2, 0x0

    :goto_10
    if-ge v2, v1, :cond_2b

    aget-object v3, p1, v2

    .line 4
    invoke-virtual {v3}, Lio/grpc/okhttp/OkHttpClientStream;->getOutboundFlowState()Ljava/lang/Object;

    move-result-object v4

    check-cast v4, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;

    if-nez v4, :cond_25

    .line 5
    new-instance v4, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;

    invoke-direct {v4, p0, v3}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;-><init>(Lio/grpc/okhttp/OutboundFlowController;Lio/grpc/okhttp/OkHttpClientStream;)V

    .line 6
    invoke-virtual {v3, v4}, Lio/grpc/okhttp/OkHttpClientStream;->setOutboundFlowState(Ljava/lang/Object;)V

    goto :goto_28

    .line 7
    :cond_25
    invoke-virtual {v4, v0}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->incrementStreamWindow(I)I

    :goto_28
    add-int/lit8 v2, v2, 0x1

    goto :goto_10

    :cond_2b
    if-lez v0, :cond_30

    .line 8
    invoke-direct {p0}, Lio/grpc/okhttp/OutboundFlowController;->writeStreams()V

    :cond_30
    return-void

    .line 9
    :cond_31
    new-instance v0, Ljava/lang/IllegalArgumentException;

    new-instance v1, Ljava/lang/StringBuilder;

    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V

    const-string v2, "Invalid initial window size: "

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object p1

    invoke-direct {v0, p1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V

    goto :goto_49

    :goto_48
    throw v0

    :goto_49
    goto :goto_48
.end method

.method windowUpdate(Lio/grpc/okhttp/OkHttpClientStream;I)V
    .registers 4

    if-nez p1, :cond_b

    .line 1
    iget-object p1, p0, Lio/grpc/okhttp/OutboundFlowController;->connectionState:Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;

    invoke-virtual {p1, p2}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->incrementStreamWindow(I)I

    .line 2
    invoke-direct {p0}, Lio/grpc/okhttp/OutboundFlowController;->writeStreams()V

    goto :goto_28

    .line 3
    :cond_b
    invoke-direct {p0, p1}, Lio/grpc/okhttp/OutboundFlowController;->state(Lio/grpc/okhttp/OkHttpClientStream;)Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;

    move-result-object p1

    .line 4
    invoke-virtual {p1, p2}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->incrementStreamWindow(I)I

    .line 5
    new-instance p2, Lio/grpc/okhttp/OutboundFlowController$WriteStatus;

    const/4 v0, 0x0

    invoke-direct {p2, p0, v0}, Lio/grpc/okhttp/OutboundFlowController$WriteStatus;-><init>(Lio/grpc/okhttp/OutboundFlowController;Lio/grpc/okhttp/OutboundFlowController$1;)V

    .line 6
    invoke-virtual {p1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->writableWindow()I

    move-result v0

    invoke-virtual {p1, v0, p2}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->writeBytes(ILio/grpc/okhttp/OutboundFlowController$WriteStatus;)I

    .line 7
    invoke-virtual {p2}, Lio/grpc/okhttp/OutboundFlowController$WriteStatus;->hasWritten()Z

    move-result p1

    if-eqz p1, :cond_28

    .line 8
    invoke-virtual {p0}, Lio/grpc/okhttp/OutboundFlowController;->flush()V

    :cond_28
    :goto_28
    return-void
.end method