This repository has been archived on 2021-12-05. You can view files and clone it, but cannot push or open issues or pull requests.
envoy/server/src/main/java/envoy/server/net/ObjectMessageReader.java

69 lines
1.7 KiB
Java
Executable File

package envoy.server.net;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.*;
import com.jenkov.nioserver.*;
import envoy.util.SerializationUtils;
/**
* This {@link IMessageReader} decodes serialized Java objects.
*
* @author Kai S. K. Engelbart
* @since Envoy Server Standalone v0.1-alpha
*/
public final class ObjectMessageReader implements IMessageReader {
private final List<Message> completeMessages = new ArrayList<>();
private Message nextMessage;
private MessageBuffer messageBuffer;
@Override
public List<Message> getMessages() { return completeMessages; }
@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);
buffer.clear();
// Get message length
if (nextMessage.length < 4)
return;
int length = SerializationUtils.bytesToInt(nextMessage.sharedArray, nextMessage.offset) + 4;
do {
// Separate first complete message
if (nextMessage.length >= length) {
Message message = messageBuffer.getMessage();
message.writePartialMessageToMessage(nextMessage, length);
message.length = nextMessage.length - length;
nextMessage.length = length;
completeMessages.add(nextMessage);
nextMessage = message;
}
// Get message length
if (nextMessage.length < 4)
return;
length = SerializationUtils.bytesToInt(nextMessage.sharedArray, nextMessage.offset) + 4;
} while (nextMessage.length >= length);
}
}