1 /*
2 * Conditions Of Use
3 *
4 * This software was developed by employees of the National Institute of
5 * Standards and Technology (NIST), an agency of the Federal Government.
6 * Pursuant to title 15 Untied States Code Section 105, works of NIST
7 * employees are not subject to copyright protection in the United States
8 * and are considered to be in the public domain.  As a result, a formal
9 * license is not needed to use the software.
10 *
11 * This software is provided by NIST as a service and is expressly
12 * provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
13 * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
14 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
15 * AND DATA ACCURACY.  NIST does not warrant or make any representations
16 * regarding the use of the software or the results thereof, including but
17 * not limited to the correctness, accuracy, reliability or usefulness of
18 * the software.
19 *
20 * Permission to use this software is contingent upon your acceptance
21 * of the terms of this agreement
22 *
23 * .
24 *
25 */
26 /*******************************************************************************
27  * Product of NIST/ITL Advanced Networking Technologies Division (ANTD).        *
28  *******************************************************************************/
29 
30 package gov.nist.javax.sip;
31 
32 import gov.nist.javax.sip.stack.*;
33 import gov.nist.javax.sip.message.*;
34 import javax.sip.*;
35 
36 /**
37  * Implements all the support classes that are necessary for the nist-sip stack
38  * on which the jain-sip stack has been based. This is a mapping class to map
39  * from the NIST-SIP abstractions to the JAIN abstractions. (i.e. It is the glue
40  * code that ties the NIST-SIP event model and the JAIN-SIP event model
41  * together. When a SIP Request or SIP Response is read from the corresponding
42  * messageChannel, the NIST-SIP stack calls the SIPStackMessageFactory
43  * implementation that has been registered with it to process the request.)
44  *
45  * @version 1.2 $Revision: 1.14 $ $Date: 2009/07/29 20:38:17 $
46  *
47  * @author M. Ranganathan <br/>
48  *
49  *
50  */
51 class NistSipMessageFactoryImpl implements StackMessageFactory {
52 
53     private SipStackImpl sipStack;
54 
55     /**
56      * Construct a new SIP Server Request.
57      *
58      * @param sipRequest
59      *            is the SIPRequest from which the SIPServerRequest is to be
60      *            constructed.
61      * @param messageChannel
62      *            is the MessageChannel abstraction for this SIPServerRequest.
63      */
newSIPServerRequest(SIPRequest sipRequest, MessageChannel messageChannel)64     public ServerRequestInterface newSIPServerRequest(SIPRequest sipRequest,
65             MessageChannel messageChannel) {
66 
67         if (messageChannel == null || sipRequest == null) {
68             throw new IllegalArgumentException("Null Arg!");
69         }
70 
71         SipStackImpl theStack = (SipStackImpl) messageChannel.getSIPStack();
72         DialogFilter retval = new DialogFilter(
73                 theStack);
74         if (messageChannel instanceof SIPTransaction) {
75             // If the transaction has already been created
76             // then set the transaction channel.
77             retval.transactionChannel = (SIPTransaction) messageChannel;
78         }
79         retval.listeningPoint = messageChannel.getMessageProcessor()
80                 .getListeningPoint();
81         if (retval.listeningPoint == null)
82             return null;
83         if (sipStack.isLoggingEnabled())
84             sipStack.getStackLogger().logDebug(
85                     "Returning request interface for "
86                             + sipRequest.getFirstLine() + " " + retval
87                             + " messageChannel = " + messageChannel);
88         return retval;
89     }
90 
91     /**
92      * Generate a new server response for the stack.
93      *
94      * @param sipResponse
95      *            is the SIPRequest from which the SIPServerRequest is to be
96      *            constructed.
97      * @param messageChannel
98      *            is the MessageChannel abstraction for this SIPServerResponse
99      */
newSIPServerResponse( SIPResponse sipResponse, MessageChannel messageChannel)100     public ServerResponseInterface newSIPServerResponse(
101             SIPResponse sipResponse, MessageChannel messageChannel) {
102         SIPTransactionStack theStack = (SIPTransactionStack) messageChannel
103                 .getSIPStack();
104         // Tr is null if a transaction is not mapped.
105         SIPTransaction tr = (SIPTransaction) ((SIPTransactionStack) theStack)
106                 .findTransaction(sipResponse, false);
107         if (sipStack.isLoggingEnabled())
108             sipStack.getStackLogger().logDebug(
109                     "Found Transaction " + tr + " for " + sipResponse);
110 
111         if (tr != null) {
112             // Prune unhealthy responses early if handling statefully.
113             // If the state has not yet been assigned then this is a
114             // spurious response. This was moved up from the transaction
115             // layer for efficiency.
116             if (tr.getState() == null) {
117                 if (sipStack.isLoggingEnabled())
118                     sipStack.getStackLogger().logDebug(
119                             "Dropping response - null transaction state");
120                 return null;
121                 // Ignore 1xx
122             } else if (TransactionState.COMPLETED == tr.getState()
123                     && sipResponse.getStatusCode() / 100 == 1) {
124                 if (sipStack.isLoggingEnabled())
125                     sipStack.getStackLogger().logDebug(
126                             "Dropping response - late arriving "
127                                     + sipResponse.getStatusCode());
128                 return null;
129             }
130         }
131 
132         DialogFilter retval = new DialogFilter(
133                 sipStack);
134 
135         retval.transactionChannel = tr;
136 
137         retval.listeningPoint = messageChannel.getMessageProcessor()
138                 .getListeningPoint();
139         return retval;
140     }
141 
NistSipMessageFactoryImpl(SipStackImpl sipStackImpl)142     public NistSipMessageFactoryImpl(SipStackImpl sipStackImpl) {
143         this.sipStack = sipStackImpl;
144 
145     }
146 
147 }