aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Integration/Operation/JobDescriptionFile.cs
blob: f87252dde614933f388b4f3b123090e91c3b7f1a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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
{
    /// <summary>
    /// Represents a job description file containing a series of job segments and brush stops.
    /// </summary>
    public class JobDescriptionFile
    {
        private IEnumerable<JobSegment> _segments;

        /// <summary>
        /// Initializes a new instance of the <see cref="JobDescriptionFile"/> class.
        /// </summary>
        /// <param name="segments">The segments.</param>
        public JobDescriptionFile(IEnumerable<JobSegment> segments)
        {
            _segments = segments;
        }

        /// <summary>
        /// Returns a memory stream containing the job description file data.
        /// </summary>
        /// <returns></returns>
        public MemoryStream ToStream()
        {
            List<IMessage> messages = new List<IMessage>();

            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;
        }

        /// <summary>
        /// Returns an array of bytes containing the job description file data.
        /// </summary>
        /// <returns></returns>
        public byte[] ToBytes()
        {
            using (var ms = ToStream())
            {
                return ms.ToArray();
            }
        }

        /// <summary>
        /// Reads the job description file.
        /// </summary>
        /// <param name="filePath">The file path.</param>
        /// <returns></returns>
        public static List<JobSegment> ReadJobDescriptionFile(String filePath)
        {
            using (FileStream fs = new FileStream(filePath, FileMode.Open))
            {
                return ReadJobDescriptionFile(fs);
            }
        }

        /// <summary>
        /// Reads the job description file.
        /// </summary>
        ///<param name="stream">Source stream.</param>
        /// <returns></returns>
        public static List<JobSegment> ReadJobDescriptionFile(Stream stream)
        {
            List<JobSegment> segments = new List<JobSegment>();

            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;
        }
    }
}