package org.mobicents.protocols.ss7.cap;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.mobicents.protocols.ss7.cap.api.CAPApplicationContext;
import org.mobicents.protocols.ss7.cap.api.CAPDialog;
import org.mobicents.protocols.ss7.cap.api.CAPDialogListener;
import org.mobicents.protocols.ss7.cap.api.CAPException;
import org.mobicents.protocols.ss7.cap.api.CAPMessage;
import org.mobicents.protocols.ss7.cap.api.CAPParameterFactory;
import org.mobicents.protocols.ss7.cap.api.CAPProvider;
import org.mobicents.protocols.ss7.cap.api.EsiBcsm.OAnswerSpecificInfo;
import org.mobicents.protocols.ss7.cap.api.EsiBcsm.ODisconnectSpecificInfo;
import org.mobicents.protocols.ss7.cap.api.dialog.CAPGeneralAbortReason;
import org.mobicents.protocols.ss7.cap.api.dialog.CAPGprsReferenceNumber;
import org.mobicents.protocols.ss7.cap.api.dialog.CAPNoticeProblemDiagnostic;
import org.mobicents.protocols.ss7.cap.api.dialog.CAPUserAbortReason;
import org.mobicents.protocols.ss7.cap.api.errors.CAPErrorMessage;
import org.mobicents.protocols.ss7.cap.api.isup.CalledPartyNumberCap;
import org.mobicents.protocols.ss7.cap.api.isup.CallingPartyNumberCap;
import org.mobicents.protocols.ss7.cap.api.isup.LocationNumberCap;
import org.mobicents.protocols.ss7.cap.api.primitives.EventTypeBCSM;
import org.mobicents.protocols.ss7.cap.api.primitives.ReceivingSideID;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ActivityTestRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ActivityTestResponse;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ApplyChargingReportRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ApplyChargingRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.AssistRequestInstructionsRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CAPDialogCircuitSwitchedCall;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CAPServiceCircuitSwitchedCallListener;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CallInformationReportRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CallInformationRequestRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CancelRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CollectInformationRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ConnectRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ConnectToResourceRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ContinueRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ContinueWithArgumentRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.DisconnectForwardConnectionRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.DisconnectForwardConnectionWithArgumentRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.DisconnectLegRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.DisconnectLegResponse;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.EstablishTemporaryConnectionRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.EventReportBCSMRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.FurnishChargingInformationRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.InitialDPRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.InitiateCallAttemptRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.InitiateCallAttemptResponse;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.MoveLegRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.MoveLegResponse;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.PlayAnnouncementRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.PromptAndCollectUserInformationRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.PromptAndCollectUserInformationResponse;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ReleaseCallRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.RequestReportBCSMEventRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ResetTimerRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.SendChargingInformationRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.SpecializedResourceReportRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.SplitLegRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.SplitLegResponse;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.primitive.DestinationRoutingAddress;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.primitive.EventSpecificInformationBCSM;
import org.mobicents.protocols.ss7.inap.api.primitives.MiscCallInfo;
import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberInformation.LocationInformation;
import org.mobicents.protocols.ss7.sccp.parameter.SccpAddress;
import org.mobicents.protocols.ss7.tcap.asn.comp.PAbortCauseType;
import org.mobicents.protocols.ss7.tcap.asn.comp.Problem;
public class CallSsfExample implements CAPDialogListener, CAPServiceCircuitSwitchedCallListener {
private CAPProvider capProvider;
private CAPParameterFactory paramFact;
private CAPDialogCircuitSwitchedCall currentCapDialog;
private CallContent cc;
public CallSsfExample() throws NamingException {
InitialContext ctx = new InitialContext();
try {
String providerJndiName = "java:/mobicents/ss7/cap";
this.capProvider = ((CAPProvider) ctx.lookup(providerJndiName));
} finally {
ctx.close();
}
paramFact = capProvider.getCAPParameterFactory();
capProvider.addCAPDialogListener(this);
capProvider.getCAPServiceCircuitSwitchedCall().addCAPServiceListener(this);
}
public CAPProvider getCAPProvider() {
return capProvider;
}
public void start() {
// Make the circuitSwitchedCall service activated
capProvider.getCAPServiceCircuitSwitchedCall().acivate();
currentCapDialog = null;
}
public void stop() {
capProvider.getCAPServiceCircuitSwitchedCall().deactivate();
}
public void sendInitialDP(SccpAddress origAddress, SccpAddress remoteAddress, int serviceKey,
CalledPartyNumberCap calledPartyNumber, CallingPartyNumberCap callingPartyNumber, LocationNumberCap locationNumber,
EventTypeBCSM eventTypeBCSM, LocationInformation locationInformation) throws CAPException {
// First create Dialog
CAPApplicationContext acn = CAPApplicationContext.CapV2_gsmSSF_to_gsmSCF;
currentCapDialog = capProvider.getCAPServiceCircuitSwitchedCall().createNewDialog(acn, origAddress, remoteAddress);
currentCapDialog.addInitialDPRequest(serviceKey, calledPartyNumber, callingPartyNumber, null, null, null,
locationNumber, null, null, null, null, null, eventTypeBCSM, null, null, null, null, null, null, null, false,
null, null, locationInformation, null, null, null, null, null, false, null);
// This will initiate the TC-BEGIN with INVOKE component
currentCapDialog.send();
this.cc.step = Step.initialDPSent;
this.cc.calledPartyNumber = calledPartyNumber;
this.cc.callingPartyNumber = callingPartyNumber;
}
public void sendEventReportBCSM_OAnswer(OAnswerSpecificInfo oAnswerSpecificInfo, ReceivingSideID legID,
MiscCallInfo miscCallInfo) throws CAPException {
if (currentCapDialog != null && this.cc != null) {
EventSpecificInformationBCSM eventSpecificInformationBCSM = this.capProvider.getCAPParameterFactory()
.createEventSpecificInformationBCSM(oAnswerSpecificInfo);
currentCapDialog.addEventReportBCSMRequest(EventTypeBCSM.oAnswer, eventSpecificInformationBCSM, legID,
miscCallInfo, null);
currentCapDialog.send();
this.cc.step = Step.answered;
}
}
public void sendEventReportBCSM_ODisconnect(ODisconnectSpecificInfo oDisconnectSpecificInfo, ReceivingSideID legID,
MiscCallInfo miscCallInfo) throws CAPException {
if (currentCapDialog != null && this.cc != null) {
EventSpecificInformationBCSM eventSpecificInformationBCSM = this.capProvider.getCAPParameterFactory()
.createEventSpecificInformationBCSM(oDisconnectSpecificInfo);
currentCapDialog.addEventReportBCSMRequest(EventTypeBCSM.oDisconnect, eventSpecificInformationBCSM, legID,
miscCallInfo, null);
currentCapDialog.send();
this.cc.step = Step.disconnected;
}
}
@Override
public void onRequestReportBCSMEventRequest(RequestReportBCSMEventRequest ind) {
if (currentCapDialog != null && this.cc != null && this.cc.step != Step.disconnected) {
this.cc.requestReportBCSMEventRequest = ind;
// initiating BCSM events processing
}
ind.getCAPDialog().processInvokeWithoutAnswer(ind.getInvokeId());
}
@Override
public void onActivityTestRequest(ActivityTestRequest ind) {
if (currentCapDialog != null && this.cc != null && this.cc.step != Step.disconnected) {
this.cc.activityTestInvokeId = ind.getInvokeId();
}
}
@Override
public void onActivityTestResponse(ActivityTestResponse ind) {
// TODO Auto-generated method stub
}
@Override
public void onContinueRequest(ContinueRequest ind) {
this.cc.step = Step.callAllowed;
ind.getCAPDialog().processInvokeWithoutAnswer(ind.getInvokeId());
// sending Continue to use the original calledPartyAddress
}
@Override
public void onConnectRequest(ConnectRequest ind) {
this.cc.step = Step.callAllowed;
this.cc.destinationRoutingAddress = ind.getDestinationRoutingAddress();
ind.getCAPDialog().processInvokeWithoutAnswer(ind.getInvokeId());
// sending Connect to force routing the call to a new number
}
@Override
public void onDialogTimeout(CAPDialog capDialog) {
if (currentCapDialog != null && this.cc != null && this.cc.step != Step.disconnected) {
// if the call is still up - keep the sialog alive
currentCapDialog.keepAlive();
}
}
@Override
public void onDialogDelimiter(CAPDialog capDialog) {
if (currentCapDialog != null && this.cc != null && this.cc.step != Step.disconnected) {
if (this.cc.activityTestInvokeId != null) {
try {
currentCapDialog.addActivityTestResponse(this.cc.activityTestInvokeId);
this.cc.activityTestInvokeId = null;
currentCapDialog.send();
} catch (CAPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
@Override
public void onErrorComponent(CAPDialog capDialog, Long invokeId, CAPErrorMessage capErrorMessage) {
// TODO Auto-generated method stub
}
@Override
public void onRejectComponent(CAPDialog capDialog, Long invokeId, Problem problem, boolean isLocalOriginated) {
// TODO Auto-generated method stub
}
@Override
public void onInvokeTimeout(CAPDialog capDialog, Long invokeId) {
// TODO Auto-generated method stub
}
@Override
public void onCAPMessage(CAPMessage capMessage) {
// TODO Auto-generated method stub
}
@Override
public void onInitialDPRequest(InitialDPRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onApplyChargingRequest(ApplyChargingRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onEventReportBCSMRequest(EventReportBCSMRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onApplyChargingReportRequest(ApplyChargingReportRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onReleaseCallRequest(ReleaseCallRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onCallGapRequest(org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CallGapRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onCallInformationRequestRequest(CallInformationRequestRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onCallInformationReportRequest(CallInformationReportRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onAssistRequestInstructionsRequest(AssistRequestInstructionsRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onEstablishTemporaryConnectionRequest(EstablishTemporaryConnectionRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onDisconnectForwardConnectionRequest(DisconnectForwardConnectionRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onConnectToResourceRequest(ConnectToResourceRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onResetTimerRequest(ResetTimerRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onFurnishChargingInformationRequest(FurnishChargingInformationRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onSendChargingInformationRequest(SendChargingInformationRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onSpecializedResourceReportRequest(SpecializedResourceReportRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onPlayAnnouncementRequest(PlayAnnouncementRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onPromptAndCollectUserInformationRequest(PromptAndCollectUserInformationRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onPromptAndCollectUserInformationResponse(PromptAndCollectUserInformationResponse ind) {
// TODO Auto-generated method stub
}
@Override
public void onCancelRequest(CancelRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onDialogRequest(CAPDialog capDialog, CAPGprsReferenceNumber capGprsReferenceNumber) {
// TODO Auto-generated method stub
}
@Override
public void onDialogAccept(CAPDialog capDialog, CAPGprsReferenceNumber capGprsReferenceNumber) {
// TODO Auto-generated method stub
}
@Override
public void onDialogUserAbort(CAPDialog capDialog, CAPGeneralAbortReason generalReason, CAPUserAbortReason userReason) {
// TODO Auto-generated method stub
}
@Override
public void onDialogProviderAbort(CAPDialog capDialog, PAbortCauseType abortCause) {
// TODO Auto-generated method stub
}
@Override
public void onDialogClose(CAPDialog capDialog) {
// TODO Auto-generated method stub
}
@Override
public void onDialogRelease(CAPDialog capDialog) {
this.currentCapDialog = null;
this.cc = null;
}
@Override
public void onDialogNotice(CAPDialog capDialog, CAPNoticeProblemDiagnostic noticeProblemDiagnostic) {
// TODO Auto-generated method stub
}
private enum Step {
initialDPSent, callAllowed, answered, disconnected;
}
private class CallContent {
public Step step;
public Long activityTestInvokeId;
public CalledPartyNumberCap calledPartyNumber;
public CallingPartyNumberCap callingPartyNumber;
public RequestReportBCSMEventRequest requestReportBCSMEventRequest;
public DestinationRoutingAddress destinationRoutingAddress;
}
@Override
public void onContinueWithArgumentRequest(ContinueWithArgumentRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onDisconnectLegRequest(DisconnectLegRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onDisconnectLegResponse(DisconnectLegResponse ind) {
// TODO Auto-generated method stub
}
@Override
public void onDisconnectForwardConnectionWithArgumentRequest(DisconnectForwardConnectionWithArgumentRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onInitiateCallAttemptRequest(InitiateCallAttemptRequest initiateCallAttemptRequest) {
// TODO Auto-generated method stub
}
@Override
public void onInitiateCallAttemptResponse(InitiateCallAttemptResponse initiateCallAttemptResponse) {
// TODO Auto-generated method stub
}
@Override
public void onMoveLegRequest(MoveLegRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onMoveLegResponse(MoveLegResponse ind) {
// TODO Auto-generated method stub
}
@Override
public void onCollectInformationRequest(CollectInformationRequest ind) {
// TODO Auto-generated method stub
}
public void onSplitLegRequest(SplitLegRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onSplitLegResponse(SplitLegResponse ind) {
// TODO Auto-generated method stub
}
}