137 lines
5.3 KiB
Java
137 lines
5.3 KiB
Java
/*
|
|
This file is part of Peers, a java SIP softphone.
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
any later version.
|
|
|
|
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 for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
Copyright 2007, 2008, 2009, 2010 Yohann Martineau
|
|
*/
|
|
|
|
package peers.sip.core.useragent;
|
|
|
|
|
|
import org.tinylog.Logger;
|
|
import peers.sip.RFC3261;
|
|
import peers.sip.core.useragent.handlers.ByeHandler;
|
|
import peers.sip.core.useragent.handlers.CancelHandler;
|
|
import peers.sip.core.useragent.handlers.InviteHandler;
|
|
import peers.sip.core.useragent.handlers.OptionsHandler;
|
|
import peers.sip.core.useragent.handlers.RegisterHandler;
|
|
import peers.sip.syntaxencoding.NameAddress;
|
|
import peers.sip.syntaxencoding.SipHeaderFieldName;
|
|
import peers.sip.syntaxencoding.SipHeaderFieldValue;
|
|
import peers.sip.syntaxencoding.SipHeaderParamName;
|
|
import peers.sip.syntaxencoding.SipHeaders;
|
|
import peers.sip.syntaxencoding.SipURI;
|
|
import peers.sip.syntaxencoding.SipUriSyntaxException;
|
|
import peers.sip.transaction.TransactionManager;
|
|
import peers.sip.transactionuser.Dialog;
|
|
import peers.sip.transactionuser.DialogManager;
|
|
import peers.sip.transport.SipRequest;
|
|
import peers.sip.transport.SipResponse;
|
|
import peers.sip.transport.TransportManager;
|
|
|
|
|
|
public abstract class RequestManager {
|
|
|
|
public static SipURI getDestinationUri(SipRequest sipRequest
|
|
) {
|
|
SipHeaders requestHeaders = sipRequest.getSipHeaders();
|
|
SipURI destinationUri = null;
|
|
SipHeaderFieldValue route = requestHeaders.get(
|
|
new SipHeaderFieldName(RFC3261.HDR_ROUTE));
|
|
if (route != null) {
|
|
try {
|
|
destinationUri = new SipURI(
|
|
NameAddress.nameAddressToUri(route.toString()));
|
|
} catch (SipUriSyntaxException e) {
|
|
Logger.error("syntax error", e);
|
|
}
|
|
}
|
|
if (destinationUri == null) {
|
|
destinationUri = sipRequest.getRequestUri();
|
|
}
|
|
return destinationUri;
|
|
}
|
|
|
|
public static SipResponse generateResponse(SipRequest sipRequest,
|
|
Dialog dialog, int statusCode, String reasonPhrase) {
|
|
//8.2.6.2
|
|
SipResponse sipResponse = new SipResponse(statusCode, reasonPhrase);
|
|
SipHeaders requestHeaders = sipRequest.getSipHeaders();
|
|
SipHeaders responseHeaders = sipResponse.getSipHeaders();
|
|
SipHeaderFieldName fromName = new SipHeaderFieldName(RFC3261.HDR_FROM);
|
|
responseHeaders.add(fromName, requestHeaders.get(fromName));
|
|
SipHeaderFieldName callIdName = new SipHeaderFieldName(RFC3261.HDR_CALLID);
|
|
responseHeaders.add(callIdName, requestHeaders.get(callIdName));
|
|
SipHeaderFieldName cseqName = new SipHeaderFieldName(RFC3261.HDR_CSEQ);
|
|
responseHeaders.add(cseqName, requestHeaders.get(cseqName));
|
|
SipHeaderFieldName viaName = new SipHeaderFieldName(RFC3261.HDR_VIA);
|
|
responseHeaders.add(viaName, requestHeaders.get(viaName));//TODO check ordering
|
|
SipHeaderFieldName toName = new SipHeaderFieldName(RFC3261.HDR_TO);
|
|
SipHeaderFieldValue toValue = requestHeaders.get(toName);
|
|
SipHeaderParamName toTagParamName = new SipHeaderParamName(RFC3261.PARAM_TAG);
|
|
String toTag = toValue.getParam(toTagParamName);
|
|
if (toTag == null) {
|
|
if (dialog != null) {
|
|
toTag = dialog.getLocalTag();
|
|
toValue.addParam(toTagParamName, toTag);
|
|
}
|
|
}
|
|
responseHeaders.add(toName, toValue);
|
|
return sipResponse;
|
|
}
|
|
|
|
protected InviteHandler inviteHandler;
|
|
protected CancelHandler cancelHandler;
|
|
protected ByeHandler byeHandler;
|
|
protected OptionsHandler optionsHandler;
|
|
protected RegisterHandler registerHandler;
|
|
|
|
protected UserAgent userAgent;
|
|
protected TransactionManager transactionManager;
|
|
protected TransportManager transportManager;
|
|
|
|
public RequestManager(UserAgent userAgent,
|
|
InviteHandler inviteHandler,
|
|
CancelHandler cancelHandler,
|
|
ByeHandler byeHandler,
|
|
OptionsHandler optionsHandler,
|
|
RegisterHandler registerHandler,
|
|
DialogManager dialogManager,
|
|
TransactionManager transactionManager,
|
|
TransportManager transportManager) {
|
|
this.userAgent = userAgent;
|
|
this.inviteHandler = inviteHandler;
|
|
this.cancelHandler = cancelHandler;
|
|
this.byeHandler = byeHandler;
|
|
this.optionsHandler = optionsHandler;
|
|
this.registerHandler = registerHandler;
|
|
this.transactionManager = transactionManager;
|
|
this.transportManager = transportManager;
|
|
}
|
|
|
|
public InviteHandler getInviteHandler() {
|
|
return inviteHandler;
|
|
}
|
|
|
|
public ByeHandler getByeHandler() {
|
|
return byeHandler;
|
|
}
|
|
|
|
public RegisterHandler getRegisterHandler() {
|
|
return registerHandler;
|
|
}
|
|
|
|
}
|