/*
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.stetho.websocket;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
class ReadHandler {
private final BufferedInputStream mBufferedInput;
private final SimpleEndpoint mEndpoint;
/**
* Used to build a larger payload over multiple frames.
*/
private final ByteArrayOutputStream mCurrentPayload = new ByteArrayOutputStream();
public ReadHandler(InputStream bufferedInput, SimpleEndpoint endpoint) {
mBufferedInput = new BufferedInputStream(bufferedInput, 1024);
mEndpoint = endpoint;
}
/**
* Enter a loop processing incoming frames until orderly shutdown or a socket exception is
* thrown. This method returns normally on orderly shutdown, throws otherwise.
*
* @throws IOException Socket exception during the read loop.
*/
public void readLoop(ReadCallback readCallback) throws IOException {
Frame frame = new Frame();
do {
frame.readFrom(mBufferedInput);
mCurrentPayload.write(frame.payloadData, 0, (int)frame.payloadLen);
if (frame.fin) {
byte[] completePayload = mCurrentPayload.toByteArray();
readCallback.onCompleteFrame(frame.opcode, completePayload, completePayload.length);
mCurrentPayload.reset();
}
} while (frame.opcode != Frame.OPCODE_CONNECTION_CLOSE);
}
}