58 lines
1.5 KiB
Java
58 lines
1.5 KiB
Java
|
package envoy.server;
|
||
|
|
||
|
import java.io.IOException;
|
||
|
import java.nio.ByteBuffer;
|
||
|
import java.util.ArrayList;
|
||
|
import java.util.List;
|
||
|
|
||
|
import com.jenkov.nioserver.IMessageReader;
|
||
|
import com.jenkov.nioserver.Message;
|
||
|
import com.jenkov.nioserver.MessageBuffer;
|
||
|
import com.jenkov.nioserver.Socket;
|
||
|
|
||
|
/**
|
||
|
* Project: <strong>envoy-server-standalone</strong><br>
|
||
|
* File: <strong>ObjectMessageReader.java</strong><br>
|
||
|
* Created: <strong>28.12.2019</strong><br>
|
||
|
*
|
||
|
* @author Kai S. K. Engelbart
|
||
|
* @since Envoy Server Standalone v0.1-alpha
|
||
|
*/
|
||
|
public class ObjectMessageReader implements IMessageReader {
|
||
|
|
||
|
private List<Message> completeMessages = new ArrayList<>();
|
||
|
private Message nextMessage;
|
||
|
private MessageBuffer messageBuffer;
|
||
|
|
||
|
@Override
|
||
|
public void init(MessageBuffer messageBuffer) {
|
||
|
this.messageBuffer = messageBuffer;
|
||
|
nextMessage = messageBuffer.getMessage();
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void read(Socket socket, ByteBuffer buffer) throws IOException {
|
||
|
socket.read(buffer);
|
||
|
buffer.flip();
|
||
|
|
||
|
if (!buffer.hasRemaining()) {
|
||
|
buffer.clear();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
nextMessage.writeToMessage(buffer);
|
||
|
|
||
|
int length = nextMessage.sharedArray[nextMessage.offset];
|
||
|
if(nextMessage.length - nextMessage.offset >= length) {
|
||
|
Message message = messageBuffer.getMessage();
|
||
|
message.writePartialMessageToMessage(nextMessage, nextMessage.offset + length);
|
||
|
completeMessages.add(nextMessage);
|
||
|
nextMessage = message;
|
||
|
}
|
||
|
|
||
|
buffer.clear();
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public List<Message> getMessages() { return completeMessages; }
|
||
|
}
|