internal Traffic(STFReader stf) { stf.MustMatchBlockStart(); Name = stf.ReadString(); stf.ParseBlock(new STFReader.TokenProcessor[] { new STFReader.TokenProcessor("service_definition", () => { Services.Add(new Services(stf)); }), }); // TrafficFile = new TrafficFile(FolderStructure.TrafficFile(Name)); TrafficFile = new TrafficFile(FolderStructure.RouteFromActivity(stf.FileName).TrafficFile(Name)); }
public Service(Content content) { Debug.Assert(content.Type == ContentType.Service); if (System.IO.Path.GetExtension(content.PathName).Equals(".srv", StringComparison.OrdinalIgnoreCase)) { var file = new ServiceFile(content.PathName); Name = file.Name; Consist = file.Train_Config; Path = file.PathID; Debug.Assert(content is ContentMSTSService); var msts = content as ContentMSTSService; var actFile = new ActivityFile(content.Parent.PathName); if (msts.IsPlayer) { var activityTraffic = actFile.Tr_Activity.Tr_Activity_File.Player_Service_Definition.Player_Traffic_Definition; ID = "0"; StartTime = MSTSTimeToDateTime(activityTraffic.Time); Stops = from stop in activityTraffic.Player_Traffic_List select new Stop(stop.PlatformStartID, stop.DistanceDownPath, MSTSTimeToDateTime(stop.ArrivalTime), MSTSTimeToDateTime(stop.DepartTime)); } else { var trfFile = new TrafficFile(msts.TrafficPathName); var activityService = actFile.Tr_Activity.Tr_Activity_File.Traffic_Definition.ServiceDefinitionList[msts.TrafficIndex]; var trafficService = trfFile.TrafficDefinition.TrafficItems[msts.TrafficIndex]; ID = activityService.UiD.ToString(); StartTime = MSTSTimeToDateTime(activityService.Time); Stops = trafficService.TrafficDetails.Zip(activityService.ServiceList, (tt, stop) => new Stop(stop.PlatformStartID, stop.DistanceDownPath, MSTSTimeToDateTime(tt.ArrivalTime), MSTSTimeToDateTime(tt.DepartTime))); } } else if (System.IO.Path.GetExtension(content.PathName).Equals(".timetable_or", StringComparison.OrdinalIgnoreCase)) { // TODO: Make common timetable parser. var file = new TimetableReader(content.PathName); Name = content.Name; var serviceColumn = -1; var consistRow = -1; var pathRow = -1; var startRow = -1; for (var row = 0; row < file.Strings.Count; row++) { if (file.Strings[row][0] == "#consist" && consistRow == -1) { consistRow = row; } else if (file.Strings[row][0] == "#path" && pathRow == -1) { pathRow = row; } else if (file.Strings[row][0] == "#start" && startRow == -1) { startRow = row; } } for (var column = 0; column < file.Strings[0].Length; column++) { if (file.Strings[0][column] == content.Name && serviceColumn == -1) { serviceColumn = column; } } ID = serviceColumn.ToString(); var timeRE = new Regex(@"^(\d\d):(\d\d)(?:-(\d\d):(\d\d))?"); var startTimeMatch = timeRE.Match(file.Strings[startRow][serviceColumn]); if (startTimeMatch.Success) { StartTime = new DateTime(2000, 1, 1, int.Parse(startTimeMatch.Groups[1].Value), int.Parse(startTimeMatch.Groups[2].Value), 0); } var stops = new List <Stop>(); for (var row = 0; row < file.Strings.Count; row++) { if (row != startRow) { var timeMatch = timeRE.Match(file.Strings[row][serviceColumn]); if (timeMatch.Success) { var arrivalTime = new DateTime(2000, 1, 1, int.Parse(timeMatch.Groups[1].Value), int.Parse(timeMatch.Groups[2].Value), 0); var departureTime = timeMatch.Groups[3].Success ? new DateTime(2000, 1, 1, int.Parse(timeMatch.Groups[3].Value), int.Parse(timeMatch.Groups[4].Value), 0) : arrivalTime; // If the time is prior to this train's start time, assume it is rolling over in to "tomorrow". if (arrivalTime < StartTime) { arrivalTime = arrivalTime.AddDays(1); departureTime = departureTime.AddDays(1); } stops.Add(new Stop(file.Strings[row][0].Replace(" $hold", "").Replace(" $forcehold", ""), arrivalTime, departureTime)); } } } Stops = stops.OrderBy(s => s.ArrivalTime); Consist = file.Strings[consistRow][serviceColumn].Replace(" $reverse", ""); Reversed = file.Strings[consistRow][serviceColumn].Contains(" $reverse"); Path = file.Strings[pathRow][serviceColumn]; } }
/// <summary> /// Try to load the file. /// Possibly this might raise an exception. That exception is not caught here /// </summary> /// <param name="file">The file that needs to be loaded</param> public override void TryLoading(string file) { _ = new TrafficFile(file); }