Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }