private void ForwardRequest(IProxie proxie, RequestProxy requestProxy, SipMessageReader reader) { #region vars... var serverConnectionAddresses = requestProxy.ConnectionAddresses; var clientConnectionAddresses = proxie.ToConnectionAddresses; int serverTransactionId = requestProxy.ServerTransactionId; int clientTransactionId = proxie.TransactionId; var method = reader.Method; var content = requestProxy.Content; #endregion clientTransactionIds.Add(clientTransactionId, serverTransactionId); if (method == Methods.Ackm) { proxie.IsFinalReceived = true; } requestProxy.AddProxie(proxie); var writer = GetWriter(); proxie.GenerateForwardedRequest(writer, reader, content, serverConnectionAddresses, serverTransactionId); requestProducer.SendRequest(clientConnectionAddresses, writer, clientTransactionId, serverTransactionId); proxie.TimerC = (method == Methods.Invitem) ? timerC.Add(new ServerClientId(serverTransactionId, clientTransactionId)) : timerC.InvalidTimerIndex; }
private void SendNotify(Dialog dialog, int expires) { int transactionId = GetTransactionId(Methods.Notifym); var writer = GetWriter(); writer.WriteRequestLine(Methods.Notifym, dialog.RemoteUri); writer.WriteVia(dialog.Transport, dialog.LocalEndPoint, transactionId); writer.WriteFrom(dialog.LocalUri, dialog.LocalTag); writer.WriteTo(dialog.RemoteUri, dialog.RemoteTag); writer.WriteDate(DateTime.UtcNow); writer.WriteCallId(dialog.CallId); writer.WriteCseq(dialog.GetNextLocalCseq(), Methods.Notifym); writer.WriteContact(dialog.LocalEndPoint, dialog.Transport); //Event: message-summary //writer.WriteEvent(); writer.WriteSubscriptionState(expires); writer.WriteMaxForwards(70); writer.WriteContentType(contentType); writer.WriteContentLength(content.Length); writer.WriteCRLF(); writer.Write(content); notifyProducer.SendRequest(dialog.ConnectionAddresses, writer, transactionId); }
private void SendRegister(Trunk trunk, int expires) { var writer = GetWriter(); int transationId = GetTransactionId(Methods.Registerm); writer.WriteRequestLine(Methods.Registerm, trunk.RequestUri); writer.WriteVia(trunk.Transport, trunk.LocalEndPoint, transationId); writer.WriteFrom(trunk.Uri, trunk.Id); writer.WriteTo(trunk.Uri); writer.WriteCallId(trunk.LocalEndPoint.Address, Interlocked.Increment(ref count)); writer.WriteCseq(trunk.GetCSeq(Methods.Registerm), Methods.Registerm); writer.WriteContact(trunk.LocalEndPoint, trunk.Transport); writer.WriteEventRegistration(); writer.WriteExpires(expires); if (trunk.Nonce.IsValid) { int nc = trunk.GetNextNonceCount(); int cnonce = Environment.TickCount; var response = SipDigestAuthentication.GetResponseHexChars(trunk.AuthenticationId, trunk.Realm, AuthAlgorithms.Md5, trunk.Nonce, cnonce, nc, trunk.Password, trunk.Qop, trunk.RequestUri, Methods.Registerm.ToByteArrayPart(), new ArraySegment <byte>()); writer.WriteDigestAuthorization(trunk.AuthHeader, trunk.AuthenticationId, trunk.Realm, trunk.Qop, AuthAlgorithms.Md5, trunk.RequestUri, trunk.Nonce, nc, cnonce, trunk.Opaque, response); } writer.WriteContentLength(0); writer.WriteCRLF(); registerProducer.SendRequest(trunk.ConnectionAddresses, writer, transationId, trunk.Id); }
private void SendNotify(Dialog dialog, int expires, PresenceDocument document) { int transactionId = GetTransactionId(Methods.Notifym); var writer = new SipMessageWriter(); writer.WriteRequestLine(Methods.Notifym, dialog.RemoteUri); writer.WriteVia(dialog.Transport, dialog.LocalEndPoint, transactionId); writer.WriteFrom(dialog.LocalUri, dialog.LocalTag); writer.WriteTo(dialog.RemoteUri, dialog.RemoteTag); writer.WriteCallId(dialog.CallId); writer.WriteEventPresence(); writer.WriteSubscriptionState(expires); writer.WriteMaxForwards(70); writer.WriteCseq(dialog.GetNextLocalCseq(), Methods.Notifym); writer.WriteContact(dialog.LocalEndPoint, dialog.Transport); if (document != null) { writer.WriteContentType(application, pidfXml); //writer.WriteContentLength(); //writer.WriteCRLF(); //writer.RewriteContentLength( // document.CopyTo((length) => writer.GetBytesForCustomWrite(length))); document.WriteLenghtAndContent(writer); } else { writer.WriteContentLength(0); writer.WriteCRLF(); } notifyProducer.SendRequest(dialog.Transport, dialog.LocalEndPoint, dialog.RemoteEndPoint, ServerAsyncEventArgs.AnyConnectionId, writer, transactionId); }