private static IEnumerable <Reader.Metadata> LoadMetadata(Reader reader) { var segments = GetSegments(reader).ToList(); var prevMetaDataLookup = new Dictionary <string, Dictionary <string, Reader.Metadata> >(); foreach (var segment in segments) { if (!(segment.TableOfContents.ContainsNewObjects || segment.TableOfContents.HasDaqMxData || segment.TableOfContents.HasMetaData || segment.TableOfContents.HasRawData)) { continue; } var metadatas = reader.ReadMetadata(segment); long rawDataSize = 0; long nextOffset = segment.RawDataOffset; foreach (var m in metadatas) { if (m.RawData.Count == 0 && m.Path.Length > 1) { // apply previous metadata if available if (prevMetaDataLookup.ContainsKey(m.Path[0]) && prevMetaDataLookup[m.Path[0]].ContainsKey(m.Path[1])) { var prevMetaData = prevMetaDataLookup[m.Path[0]][m.Path[1]]; if (prevMetaData != null) { m.RawData.Count = segment.TableOfContents.HasRawData ? prevMetaData.RawData.Count : 0; m.RawData.DataType = prevMetaData.RawData.DataType; m.RawData.ClrDataType = prevMetaData.RawData.ClrDataType; m.RawData.Offset = segment.RawDataOffset + rawDataSize; m.RawData.IsInterleaved = prevMetaData.RawData.IsInterleaved; m.RawData.InterleaveStride = prevMetaData.RawData.InterleaveStride; m.RawData.Size = prevMetaData.RawData.Size; m.RawData.Dimension = prevMetaData.RawData.Dimension; } } } if (m.RawData.IsInterleaved && segment.NextSegmentOffset <= 0) { m.RawData.Count = segment.NextSegmentOffset > 0 ? (segment.NextSegmentOffset - m.RawData.Offset + m.RawData.InterleaveStride - 1) / m.RawData.InterleaveStride : (reader.FileSize - m.RawData.Offset + m.RawData.InterleaveStride - 1) / m.RawData.InterleaveStride; } if (m.Path.Length > 1) { rawDataSize += m.RawData.Size; nextOffset += m.RawData.Size; } } var implicitMetadatas = new List <Reader.Metadata>(); if (metadatas.All(m => !m.RawData.IsInterleaved && m.RawData.Size > 0)) { while (nextOffset < segment.NextSegmentOffset || (segment.NextSegmentOffset == -1 && nextOffset < reader.FileSize)) { // Incremental Meta Data see http://www.ni.com/white-paper/5696/en/#toc1 foreach (var m in metadatas) { if (m.Path.Length > 1) { var implicitMetadata = new Reader.Metadata() { Path = m.Path, RawData = new Reader.RawData() { Count = m.RawData.Count, DataType = m.RawData.DataType, ClrDataType = m.RawData.ClrDataType, Offset = nextOffset, IsInterleaved = m.RawData.IsInterleaved, Size = m.RawData.Size, Dimension = m.RawData.Dimension }, Properties = m.Properties }; implicitMetadatas.Add(implicitMetadata); nextOffset += implicitMetadata.RawData.Size; } } } } var metadataWithImplicit = metadatas.Concat(implicitMetadatas).ToList(); foreach (var metadata in metadataWithImplicit) { if (metadata.Path.Length == 2) { if (!prevMetaDataLookup.ContainsKey(metadata.Path[0])) { prevMetaDataLookup[metadata.Path[0]] = new Dictionary <string, Reader.Metadata>(); } prevMetaDataLookup[metadata.Path[0]][metadata.Path[1]] = metadata; } yield return(metadata); } } }
private static IEnumerable <Reader.Metadata> LoadMetadata(Reader reader) { var segments = GetSegments(reader).ToList(); var segmentMetadata = new List <Tuple <Reader.Segment, List <Reader.Metadata> > >(); Tuple <Reader.Segment, List <Reader.Metadata> > prevSegment = null; foreach (var segment in segments) { var metadatas = reader.ReadMetadata(segment); long rawDataSize = 0; long nextOffset = segment.RawDataOffset; foreach (var m in metadatas) { if (m.RawData.Count == 0 && prevSegment != null && m.Path.Length > 1) { // apply previous metadata if available var prevMetaData = prevSegment.Item2.FirstOrDefault(md => md.Path.Length > 1 && md.Path[1] == m.Path[1]); if (prevMetaData != null) { m.RawData.Count = prevMetaData.RawData.Count; m.RawData.DataType = prevMetaData.RawData.DataType; m.RawData.ClrDataType = prevMetaData.RawData.ClrDataType; m.RawData.Offset = segment.RawDataOffset + rawDataSize; m.RawData.IsInterleaved = prevMetaData.RawData.IsInterleaved; m.RawData.InterleaveStride = prevMetaData.RawData.InterleaveStride; m.RawData.Size = prevMetaData.RawData.Size; m.RawData.Dimension = prevMetaData.RawData.Dimension; } } if (m.RawData.IsInterleaved && segment.NextSegmentOffset <= 0) { m.RawData.Count = segment.NextSegmentOffset > 0 ? (segment.NextSegmentOffset - m.RawData.Offset + m.RawData.InterleaveStride - 1) / m.RawData.InterleaveStride : (reader.FileSize - m.RawData.Offset + m.RawData.InterleaveStride - 1) / m.RawData.InterleaveStride; } if (m.Path.Length > 1) { rawDataSize += m.RawData.Size; nextOffset += m.RawData.Size; } } var implicitMetadatas = new List <Reader.Metadata>(); if (metadatas.All(m => !m.RawData.IsInterleaved && m.RawData.Size > 0)) { while (nextOffset < segment.NextSegmentOffset || (segment.NextSegmentOffset == -1 && nextOffset < reader.FileSize)) { // Incremental Meta Data see http://www.ni.com/white-paper/5696/en/#toc1 foreach (var m in metadatas) { if (m.Path.Length > 1) { var implicitMetadata = new Reader.Metadata() { Path = m.Path, RawData = new Reader.RawData() { Count = m.RawData.Count, DataType = m.RawData.DataType, ClrDataType = m.RawData.ClrDataType, Offset = nextOffset, IsInterleaved = m.RawData.IsInterleaved, Size = m.RawData.Size, Dimension = m.RawData.Dimension }, Properties = m.Properties }; implicitMetadatas.Add(implicitMetadata); nextOffset += implicitMetadata.RawData.Size; } } } } var metadataWithImplicit = metadatas.Concat(implicitMetadatas).ToList(); prevSegment = Tuple.Create(segment, metadataWithImplicit); segmentMetadata.Add(prevSegment); } return(segmentMetadata.SelectMany(st => st.Item2)); }