/// <summary> /// Creates a SIP request. /// </summary> /// <param name="method">The SIP method (invite etc.)</param> /// <param name="content">The SIP body contents.</param> /// <param name="contentType">The type of the SIP body.</param> /// <returns>Message.</returns> public virtual Message CreateRequest(string method, string content = "", string contentType = "") { Server = false; if (RemoteParty == null) { Debug.Assert(false, String.Format("No remoteParty for UAC\n")); } if (LocalParty == null) { LocalParty = new Address("\"Anonymous\" <sip:[email protected]>"); } //TODO: Use Remote Party instead of Remote Target? SIPURI uri; if (RemoteTarget != null) { uri = new SIPURI(RemoteTarget.ToString()); } else { uri = new SIPURI(RemoteParty.ToString()); } if (method == "REGISTER") { //TODO: Is this right ? //uri.User = ""; } if ((method != "ACK") && (method != "CANCEL")) { LocalSeq = ++LocalSeq; } //TODO: Use Remote Party instead of Remote Target? Header to; if (RemoteTarget != null) { to = new Header(RemoteTarget.ToString(), "To"); } else { to = new Header(RemoteParty.ToString(), "To"); } Header from = new Header(LocalParty.ToString(), "From"); from.Attributes["tag"] = LocalTag; Header cSeq = new Header(LocalSeq + " " + method, "CSeq"); Header callId = new Header(CallID, "Call-ID"); Header maxForwards = new Header(MaxForwards.ToString(), "Max-Forwards"); Header via = Stack.CreateVia(); Dictionary <string, object> branchParams = new Dictionary <string, object> { { "To", to.Value }, { "From", @from.Value }, { "CallId", callId.Value }, { "CSeq", cSeq.Number } }; via.Attributes["branch"] = Transaction.CreateBranch(branchParams, false); if (LocalTarget == null) { LocalTarget = Stack.Uri.Dup(); LocalTarget.User = LocalParty.Uri.User; } Header contact = new Header(LocalTarget.ToString(), "Contact"); Header[] headerList = { to, from, cSeq, callId, maxForwards, via, contact }; List <Header> headers = headerList.ToList(); // Check this TODO // if (RouteSet.Count != 0) { headers.AddRange(RouteSet); } //app adds other headers such as Supported, Require and Proxy-Require if (!string.IsNullOrEmpty(contentType)) { headers.Add(new Header(contentType, "Content-Type")); } Dictionary <string, List <Header> > headerDict = new Dictionary <string, List <Header> >(); foreach (Header h in headers) { if (headerDict.ContainsKey(h.Name)) { headerDict[h.Name].Add(h); } else { List <Header> temp = new List <Header> { h }; headerDict.Add(h.Name, temp); } } Request = Message.CreateRequest(method, uri, headerDict, content); return(Request); }