parseNode method

Map<String, dynamic>? parseNode(
  1. dynamic reader,
  2. dynamic version
)

Implementation

Map<String, dynamic>? parseNode( reader, version ) {

	Map<String, dynamic> node = {};

	// The first three data sizes depends on version.
	var endOffset = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();
	var numProperties = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();

	( version >= 7500 ) ? reader.getUint64() : reader.getUint32(); // the returned propertyListLen is not used

	var nameLen = reader.getUint8();
	var name = reader.getString( nameLen );

	// Regards this node as NULL-record if endOffset is zero
	if ( endOffset == 0 ) return null;

	var propertyList = [];

	for ( var i = 0; i < numProperties; i ++ ) {

		propertyList.add( this.parseProperty( reader ) );

	}

	// Regards the first three elements in propertyList as id, attrName, and attrType
	var id = propertyList.length > 0 ? propertyList[ 0 ] : '';
	var attrName = propertyList.length > 1 ? propertyList[ 1 ] : '';
	var attrType = propertyList.length > 2 ? propertyList[ 2 ] : '';

	// check if this node represents just a single property
	// like (name, 0) set or (name2, [0, 1, 2]) set of {name: 0, name2: [0, 1, 2]}
	node["singleProperty"] = ( numProperties == 1 && reader.getOffset() == endOffset ) ? true : false;

	while ( endOffset > reader.getOffset() ) {

		var subNode = this.parseNode( reader, version );

		if ( subNode != null ) this.parseSubNode( name, node, subNode );

	}

	node["propertyList"] = propertyList; // raw property list used by parent

	if ( id is num ) node["id"] = id;
	if ( attrName != '' ) node["attrName"] = attrName;
	if ( attrType != '' ) node["attrType"] = attrType;
	if ( name != '' ) node["name"] = name;

	return node;

}