Implement interest Exclude to_ccnb and from_ccnb.
diff --git a/js/tools/build/ndn-js-uncomp.js b/js/tools/build/ndn-js-uncomp.js
index 04700e7..e9d4dc4 100644
--- a/js/tools/build/ndn-js-uncomp.js
+++ b/js/tools/build/ndn-js-uncomp.js
@@ -493,27 +493,16 @@
// Unescape the components.
for (var i = 0; i < array.length; ++i) {
- var component = unescape(array[i].trim());
+ var component = Name.fromEscapedString(array[i]);
- if (component.match(/[^.]/) == null) {
- // Special case for component of only periods.
- if (component.length <= 2) {
- // Zero, one or two periods is illegal. Ignore this componenent to be
- // consistent with the C implmentation.
- // This also gets rid of a trailing '/'.
- array.splice(i, 1);
- --i;
- continue;
- }
- else
- // Remove 3 periods.
- array[i] = component.substr(3, component.length - 3);
+ if (component == null) {
+ // Ignore the illegal componenent. This also gets rid of a trailing '/'.
+ array.splice(i, 1);
+ --i;
+ continue;
}
else
array[i] = component;
-
- // Change the component to Uint8Array now.
- array[i] = DataUtils.toNumbersFromString(array[i]);
}
return array;
@@ -681,7 +670,7 @@
Name.ContentDigestPrefix = new Uint8Array([0xc1, 0x2e, 0x4d, 0x2e, 0x47, 0xc1, 0x01, 0xaa, 0x02, 0x85]);
Name.ContentDigestSuffix = new Uint8Array([0x00]);
-/**
+/*
* Return component as an escaped string according to "CCNx URI Scheme".
* We can't use encodeURIComponent because that doesn't encode all the characters we want to.
*/
@@ -715,6 +704,27 @@
return result;
};
+/*
+ * Return component as a Uint8Array by decoding the escapedString according to "CCNx URI Scheme".
+ * If escapedString is "", "." or ".." then return null, which means to skip the component in the name.
+ */
+Name.fromEscapedString = function(escapedString) {
+ var component = unescape(escapedString.trim());
+
+ if (component.match(/[^.]/) == null) {
+ // Special case for component of only periods.
+ if (component.length <= 2)
+ // Zero, one or two periods is illegal. Ignore this componenent to be
+ // consistent with the C implementation.
+ return null;
+ else
+ // Remove 3 periods.
+ return DataUtils.toNumbersFromString(component.substr(3, component.length - 3));
+ }
+ else
+ return DataUtils.toNumbersFromString(component);
+}
+
Name.prototype.match = function(/*Name*/ name) {
var i_name = this.components;
var o_name = name.components;
@@ -1425,93 +1435,75 @@
return this.name.match(name);
}
-/**
- * Exclude
+/*
+ * Handle the interest Exclude element.
+ * _values is an array where each element is either Uint8Array component or Exclude.ANY.
*/
-var Exclude = function Exclude(_values){
- this.OPTIMUM_FILTER_SIZE = 100;
- this.values = _values; //array of elements
+var Exclude = function Exclude(_values) {
+ this.values = (_values || []);
}
+Exclude.ANY = "*";
+
Exclude.prototype.from_ccnb = function(/*XMLDecoder*/ decoder) {
- decoder.readStartElement(this.getElementLabel());
+ decoder.readStartElement(CCNProtocolDTags.Exclude);
- //TODO APPLY FILTERS/EXCLUDE. For now, just skip the element.
- var structureDecoder = new BinaryXMLStructureDecoder();
- structureDecoder.seek(decoder.offset);
- if (!structureDecoder.findElementEnd(decoder.istream))
- throw new ContentDecodingException(new Error("Cannot find the end of interest Exclude element"));
- decoder.seek(structureDecoder.offset);
+ while (true) {
+ if (decoder.peekStartElement(CCNProtocolDTags.Component))
+ this.values.push(decoder.readBinaryElement(CCNProtocolDTags.Component));
+ else if (decoder.peekStartElement(CCNProtocolDTags.Any)) {
+ decoder.readStartElement(CCNProtocolDTags.Any);
+ decoder.readEndElement();
+ this.values.push(Exclude.ANY);
+ }
+ else if (decoder.peekStartElement(CCNProtocolDTags.Bloom)) {
+ // Skip the Bloom and treat it as Any.
+ decoder.readBinaryElement(CCNProtocolDTags.Bloom);
+ this.values.push(Exclude.ANY);
+ }
+ else
+ break;
+ }
+
+ decoder.readEndElement();
+};
+
+Exclude.prototype.to_ccnb = function(/*XMLEncoder*/ encoder) {
+ if (this.values == null || this.values.length == 0)
+ return;
+
+ encoder.writeStartElement(CCNProtocolDTags.Exclude);
+
+ // TODO: Do we want to order the components (except for ANY)?
+ for (var i = 0; i < this.values.length; ++i) {
+ if (this.values[i] == Exclude.ANY) {
+ encoder.writeStartElement(CCNProtocolDTags.Any);
+ encoder.writeEndElement();
+ }
+ else
+ encoder.writeElement(CCNProtocolDTags.Component, this.values[i]);
+ }
+
+ encoder.writeEndElement();
+};
+
+// Return a string with elements separated by "," and Exclude.ANY shown as "*".
+Exclude.prototype.to_uri = function() {
+ if (this.values == null || this.values.length == 0)
+ return "";
+
+ var result = "";
+ for (var i = 0; i < this.values.length; ++i) {
+ if (i > 0)
+ result += ",";
- //TODO
- /*var component;
- var any = false;
- while ((component = decoder.peekStartElement(CCNProtocolDTags.Component)) ||
- (any = decoder.peekStartElement(CCNProtocolDTags.Any)) ||
- decoder.peekStartElement(CCNProtocolDTags.Bloom)) {
- var ee = component?new ExcludeComponent(): any ? new ExcludeAny() : new BloomFilter();
- ee.decode(decoder);
- _values.add(ee);
- }*/
+ if (this.values[i] == Exclude.ANY)
+ result += "*";
+ else
+ result += Name.toEscapedString(this.values[i]);
+ }
+ return result;
};
-
-Exclude.prototype.to_ccnb=function(/*XMLEncoder*/ encoder) {
- if (!validate()) {
- throw new ContentEncodingException("Cannot encode " + this.getClass().getName() + ": field values missing.");
- }
-
- if (empty())
- return;
-
- encoder.writeStartElement(getElementLabel());
-
- encoder.writeEndElement();
-
- };
-
-Exclude.prototype.getElementLabel = function() { return CCNProtocolDTags.Exclude; };
-
-
-/**
- * ExcludeAny
- */
-var ExcludeAny = function ExcludeAny() {
-
-};
-
-ExcludeAny.prototype.from_ccnb = function(decoder) {
- decoder.readStartElement(this.getElementLabel());
- decoder.readEndElement();
-};
-
-
-ExcludeAny.prototype.to_ccnb = function( encoder) {
- encoder.writeStartElement(this.getElementLabel());
- encoder.writeEndElement();
-};
-
-ExcludeAny.prototype.getElementLabel=function() { return CCNProtocolDTags.Any; };
-
-
-/**
- * ExcludeComponent
- */
-var ExcludeComponent = function ExcludeComponent(_body) {
-
- //TODO Check BODY is an Array of componenets.
-
- this.body = _body
-};
-
-ExcludeComponent.prototype.from_ccnb = function( decoder) {
- this.body = decoder.readBinaryElement(this.getElementLabel());
-};
-
-ExcludeComponent.prototype.to_ccnb = function(encoder) {
- encoder.writeElement(this.getElementLabel(), this.body);
-};
-
-ExcludeComponent.prototype.getElementLabel = function() { return CCNProtocolDTags.Component; };
/**
* @author: Meki Cheraoui
* See COPYING for copyright and distribution information.