using Google.Protobuf; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.PMR; using Tango.PMR.Common; using Tango.PMR.Printing; namespace Tango.Integration.Operation { /// /// Represents a job description file containing a series of job segments and brush stops. /// public class JobDescriptionFile { private IEnumerable _segments; /// /// Initializes a new instance of the class. /// /// The segments. public JobDescriptionFile(IEnumerable segments) { _segments = segments; } /// /// Returns a memory stream containing the job description file data. /// /// public MemoryStream ToStream() { List messages = new List(); foreach (var segment in _segments) { var seg = new JobDescriptionFileSegment() { Name = segment.Name, Length = segment.Length, BrushStopsCount = segment.BrushStops.Count, }; messages.Add(seg); foreach (var stop in segment.BrushStops) { var st = new JobDescriptionFileBrushStop() { Index = stop.Index, OffsetMeters = stop.OffsetMeters, OffsetPercent = stop.OffsetPercent, }; st.Dispensers.AddRange(stop.Dispensers.ToList()); messages.Add(st); } } MemoryStream ms = new MemoryStream(); BinaryWriter writer = new BinaryWriter(ms); foreach (var msg in messages) { byte[] data = msg.ToByteArray(); writer.Write(data.Length); writer.Write(data); } ms.Position = 0; return ms; } /// /// Returns an array of bytes containing the job description file data. /// /// public byte[] ToBytes() { using (var ms = ToStream()) { return ms.ToArray(); } } /// /// Reads the job description file. /// /// The file path. /// public static List ReadJobDescriptionFile(String filePath) { using (FileStream fs = new FileStream(filePath, FileMode.Open)) { return ReadJobDescriptionFile(fs); } } /// /// Reads the job description file. /// ///Source stream. /// public static List ReadJobDescriptionFile(Stream stream) { List segments = new List(); using (BinaryReader reader = new BinaryReader(stream)) { while (stream.Position < stream.Length) { int length = reader.ReadInt32(); var segment = JobDescriptionFileSegment.Parser.ParseFrom(reader.ReadBytes(length)); JobSegment s = new JobSegment(); s.Length = segment.Length; s.Name = segment.Name; for (int i = 0; i < segment.BrushStopsCount; i++) { length = reader.ReadInt32(); var stop = JobDescriptionFileBrushStop.Parser.ParseFrom(reader.ReadBytes(length)); JobBrushStop st = new JobBrushStop(); st.Dispensers.AddRange(stop.Dispensers); st.Index = stop.Index; st.OffsetMeters = stop.OffsetMeters; st.OffsetPercent = stop.OffsetPercent; s.BrushStops.Add(st); } segments.Add(s); } } return segments; } } }