* net.pterodactylus.fcp.DataFound)
*/
public void receivedDataFound(FcpConnection fcpConnection, DataFound dataFound) {
- /* TODO */
+ if (fcpConnection != HighLevelClient.this.fcpConnection) {
+ return;
+ }
+ String identifier = dataFound.getIdentifier();
+ HighLevelProgressCallback<DownloadResult> downloadCallback = downloadCallbacks.get(identifier);
+ if (downloadCallback != null) {
+ DownloadResult downloadResult = downloadCallback.getIntermediaryResult();
+ downloadResult.setFinished(true);
+ downloadResult.setFailed(false);
+ downloadCallback.progressUpdated();
+ downloadCallback.setDone();
+ }
+ HighLevelProgress highLevelProgress = new HighLevelProgress(identifier, true);
+ fireProgressReceived(identifier , highLevelProgress);
}
/**
String identifier = getFailed.getIdentifier();
HighLevelProgressCallback<DownloadResult> downloadCallback = downloadCallbacks.remove(identifier);
if (downloadCallback != null) {
- downloadCallback.getIntermediaryResult().setFailed(true);
+ DownloadResult downloadResult = downloadCallback.getIntermediaryResult();
+ downloadResult.setFailed(true);
+ downloadResult.setFinished(true);
downloadCallback.setDone();
return;
}
* net.pterodactylus.fcp.PutFailed)
*/
public void receivedPutFailed(FcpConnection fcpConnection, PutFailed putFailed) {
- /* TODO */
+ if (fcpConnection != HighLevelClient.this.fcpConnection) {
+ return;
+ }
+ String identifier = putFailed.getIdentifier();
+ HighLevelProgressCallback<DownloadResult> downloadCallback = downloadCallbacks.get(identifier);
+ if (downloadCallback != null) {
+ DownloadResult downloadResult = downloadCallback.getIntermediaryResult();
+ downloadResult.setFailed(true);
+ downloadResult.setFinished(true);
+ downloadCallback.progressUpdated();
+ downloadCallback.setDone();
+ }
+ /* TODO - check inserts */
+ HighLevelProgress highLevelProgress = new HighLevelProgress(identifier, true);
+ fireProgressReceived(identifier, highLevelProgress);
}
/**
* net.pterodactylus.fcp.PutFetchable)
*/
public void receivedPutFetchable(FcpConnection fcpConnection, PutFetchable putFetchable) {
- /* TODO */
+ if (fcpConnection != HighLevelClient.this.fcpConnection) {
+ return;
+ }
+ String identifier = putFetchable.getIdentifier();
+ /* TODO - check inserts */
+ HighLevelProgress highLevelProgress = new HighLevelProgress(identifier);
+ highLevelProgress.setFetchable(true);
+ fireProgressReceived(identifier, highLevelProgress);
}
/**
* net.pterodactylus.fcp.PutSuccessful)
*/
public void receivedPutSuccessful(FcpConnection fcpConnection, PutSuccessful putSuccessful) {
- /* TODO */
+ if (fcpConnection != HighLevelClient.this.fcpConnection) {
+ return;
+ }
+ String identifier = putSuccessful.getIdentifier();
+ HighLevelProgressCallback<DownloadResult> downloadCallback = downloadCallbacks.get(identifier);
+ if (downloadCallback != null) {
+ DownloadResult downloadResult = downloadCallback.getIntermediaryResult();
+ downloadResult.setFinished(true);
+ downloadResult.setFailed(false);
+ downloadCallback.progressUpdated();
+ }
+ /* TODO - check inserts */
+ HighLevelProgress highLevelProgress = new HighLevelProgress(identifier, true);
+ fireProgressReceived(identifier, highLevelProgress);
}
/**
downloadResult.setTotalFinalized(simpleProgress.isFinalizedTotal());
downloadCallback.progressUpdated();
}
+ /* TODO - check inserts */
HighLevelProgress highLevelProgress = new HighLevelProgress(identifier, simpleProgress.getTotal(), simpleProgress.getRequired(), simpleProgress.getSucceeded(), simpleProgress.getFailed(), simpleProgress.getFatallyFailed(), simpleProgress.isFinalizedTotal());
fireProgressReceived(identifier, highLevelProgress);
}
/**
* Result for operations that send progress messages until they have completed.
+ * The fields of the progress message has to be checked in given order because
+ * if you receive this progress asynchronously via a
+ * {@link HighLevelProgressListener} the progress will not have any state, you
+ * will simply get the latest results, with other fields unset. First you should
+ * check whether {@link #isFinished()} returns <code>true</code>. If it does,
+ * the request is finished and {@link #isFailed()} will tell you whether the
+ * request has failed or succeeded. Other fields are not set. If the request is
+ * not yet finished, {@link #isFetchable()} will tell you whether the request
+ * has progressed to a state that allows other clients to fetch the inserted
+ * data. This is of course only valid for Put and PutDir requests. If none of
+ * those methods return <code>true</code>, you can use the block count
+ * methods to get detailed progress statistics. When progress you received is a
+ * {@link DownloadResult} you do not need to check
*
* @author David ‘Bombe’ Roden <bombe@freenetproject.org>
* @version $Id$
*/
public class HighLevelProgress extends HighLevelResult {
+ /** Whether the request is finished. */
+ private boolean finished;
+
+ /** Whether a Put request should be fetchable now. */
+ private boolean fetchable;
+
/** The number of total blocks. */
private int totalBlocks;
}
/**
+ * Creates a new high-level progress for a request that is finished.
+ *
+ * @param identifier
+ * The identifier of the request
+ * @param successful
+ * <code>true</code> if the request finished successfully,
+ * <code>false</code> otherwise
+ */
+ public HighLevelProgress(String identifier, boolean successful) {
+ this(identifier);
+ finished = true;
+ setFailed(!successful);
+ }
+
+ /**
* Creates a new high-level progress with the given values.
*
* @param identifier
}
/**
+ * Returns whether this progress means that a request has finished. Use
+ * {@link #isFailed()} to check if the request failed.
+ *
+ * @see #isFailed()
+ * @return <code>true</code> if the request has finished
+ */
+ public boolean isFinished() {
+ return finished;
+ }
+
+ /**
+ * Sets whether the request described by this progress has finished.
+ *
+ * @param finished
+ * <code>true</code> if the request has finished,
+ * <code>false</code> otherwise
+ */
+ void setFinished(boolean finished) {
+ this.finished = finished;
+ }
+
+ /**
+ * Returns whether the request should be fetchable now, in case it was a Put
+ * request.
+ *
+ * @return <code>true</code> if the request should be fetchable now,
+ * <code>false</code> otherwise
+ */
+ public boolean isFetchable() {
+ return fetchable;
+ }
+
+ /**
+ * Sets whether the request should be fetchable now, in case it was a Put
+ * request.
+ *
+ * @param fetchable
+ * <code>true</code> if the request should be fetchable now,
+ * <code>false</code> otherwise
+ */
+ void setFetchable(boolean fetchable) {
+ this.fetchable = fetchable;
+ }
+
+ /**
* Returns the number of total blocks.
*
* @return The number of total blocks