package com.steamcommunity.siplus.steamscreenshots; import java.io.ByteArrayInputStream; import java.io.IOException; import com.google.common.io.LittleEndianDataInputStream; public class IncomingData { byte[] mData; MessageHeader mHeader; boolean mProtobuf; int mType; @SuppressWarnings("resource") IncomingData(byte[] data) throws IncomingException { try { LittleEndianDataInputStream stream = new LittleEndianDataInputStream(new ByteArrayInputStream(data)); boolean extendedHeader = false; int headerSize; int headerSizeSize; mType = stream.readInt(); if (mType < 0) { mProtobuf = true; mType = (0x7fffffff + mType) + 1; headerSize = stream.readInt(); if (headerSize < 0) { throw new IncomingException(); } headerSizeSize = 8; } else { switch (mType) { case ChannelEncryptRequestIncoming.MESSAGE: case ChannelEncryptResultIncoming.MESSAGE: headerSize = 16; headerSizeSize = 4; break; default: extendedHeader = true; headerSize = stream.readByte(); if (headerSize < 0) { headerSize += 256; } headerSize -= 5; if (headerSize < 0) { throw new IncomingException(); } headerSizeSize = 5; } } byte[] header = new byte[headerSize]; Utility.readFromStream(stream, header); mHeader = new MessageHeader(header, mProtobuf, extendedHeader); mData = new byte[data.length - headerSize - headerSizeSize]; Utility.readFromStream(stream, mData); } catch (IOException e) { throw new IncomingException(); } } }