package de.tum.in.www1.jReto.connectivity;
import java.nio.ByteBuffer;
import java.util.UUID;
/**
* An InTransfer represents a data transfer from a remote peer to the local peer. The connection class generates InTransfer instances when a remote peer sends data.
*
* This class exposes several events that can be set with the corresponding methods:
*
* - onCompleteData: Called when the transfer completes with the full data received. Buffers the data in memory until the transfer is complete. Alternative to onPartialData. If both are set, onPartialData is used.
* - onPartialData: Called whenever data is received. This method may be called multiple times, i.e. the data is not the full transfer. Exclusive alternative to onCompleteData.
*/
public class InTransfer extends Transfer {
public static interface CompleteDataHandler {
void onData(InTransfer transfer, ByteBuffer data);
}
public static interface PartialDataHandler {
void onPartialData(InTransfer transfer, ByteBuffer data);
}
private CompleteDataHandler completeDataHandler;
private PartialDataHandler partialDataHandler;
private DefaultDataConsumer defaultDataConsumer;
public InTransfer(TransferManager transferManager, int lenght, UUID identifier) {
super(transferManager, lenght, identifier);
}
void updateWithReceivedData(final ByteBuffer data) {
int dataLength = data.remaining();
if (this.partialDataHandler != null) {
this.partialDataHandler.onPartialData(this, data);
} else if (this.completeDataHandler != null) {
if (this.defaultDataConsumer == null) {
this.defaultDataConsumer = new DefaultDataConsumer(this.getLength());
}
this.defaultDataConsumer.consume(data);
} else {
System.err.println("You need to set either onCompleteData or onPartialData on incoming transfers (affected instance: "+this);
}
this.updateProgress(dataLength);
}
public void cancel() {
InTransfer.this.getTransferManager().cancelTransfer(InTransfer.this);
}
void confirmEnd() {
this.defaultDataConsumer = null;
super.confirmEnd();
}
void confirmCompletion() {
if (this.completeDataHandler != null) this.completeDataHandler.onData(this, this.defaultDataConsumer.getData());
super.confirmCompletion();
}
public CompleteDataHandler getOnCompleteData() {
return this.completeDataHandler;
}
/** Sets the onCompleteData event handler. */
public void setOnCompleteData(CompleteDataHandler completeDataHandler) {
this.completeDataHandler = completeDataHandler;
}
public PartialDataHandler getOnPartialData() {
return this.partialDataHandler;
}
/** Sets the onPartialData event handler. */
public void setOnPartialData(PartialDataHandler partialDataHandler) {
this.partialDataHandler = partialDataHandler;
}
}