public void CanDeSerialize() { var testRepeatTime = $"r=604800 3600 0 90000"; var expected = new RepeatTime() { RepeatInterval = TimeSpan.FromSeconds(604800), ActiveDuration = TimeSpan.FromSeconds(3600), OffsetsFromStartTime = new List <TimeSpan>() { TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(90000), } }; var value = RepeatTimeSerializer.Instance.ReadValue(testRepeatTime.ToByteArray()); Assert.True(CheckIfOriginSareSame(expected, value)); }
public void WriteValue(IBufferWriter <byte> writer, RepeatTime value) { if (value.OffsetsFromStartTime == null || !value.OffsetsFromStartTime.Any()) { throw new SerializationException("Repeat Time field: offsets from start-time are required"); } var field = $"r={value.RepeatInterval.TotalSeconds} {value.ActiveDuration.TotalSeconds}"; writer.WriteString(field); foreach (var offset in value.OffsetsFromStartTime) { writer.WriteString(" " + offset.TotalSeconds.ToString()); } writer.WriteString(SDPSerializer.CRLF); }
public override int GetHashCode() { int hash = 1; if (ItemLotGroupId != 0) { hash ^= ItemLotGroupId.GetHashCode(); } if (RepeatTime != 0) { hash ^= RepeatTime.GetHashCode(); } hash ^= conditions_.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } return(hash); }
public RepeatTime ReadValue(ReadOnlySpan <byte> data) { var remainingSlice = data; //header SerializationHelpers.ParseRequiredHeader("Repeat Time field", remainingSlice, HeaderBytes); remainingSlice = remainingSlice.Slice(HeaderBytes.Length); var rt = new RepeatTime() { OffsetsFromStartTime = new List <TimeSpan>() }; //repeat interval rt.RepeatInterval = SerializationHelpers.ParseRequiredTimespan("Repeat Time field: repeat interval", SerializationHelpers.NextRequiredDelimitedField("Repeat Time field: repeat interval", SDPSerializer.ByteSpace, remainingSlice, out var consumed)); remainingSlice = remainingSlice.Slice(consumed + 1); //active duration rt.ActiveDuration = SerializationHelpers.ParseRequiredTimespan("Repeat Time field: active duration", SerializationHelpers.NextRequiredDelimitedField("Repeat Time field: active duration", SDPSerializer.ByteSpace, remainingSlice, out consumed)); remainingSlice = remainingSlice.Slice(consumed + 1); //offsets from start-time ReadOnlySpan <byte> token; while ((token = SerializationHelpers.NextDelimitedField(SDPSerializer.ByteSpace, remainingSlice, out consumed)) != null) { rt.OffsetsFromStartTime.Add(SerializationHelpers.ParseRequiredTimespan("Repeat Time field: offsets from start-time are required", token)); //There is no remaining peace left if (remainingSlice.Length <= consumed + 1) { break; } remainingSlice = remainingSlice.Slice(consumed + 1); } return(rt); }
public async Task CanSerialize() { var expected = $"r=604800 3600 0 90000{SDPLib.SDPSerializer.CRLF}".ToByteArray(); var pipe = new Pipe(); var value = new RepeatTime() { RepeatInterval = TimeSpan.FromSeconds(604800), ActiveDuration = TimeSpan.FromSeconds(3600), OffsetsFromStartTime = new List <TimeSpan>() { TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(90000), } }; RepeatTimeSerializer.Instance.WriteValue(pipe.Writer, value); pipe.Writer.Complete(); var serialized = (await pipe.Reader.ReadAsync()).Buffer.ToArray(); Assert.Equal(expected, serialized); }
private bool CheckIfOriginSareSame(RepeatTime expected, RepeatTime value) { return(expected.ActiveDuration == value.ActiveDuration && expected.RepeatInterval == value.RepeatInterval && expected.OffsetsFromStartTime.SequenceEqual(value.OffsetsFromStartTime)); }
public static SDP Parse(string data) { TimeDescription currentTd = null; MediaDescription currentMd = null; try { SDP sdp = new SDP(); var lines = Regex.Split(data, CRLF); foreach (var line in lines) { var trimmed = line.Trim(); if (trimmed.StartsWith("v=")) { var value = ParseKeyValueLine(trimmed, "Session Version"); decimal version; if (!decimal.TryParse(value, out version)) { // TODO(frank.lamar): warn. } else { sdp.Version = version; } } else if (trimmed.StartsWith("o=")) { sdp.Origin = SessionOriginator.Parse(trimmed); } else if (trimmed.StartsWith("s=")) { sdp.SessionName = ParseKeyValueLine(trimmed, "Session Name"); } else if (trimmed.StartsWith("i=")) { var info = ParseKeyValueLine(trimmed, "Session Information"); if (currentMd != null) { // Media Title at the media level currentMd.MediaTitle = info; } else { // Session information at the Session level. sdp.SessionInformation = info; } } else if (trimmed.StartsWith("u=")) { var value = ParseKeyValueLine(trimmed, "Session URI"); Uri uri; if (!Uri.TryCreate(value, UriKind.RelativeOrAbsolute, out uri)) { throw new SdpParseException($"Unable to parse malformed Session URI {value}"); } sdp.URI = uri; } else if (trimmed.StartsWith("e=")) { sdp.Email = ParseKeyValueLine(trimmed, "Session Email"); } else if (trimmed.StartsWith("p=")) { sdp.PhoneNumber = ParseKeyValueLine(trimmed, "Session Phone Number"); } else if (trimmed.StartsWith("c=")) { var connection = ConnectionInfo.Parse(trimmed); if (currentMd != null) { // Media Description connection currentMd.Connection = connection; } else { // Session level connection sdp.Connection = connection; } } else if (trimmed.StartsWith("b=")) { var bandwidth = BandwidthInfo.Parse(trimmed); if (currentMd != null) { // Media Description bandwidth currentMd.Bandwidths.Add(bandwidth); } else { // Session level bandwidth sdp.Bandwidths.Add(bandwidth); } } else if (trimmed.StartsWith("t=")) { currentTd = TimeDescription.Parse(trimmed); sdp.TimeDescriptions.Add(currentTd); } else if (trimmed.StartsWith("r=")) { if (currentTd != null) { currentTd.RepeatTimes.Add(RepeatTime.Parse(trimmed)); } // Just ignore the repeate time if no current time was defined. } else if (trimmed.StartsWith("z=")) { sdp.TimeZone = TimeZone.Parse(trimmed); } else if (trimmed.StartsWith("a=")) { if (currentMd != null) { // Media Description level attribute currentMd.Attributes.Add(Attribute.Parse(trimmed)); } else { // Session level attribute sdp.Attributes.Add(Attribute.Parse(trimmed)); } } else if (trimmed.StartsWith("m=")) { currentMd = MediaDescription.Parse(trimmed); sdp.MediaDescriptions.Add(currentMd); } } // end foreach... return(sdp); } catch (Exception e) { if (e is SdpParseException) { throw e; } throw new SdpParseException("Failed to parse session description", e); } }