Fix bug: segmented packets, once aggregated, had the interest name and not the returned data name without the segment component.
diff --git a/src/main/java/com/intel/jndn/utils/SegmentedClient.java b/src/main/java/com/intel/jndn/utils/SegmentedClient.java
index 671d6a2..d9deb3e 100644
--- a/src/main/java/com/intel/jndn/utils/SegmentedClient.java
+++ b/src/main/java/com/intel/jndn/utils/SegmentedClient.java
@@ -71,8 +71,7 @@
@Override
public Future<Data> getAsync(Face face, Interest interest) {
List<Future<Data>> segments = getAsyncList(face, interest);
- Name name = hasSegment(interest.getName()) ? interest.getName().getPrefix(-1) : interest.getName();
- return new SegmentedFutureData(name, segments);
+ return new SegmentedFutureData(interest.getName(), segments);
}
/**
@@ -103,10 +102,8 @@
public List<Future<Data>> getAsyncList(Face face, Interest interest) {
// get first segment; default 0 or use a specified start segment
long firstSegment = 0;
- boolean specifiedSegment = false;
try {
firstSegment = interest.getName().get(-1).toSegment();
- specifiedSegment = true;
} catch (EncodingException e) {
// check for interest selector if no initial segment found
if (interest.getChildSelector() == -1) {
@@ -120,9 +117,11 @@
segments.add(SimpleClient.getDefault().getAsync(face, interest));
// retrieve first packet and find the FinalBlockId
+ Data firstData;
long lastSegment;
try {
- lastSegment = segments.get(0).get().getMetaInfo().getFinalBlockId().toSegment();
+ firstData = segments.get(0).get();
+ lastSegment = firstData.getMetaInfo().getFinalBlockId().toSegment();
} catch (ExecutionException | InterruptedException e) {
logger.log(Level.FINE, "Failed to retrieve first segment: " + interest.toUri(), e);
((FutureData) segments.get(0)).reject(e); // TODO implies knowledge of underlying data structure
@@ -132,14 +131,18 @@
return segments;
}
- // cut interest segment off
- if (specifiedSegment) {
- interest.setName(interest.getName().getPrefix(-1));
+ // set follow-on segment names to match first segment retrieve
+ Interest interestCopy = new Interest(interest);
+ if (hasSegment(firstData.getName())) {
+ interestCopy.setName(firstData.getName().getPrefix(-1)); // cut last segment number if present
+ } else {
+ logger.log(Level.FINER, "First packet retrieved does not have a segment number, continuing on: " + firstData.getName().toUri());
+ interestCopy.setName(firstData.getName());
}
// send interests in remaining segments
for (long i = firstSegment + 1; i <= lastSegment; i++) {
- Interest segmentedInterest = new Interest(interest);
+ Interest segmentedInterest = new Interest(interestCopy);
segmentedInterest.getName().appendSegment(i);
Future<Data> futureData = SimpleClient.getDefault().getAsync(face, segmentedInterest);
segments.add((int) i, futureData);