public void testInterestSelectedDelegation() { Link link = new Link(); link.setName(new Name("test")); link.addDelegation(10, new Name("/test1")); link.addDelegation(20, new Name("/test2")); link.addDelegation(100, new Name("/test3")); try { keyChain.sign(link, certificateName); } catch (SecurityException ex) { Assert.Fail(ex.Message); } Blob linkEncoding = link.wireEncode(); Interest interestA = new Interest(); interestA.setLinkWireEncoding(linkEncoding); Assert.AssertTrue(interestA.getSelectedDelegationIndex() < 0); interestA.setSelectedDelegationIndex(link.getDelegations().find( new Name("test2"))); Assert.AssertTrue(interestA.getSelectedDelegationIndex() >= 0); Link link2 = null; try { link2 = interestA.getLink(); } catch (Exception ex_0) { Assert.Fail(ex_0.Message); } Assert.AssertEquals( new Name("test2"), link2.getDelegations() .get(interestA.getSelectedDelegationIndex()).getName()); interestA.setSelectedDelegationIndex(-1); Assert.AssertTrue(interestA.getSelectedDelegationIndex() < 0); }
/// <summary> /// Decode input as an interest in NDN-TLV and set the fields of the interest /// object. /// </summary> /// /// <param name="interest">The Interest object whose fields are updated.</param> /// <param name="input"></param> /// <param name="signedPortionBeginOffset">name component and ends just before the final name component (which is assumed to be a signature for a signed interest).</param> /// <param name="signedPortionEndOffset">name component and ends just before the final name component (which is assumed to be a signature for a signed interest).</param> /// <param name="copy">unchanged while the Blob values are used.</param> /// <exception cref="EncodingException">For invalid encoding.</exception> public override void decodeInterest(Interest interest, ByteBuffer input, int[] signedPortionBeginOffset, int[] signedPortionEndOffset, bool copy) { TlvDecoder decoder = new TlvDecoder(input); int endOffset = decoder.readNestedTlvsStart(net.named_data.jndn.encoding.tlv.Tlv.Interest); decodeName(interest.getName(), signedPortionBeginOffset, signedPortionEndOffset, decoder, copy); if (decoder.peekType(net.named_data.jndn.encoding.tlv.Tlv.Selectors, endOffset)) decodeSelectors(interest, decoder, copy); // Require a Nonce, but don't force it to be 4 bytes. ByteBuffer nonce = decoder.readBlobTlv(net.named_data.jndn.encoding.tlv.Tlv.Nonce); interest.setInterestLifetimeMilliseconds(decoder .readOptionalNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.InterestLifetime, endOffset)); if (decoder.peekType(net.named_data.jndn.encoding.tlv.Tlv.Data, endOffset)) { // Get the bytes of the Link TLV. int linkBeginOffset = decoder.getOffset(); int linkEndOffset = decoder.readNestedTlvsStart(net.named_data.jndn.encoding.tlv.Tlv.Data); decoder.seek(linkEndOffset); interest.setLinkWireEncoding( new Blob(decoder.getSlice(linkBeginOffset, linkEndOffset), copy), this); } else interest.unsetLink(); interest.setSelectedDelegationIndex((int) decoder .readOptionalNonNegativeIntegerTlv(net.named_data.jndn.encoding.tlv.Tlv.SelectedDelegation, endOffset)); if (interest.getSelectedDelegationIndex() >= 0 && !interest.hasLink()) throw new EncodingException( "Interest has a selected delegation, but no link object"); // Set the nonce last because setting other interest fields clears it. interest.setNonce(new Blob(nonce, copy)); decoder.finishNestedTlvs(endOffset); }