public static MusicTrack ParseMusicTrack(byte[] data) { using (var reader = new BinaryReader(new MemoryStream(data))) { var musicTrack = new MusicTrack(data.Length); musicTrack.Id = reader.ReadUInt32(); musicTrack.Unknown = reader.ReadByte(); musicTrack.SoundCount = reader.ReadUInt32(); musicTrack.Sounds = new Sound[musicTrack.SoundCount]; for (var i = 0; i < musicTrack.SoundCount; i++) { var sound = new Sound(0); sound.Unknown_04 = reader.ReadByte(); sound.Unknown_05 = reader.ReadByte(); sound.Conversion = (ConversionType)reader.ReadByte(); sound.Unknown_07 = reader.ReadByte(); sound.Source = (AudioSource)reader.ReadByte(); sound.AudioId = reader.ReadUInt32(); sound.AudioLength = reader.ReadUInt32(); sound.AudioType = (AudioType)reader.ReadByte(); musicTrack.Sounds[i] = sound; } musicTrack.TimeParameterCount = reader.ReadUInt32(); musicTrack.TimeParameters = new TimeParameter[musicTrack.TimeParameterCount]; for (var i = 0; i < musicTrack.TimeParameterCount; i++) { TimeParameter timeParameter = default; timeParameter.SubTrackIndex = reader.ReadUInt32(); timeParameter.AudioId = reader.ReadUInt32(); timeParameter.BeginOffset = reader.ReadDouble(); timeParameter.BeginTrimOffset = reader.ReadDouble(); timeParameter.EndOffset = reader.ReadDouble(); timeParameter.EndTrimOffset = reader.ReadDouble(); musicTrack.TimeParameters[i] = timeParameter; } musicTrack.SubTrackCount = reader.ReadUInt32(); musicTrack.CurveCount = reader.ReadUInt32(); musicTrack.Curves = new Curve[musicTrack.CurveCount]; for (var i = 0; i < musicTrack.CurveCount; i++) { Curve curve = default; curve.TimeParameterIndex = reader.ReadUInt32(); curve.Type = (FadeCurveType)reader.ReadUInt32(); curve.PointCount = reader.ReadUInt32(); curve.Points = new FadePoint[curve.PointCount]; for (var j = 0; j < curve.PointCount; j++) { FadePoint fadePoint = default; fadePoint.FromX = reader.ReadSingle(); fadePoint.FromY = reader.ReadSingle(); fadePoint.FollowingCurveShape = (BlendCurveShape)reader.ReadUInt32(); curve.Points[j] = fadePoint; } musicTrack.Curves[i] = curve; } musicTrack.Properties = reader.ReadAudioProperties(); musicTrack.TrackType = (TrackType)reader.ReadByte(); if (musicTrack.TrackType == TrackType.Switch) { SwitchParameters switchParameters = default; switchParameters.Unknown = reader.ReadByte(); switchParameters.GroupId = reader.ReadUInt32(); switchParameters.DefaultSwitchOrStateId = reader.ReadUInt32(); switchParameters.SubTrackCount = reader.ReadUInt32(); switchParameters.AssociatedSwitchOrStateIds = new uint[switchParameters.SubTrackCount]; for (var i = 0; i < switchParameters.SubTrackCount; i++) { switchParameters.AssociatedSwitchOrStateIds[i] = reader.ReadUInt32(); } switchParameters.FadeOutDuration = reader.ReadUInt32(); switchParameters.FadeOutCurveShape = (BlendCurveShape)reader.ReadUInt32(); switchParameters.FadeOutOffset = reader.ReadInt32(); switchParameters.ExitSourceAt = (InteractiveMusicKeyPoint)reader.ReadUInt32(); switchParameters.ExitSourceAtCueId = reader.ReadUInt32(); switchParameters.FadeInDuration = reader.ReadUInt32(); switchParameters.FadeInCurveShape = (BlendCurveShape)reader.ReadUInt32(); switchParameters.FadeInOffset = reader.ReadInt32(); musicTrack.SwitchParameters = switchParameters; } musicTrack.LookAheadTime = reader.ReadUInt32(); return(musicTrack); } }
private List <DicomPatientData> ParseXml(string xmlfile, out List <Patient> patients) { var doc = new XmlDocument(); doc.Load(xmlfile); var dicomPatients = new List <DicomPatientData>(); patients = new List <Patient>(); XmlNodeList nodes = doc.DocumentElement.SelectNodes("/responses/data-set"); foreach (XmlNode node in nodes) { string patientFirstName = null, patientLastName = null, patientId = null, patientBirthDate = null, patientSex = null, characterSet = null; string transliteratedPatientFirstName = null, transliteratedPatientLastName = null; TimeParameter tp = null; TRICS.Planner.Model.Common.Gender gender = TRICS.Planner.Model.Common.Gender.Unknown; bool transliterationOk = false; foreach (XmlNode elem in node.SelectNodes("element")) { var el = elem.Attributes.GetNamedItem("name"); if (el.InnerText.StartsWith("PatientName")) { var patientName = elem.InnerText; var group1 = patientName.Split('=')[0]; string converted = GetConvertedString(group1); if (converted != null) { transliterationOk = true; var namePieces = group1.Split('^'); if (namePieces.Length == 1) { // just the last name is given patientLastName = namePieces[0]; } if (namePieces.Length >= 2) { patientLastName = namePieces[0]; patientFirstName = namePieces[1]; } var transliteratedPieces = converted.Split('^'); if (transliteratedPieces.Length == 1) { // just the last name is given transliteratedPatientLastName = transliteratedPieces[0]; } if (transliteratedPieces.Length >= 2) { transliteratedPatientLastName = transliteratedPieces[0]; transliteratedPatientFirstName = transliteratedPieces[1]; } } } else if (el.InnerText.StartsWith("PatientID")) { patientId = elem.InnerText; } else if (el.InnerText.StartsWith("PatientBirthDate")) { if (elem.InnerText.Length >= 8) { tp = new TimeParameter { Year = Int32.Parse(elem.InnerText.Substring(0, 4)), Month = Int32.Parse(elem.InnerText.Substring(4, 2)), Day = Int32.Parse(elem.InnerText.Substring(6, 2)) }; var year = Int32.Parse(elem.InnerText.Substring(0, 4)); var month = Int32.Parse(elem.InnerText.Substring(4, 2)); var day = Int32.Parse(elem.InnerText.Substring(6, 2)); patientBirthDate = day + "/" + month + "/" + year; } } else if (el.InnerText.StartsWith("PatientSex")) { if (String.IsNullOrWhiteSpace(elem.InnerText)) { gender = TRICS.Planner.Model.Common.Gender.Unknown; } else { if (elem.InnerText.StartsWith("M")) { gender = TRICS.Planner.Model.Common.Gender.Male; } else if (elem.InnerText.StartsWith("F")) { gender = TRICS.Planner.Model.Common.Gender.Female; } else { gender = TRICS.Planner.Model.Common.Gender.Any; } } patientSex = elem.InnerText; } else if (el.InnerText.StartsWith("SpecificCharacterSet")) { characterSet = elem.InnerText; } } if (transliterationOk) { // even if transliteration succeeds, check the character set if (!String.IsNullOrWhiteSpace(characterSet)) { // check if we support the first alphabet given string alphabet = characterSet.Split('\\')[0].Trim(); if (alphabet.Count() > 0) { if (!supportedAplhabets.Contains(alphabet)) { // alphabet not supported, so we reject this patient altogheter transliterationOk = false; } } // else it is the default ASCII } if (transliterationOk) { Patient patient = new Patient { ChartNumber = patientId, LastName = transliteratedPatientLastName, FirstName = transliteratedPatientFirstName, Birthday = tp, Gender = gender }; patient.Birthday.UserFormat = "dd/MM/yyyy"; patients.Add(patient); if (String.IsNullOrWhiteSpace(characterSet)) { // in case we don't have a SpecificCharacterSet from findscu // and the transliterated names don't coincide with the original ones, // we need to specify UTF8 as character set, since the default ASCII won't do if ( ( (transliteratedPatientFirstName != null) && !transliteratedPatientFirstName.Equals(patientFirstName, StringComparison.InvariantCultureIgnoreCase) ) || ( (transliteratedPatientLastName != null) && !transliteratedPatientLastName.Equals(patientLastName, StringComparison.InvariantCultureIgnoreCase) ) ) { characterSet = SupportedCharacterSets.UTF8; } } DicomPatientData person = new DicomPatientData { Identity = new DicomWorkItem { PatientLastName = patientLastName, PatientFirstName = patientFirstName, PatientID = patientId, PatientBirthDate = patientBirthDate, PatientSex = patientSex, SpecificCharacterSet = characterSet }, PatientKey = patient.GetFallbackKey().ToUpper() }; dicomPatients.Add(person); } else { Logger.WriteMsg(LogSeverity.Warning, $"Given character set {characterSet} not supported"); } } else { Logger.WriteMsg(LogSeverity.Warning, $"Can't transliterate patient with ID {patientId}"); } } return(dicomPatients); }