package com.netifera.platform.net.internal.sniffing.stream;
import java.nio.ByteBuffer;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import com.netifera.platform.net.sniffing.stream.ISessionKey;
import com.netifera.platform.net.sniffing.stream.IStreamSniffer;
import com.netifera.platform.net.sniffing.stream.IStreamSnifferHandle;
public class TCPStreamManager {
private final ISessionKey key;
private final Object sessionTag;
private final Collection<IStreamSnifferHandle> streamHandles;
private boolean closed = false;
TCPStreamManager(ISessionKey key, Object sessionTag, Collection<IStreamSnifferHandle> handles) {
this.streamHandles = new HashSet<IStreamSnifferHandle>(handles);
this.key = key;
this.sessionTag = sessionTag;
}
synchronized void unregisterHandle(IStreamSnifferHandle handle) {
streamHandles.remove(handle);
}
synchronized void handleEstablished(IStreamSniffer.SessionType sessionType) {
for(Iterator<IStreamSnifferHandle> itr = streamHandles.iterator(); itr.hasNext(); ) {
IStreamSnifferHandle handle = itr.next();
if(handle.getSniffer().handleNewSession(new TCPSessionContext(key, sessionTag), sessionType) == false) {
itr.remove();
}
}
}
synchronized void handleClientData(ByteBuffer data) {
for(Iterator<IStreamSnifferHandle> itr = streamHandles.iterator(); itr.hasNext(); ) {
IStreamSnifferHandle handle = itr.next();
if(handle.getSniffer().handleClientData(new TCPSessionContext(key, sessionTag), data) == false) {
itr.remove();
}
}
}
synchronized void handleServerData(ByteBuffer data) {
for(Iterator<IStreamSnifferHandle> itr = streamHandles.iterator(); itr.hasNext(); ) {
IStreamSnifferHandle handle = itr.next();
if(handle.getSniffer().handleServerData(new TCPSessionContext(key, sessionTag), data) == false) {
itr.remove();
}
}
}
synchronized void handleClose() {
closed = true;
for(IStreamSnifferHandle handle : streamHandles) {
handle.getSniffer().handleSessionClose(new TCPSessionContext(key, sessionTag));
}
}
boolean isActive() {
return streamHandles.size() > 0;
}
void shutdown() {
if(!closed) {
handleClose();
}
streamHandles.clear();
}
}