package org.mobicents.protocols.ss7.cap; import java.util.ArrayList; import javax.naming.InitialContext; import javax.naming.NamingException; 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.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.primitives.BCSMEvent; import org.mobicents.protocols.ss7.cap.api.primitives.EventTypeBCSM; import org.mobicents.protocols.ss7.cap.api.primitives.MonitorMode; 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.CallGapRequest; import org.mobicents.protocols.ss7.inap.api.primitives.LegID; import org.mobicents.protocols.ss7.inap.api.primitives.LegType; import org.mobicents.protocols.ss7.isup.message.parameter.CalledPartyNumber; import org.mobicents.protocols.ss7.isup.message.parameter.NAINumber; import org.mobicents.protocols.ss7.tcap.asn.comp.PAbortCauseType; import org.mobicents.protocols.ss7.tcap.asn.comp.Problem; public class CallScfExample implements CAPDialogListener, CAPServiceCircuitSwitchedCallListener { private CAPProvider capProvider; private CAPParameterFactory paramFact; private CAPDialogCircuitSwitchedCall currentCapDialog; private CallContent cc; public CallScfExample() 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(); } @Override public void onInitialDPRequest(InitialDPRequest ind) { this.cc = new CallContent(); this.cc.idp = ind; this.cc.step = Step.initialDPRecieved; ind.getCAPDialog().processInvokeWithoutAnswer(ind.getInvokeId()); } @Override public void onEventReportBCSMRequest(EventReportBCSMRequest ind) { if (this.cc != null) { this.cc.eventList.add(ind); switch (ind.getEventTypeBCSM()) { case oAnswer: this.cc.step = Step.answered; break; case oDisconnect: this.cc.step = Step.disconnected; break; } } ind.getCAPDialog().processInvokeWithoutAnswer(ind.getInvokeId()); } @Override public void onDialogDelimiter(CAPDialog capDialog) { try { if (this.cc != null) { switch (this.cc.step) { case initialDPRecieved: // informing SSF of BCSM events processing ArrayList<BCSMEvent> bcsmEventList = new ArrayList<BCSMEvent>(); BCSMEvent ev = this.capProvider.getCAPParameterFactory().createBCSMEvent( EventTypeBCSM.routeSelectFailure, MonitorMode.notifyAndContinue, null, null, false); bcsmEventList.add(ev); ev = this.capProvider.getCAPParameterFactory().createBCSMEvent(EventTypeBCSM.oCalledPartyBusy, MonitorMode.interrupted, null, null, false); bcsmEventList.add(ev); ev = this.capProvider.getCAPParameterFactory().createBCSMEvent(EventTypeBCSM.oNoAnswer, MonitorMode.interrupted, null, null, false); bcsmEventList.add(ev); ev = this.capProvider.getCAPParameterFactory().createBCSMEvent(EventTypeBCSM.oAnswer, MonitorMode.notifyAndContinue, null, null, false); bcsmEventList.add(ev); LegID legId = this.capProvider.getINAPParameterFactory().createLegID(true, LegType.leg1); ev = this.capProvider.getCAPParameterFactory().createBCSMEvent(EventTypeBCSM.oDisconnect, MonitorMode.notifyAndContinue, legId, null, false); bcsmEventList.add(ev); legId = this.capProvider.getINAPParameterFactory().createLegID(true, LegType.leg2); ev = this.capProvider.getCAPParameterFactory().createBCSMEvent(EventTypeBCSM.oDisconnect, MonitorMode.interrupted, legId, null, false); bcsmEventList.add(ev); ev = this.capProvider.getCAPParameterFactory().createBCSMEvent(EventTypeBCSM.oAbandon, MonitorMode.notifyAndContinue, null, null, false); bcsmEventList.add(ev); currentCapDialog.addRequestReportBCSMEventRequest(bcsmEventList, null); // calculating here a new called party number if it is needed String newNumber = "22123124"; if (newNumber != null) { // sending Connect to force routing the call to a new number ArrayList<CalledPartyNumberCap> calledPartyNumber = new ArrayList<CalledPartyNumberCap>(); CalledPartyNumber cpn = this.capProvider.getISUPParameterFactory().createCalledPartyNumber(); cpn.setAddress("5599999988"); cpn.setNatureOfAddresIndicator(NAINumber._NAI_INTERNATIONAL_NUMBER); cpn.setNumberingPlanIndicator(CalledPartyNumber._NPI_ISDN); cpn.setInternalNetworkNumberIndicator(CalledPartyNumber._INN_ROUTING_ALLOWED); CalledPartyNumberCap cpnc = this.capProvider.getCAPParameterFactory().createCalledPartyNumberCap( cpn); calledPartyNumber.add(cpnc); DestinationRoutingAddress destinationRoutingAddress = this.capProvider.getCAPParameterFactory() .createDestinationRoutingAddress(calledPartyNumber); currentCapDialog.addConnectRequest(destinationRoutingAddress, null, null, null, null, null, null, null, null, null, null, null, null, false, false, false, null, false, false); } else { // sending Continue to use the original calledPartyAddress currentCapDialog.addContinueRequest(); } currentCapDialog.send(); break; case disconnected: // the call is terminated - close dialog currentCapDialog.close(false); break; } } } catch (CAPException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void onDialogTimeout(CAPDialog capDialog) { if (currentCapDialog != null && this.cc != null && this.cc.step != Step.disconnected && this.cc.activityTestInvokeId == null) { // check the SSF if the call is still alive currentCapDialog.keepAlive(); try { this.cc.activityTestInvokeId = currentCapDialog.addActivityTestRequest(); currentCapDialog.send(); } catch (CAPException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override public void onActivityTestResponse(ActivityTestResponse ind) { if (currentCapDialog != null && this.cc != null) { this.cc.activityTestInvokeId = null; } } @Override public void onInvokeTimeout(CAPDialog capDialog, Long invokeId) { if (currentCapDialog != null && this.cc != null) { if (this.cc.activityTestInvokeId == invokeId) { // activityTest failure try { currentCapDialog.close(true); } 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 onCAPMessage(CAPMessage capMessage) { // TODO Auto-generated method stub } @Override public void onRequestReportBCSMEventRequest(RequestReportBCSMEventRequest ind) { // TODO Auto-generated method stub } @Override public void onApplyChargingRequest(ApplyChargingRequest ind) { // TODO Auto-generated method stub } @Override public void onContinueRequest(ContinueRequest 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 onConnectRequest(ConnectRequest 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 onActivityTestRequest(ActivityTestRequest 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 { initialDPRecieved, answered, disconnected; } private class CallContent { public Step step; public InitialDPRequest idp; public ArrayList<EventReportBCSMRequest> eventList = new ArrayList<EventReportBCSMRequest>(); public Long activityTestInvokeId; } @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 } @Override public void onCallGapRequest(CallGapRequest ind) { // TODO Auto-generated method stub } }