示例#1
0
        private static Session ReadSession(BinaryReader reader, int length)
        {
            List <DateTime>  mapReadingList   = null;
            Route            route            = null;
            HandleCollection handles          = null;
            LongLat          projectionOrigin = null;
            LapCollection    laps             = null;
            var         startPos    = reader.BaseStream.Position;
            SessionInfo sessionInfo = null;
            DateTime    lastTime;

            while (reader.BaseStream.Position < startPos + length)
            {
                var tag       = (Tags)reader.ReadByte();
                var tagLength = Convert.ToInt32(reader.ReadUInt32());
                switch (tag)
                {
                case Tags.Route:
                    var attributes = reader.ReadUInt16();
                    var extraWaypointAttributesLength = reader.ReadUInt16();
                    var routeSegments = new List <RouteSegment>();
                    var segmentCount  = reader.ReadUInt32();
                    lastTime = DateTime.MinValue;
                    for (var i = 0; i < segmentCount; i++)
                    {
                        var rs            = new RouteSegment();
                        var waypointCount = reader.ReadUInt32();
                        for (var j = 0; j < waypointCount; j++)
                        {
                            var w = new Waypoint();
                            w.LongLat = ReadLongLat(reader);
                            w.Time    = ReadTime(lastTime, reader);
                            lastTime  = w.Time;
                            if ((attributes & (UInt16)WaypointAttribute.HeartRate) == (UInt16)WaypointAttribute.HeartRate)
                            {
                                w.HeartRate = reader.ReadByte();
                            }
                            if ((attributes & (UInt16)WaypointAttribute.Altitude) == (UInt16)WaypointAttribute.Altitude)
                            {
                                w.Altitude = reader.ReadInt16();
                            }
                            reader.BaseStream.Position += extraWaypointAttributesLength; // for forward compatibility
                            rs.Waypoints.Add(w);
                        }
                        routeSegments.Add(rs);
                    }
                    route = new Route(routeSegments);
                    break;

                case Tags.Handles:
                    handles = new HandleCollection();
                    var handleCount        = reader.ReadUInt32();
                    var handleMarkerDrawer = SessionSettings.CreateDefaultMarkerDrawers()[MarkerType.Handle];
                    for (var i = 0; i < handleCount; i++)
                    {
                        var handle = new Handle();
                        // transformation matrix
                        handle.TransformationMatrix = new GeneralMatrix(3, 3);
                        for (var j = 0; j < 9; j++)
                        {
                            handle.TransformationMatrix.SetElement(j / 3, j % 3, reader.ReadDouble());
                        }
                        // parameterized location
                        var segmentIndex = Convert.ToInt32(reader.ReadUInt32());
                        var value        = reader.ReadDouble();
                        handle.ParameterizedLocation = new ParameterizedLocation(segmentIndex, value);

                        // pixel location
                        handle.Location = new PointD(reader.ReadDouble(), reader.ReadDouble());
                        // type
                        handle.Type = (Handle.HandleType)reader.ReadInt16();
                        // use default marker drawer
                        handle.MarkerDrawer = handleMarkerDrawer;

                        handles.Add(handle);
                    }
                    break;

                case Tags.ProjectionOrigin:
                    projectionOrigin = ReadLongLat(reader);
                    break;

                case Tags.Laps:
                    laps = new LapCollection();
                    var lapCount = reader.ReadUInt32();
                    for (var i = 0; i < lapCount; i++)
                    {
                        var lap = new Lap();
                        lap.Time    = DateTime.FromBinary(reader.ReadInt64());
                        lap.LapType = (LapType)reader.ReadByte();
                        laps.Add(lap);
                    }
                    break;

                case Tags.SessionInfo:
                    sessionInfo             = new SessionInfo();
                    sessionInfo.Person      = new SessionPerson();
                    sessionInfo.Person.Name = ReadString(reader);
                    sessionInfo.Person.Club = ReadString(reader);
                    sessionInfo.Person.Id   = reader.ReadUInt32();
                    sessionInfo.Description = ReadString(reader);
                    // when more fields are added, check so that tagLength is not passed
                    break;

                case Tags.MapReadingInfo:
                    mapReadingList = new List <DateTime>();
                    lastTime       = DateTime.MinValue;
                    var startPosition = reader.BaseStream.Position;
                    while (reader.BaseStream.Position - startPosition < tagLength)
                    {
                        var time = ReadTime(lastTime, reader);
                        mapReadingList.Add(time);
                        lastTime = time;
                    }
                    break;

                default:
                    reader.BaseStream.Position += tagLength;
                    break;
                }
            }

            if (mapReadingList != null && route != null)
            {
                route = new Route(Route.AddMapReadingWaypoints(route.Segments, mapReadingList));
            }
            var session = new Session(
                route,
                laps,
                new Size(0, 0),
                handles != null && handles.Count > 0 ? handles[0].TransformationMatrix : null,
                projectionOrigin,
                new SessionSettings());

            if (handles != null)
            {
                foreach (var h in handles)
                {
                    session.AddHandle(h);
                }
            }
            if (sessionInfo != null)
            {
                session.SessionInfo = sessionInfo;
            }

            return(session);
        }