@@ -196,12 +196,12 @@ function getMessageFromFile(messageType, filePath, type, callback) {
196196 callback ( error ) ;
197197 } else {
198198 if ( type == "msg" ) {
199- message = buildMessageClass ( details ) ;
199+ var message = buildMessageClass ( details ) ;
200200 setMessageInRegistry ( messageType , message , type ) ;
201201 callback ( null , message ) ;
202202 } else if ( type == "srv" ) {
203- request = buildMessageClass ( details . request ) ;
204- response = buildMessageClass ( details . response ) ;
203+ var request = buildMessageClass ( details . request ) ;
204+ var response = buildMessageClass ( details . response ) ;
205205 setMessageInRegistry ( messageType , request , type , "Request" ) ;
206206 setMessageInRegistry ( messageType , response , type , "Response" ) ;
207207 setMessageInRegistry ( messageType , ( ) => { return request . md5sum ( ) ; } , type , 'md5sum' ) ;
@@ -461,38 +461,6 @@ function camelCase(underscoreWord, lowerCaseFirstLetter) {
461461 return camelCaseWord ;
462462}
463463
464- function buildValidator ( details ) {
465-
466- function validator ( candidate , strict ) {
467- return Object . keys ( candidate ) . every ( function ( property ) {
468- var valid = true ;
469- var exists = false ;
470-
471- details . constants . forEach ( function ( field ) {
472- if ( field . name === property ) {
473- exists = true ;
474- }
475- } ) ;
476- if ( ! exists ) {
477- details . fields . forEach ( function ( field ) {
478- if ( field . name === property ) {
479- exists = true ;
480- }
481- } ) ;
482- }
483-
484- if ( strict ) {
485- return exists ;
486- }
487- else {
488- return valid ;
489- }
490- } ) ;
491- }
492-
493- validator . name = 'validate' + camelCase ( details . messageName ) ;
494- return validator ;
495- }
496464
497465/** Construct the class definition for the given message type. The
498466 * resulting class holds the data and has the methods required for
@@ -515,14 +483,36 @@ function buildMessageClass(details) {
515483 details . fields . forEach ( function ( field ) {
516484 if ( field . messageType ) {
517485 // sub-message class
518- that [ field . name ] =
519- new ( field . messageType ) ( values ? values [ field . name ] : undefined ) ;
486+ // is it an array?
487+ var match = field . type . match ( / ( .* ) \[ ( \d * ) \] / ) ;
488+ if ( values && typeof values [ field . name ] != "undefined" ) {
489+ // values provided
490+ if ( match ) {
491+ // it's an array
492+ that [ field . name ] = values [ field . name ] . map ( function ( value ) {
493+ return new ( field . messageType ) ( value ) ;
494+ } ) ;
495+ } else {
496+ that [ field . name ] =
497+ new ( field . messageType ) ( values [ field . name ] ) ;
498+ }
499+ } else {
500+ // use defaults
501+ if ( match ) {
502+ // it's an array
503+ const basetype = match [ 1 ] ;
504+ const length = ( match [ 2 ] . length > 0 ? parseInt ( match [ 2 ] ) : 0 ) ;
505+ that [ field . name ] = new Array ( length ) . fill ( new ( field . messageType ) ( ) ) ;
506+ } else {
507+ that [ field . name ] = new ( field . messageType ) ( ) ;
508+ }
509+ }
520510 } else {
521- // simple value
511+ // simple type
522512 that [ field . name ] =
523- ( values && typeof values [ field . name ] != "undefined" ) ?
524- values [ field . name ] :
525- ( field . value || fieldsUtil . getDefaultValue ( field . type ) ) ;
513+ ( values && typeof values [ field . name ] != "undefined" ) ?
514+ values [ field . name ] :
515+ ( field . value || fieldsUtil . getDefaultValue ( field . type ) ) ;
526516 }
527517 } ) ;
528518 }
@@ -556,7 +546,6 @@ function buildMessageClass(details) {
556546 return message ;
557547 } ;
558548 Message . getMessageSize = function ( msg ) { return fieldsUtil . getMessageSize ( msg ) ; } ;
559- Message . prototype . validate = buildValidator ( details ) ;
560549
561550 return Message ;
562551}
@@ -594,22 +583,26 @@ function getMessageNameFromMessageType(messageType) {
594583function serializeInnerMessage ( message , buffer , bufferOffset ) {
595584 message . fields . forEach ( function ( field ) {
596585 var fieldValue = message [ field . name ] ;
586+ var details = { } ; // to be filled in for arrays
597587
598588 if ( fieldsUtil . isPrimitive ( field . type ) ) {
599589 fieldsUtil . serializePrimitive (
600590 field . type , fieldValue , buffer , bufferOffset ) ;
601591 bufferOffset += fieldsUtil . getPrimitiveSize ( field . type , fieldValue ) ;
602592 }
603- else if ( fieldsUtil . isArray ( field . type ) ) {
604- buffer . writeUInt32LE ( fieldValue . length , bufferOffset ) ;
605- bufferOffset += 4 ;
593+ else if ( fieldsUtil . isArray ( field . type , details ) ) {
594+ if ( typeof details . length == "undefined" ) {
595+ buffer . writeUInt32LE ( fieldValue . length , bufferOffset ) ;
596+ bufferOffset += 4 ; // only for variable length arrays
597+ }
606598
607599 var arrayType = fieldsUtil . getTypeOfArray ( field . type ) ;
608600 fieldValue . forEach ( function ( value ) {
609601 if ( fieldsUtil . isPrimitive ( arrayType ) ) {
610602 fieldsUtil . serializePrimitive (
611603 arrayType , value , buffer , bufferOffset ) ;
612- bufferOffset += fieldsUtil . getPrimitiveSize ( arrayType , value ) ;
604+ var size = fieldsUtil . getPrimitiveSize ( arrayType , value )
605+ bufferOffset += size ;
613606 }
614607 else if ( fieldsUtil . isMessage ( arrayType ) ) {
615608 serializeInnerMessage ( value , buffer , bufferOffset ) ;
@@ -630,18 +623,24 @@ function serializeInnerMessage(message, buffer, bufferOffset) {
630623function deserializeInnerMessage ( message , buffer , bufferOffset ) {
631624 message . fields . forEach ( function ( field ) {
632625 var fieldValue = message [ field . name ] ;
626+ var details = { } ; // to be filled in for arrays
633627
634628 if ( fieldsUtil . isPrimitive ( field . type ) ) {
635629 fieldValue = fieldsUtil . deserializePrimitive (
636630 field . type , buffer , bufferOffset )
637631 bufferOffset += fieldsUtil . getPrimitiveSize ( field . type , fieldValue )
638632 }
639- else if ( fieldsUtil . isArray ( field . type ) ) {
640- var array = [ ]
641- , arraySize = buffer . readUInt32LE ( bufferOffset )
642- , arrayType = fieldsUtil . getTypeOfArray ( field . type )
643- ;
644- bufferOffset += 4 ;
633+ else if ( fieldsUtil . isArray ( field . type , details ) ) {
634+ var array = [ ] ;
635+ var arrayType = fieldsUtil . getTypeOfArray ( field . type )
636+
637+ var arraySize ;
638+ if ( details . length ) {
639+ arraySize = details . length
640+ } else {
641+ arraySize = buffer . readUInt32LE ( bufferOffset )
642+ bufferOffset += 4 ; // only for variable length arrays
643+ }
645644
646645 for ( var i = 0 ; i < arraySize ; i ++ ) {
647646 if ( fieldsUtil . isPrimitive ( arrayType ) ) {
0 commit comments