Ejemplo n.º 1
0
        public DeserializationState ReadValue(ReadOnlySpan <byte> data, DeserializationSession session)
        {
            if (session.ParsedValue.Uri != null)
            {
                throw new DeserializationException("No more than one URI field is allowed per session description");
            }

            if (session.ParsedValue.MediaDescriptions != null && session.ParsedValue.MediaDescriptions.Any())
            {
                throw new DeserializationException($"Uri MUST be specified before the first media field");
            }

            var remainingSlice = data;

            //header
            SerializationHelpers.ParseRequiredHeader("Uri field", remainingSlice, HeaderBytes);
            remainingSlice = remainingSlice.Slice(HeaderBytes.Length);

            //uri
            var uriString =
                SerializationHelpers.ParseRequiredString("Uri field",
                                                         SerializationHelpers.NextRequiredField("Uri field", remainingSlice));

            if (Uri.TryCreate(uriString, UriKind.RelativeOrAbsolute, out var parsedUri))
            {
                session.ParsedValue.Uri = parsedUri;
            }
            else
            {
                throw new DeserializationException($"Invalid Uri field value: {uriString}");
            }

            return(OptionalValueDeSerializer.Instance.ReadValue);
        }
Ejemplo n.º 2
0
        public DeserializationState ReadValue(ReadOnlySpan <byte> data, DeserializationSession session)
        {
            var remainingSlice = data;

            //header
            SerializationHelpers.ParseRequiredHeader("Session name", data, HeaderBytes);
            remainingSlice = remainingSlice.Slice(HeaderBytes.Length);

            //value
            session.ParsedValue.SessionName = SerializationHelpers.NextRequiredField("Session name", remainingSlice).ToArray();
            return(OptionalValueDeSerializer.Instance.ReadValue);
        }
Ejemplo n.º 3
0
        public DeserializationState ReadValue(ReadOnlySpan <byte> data, DeserializationSession session)
        {
            if (data.Length == 0)
            {
                throw new DeserializationException("Invalid sdp field");
            }

            var media = session.ParsedValue.MediaDescriptions.LastOrDefault();

            if (media == null)
            {
                throw new DeserializationException($"Media fields must start after m= field");
            }

            switch (data[0])
            {
            case MediaTitleSerializer.Identifier:
                media.Title = MediaTitleSerializer.Instance.ReadValue(data);
                break;

            case ConnectionDataSerializer.Identifier:
                media.ConnectionInfo = ConnectionDataSerializer.Instance.ReadValue(data);
                break;

            case BandwithSerializer.Identifier:
                media.Bandwiths = media.Bandwiths ?? new List <Bandwidth>();
                media.Bandwiths.Add(BandwithSerializer.Instance.ReadValue(data));
                break;

            case EncriptionKeySerializer.Identifier:
                media.EncriptionKey = EncriptionKeySerializer.Instance.ReadValue(data);
                break;

            case AttributeSerializer.Identifier:
                media.Attributes = media.Attributes ?? new List <string>();
                media.Attributes.Add(AttributeSerializer.Instance.ReadValue(data));
                break;

            case MediaSerializer.Identifier:
                session.ParsedValue.MediaDescriptions = session.ParsedValue.MediaDescriptions ?? new List <MediaDescription>();
                session.ParsedValue.MediaDescriptions.Add(MediaSerializer.Instance.ReadValue(data));
                return(Instance.ReadValue);

            default:
                throw new DeserializationException($"Unknown field {(char)data[0]}");
            }

            return(this.ReadValue);
        }
Ejemplo n.º 4
0
        public DeserializationState ReadValue(ReadOnlySpan <byte> data, DeserializationSession session)
        {
            var remainingSlice = data;

            //header
            SerializationHelpers.ParseRequiredHeader("Origin field", remainingSlice, HeaderBytes);
            remainingSlice = remainingSlice.Slice(HeaderBytes.Length);

            session.ParsedValue.Origin = new Origin();

            //username
            session.ParsedValue.Origin.UserName =
                SerializationHelpers.ParseRequiredString("Origin field: username",
                                                         SerializationHelpers.NextRequiredDelimitedField("Origin field: username", SDPSerializer.ByteSpace, remainingSlice, out var consumed));
            remainingSlice = remainingSlice.Slice(consumed + 1);

            //sess-id
            session.ParsedValue.Origin.SessionId = SerializationHelpers.ParseLong("Origin field: sess-id",
                                                                                  SerializationHelpers.NextRequiredDelimitedField("Origin field: sess-id", SDPSerializer.ByteSpace, remainingSlice, out consumed));
            remainingSlice = remainingSlice.Slice(consumed + 1);

            //sess-version
            session.ParsedValue.Origin.SessionVersion = SerializationHelpers.ParseLong("Origin field: sess-version",
                                                                                       SerializationHelpers.NextRequiredDelimitedField("Origin field: sess-version", SDPSerializer.ByteSpace, remainingSlice, out consumed));
            remainingSlice = remainingSlice.Slice(consumed + 1);

            //nettype
            session.ParsedValue.Origin.Nettype =
                SerializationHelpers.ParseRequiredString("Origin field: nettype",
                                                         SerializationHelpers.NextRequiredDelimitedField("Origin field: nettype", SDPSerializer.ByteSpace, remainingSlice, out consumed));
            remainingSlice = remainingSlice.Slice(consumed + 1);

            //addrtype
            session.ParsedValue.Origin.AddrType =
                SerializationHelpers.ParseRequiredString("Origin field: addrtype",
                                                         SerializationHelpers.NextRequiredDelimitedField("Origin field: addrtype", SDPSerializer.ByteSpace, remainingSlice, out consumed));
            remainingSlice = remainingSlice.Slice(consumed + 1);

            // unicast-address
            session.ParsedValue.Origin.UnicastAddress =
                SerializationHelpers.ParseRequiredString("Origin field: unicast-address", remainingSlice);

            return(SessionNameSerializer.Instance.ReadValue);
        }
Ejemplo n.º 5
0
        public DeserializationState ReadValue(ReadOnlySpan <byte> data, DeserializationSession session)
        {
            if (session.ParsedValue.MediaDescriptions != null && session.ParsedValue.MediaDescriptions.Any())
            {
                throw new DeserializationException("Email address MUST be specified before the first media field");
            }

            var remainingSlice = data;

            //header
            SerializationHelpers.ParseRequiredHeader("Email field", remainingSlice, HeaderBytes);
            remainingSlice = remainingSlice.Slice(HeaderBytes.Length);

            //uri
            var emailString =
                SerializationHelpers.ParseRequiredString("Email field",
                                                         SerializationHelpers.NextRequiredField("Email field", remainingSlice));

            session.ParsedValue.EmailNumbers = session.ParsedValue.EmailNumbers ?? new List <string>();
            session.ParsedValue.EmailNumbers.Add(emailString);
            return(OptionalValueDeSerializer.Instance.ReadValue);
        }
Ejemplo n.º 6
0
 public DeserializationState ReadValue(ReadOnlySpan <byte> data, DeserializationSession session)
 {
     session.ParsedValue         = new SDP();
     session.ParsedValue.Version = VersionSerializer.Instance.ReadValue(data);
     return(OriginSerializer.Instance.ReadValue);
 }
Ejemplo n.º 7
0
        public DeserializationState ReadValue(ReadOnlySpan <byte> data, DeserializationSession session)
        {
            if (data.Length == 0)
            {
                throw new DeserializationException("Invalid SDP field");
            }

            switch (data[0])
            {
            case SessionInformationSerializer.Identifier:
                return(SessionInformationSerializer.Instance.ReadValue(data, session));

            case ConnectionDataSerializer.Identifier:
                session.ParsedValue.ConnectionData = ConnectionDataSerializer.Instance.ReadValue(data);
                return(this.ReadValue);

            case TimingSerializer.Identifier:
                session.ParsedValue.Timings = session.ParsedValue.Timings ?? new List <TimingInfo>();
                session.ParsedValue.Timings.Add(TimingSerializer.Instance.ReadValue(data));
                return(OptionalValueDeSerializer.Instance.ReadValue);

            case UriSerializer.Identifier:
                return(UriSerializer.Instance.ReadValue(data, session));

            case EmailAddressSerializer.Identifier:
                return(EmailAddressSerializer.Instance.ReadValue(data, session));

            case PhoneNumberSerializer.Identifier:
                return(PhoneNumberSerializer.Instance.ReadValue(data, session));

            case BandwithSerializer.Identifier:
                session.ParsedValue.BandWiths = session.ParsedValue.BandWiths ?? new List <Bandwidth>();
                session.ParsedValue.BandWiths.Add(BandwithSerializer.Instance.ReadValue(data));
                return(this.ReadValue);

            case RepeatTimeSerializer.Identifier:
                session.ParsedValue.SDPRepeatTimes = session.ParsedValue.SDPRepeatTimes ?? new List <RepeatTime>();
                session.ParsedValue.SDPRepeatTimes.Add(RepeatTimeSerializer.Instance.ReadValue(data));
                return(this.ReadValue);

            case SDPTimezonesSerializer.Identifier:
                session.ParsedValue.TimeZones = SDPTimezonesSerializer.Instance.ReadValue(data);
                return(this.ReadValue);

            case EncriptionKeySerializer.Identifier:
                session.ParsedValue.EncriptionKey = EncriptionKeySerializer.Instance.ReadValue(data);
                return(this.ReadValue);

            case AttributeSerializer.Identifier:
                session.ParsedValue.Attributes = session.ParsedValue.Attributes ?? new List <string>();
                session.ParsedValue.Attributes.Add(AttributeSerializer.Instance.ReadValue(data));
                return(this.ReadValue);

            case MediaSerializer.Identifier:
                session.ParsedValue.MediaDescriptions = session.ParsedValue.MediaDescriptions ?? new List <MediaDescription>();
                session.ParsedValue.MediaDescriptions.Add(MediaSerializer.Instance.ReadValue(data));
                return(MediaOptioalValueDeserializer.Instance.ReadValue);

            default:
                throw new DeserializationException($"Unknown field {(char)data[0]}");
            }
        }