FileDocCategorySizeDatePackage
NistSipMessageFactoryImpl.javaAPI DocphoneME MR2 API (J2ME)6070Wed May 02 18:00:42 BST 2007gov.nist.siplite

NistSipMessageFactoryImpl.java

/*
 * Portions Copyright  2000-2007 Sun Microsystems, Inc. All Rights
 * Reserved.  Use is subject to license terms.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License version 2 for more details (a copy is
 * included at /legal/license.txt).
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions.
 */
/*
 */

package gov.nist.siplite;
import gov.nist.siplite.stack.*;
import gov.nist.siplite.message.*;
import gov.nist.core.*;

import com.sun.midp.log.Logging;
import com.sun.midp.log.LogChannels;

/**
 * Implements all the support classes that are necessary for the nist-sip
 * stack on which the jain-sip stack has been based.
 * This is a mapping class to map from the NIST-SIP abstractions to
 * the JAIN abstractions. (i.e. It is the glue code that ties
 * the NIST-SIP event model and the JAIN-SIP event model together.
 * When a SIP Request or SIP Response is read from the corresponding
 * messageChannel, the NIST-SIP stack calls the SIPStackMessageFactory
 * implementation that has been registered with it to process the request.)
 *
 * @version  JAIN-SIP-1.1
 *
 *
 * <a href="{@docRoot}/uncopyright.html">This code is in the public domain.</a>
 *
 */
public class NistSipMessageFactoryImpl
        implements SIPStackMessageFactory {
    /** Current SIP stack context. */
    private SipStack 	 sipStackImpl;
    
    /**
     * Constructs a new SIP Server Request.
     * @param sipRequest is the Request from which the SIPServerRequest
     * is to be constructed.
     * @param messageChannel is the MessageChannel abstraction for this
     * 	SIPServerRequest.
     * @return a new SIP Server Request handle
     */
    public SIPServerRequestInterface
            newSIPServerRequest
            (Request sipRequest, MessageChannel messageChannel)
            throws IllegalArgumentException {

        if (messageChannel == null || sipRequest == null)  {
            throw new IllegalArgumentException("Null Arg!");
        }
        
        NistSipMessageHandlerImpl retval = new NistSipMessageHandlerImpl();
        if (messageChannel instanceof Transaction) {
            // If the transaction has already been created
            // then set the transaction channel.
            retval.transactionChannel = (Transaction)messageChannel;
        }
        SIPTransactionStack theStack =
                (SIPTransactionStack) messageChannel.getSIPStack();

        /*
         * IMPL_NOTE :
         * May not need to initialize listeningPoint like this. Please refer to
         * processRequest() method in NistSipMessageHandlerImpl
         */
        retval.listeningPoint =
                messageChannel.getMessageProcessor().getListeningPoint();
        
        if (Logging.REPORT_LEVEL <= Logging.INFORMATION) {
            Logging.report(Logging.INFORMATION, LogChannels.LC_JSR180,
                "Returning request interface for " +
                sipRequest.getFirstLine() + " " + retval +
                " messageChannel = " + messageChannel);
        }
        
        return  retval;
    }
    
    /**
     * Generates a new server response for the stack.
     * @param sipResponse is the Request from which the SIPServerRequest
     * is to be constructed.
     * @param messageChannel is the MessageChannel abstraction for this
     * 	SIPServerResponse
     * @return a new SIP Server Response handle
     */
    public SIPServerResponseInterface
            newSIPServerResponse(Response sipResponse,
            MessageChannel messageChannel) {
        try {
            NistSipMessageHandlerImpl retval = new NistSipMessageHandlerImpl();
            SIPTransactionStack theStack = (SIPTransactionStack)
            messageChannel.getSIPStack();
            SipStack sipStackImpl = (SipStack) theStack;
            // Tr is null if a transaction is not mapped.
            Transaction tr =
                    (Transaction)
                    ((SIPTransactionStack)theStack).
                    findTransaction(sipResponse, false);
            
            retval.transactionChannel = tr;
            
            if (Logging.REPORT_LEVEL <= Logging.INFORMATION) {
                Logging.report(Logging.INFORMATION, LogChannels.LC_JSR180,
                    "Found Transaction " + tr + " for " + sipResponse);
                Logging.report(Logging.INFORMATION, LogChannels.LC_JSR180,
                    "MessageProcessor = " +
                    messageChannel.getMessageProcessor() + "/" +
                    messageChannel.getMessageProcessor().getListeningPoint());
            }
            
            ListeningPoint lp =
                    messageChannel.getMessageProcessor().getListeningPoint();
            
            retval.listeningPoint = lp;
            return  retval;
            
        } catch (RuntimeException ex) {
            if (Logging.REPORT_LEVEL <= Logging.ERROR) {
                Logging.report(Logging.ERROR, LogChannels.LC_JSR180,
                    "runtime exception caught!");
                ex.printStackTrace();
            }
            return null;
        }
        
    }
    
    /**
     * Contrictor.
     * @param sipStackImpl current SIP stack context
     */
    public NistSipMessageFactoryImpl(SipStack sipStackImpl) {
        this.sipStackImpl = sipStackImpl;
    }
    
    
}