Package javax.sip

Examples of javax.sip.ClientTransaction


        if (request.getMethod().equalsIgnoreCase(Request.CANCEL)) {
            SIPClientTransaction ct = (SIPClientTransaction) sipStack
                    .findCancelTransaction((SIPRequest) request, false);
            if (ct != null) {
                ClientTransaction retval = sipStack.createClientTransaction(
                        (SIPRequest) request, ct.getMessageChannel());

                ((SIPTransaction) retval).addEventListener(this);
                sipStack.addTransaction((SIPClientTransaction) retval);
                if (ct.getDialog() != null) {
View Full Code Here


            Address address = protocolObjects.addressFactory.createAddress("Shootme <sip:"
                    + myAddress + ":" + myPort + ">");
            ContactHeader contactHeader = protocolObjects.headerFactory
                    .createContactHeader(address);
            inviteRequest.addHeader(contactHeader);
            ClientTransaction ct = sipProvider.getNewClientTransaction(inviteRequest);
            dialog.sendRequest(ct);
        }
View Full Code Here

                    ((ViaHeader) inviteRequest.getHeader(ViaHeader.NAME)).setTransport("udp");
                    inviteRequest.addHeader(contactHeader);
                    MaxForwardsHeader mf = protocolObjects.headerFactory
                            .createMaxForwardsHeader(10);
                    inviteRequest.addHeader(mf);
                     ClientTransaction ct = provider.getNewClientTransaction(inviteRequest);
                    dialog.sendRequest(ct);
                    reInviteCount++;
                    logger.info("RE-INVITE sent");

                } else if (response.getStatusCode() == Response.BUSY_HERE) {
View Full Code Here

        Dialog peerDialog = transactionsMapping
                .getPeerDialog(serverTransaction);

        if (peerDialog == null)
        {
            ClientTransaction ct = sipProvider
                    .getNewClientTransaction(clonedRequest);
            ct.sendRequest();
            transactionsMapping.addMapping(serverTransaction, ct);
           
            if (ct.getDialog() != null)
            {
                JipletDialog clientDialog = jiplet.getDialog(
                        ct.getDialog(), true);
                if (clientDialog.getSipProvider() == null)
                {
                    clientDialog.setSipProvider(sipProvider);
                }
            }
        }
        else if (clonedRequest.getMethod().equals(Request.ACK))
        {
            peerDialog.sendAck(clonedRequest);
        }
        else
        {

            Request dialogRequest = peerDialog.createRequest(clonedRequest
                    .getMethod());
            Object content = clonedRequest.getContent();
            if (content != null)
            {
                ContentTypeHeader contentTypeHeader = (ContentTypeHeader) clonedRequest
                        .getHeader(ContentTypeHeader.NAME);
                if (contentTypeHeader != null)
                    dialogRequest.setContent(content, contentTypeHeader);
            }

            // Copy all the headers from the original request to the
            // dialog created request:
            ListIterator l = clonedRequest.getHeaderNames();
            while (l.hasNext())
            {
                String name = (String) l.next();
                Header header = dialogRequest.getHeader(name);
                if (header == null)
                {
                    ListIterator li = clonedRequest.getHeaders(name);
                    if (li != null)
                    {
                        while (li.hasNext())
                        {
                            Header h = (Header) li.next();
                            dialogRequest.addHeader(h);
                        }
                    }
                }
                else
                {
                    if (header instanceof ViaHeader)
                    {
                        ListIterator li = clonedRequest.getHeaders(name);
                        if (li != null)
                        {
                            dialogRequest.removeHeader(name);
                            Vector v = new Vector();
                            while (li.hasNext())
                            {
                                Header h = (Header) li.next();
                                v.addElement(h);
                            }
                            for (int k = (v.size() - 1); k >= 0; k--)
                            {
                                Header h = (Header) v.elementAt(k);
                                dialogRequest.addHeader(h);
                            }
                        }
                    }
                }
            }

            JipletDialog clientDialog = jiplet.getDialog(peerDialog, false);
            ClientTransaction clientTransaction = clientDialog.getSipProvider()
                    .getNewClientTransaction(dialogRequest);
            peerDialog.sendRequest(clientTransaction);
            transactionsMapping
                    .addMapping(serverTransaction, clientTransaction);
View Full Code Here

            return;
        }

        for (Enumeration en = transactions.elements(); en.hasMoreElements();)
        {
            ClientTransaction ct = (ClientTransaction) en.nextElement();

            // check if the client transaction can be canceled.
            if (ct.getState().equals(TransactionState.COMPLETED)
                    || ct.getState().equals(TransactionState.TERMINATED))
            {
                continue;
            }

            try
            {
                JipletDialog clientJipletDialog = (JipletDialog) ct.getDialog()
                        .getApplicationData();
                if (clientJipletDialog != null)
                {
                    ClientTransaction client = clientJipletDialog
                            .getSipProvider().getNewClientTransaction(
                                    ct.createCancel());
                    client.sendRequest();
                }
                else
                {
                    ListeningPoint defaultLP = jiplet
                            .getListeningPointDefault();
                    ClientTransaction client = jiplet.getSipProvider(defaultLP)
                            .getNewClientTransaction(ct.createCancel());
                    client.sendRequest();
                }
            }
            catch (Exception e)
            {
                jiplet.error("Couldn't cancel client transaction : Exception "
View Full Code Here

                        // (in JipletDialog)
                        ViaHeader via = jiplet.getHeaderFactory().createViaHeader(lp.getIPAddress(),
                                    lp.getPort(), lp.getTransport(), null);
                        clonedRequest.addHeader(via);   
                       
                        ClientTransaction newct = clientProvider
                                .getNewClientTransaction(clonedRequest);
                        transactionsMapping
                                .addMapping(serverTransaction, newct);
                        peerDialog.sendRequest(newct);
                        jiplet.registerForResponse(clonedRequest, 60000L);
                        return;
                    }
                    else
                    {
                        // the peer dialog is not yet established so bail out.
                        // this is a client error - client is sending BYE
                        // before dialog establishment.
                        jiplet
                                .warn("While proxying a SIP request, bad dialog state - BYE dropped");
                        return;
                    }
                }
                // NEW CODE added by Amit to handle ACK and CANCEL
                else if (msg.getMethod().equals(Request.ACK))
                {
                    if (serverTransaction == null)
                    {
                        if (jiplet.isDebugEnabled() == true)
                            jiplet
                                    .debug("While proxying an ACK request, null server transaction");
                        return;
                    }

                    Dialog d = serverTransaction.getDialog();
                    TransactionsMapping transactionsMapping = jiplet.getDialog(
                            d, true).getTransactionsMapping();
                    Dialog peerDialog = transactionsMapping
                            .getPeerDialog(serverTransaction);
                    Request clonedRequest = (Request) msg.clone();
                    if (peerDialog.getState() != null)
                    {
                        peerDialog.sendAck(clonedRequest);
                    }
                    return;
                }
                else if (msg.getMethod().equals(Request.CANCEL))
                {
                    if (serverTransaction == null)
                    {
                        if (jiplet.isDebugEnabled() == true)
                            jiplet
                                    .debug("While proxying a CANCEL request, null server transaction for BYE");
                        return;
                    }

                    Dialog d = serverTransaction.getDialog();
                    JipletDialog jd = jiplet.getDialog(d, true);
                    TransactionsMapping transactionsMapping = jd
                            .getTransactionsMapping();

                    Vector transactions = transactionsMapping
                            .getClientTransactions((ServerTransaction) jd
                                    .getAttribute("firstTransaction"));
                   
                    if (transactions == null || transactions.isEmpty())
                    {
                        return;
                    }

                    for (Enumeration en = transactions.elements(); en
                            .hasMoreElements();)
                    {
                        ClientTransaction ct = (ClientTransaction) en
                                .nextElement();

                        // check if the client transaction can be canceled.
                        if (ct.getState().equals(TransactionState.COMPLETED)
                                || ct.getState().equals(
                                        TransactionState.TERMINATED))
                        {
                            continue;
                        }
                       
                        JipletDialog clientJipletDialog = (JipletDialog) ct.getDialog().getApplicationData();
                        if (clientJipletDialog != null)
                        {
                            ClientTransaction client = clientJipletDialog.getSipProvider().getNewClientTransaction(ct.createCancel());
                            client.sendRequest();
                        }
                    }
                }
                // END NEW CODE
View Full Code Here

                transactionsMapping.removeMapping(serverTransaction);
            }
        }
        else
        {
            ClientTransaction clientTransaction = timeout
                    .getClientTransaction();
            Dialog dialog = clientTransaction.getDialog();
            ServerTransaction st = null;
            if (dialog != null)
            {
                transactionsMapping = jiplet.getDialog(dialog, true)
                        .getTransactionsMapping();
View Full Code Here

            }

            for (Enumeration e = clientTransactions.elements(); e
                    .hasMoreElements();)
            {
                ClientTransaction ct = (ClientTransaction) e.nextElement();

                // check if the client transaction can be canceled.
                if (ct.getState().equals(TransactionState.COMPLETED)
                        || ct.getState().equals(TransactionState.TERMINATED))
                {
                    continue;
                }

                try
                {
                    JipletDialog clientJipletDialog = (JipletDialog) ct
                            .getDialog().getApplicationData();
                    if (clientJipletDialog != null)
                    {
                        ClientTransaction client = clientJipletDialog
                                .getSipProvider().getNewClientTransaction(
                                        ct.createCancel());
                        client.sendRequest();
                    }
                    else
                    {
                        ClientTransaction client = sipProvider
                                .getNewClientTransaction(ct.createCancel());
                        client.sendRequest();
                    }
                }
                catch (Exception ex)
                {
                    jiplet
                            .error("Couldn't statefully forward CANCEL : Exception "
                                    + ex.getClass().getName()
                                    + " : "
                                    + ex.getMessage()
                                    + "\n"
                                    + JipletLogger.getStackTrace(ex));
                }
            }
           
            clientTransactions.clear();

            return;

        }

        // FROM TAG UPDATE FOR METHODS DIALOG CREATOR

        // DIALOG CHECK

        // Note that the jiplet server is actually implemented as a back
        // to back User Agent.
        Dialog dialog = null;
        if (serverTransaction != null)
        {
            dialog = serverTransaction.getDialog();
        }

        DialogState dialogState = null;
        if (dialog != null)
            dialogState = dialog.getState();
        if ((dialogState == null) || (proxy.isReset() == true))
        {
            ClientTransaction clientTransaction = sipProvider
                    .getNewClientTransaction(clonedRequest);
            clientTransaction.sendRequest();

            // register for response
            jiplet.registerForResponse(clonedRequest, 60000L);

            if (dialog != null)
            {
                JipletDialog jdata = jiplet.getDialog(serverTransaction
                        .getDialog(), true);
                TransactionsMapping transactionsMapping = jdata
                        .getTransactionsMapping();
                transactionsMapping.addMapping(serverTransaction,
                        clientTransaction);

                if (clientTransaction.getDialog() != null)
                {
                    JipletDialog clientDialog = jiplet.getDialog(
                            clientTransaction.getDialog(), true);
                    if (clientDialog.getSipProvider() == null)
                    {
                        clientDialog.setSipProvider(sipProvider);
                    }
                }
View Full Code Here

                        && clientsTransactionList.size() > 1)
                {
                    Dialog dialog = clientTransaction.getDialog();
                    Request byeRequest = dialog.createRequest(Request.BYE);

                    ClientTransaction ct = responseProvider
                            .getNewClientTransaction(byeRequest);
                    dialog.sendRequest(ct);

                    // we have to remove the transaction from the table:
                    transactionsMapping.removeMapping(clientTransaction);
                    return;
                }
                else
                {
                    if (serverTransaction != null)
                        transactionsMapping.addMapping(serverTransaction,
                                clientTransaction);
                }
            }

            if (serverTransaction == null)
            {
                ListeningPoint defaultLP = jiplet.getListeningPointDefault();
                jiplet.getSipProvider(defaultLP).sendResponse(response);
                return;
            }
            else
            {
                // we can try to modify the tags:
                Dialog dialog = serverTransaction.getDialog();
                if (dialog != null)
                {
                    String localTag = dialog.getLocalTag();
                    String remoteTag = dialog.getRemoteTag();
                    ToHeader toHeader = (ToHeader) response
                            .getHeader(ToHeader.NAME);
                    FromHeader fromHeader = (FromHeader) response
                            .getHeader(FromHeader.NAME);

                    if (localTag != null && remoteTag != null)
                    {
                        if (dialog.isServer())
                        {
                            toHeader.setTag(localTag);
                        }
                        else
                        {
                            fromHeader.setTag(remoteTag);
                        }
                    }
                }

                // 8. Record-Route - modify record route header if needed
                /*
                 * If the selected response contains a Record-Route header field
                 * value originally provided by this proxy, the proxy MAY choose
                 * to rewrite the value before forwarding the response. This
                 * allows the proxy to provide different URIs for itself to the
                 * next upstream and downstream elements. A proxy may choose to
                 * use this mechanism for any reason. For instance, it is useful
                 * for multi-homed hosts.
                 */

                ListIterator rrHeaders = response
                        .getHeaders(RecordRouteHeader.NAME);
                while (rrHeaders.hasNext())
                {
                    // look for the 1st one to replace, replace it & get out
                    RecordRouteHeader rr = (RecordRouteHeader) rrHeaders.next();
                    URI uri = rr.getAddress().getURI();
                    if (uri instanceof SipURI)
                    {
                        SipURI sipURI = (SipURI) uri;
                        // is this a record route header we added?
                        if (jiplet.hasAddress(sipURI.getHost(), sipURI
                                .getPort()))
                        {
                            // does this one need replacing?
                            String user = sipURI.getUser();
                            if (user != null)
                            {
                                StringTokenizer tok = new StringTokenizer(user,
                                        "-");
                                if (tok.countTokens() == 2)
                                {
                                    SipURI sourceURI = jiplet
                                            .getAddressFactory().createSipURI(
                                                    null, tok.nextToken());

                                    sourceURI.setPort(Integer.valueOf(
                                            tok.nextToken()).intValue());
                                    sourceURI.setLrParam();

                                    // rewrite it back into the RR header
                                    rr.getAddress().setURI(sourceURI);
                                    rrHeaders.set(rr);
                                    break;
                                }
                            }
                        }
                    }
                }

                try
                {
                    serverTransaction.sendResponse(response);
                }
                catch (InvalidArgumentException e)
                {
                    // this exception only happens if the Response was created
                    // by Dialog.createReliableProvisionalResponse(int) and the
                    // application calls ServerTransaction.sendResponse() to
                    // send it
                    JipletLogger
                            .error("Response forwarding failed - invalid send method for reliable provisional response - need to add a check for this and call dialog method sendReliableProvisionalResponse() instead. Response = \n"
                                    + response.toString());
                }
            }

            /** ************************************************************************ */
            /** ************ 10. Generate CANCELs ******* */
            /** ************************************************************************* */
            /*
             * If the forwarded response was a final response, the jiplet MUST
             * generate a CANCEL request for all pending client transactions
             * associated with this response context. A jiplet SHOULD also
             * generate a CANCEL request for all pending client transactions
             * associated with this response context when it receives a 6xx
             * response. A pending client transaction is one that has received a
             * provisional response, but no final response (it is in the
             * proceeding state) and has not had an associated CANCEL generated
             * for it. Generating CANCEL requests is described in Section 9.1.
             */

            if (response.getStatusCode() == Response.OK
                    || (response.getStatusCode() >= Response.BUSY_EVERYWHERE && response
                            .getStatusCode() <= Response.SESSION_NOT_ACCEPTABLE))
            {
                Vector clientsTransactionList = transactionsMapping
                        .getClientTransactions(serverTransaction);

                for (Enumeration e = clientsTransactionList.elements(); e
                        .hasMoreElements();)
                {
                    ClientTransaction ctr = (ClientTransaction) e.nextElement();
                    if (ctr != clientTransaction)
                    {
                        TransactionState transactionState = ctr.getState();
                        if (transactionState == null
                                || transactionState.getValue() == TransactionState.PROCEEDING
                                        .getValue())
                        {

                            /*
                             * 9.1: The following procedures are used to
                             * construct a CANCEL request. The Request-URI,
                             * Call-ID, To, the numeric part of CSeq, and From
                             * header fields in the CANCEL request MUST be
                             * identical to those in the request being
                             * cancelled, including tags. A CANCEL constructed
                             * by a client MUST have only a single Via header
                             * field value matching the top Via value in the
                             * request being cancelled. Using the same values
                             * for these header fields allows the CANCEL to be
                             * matched with the request it cancels (Section 9.2
                             * indicates how such matching occurs). However, the
                             * method part of the CSeq header field MUST have a
                             * value of CANCEL. This allows it to be identified
                             * and processed as a transaction in its own right
                             * (See Section 17).
                             *
                             * If the request being cancelled contains a Route
                             * header field, the CANCEL request MUST include
                             * that Route header field's values.
                             */
                            Request cancelRequest = ctr.createCancel();

                            // Let's keep only the top most via header:
                            ListIterator cancelViaList = cancelRequest
                                    .getHeaders(ViaHeader.NAME);
                            cancelRequest.removeHeader(ViaHeader.NAME);
                            cancelRequest.addHeader((ViaHeader) cancelViaList
                                    .next());

                            SipURI localAddr = (SipURI) ctr.getDialog()
                                    .getLocalParty().getURI();
                            SipProvider p = jiplet.getSipProvider(localAddr
                                    .getHost(), localAddr.getPort());

                            if (p == null)
                            {
                                ListeningPoint defaultLP = jiplet
                                        .getListeningPointDefault();
                                p = jiplet.getSipProvider(defaultLP);
                            }

                            ClientTransaction ct = p
                                    .getNewClientTransaction(cancelRequest);
                            ct.sendRequest();
                        }
                    }
                }
            }
        }
View Full Code Here

    protected Dialog getPeerDialog(ServerTransaction serverTransaction)
    {
        if (table.containsKey(serverTransaction))
        {
            ClientTransaction ct = getClientTransaction(serverTransaction);
            if (ct != null)
                return ct.getDialog();
        }
        else
        {
            JipletDialog jdialog = jiplet.getDialog(serverTransaction.getDialog(),
                    false);
            if (jdialog == null)
            {
                JipletLogger
                        .warn("Could not obtain the SIP dialog while finding the peer dialog."
                                + " Cannot proxy anything to the peer");
                return null;
            }
           
            Transaction transaction = (Transaction) jdialog.getAttribute("firstTransaction");
            if (transaction == null)
            {
                JipletLogger
                        .warn("Could not find the first transaction while finding the peer dialog."
                                + " Cannot proxy anything to the peer");
                return null;
            }
           
            if (transaction instanceof ServerTransaction)
            {
                ClientTransaction ct = getClientTransaction((ServerTransaction) transaction);
                if (ct != null)
                    return ct.getDialog();
            }
            else
            {
                ServerTransaction st = getServerTransaction((ClientTransaction) transaction);
                if (st != null)
View Full Code Here

TOP

Related Classes of javax.sip.ClientTransaction

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.