1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/* 2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Conditions Of Use 3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* 4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* This software was developed by employees of the National Institute of 5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Standards and Technology (NIST), an agency of the Federal Government. 6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Pursuant to title 15 Untied States Code Section 105, works of NIST 7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* employees are not subject to copyright protection in the United States 8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* and are considered to be in the public domain. As a result, a formal 9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* license is not needed to use the software. 10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* 11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* This software is provided by NIST as a service and is expressly 12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED 13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF 14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT 15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* AND DATA ACCURACY. NIST does not warrant or make any representations 16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* regarding the use of the software or the results thereof, including but 17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* not limited to the correctness, accuracy, reliability or usefulness of 18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* the software. 19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* 20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Permission to use this software is contingent upon your acceptance 21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* of the terms of this agreement 22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* 23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* . 24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* 25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*/ 26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/******************************************************************************* 27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Product of NIST/ITL Advanced Networking Technologies Division (ANTD). * 28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *******************************************************************************/ 29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpackage gov.nist.javax.sip; 31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.stack.*; 33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.message.*; 34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.*; 35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/** 37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Implements all the support classes that are necessary for the nist-sip stack 38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * on which the jain-sip stack has been based. This is a mapping class to map 39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * from the NIST-SIP abstractions to the JAIN abstractions. (i.e. It is the glue 40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * code that ties the NIST-SIP event model and the JAIN-SIP event model 41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * together. When a SIP Request or SIP Response is read from the corresponding 42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * messageChannel, the NIST-SIP stack calls the SIPStackMessageFactory 43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * implementation that has been registered with it to process the request.) 44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @version 1.2 $Revision: 1.14 $ $Date: 2009/07/29 20:38:17 $ 46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author M. Ranganathan <br/> 48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangclass NistSipMessageFactoryImpl implements StackMessageFactory { 52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private SipStackImpl sipStack; 54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Construct a new SIP Server Request. 57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param sipRequest 59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * is the SIPRequest from which the SIPServerRequest is to be 60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * constructed. 61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param messageChannel 62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * is the MessageChannel abstraction for this SIPServerRequest. 63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public ServerRequestInterface newSIPServerRequest(SIPRequest sipRequest, 65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang MessageChannel messageChannel) { 66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (messageChannel == null || sipRequest == null) { 68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throw new IllegalArgumentException("Null Arg!"); 69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang SipStackImpl theStack = (SipStackImpl) messageChannel.getSIPStack(); 72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang DialogFilter retval = new DialogFilter( 73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang theStack); 74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (messageChannel instanceof SIPTransaction) { 75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // If the transaction has already been created 76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // then set the transaction channel. 77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang retval.transactionChannel = (SIPTransaction) messageChannel; 78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang retval.listeningPoint = messageChannel.getMessageProcessor() 80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .getListeningPoint(); 81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (retval.listeningPoint == null) 82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return null; 83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (sipStack.isLoggingEnabled()) 84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack.getStackLogger().logDebug( 85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang "Returning request interface for " 86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + sipRequest.getFirstLine() + " " + retval 87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + " messageChannel = " + messageChannel); 88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return retval; 89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Generate a new server response for the stack. 93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param sipResponse 95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * is the SIPRequest from which the SIPServerRequest is to be 96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * constructed. 97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param messageChannel 98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * is the MessageChannel abstraction for this SIPServerResponse 99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public ServerResponseInterface newSIPServerResponse( 101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang SIPResponse sipResponse, MessageChannel messageChannel) { 102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang SIPTransactionStack theStack = (SIPTransactionStack) messageChannel 103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .getSIPStack(); 104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Tr is null if a transaction is not mapped. 105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang SIPTransaction tr = (SIPTransaction) ((SIPTransactionStack) theStack) 106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .findTransaction(sipResponse, false); 107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (sipStack.isLoggingEnabled()) 108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack.getStackLogger().logDebug( 109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang "Found Transaction " + tr + " for " + sipResponse); 110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (tr != null) { 112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Prune unhealthy responses early if handling statefully. 113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // If the state has not yet been assigned then this is a 114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // spurious response. This was moved up from the transaction 115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // layer for efficiency. 116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (tr.getState() == null) { 117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (sipStack.isLoggingEnabled()) 118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack.getStackLogger().logDebug( 119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang "Dropping response - null transaction state"); 120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return null; 121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Ignore 1xx 122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else if (TransactionState.COMPLETED == tr.getState() 123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang && sipResponse.getStatusCode() / 100 == 1) { 124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (sipStack.isLoggingEnabled()) 125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack.getStackLogger().logDebug( 126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang "Dropping response - late arriving " 127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + sipResponse.getStatusCode()); 128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return null; 129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang DialogFilter retval = new DialogFilter( 133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack); 134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang retval.transactionChannel = tr; 136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang retval.listeningPoint = messageChannel.getMessageProcessor() 138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .getListeningPoint(); 139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return retval; 140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public NistSipMessageFactoryImpl(SipStackImpl sipStackImpl) { 143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sipStack = sipStackImpl; 144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang}