예제 #1
0
        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));
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }
예제 #6
0
 private bool CheckIfOriginSareSame(RepeatTime expected, RepeatTime value)
 {
     return(expected.ActiveDuration == value.ActiveDuration &&
            expected.RepeatInterval == value.RepeatInterval &&
            expected.OffsetsFromStartTime.SequenceEqual(value.OffsetsFromStartTime));
 }
예제 #7
0
        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);
            }
        }