From f91da617d7fa2c857bd5c4dedb8921467be52aab Mon Sep 17 00:00:00 2001 From: roblabla Date: Thu, 13 Aug 2015 13:28:05 +0000 Subject: [PATCH 1/2] Add countType support --- src/datatypes/structures.js | 21 ++++++++++++++++++--- src/datatypes/utils.js | 29 ++++++++++++++++++++++++----- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/datatypes/structures.js b/src/datatypes/structures.js index 4c6f695..513e658 100644 --- a/src/datatypes/structures.js +++ b/src/datatypes/structures.js @@ -21,11 +21,17 @@ function readArray(buffer, offset, typeArgs, rootNode) { size: 0 }; var count; - if(typeof typeArgs.count === "object") { + if(typeof typeArgs.count === "object") count = evalCount(typeArgs.count, rootNode); - } - else + else if (typeof typeArgs.count !== "undefined") count = getField(typeArgs.count, rootNode); + else if (typeof typeArgs.countType !== "undefined") { + var countResults = this.read(buffer, offset, { type: typeArgs.countType, typeArgs: typeArgs.countTypeArgs }, rootNode); + results.size += countResults.size; + offset += countResults.size; + count = countResults.value; + } else // TODO : broken schema, should probably error out. + count = 0; for(var i = 0; i < count; i++) { var readResults = this.read(buffer, offset, {type: typeArgs.type, typeArgs: typeArgs.typeArgs}, rootNode); results.size += readResults.size; @@ -36,6 +42,11 @@ function readArray(buffer, offset, typeArgs, rootNode) { } function writeArray(value, buffer, offset, typeArgs, rootNode) { + if (typeof typeArgs.count === "undefined" && + typeof typeArgs.countType !== "undefined") { + offset = this.write(value.length, buffer, offset, { type: typeArgs.countType, typeArgs: typeArgs.countTypeArgs }, rootNode); + } else if (typeof typeArgs.count === "undefined") { // Broken schema, should probably error out + } for(var index in value) { offset = this.write(value[index], buffer, offset, {type: typeArgs.type, typeArgs: typeArgs.typeArgs}, rootNode); } @@ -44,6 +55,10 @@ function writeArray(value, buffer, offset, typeArgs, rootNode) { function sizeOfArray(value, typeArgs, rootNode) { var size = 0; + if (typeof typeArgs.count === "undefined" && + typeof typeArgs.countType !== "undefined") { + size = this.sizeOf(value.length, { type: typeArgs.countType, typeArgs: typeArgs.countTypeArgs }, rootNode); + } for(var index in value) { size += this.sizeOf(value[index], {type: typeArgs.type, typeArgs: typeArgs.typeArgs}, rootNode); } diff --git a/src/datatypes/utils.js b/src/datatypes/utils.js index 4604e26..d4c7c52 100644 --- a/src/datatypes/utils.js +++ b/src/datatypes/utils.js @@ -97,18 +97,37 @@ function writeBool(value, buffer, offset) { function readBuffer(buffer, offset, typeArgs, rootNode) { - var count = getField(typeArgs.count, rootNode); + var size = 0; + var count; + if (typeof typeArgs.count !== "undefined") + count = getField(typeArgs.count, rootNode); + else if (typeof typeArgs.countType !== "undefined") { + var countResults = this.read(buffer, offset, { type: typeArgs.countType, typeArgs: typeArgs.countTypeArgs }, rootNode); + size += countResults.size; + offset += countResults.size; + count = countResults.value; + } return { value: buffer.slice(offset, offset + count), - size: count + size: size + count }; } -function writeBuffer(value, buffer, offset) { +function writeBuffer(value, buffer, offset, typeArgs, rootNode) { + if (typeof typeArgs.count === "undefined" && + typeof typeArgs.countType !== "undefined") { + offset = this.write(value.length, buffer, offset, { type: typeArgs.countType, typeArgs: typeArgs.countTypeArgs }, rootNode); + } else if (typeof typeArgs.count === "undefined") { // Broken schema, should probably error out + } value.copy(buffer, offset); return offset + value.length; } -function sizeOfBuffer(value) { - return value.length; +function sizeOfBuffer(value, typeArgs, rootNode) { + var size = 0; + if (typeof typeArgs.count === "undefined" && + typeof typeArgs.countType !== "undefined") { + size = this.sizeOf(value.length, { type: typeArgs.countType, typeArgs: typeArgs.countTypeArgs }, rootNode); + } + return size + value.length; } From 3d6db80593cd4260514a1876ca535e55b0d80076 Mon Sep 17 00:00:00 2001 From: roblabla Date: Thu, 13 Aug 2015 14:56:48 +0000 Subject: [PATCH 2/2] TypeArgs should default to an empty object in case it is undefined --- src/protocol.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/protocol.js b/src/protocol.js index d254f4e..d8f916b 100644 --- a/src/protocol.js +++ b/src/protocol.js @@ -20,7 +20,8 @@ NMProtocols.prototype.read = function(buffer, cursor, fieldInfo, rootNodes) { error: new Error("missing data type: " + fieldInfo.type) }; } - var readResults = type[0].call(this, buffer, cursor, fieldInfo.typeArgs, rootNodes); + var typeArgs = fieldInfo.typeArgs || {}; + var readResults = type[0].call(this, buffer, cursor, typeArgs, rootNodes); if(readResults == null) { throw new Error("Reader returned null : " + JSON.stringify(fieldInfo)); } @@ -35,7 +36,8 @@ NMProtocols.prototype.write = function(value, buffer, offset, fieldInfo, rootNod error: new Error("missing data type: " + fieldInfo.type) }; } - return type[1].call(this, value, buffer, offset, fieldInfo.typeArgs, rootNode); + var typeArgs = fieldInfo.typeArgs || {}; + return type[1].call(this, value, buffer, offset, typeArgs, rootNode); }; NMProtocols.prototype.sizeOf = function(value, fieldInfo, rootNode) { @@ -44,7 +46,8 @@ NMProtocols.prototype.sizeOf = function(value, fieldInfo, rootNode) { throw new Error("missing data type: " + fieldInfo.type); } if(typeof type[2] === 'function') { - return type[2].call(this, value, fieldInfo.typeArgs, rootNode); + var typeArgs = fieldInfo.typeArgs || {}; + return type[2].call(this, value, typeArgs, rootNode); } else { return type[2]; }