public bool Supports(MessageDefinition mesgDef) { if (mesgDef == null) { return(false); } if (GlobalMessageNum != mesgDef.GlobalMessageNum) { return(false); } if (LocalMessageNum != mesgDef.LocalMessageNum) { return(false); } foreach (FieldDefinition fieldDef in mesgDef.GetFields()) { FieldDefinition supportedFieldDef = GetField(fieldDef.Num); if (supportedFieldDef == null) { return(false); } if (fieldDef.Size > supportedFieldDef.Size) { return(false); } } foreach (DeveloperFieldDefinition fieldDef in mesgDef.DeveloperFieldDefinitions) { var supportedFieldDef = GetDeveloperFieldDefinition(fieldDef.FieldNum, fieldDef.DeveloperDataIndex); if (supportedFieldDef == null) { return(false); } if (fieldDef.Size > supportedFieldDef.Size) { return(false); } } return(true); }
/// <summary> /// Validate if a MessageDefinition is compatible with a protocol version /// </summary> /// <param name="defn">Definition to validate</param> /// <returns>true if definition is compatible. false otherwise</returns> public bool ValidateMessageDefn(MessageDefinition defn) { if (defn.DeveloperFieldDefinitions.Any()) { return(false); } foreach (var fld in defn.GetFields()) { int typeNum = fld.Type & Fit.BaseTypeNumMask; if (typeNum > Fit.Byte) { return(false); } } return(true); }
public void Read(Stream inStream, MessageDefinition defnMessage) { inStream.Position = 1; EndianBinaryReader mesgReader = new EndianBinaryReader(inStream, defnMessage.IsBigEndian); LocalNum = defnMessage.LocalMessageNum; foreach (FieldDefinition fieldDef in defnMessage.GetFields()) { bool read = true; // It's possible the field type found in the field definition may // not agree with the type defined in the profile. The profile // type will be preferred for decode. Field field = GetField(fieldDef.Num); if (field == null) { // We normally won't have fields attached to our skeleton message, // as we add values we need to add the fields too based on the mesg,field // combo in the profile. Must derive from the profile so the scale etc // is correct field = new Field(Profile.GetMessage(this.MessageNumber).GetField(fieldDef.Num)); if (field.Num == Fit.FieldNumInvalid) { // If there was no info in the profile the FieldNum will get set to invalid // so preserve the unknown fields info while we know it field.Num = fieldDef.Num; field.SetType(fieldDef.Type); } SetField(field); } if (field.Type != fieldDef.Type) { int fieldSize = Fit.BaseType[field.Type & Fit.BaseTypeNumMask].size; int defSize = Fit.BaseType[fieldDef.Type & Fit.BaseTypeNumMask].size; if (defSize < fieldSize) { field.SetType(fieldDef.Type); } else if (defSize != fieldSize) { // Demotion is hard. Don't read the field if the // sizes are different. Use the profile type if the // signedness of the field has changed. read = false; } } if (read) { ReadFieldValue(field, fieldDef.Size, mesgReader); } else { // Skip the bytes for the field if we aren't going to bother reading them mesgReader.ReadBytes(fieldDef.Size); } } foreach (DeveloperFieldDefinition fldDef in defnMessage.DeveloperFieldDefinitions) { DeveloperField fld = GetDeveloperField(fldDef.FieldNum, fldDef.DeveloperDataIndex); if (ReferenceEquals(fld, null)) { fld = new DeveloperField(fldDef); SetDeveloperField(fld); } ReadFieldValue(fld, fldDef.Size, mesgReader); } }