Example #1
0
        /// <summary>
        /// Creates a SDP offer.
        /// </summary>
        /// <param name="streams">A list of SDP Media objects.</param>
        /// <param name="parameters">The parameters.</param>
        /// <param name="previous">Optional previous SDP.</param>
        /// <returns>SDP.</returns>
        public static SDP CreateOffer(List <SDPMedia> streams, Dictionary <string, string> parameters, SDP previous = null)
        {
            SDP s = new SDP();

            s.Other["v"] = "0";
            foreach (Char a in "iep")
            {
                if (parameters.ContainsKey(a.ToString()))
                {
                    s.Other[a.ToString()] = parameters[a.ToString()];
                }
            }
            if (previous != null && previous.Originator != null)
            {
                s.Originator         = new SDPOriginator(previous.Originator.ToString());
                s.Originator.Version = s.Originator.Version + 1;
            }
            s.Other["s"] = "-";
            s.Other["t"] = "0";
            s.Media      = streams;
            return(s);
        }
Example #2
0
        /// <summary>
        /// Parses the specified SDP.
        /// </summary>
        /// <param name="sdp">The input SDP text.</param>
        public void Parse(string sdp)
        {
            sdp = sdp.Replace("\r\n", "\n");
            sdp = sdp.Replace("\r", "\n");
            sdp = sdp.Trim();
            foreach (String line in sdp.Split('\n'))
            {
                //Per line parsing
                string[] values        = line.Split("=".ToCharArray(), 2);
                string   k             = values[0];
                string   currentObject = "";
                switch (k)
                {
                case "o":
                    Originator    = new SDPOriginator(values[1]);
                    currentObject = Originator.ToString();
                    break;

                case "c":
                    Connection    = new SDPConnection(values[1]);
                    currentObject = Connection.ToString();
                    break;

                case "m":
                {
                    SDPMedia currentMedia = new SDPMedia(values[1]);
                    Media.Add(currentMedia);
                    currentObject = currentMedia.ToString();
                }
                break;

                default:
                    currentObject = values[1];
                    break;
                }

                if (k == "m")
                {
                    SDPMedia obj = Media.Last();
                }
                else if (Media.Count > 0)
                {
                    SDPMedia obj = Media.Last();
                    if (k == "a" && values[1].StartsWith("rtpmap:"))
                    {
                        string[] split      = values[1].Remove(0, 7).Split(" ".ToCharArray(), 2);
                        string   pt         = split[0];
                        string[] rest       = split[1].Split("/".ToCharArray(), 2);
                        string   name       = rest[0];
                        string   rate       = null;
                        string   parameters = null;
                        if (rest.Length > 1)
                        {
                            string[] final = rest[1].Split("/".ToCharArray(), 2);
                            rate = final[0];

                            parameters = null;
                            if (final.Length > 1)
                            {
                                parameters = final[1];
                            }
                        }

                        foreach (SDPMediaFormat f in obj.Mediaformats)
                        {
                            if (f.Pt == pt)
                            {
                                f.Name = name;
                                if (rate != null)
                                {
                                    f.Rate = rate;
                                }
                                if (parameters != null)
                                {
                                    f.Parameters = parameters;
                                }
                            }
                        }
                    }
                    else
                    {
                        if (!Multiple.Contains(k))
                        {
                            obj.OtherAttributes.Add(k, currentObject);
                        }
                        else
                        {
                            if (!obj.OtherAttributes.ContainsKey(k))
                            {
                                obj.OtherAttributes.Add(k, currentObject);
                            }

                            //TODO HANDLE multiple attributes of the same type;
                            //if (obj.properties.ContainsKey(k))
                            //{
                            //    obj[k, true].Add(current_attribute);
                            //}
                            //else
                            //{
                            //    obj[k, true] = new List<AttributeClass>();
                            //    obj[k, true].Add(current_attribute);
                            //}
                        }
                    }
                }
                else
                {
                    if (k != "o" && k != "c")
                    {
                        SDP obj = this;
                        if (!Multiple.Contains(k))
                        {
                            obj.Other.Add(k, currentObject);
                        }
                        else
                        {
                            obj.Other.Add(k, currentObject);
                            //TODO HANDLE multiple attributes of the same type;
                            //if (obj.properties.ContainsKey(k))
                            //{
                            //    obj[k, true].Add(current_attribute);
                            //}
                            //else
                            //{
                            //    obj[k, true] = new List<AttributeClass>();
                            //    obj[k, true].Add(current_attribute);
                            //}
                        }
                    }
                }
            }
        }
Example #3
0
        /// <summary>
        /// Creates a SDP answer.
        /// </summary>
        /// <param name="streams">A list of SDP Media objects..</param>
        /// <param name="offer">The SDP offer.</param>
        /// <param name="parameters">Optional parameters.</param>
        /// <returns>SDP.</returns>
        public static SDP CreateAnswer(List <SDPMedia> streams, SDP offer, Dictionary <string, string> parameters = null)
        {
            SDP s = new SDP();

            s.Other["v"] = "0";
            foreach (Char a in "iep")
            {
                if (parameters.ContainsKey(a.ToString()))
                {
                    s.Other[a.ToString()] = parameters[a.ToString()];
                }
            }
            s.Originator = new SDPOriginator();
            s.Other["s"] = "-";
            s.Other["t"] = offer.Other["t"];
            foreach (SDPMedia yourMedia in offer.Media)
            {
                SDPMedia myMedia = null;
                foreach (SDPMedia t in streams)
                {
                    if (t.Media != yourMedia.Media)
                    {
                        continue;
                    }
                    myMedia = new SDPMedia(t.ToString());
                    //streams.RemoveAt(i);
                    List <KeyValuePair <SDPMediaFormat, SDPMediaFormat> > found =
                        new List <KeyValuePair <SDPMediaFormat, SDPMediaFormat> >();
                    foreach (SDPMediaFormat yourmf in yourMedia.Mediaformats)
                    {
                        foreach (SDPMediaFormat mymf in myMedia.Mediaformats)
                        {
                            int mymfpt   = -1;
                            int yourmfpt = -1;
                            try
                            {
                                mymfpt   = Int32.Parse(mymf.Pt);
                                yourmfpt = Int32.Parse(yourmf.Pt);
                            }
                            catch (Exception)
                            {
                                mymfpt   = -1;
                                yourmfpt = -1;
                            }
                            if ((0 <= mymfpt && mymfpt < 32 && 0 <= yourmfpt && yourmfpt <= 32 && mymfpt == yourmfpt) ||
                                (mymfpt < 0 && yourmfpt < 0 && mymfpt == yourmfpt) ||
                                (mymf.Name == yourmf.Name && mymf.Rate == yourmf.Rate && mymf.Count == yourmf.Count))
                            {
                                found.Add(new KeyValuePair <SDPMediaFormat, SDPMediaFormat>(yourmf, mymf));
                                break;
                            }
                        }
                    }
                    if (found.Count > 0)
                    {
                        foreach (KeyValuePair <SDPMediaFormat, SDPMediaFormat> kvp in found)
                        {
                            myMedia.Mediaformats.Add(kvp.Key);
                        }
                    }
                    else
                    {
                        myMedia.Mediaformats.Clear();
                        SDPMediaFormat temp = new SDPMediaFormat {
                            Pt = "0"
                        };
                        myMedia.Mediaformats.Add(temp);
                        myMedia.Port = "0";
                    }
                }
                if (myMedia == null)
                {
                    myMedia = new SDPMedia(yourMedia.ToString())
                    {
                        Port = "0"
                    };
                }
                s.Media.Add(myMedia);
            }
            bool valid = s.Media.Any(myMedia => myMedia.Port != "0");

            return(valid ? s : null);
        }
Example #4
0
 internal void AcceptCall(SDP sdp, Message IncomingCall)
 {
     foreach (UserAgent userAgent in Useragents.ToArray())
     {
         if (userAgent.CallID == IncomingCall.First("Call-ID").Value.ToString())
         {
             Message response = userAgent.CreateResponse(200, "OK");
             response.InsertHeader(new Header("application/sdp", "Content-Type"));
             response.Body = sdp.ToString();
             userAgent.SendResponse(response);
         }
     }
 }
Example #5
0
 public void SendInvite(string uri, SDP sdp)
 {
     uri = checkURI(uri);
     UserAgent cua = new UserAgent(Stack) { LocalParty = PublicServiceIdentity, RemoteParty = new Address(uri) };
     Useragents.Add(cua);
     Message invite = cua.CreateRequest("INVITE");
     invite.InsertHeader(new Header("application/sdp", "Content-Type"));
     invite.Body = sdp.ToString();
     cua.SendRequest(invite);
 }
Example #6
0
 internal void StopCall(SDP sdp)
 {
     //Message response = CallUA.CreateResponse(200, "OK");
     //response.InsertHeader(new Header("application/sdp", "Content-Type"));
     //response.Body = sdp.ToString();
     //CallUA.SendResponse(response);
 }
Example #7
0
 public void Invite(string uri, SDP sdp)
 {
     uri = checkURI(uri);
     if (IsRegistered())
     {
         UserAgent cua = new UserAgent(Stack) { LocalParty = RegisterUA.LocalParty, RemoteParty = new Address(uri) };
         Useragents.Add(cua);
         Message invite = cua.CreateRequest("INVITE");
         invite.InsertHeader(new Header("application/sdp", "Content-Type"));
         invite.Body= sdp.ToString();
         cua.SendRequest(invite);
     }
     else
     {
         Log.Error("isRegistered failed in invite message");
     }
 }
Example #8
0
 /// <summary>
 /// Creates a SDP offer.
 /// </summary>
 /// <param name="streams">A list of SDP Media objects.</param>
 /// <param name="parameters">The parameters.</param>
 /// <param name="previous">Optional previous SDP.</param>
 /// <returns>SDP.</returns>
 public static SDP CreateOffer(List<SDPMedia> streams, Dictionary<string, string> parameters, SDP previous = null)
 {
     SDP s = new SDP();
     s.Other["v"] = "0";
     foreach (Char a in "iep")
     {
         if (parameters.ContainsKey(a.ToString()))
         {
             s.Other[a.ToString()] = parameters[a.ToString()];
         }
     }
     if (previous != null && previous.Originator != null)
     {
         s.Originator = new SDPOriginator(previous.Originator.ToString());
         s.Originator.Version = s.Originator.Version + 1;
     }
     s.Other["s"] = "-";
     s.Other["t"] = "0";
     s.Media = streams;
     return s;
 }
Example #9
0
 /// <summary>
 /// Creates a SDP answer.
 /// </summary>
 /// <param name="streams">A list of SDP Media objects..</param>
 /// <param name="offer">The SDP offer.</param>
 /// <param name="parameters">Optional parameters.</param>
 /// <returns>SDP.</returns>
 public static SDP CreateAnswer(List<SDPMedia> streams, SDP offer, Dictionary<string, string> parameters = null)
 {
     SDP s = new SDP();
     s.Other["v"] = "0";
     foreach (Char a in "iep")
     {
         if (parameters.ContainsKey(a.ToString()))
         {
             s.Other[a.ToString()] = parameters[a.ToString()];
         }
     }
     s.Originator = new SDPOriginator();
     s.Other["s"] = "-";
     s.Other["t"] = offer.Other["t"];
     foreach (SDPMedia yourMedia in offer.Media)
     {
         SDPMedia myMedia = null;
         foreach (SDPMedia t in streams)
         {
             if (t.Media != yourMedia.Media) continue;
             myMedia = new SDPMedia(t.ToString());
             //streams.RemoveAt(i);
             List<KeyValuePair<SDPMediaFormat, SDPMediaFormat>> found =
                 new List<KeyValuePair<SDPMediaFormat, SDPMediaFormat>>();
             foreach (SDPMediaFormat yourmf in yourMedia.Mediaformats)
             {
                 foreach (SDPMediaFormat mymf in myMedia.Mediaformats)
                 {
                     int mymfpt = -1;
                     int yourmfpt = -1;
                     try
                     {
                         mymfpt = Int32.Parse(mymf.Pt);
                         yourmfpt = Int32.Parse(yourmf.Pt);
                     }
                     catch (Exception)
                     {
                         mymfpt = -1;
                         yourmfpt = -1;
                     }
                     if ((0 <= mymfpt && mymfpt < 32 && 0 <= yourmfpt && yourmfpt <= 32 && mymfpt == yourmfpt)
                         || (mymfpt < 0 && yourmfpt < 0 && mymfpt == yourmfpt)
                         || (mymf.Name == yourmf.Name && mymf.Rate == yourmf.Rate && mymf.Count == yourmf.Count))
                     {
                         found.Add(new KeyValuePair<SDPMediaFormat, SDPMediaFormat>(yourmf, mymf));
                         break;
                     }
                 }
             }
             if (found.Count > 0)
             {
                 foreach (KeyValuePair<SDPMediaFormat, SDPMediaFormat> kvp in found)
                 {
                     myMedia.Mediaformats.Add(kvp.Key);
                 }
             }
             else
             {
                 myMedia.Mediaformats.Clear();
                 SDPMediaFormat temp = new SDPMediaFormat {Pt = "0"};
                 myMedia.Mediaformats.Add(temp);
                 myMedia.Port = "0";
             }
         }
         if (myMedia == null)
         {
             myMedia = new SDPMedia(yourMedia.ToString()) {Port = "0"};
         }
         s.Media.Add(myMedia);
     }
     bool valid = s.Media.Any(myMedia => myMedia.Port != "0");
     return valid ? s : null;
 }