RingBufferDef *inBuf = RINGS_createRingBuffer(65000, RINGS_OVERFLOW_SHIFT, true); uint64_t prbits = EXB_PREAMBLE_R; uint8_t mode = MODE_PREAMBLE; ExbPacket *packet = NULL; uint16_t sbody = 0; while(1) { char ch; ssize_t r = read(fd, &ch, 1); if (r > 0) { // if some char was received fflush(stdout); RINGS_write((uint8_t) ch, inBuf); uint16_t dlen = RINGS_dataLenght(inBuf); if (mode == MODE_PREAMBLE) { // If expected preamble form stream if (dlen >= EXB_PREAMBLE_SIZE) { //If the buffer contain data with size of preamble or more int r = RINGS_cmpData(dlen - EXB_PREAMBLE_SIZE, (uint8_t*) &prbits, EXB_PREAMBLE_SIZE, inBuf); if (r == 0) { RINGS_dataClear(inBuf); mode = MODE_HEADER; } } } else if (mode == MODE_HEADER) { if (dlen >= EXB_HEADER_SIZE ) { uint8_t *header = (uint8_t*) malloc(EXB_HEADER_SIZE); packet = (ExbPacket*) malloc(sizeof(ExbPacket)); RINGS_extractData(inBuf->reader, EXB_HEADER_SIZE, header, inBuf); ExbPacket_parsePacketHeader(packet, header, 0); sbody = packet->length; RINGS_dataClear(inBuf); mode = MODE_BODY; free(header); } } else { if (dlen >= sbody + EXB_HEADER_SIZE) { uint8_t *blobs = (uint8_t*) malloc(sbody + EXB_HEADER_SIZE); uint8_t *blob = (uint8_t*) malloc(sbody + EXB_HEADER_SIZE + EXB_PREAMBLE_SIZE); RINGS_readAll(blobs, inBuf); memcpy(blob + 8, blobs, sbody + EXB_HEADER_SIZE); memcpy(blob, &prbits, 8); int stotal = sbody + EXB_HEADER_SIZE + EXB_PREAMBLE_SIZE; jbyteArray ret = env->NewByteArray(stotal); env->SetByteArrayRegion(ret, 0, stotal, (jbyte*) blob); free(blob); free(blobs); free(packet); RINGS_Free(inBuf); free(inBuf); return ret; //mode = MODE_PREAMBLE; } } } else { jbyteArray ret = env->NewByteArray(0); return ret; } }