internal protected FamosFileComponent(BinaryReader reader, int codePage) : base(reader, codePage) { FamosFilePackInfo? packInfo = null; FamosFileBufferInfo? bufferInfo = null; FamosFilePropertyInfo?propertyInfo = null; while (true) { var nextKeyType = this.DeserializeKeyType(); if (propertyInfo != null && nextKeyType != FamosFileKeyType.CN) { throw new FormatException("A channel info of type '|CN' was expected because a property info of type '|Np' has been defined previously."); } // end of CC reached if (nextKeyType == FamosFileKeyType.CT || nextKeyType == FamosFileKeyType.CI || nextKeyType == FamosFileKeyType.CB || nextKeyType == FamosFileKeyType.CG || nextKeyType == FamosFileKeyType.CC || nextKeyType == FamosFileKeyType.CV || nextKeyType == FamosFileKeyType.CS) { // go back to start of key this.Reader.BaseStream.Position -= 4; break; } else if (nextKeyType == FamosFileKeyType.Unknown) { this.SkipKey(); continue; } // CD else if (nextKeyType == FamosFileKeyType.CD) { this.XAxisScaling = new FamosFileXAxisScaling(this.Reader, this.CodePage); } // CZ else if (nextKeyType == FamosFileKeyType.CZ) { this.ZAxisScaling = new FamosFileZAxisScaling(this.Reader, this.CodePage); } // NT else if (nextKeyType == FamosFileKeyType.NT) { this.TriggerTime = new FamosFileTriggerTime(this.Reader); } // CP else if (nextKeyType == FamosFileKeyType.CP) { packInfo = new FamosFilePackInfo(this.Reader); } // Cb else if (nextKeyType == FamosFileKeyType.Cb) { if (bufferInfo == null) { bufferInfo = new FamosFileBufferInfo(this.Reader); } else { throw new FormatException("Although the format specification allows multiple '|Cb' keys, this implementation supports only a single definition per component. Please send a sample file to the project maintainer to overcome this limitation in future."); } } // CR else if (nextKeyType == FamosFileKeyType.CR) { this.DeserializeCR(); } // ND else if (nextKeyType == FamosFileKeyType.ND) { this.DisplayInfo = new FamosFileDisplayInfo(this.Reader); } // Cv else if (nextKeyType == FamosFileKeyType.Cv) { throw new NotSupportedException("Events are not supported yet. Please send a sample file to the package author to find a solution."); } //this.EventReference = new FamosFileEventReference(this.Reader); // CN else if (nextKeyType == FamosFileKeyType.CN) { this.Channels.Add(new FamosFileChannel(this.Reader, this.CodePage)); this.Channels.Last().PropertyInfo = propertyInfo; propertyInfo = null; } // Np else if (nextKeyType == FamosFileKeyType.Np) { propertyInfo = new FamosFilePropertyInfo(this.Reader, this.CodePage); } else { // should never happen throw new FormatException("An unexpected state has been reached."); } } if (packInfo is null) { throw new FormatException("No pack information was found in the component."); } else { this.PackInfo = packInfo; } if (bufferInfo is null) { throw new FormatException("No buffer information was found in the component."); } else { this.BufferInfo = bufferInfo; } }
private void Deserialize() { // CF var keyType = this.DeserializeKeyType(); if (keyType != FamosFileKeyType.CF) { throw new FormatException("The file is not a FAMOS file."); } var keyVersion = this.DeserializeInt32(); if (keyVersion == 1) { throw new FormatException($"Only files of format version '2' can be read."); } else if (keyVersion == SUPPORTED_VERSION) { this.DeserializeKey(keySize => { var processor = this.DeserializeInt32(); }); } else { throw new FormatException($"Expected key version '2', got '{keyVersion}'."); } // CK new FamosFileKeyGroup(this.Reader); // Now, all other keys. FamosFileBaseProperty?propertyInfoReceiver = null; while (true) { if (this.Reader.BaseStream.Position >= this.Reader.BaseStream.Length) { return; } var nextKeyType = this.DeserializeKeyType(); // Reset propertyInfoReceiver if next key type is not 'Np'. if (nextKeyType != FamosFileKeyType.Np) { propertyInfoReceiver = null; } // Unknown if (nextKeyType == FamosFileKeyType.Unknown) { this.SkipKey(); continue; } // NO else if (nextKeyType == FamosFileKeyType.NO) { this.OriginInfo = new FamosFileOriginInfo(this.Reader, this.CodePage); } // NL else if (nextKeyType == FamosFileKeyType.NL) { this.LanguageInfo = new FamosFileLanguageInfo(this.Reader); this.CodePage = this.LanguageInfo.CodePage; } // NE - only imc internal else if (nextKeyType == FamosFileKeyType.NE) { this.SkipKey(); } // Ca else if (nextKeyType == FamosFileKeyType.Ca) { throw new FormatException("The functionality of the 'Ca'-key is not supported. Please submit a sample .dat or .raw file to the package author to find a solution."); } // NU else if (nextKeyType == FamosFileKeyType.NU) { this.CustomKeys.Add(new FamosFileCustomKey(this.Reader, this.CodePage)); } // CB else if (nextKeyType == FamosFileKeyType.CB) { this.Groups.Add(new FamosFileGroup(this.Reader, this.CodePage)); propertyInfoReceiver = this.Groups.Last(); } // CG else if (nextKeyType == FamosFileKeyType.CG) { this.Fields.Add(new FamosFileField(this.Reader, this.CodePage)); } // CT else if (nextKeyType == FamosFileKeyType.CT) { _texts.Add(new FamosFileText(this.Reader, this.CodePage)); propertyInfoReceiver = _texts.Last(); } // CI else if (nextKeyType == FamosFileKeyType.CI) { _singleValues.Add(new FamosFileSingleValue.Deserializer(this.Reader, this.CodePage).Deserialize()); propertyInfoReceiver = _singleValues.Last(); } // CS else if (nextKeyType == FamosFileKeyType.CS) { this.RawBlocks.Add(new FamosFileRawBlock(this.Reader)); } // Nv - only for data manager else if (nextKeyType == FamosFileKeyType.Nv) { this.SkipKey(); } // Np else if (nextKeyType == FamosFileKeyType.Np) { var propertyInfo = new FamosFilePropertyInfo(this.Reader, this.CodePage); if (propertyInfoReceiver != null) { propertyInfoReceiver.PropertyInfo = propertyInfo; } else { throw new FormatException("Found property key in an unexpected location."); } propertyInfoReceiver = null; } // Cb else if (nextKeyType == FamosFileKeyType.Cb) { throw new FormatException("Although the format specification allows '|Cb' keys at any level, this implementation supports this key only at component level. Please send a sample file to the project maintainer to overcome this limitation in future."); } else { //throw new FormatException($"Unexpected key '{keyType}'."); this.SkipKey(); } } }