Below is the example code used to handle the above mentioned scenario:
--------------------
sbb-jar.xml
--------------------
<event event-direction="Receive" initial-event="True">
<event-name>Invite</event-name>
<event-type-ref>
<event-type-name>javax.sip.message.Request.INVITE</
event-type-name>
<event-type-vendor>net.java.slee</event-type-vendor>
<event-type-version>1.2</event-type-version>
</event-type-ref>
<initial-event-select variable="ActivityContext"/>
<initial-event-selector-method-name>initialEventSelector</
initial-event-selector-method-name>
</event>
<event event-direction="Receive" initial-event="False">
<event-name>Refer</event-name>
<event-type-ref>
<event-type-name>javax.sip.Dialog.REFER</event-type-
name>
<event-type-vendor>net.java.slee</event-type-vendor>
<event-type-version>1.2</event-type-version>
</event-type-ref>
</event>
--------------------
Sbb.java
--------------------
/**
* Out-of-dialog INVITE
*/
public void onInvite(javax.sip.RequestEvent event,
ActivityContextInterface aci) {
Request request = event.getRequest();
ServerTransaction txn = event.getServerTransaction();
//Create a dialog
DialogActivity dialog = (DialogActivity)txn.getDialog();
if(null == dialog){
dialog = (DialogActivity)getSipProvider().getNewDialog(txn);
}
Response resp = getMessageFactory().createResponse(Response.OK,
request);
//Add contact header and SDP content into the response
//!!Not relevant for the discussion!!
//....
txn.sendResponse(resp);
//Attach to the dialog ACI
ActivityContextInterface dialogAci = getSipAcif
().getActivityContextInterface((DialogActivity) dialog);
logger.info("Attaching to dialog["+((DialogWrapper)
dialog).getActivityHandle()+"] ACI["+ dialogAci.toString()+"]");
dialogAci.attach(getSbbLocalObject());
dialog.terminateOnBye(true);
//Store the dialog in the CMP
setIncomingDialog(dialog);
}
/**
* REFER request
*/
public void onRefer(javax.sip.RequestEvent event,
ActivityContextInterface aci) {
Request referReq = event.getRequest();
ServerTransaction st = event.getServerTransaction();
DialogActivity incomingDialog = (DialogActivity)event.getDialog();
//Send 'accepted' to the requester
Response res = getMessageFactory().createResponse(Response.ACCEPTED,
request);
st.sendResponse(res);
//Send an immediate NOTIFY with 200 OK
Request notifyReq =incomingDialog.createRequest(Request.NOTIFY);
//Add Content, Event, SubscriptionState and Route headers to the
notifyReq
//!!May not be relevant for the discussion!!
//...
ClientTransaction clientTransaction = getSipProvider
().getNewClientTransaction(notifyReq);
incomingDialog.sendRequest(clientTransaction);
//Send an INVITE to the B-Party
//Construct a new Request from the parameters available in the
request
Request request = getRefereeRequest(referReq);
ClientTransaction ct = getSipProvider().getNewClientTransaction
(request);
ct.sendRequest();
DialogActivity outgoingDialog = (DialogActivity)getSipProvider
().getNewDialog(ct);
ActivityContextInterface outgoingDialogAci = getSipAcif
().getActivityContextInterface(outgoingDialog);
//Store the dialog in the CMP
setOutgoingDialog(outgoingDialog);
logger.info("Attaching to dialog["+((DialogWrapper)
outgoingDialog).getActivityHandle()+"] ACI["+
outgoingDialogAci.toString()+"]");
outgoingDialogAci.attach(getSbbLocalObject());
//Allowing the client to send clean-up messages within dialog after
a
//BYE is sent to it by the server.
outgoingDialog.terminateOnBye(false);
}
--------------------
Thanks for your response.