package org.mobicents.smsc.ihub; import java.util.concurrent.atomic.AtomicLong; import org.apache.log4j.Logger; import org.mobicents.protocols.ss7.map.api.MAPDialog; import org.mobicents.protocols.ss7.map.api.MAPDialogListener; import org.mobicents.protocols.ss7.map.api.MAPException; import org.mobicents.protocols.ss7.map.api.MAPMessage; import org.mobicents.protocols.ss7.map.api.dialog.MAPAbortProviderReason; import org.mobicents.protocols.ss7.map.api.dialog.MAPAbortSource; import org.mobicents.protocols.ss7.map.api.dialog.MAPNoticeProblemDiagnostic; import org.mobicents.protocols.ss7.map.api.dialog.MAPRefuseReason; import org.mobicents.protocols.ss7.map.api.dialog.MAPUserAbortChoice; import org.mobicents.protocols.ss7.map.api.errors.AbsentSubscriberDiagnosticSM; import org.mobicents.protocols.ss7.map.api.errors.MAPErrorMessage; import org.mobicents.protocols.ss7.map.api.errors.MAPErrorMessageFactory; import org.mobicents.protocols.ss7.map.api.primitives.AddressNature; import org.mobicents.protocols.ss7.map.api.primitives.AddressString; import org.mobicents.protocols.ss7.map.api.primitives.IMSI; import org.mobicents.protocols.ss7.map.api.primitives.ISDNAddressString; import org.mobicents.protocols.ss7.map.api.primitives.MAPExtensionContainer; import org.mobicents.protocols.ss7.map.api.primitives.NumberingPlan; import org.mobicents.protocols.ss7.map.api.service.sms.AlertServiceCentreRequest; import org.mobicents.protocols.ss7.map.api.service.sms.AlertServiceCentreResponse; import org.mobicents.protocols.ss7.map.api.service.sms.ForwardShortMessageRequest; import org.mobicents.protocols.ss7.map.api.service.sms.ForwardShortMessageResponse; import org.mobicents.protocols.ss7.map.api.service.sms.InformServiceCentreRequest; import org.mobicents.protocols.ss7.map.api.service.sms.LocationInfoWithLMSI; import org.mobicents.protocols.ss7.map.api.service.sms.MAPDialogSms; import org.mobicents.protocols.ss7.map.api.service.sms.MAPServiceSmsListener; import org.mobicents.protocols.ss7.map.api.service.sms.MoForwardShortMessageRequest; import org.mobicents.protocols.ss7.map.api.service.sms.MoForwardShortMessageResponse; import org.mobicents.protocols.ss7.map.api.service.sms.MtForwardShortMessageRequest; import org.mobicents.protocols.ss7.map.api.service.sms.MtForwardShortMessageResponse; import org.mobicents.protocols.ss7.map.api.service.sms.NoteSubscriberPresentRequest; import org.mobicents.protocols.ss7.map.api.service.sms.ReadyForSMRequest; import org.mobicents.protocols.ss7.map.api.service.sms.ReadyForSMResponse; import org.mobicents.protocols.ss7.map.api.service.sms.ReportSMDeliveryStatusRequest; import org.mobicents.protocols.ss7.map.api.service.sms.ReportSMDeliveryStatusResponse; import org.mobicents.protocols.ss7.map.api.service.sms.SendRoutingInfoForSMRequest; import org.mobicents.protocols.ss7.map.api.service.sms.SendRoutingInfoForSMResponse; import org.mobicents.protocols.ss7.map.api.service.sms.SmsSignalInfo; import org.mobicents.protocols.ss7.map.api.smstpdu.AddressField; import org.mobicents.protocols.ss7.map.api.smstpdu.SmsSubmitTpdu; import org.mobicents.protocols.ss7.map.api.smstpdu.SmsTpdu; import org.mobicents.protocols.ss7.map.api.smstpdu.SmsTpduType; import org.mobicents.protocols.ss7.map.primitives.IMSIImpl; import org.mobicents.protocols.ss7.map.primitives.ISDNAddressStringImpl; import org.mobicents.protocols.ss7.map.service.sms.LocationInfoWithLMSIImpl; import org.mobicents.protocols.ss7.tcap.asn.ApplicationContextName; import org.mobicents.protocols.ss7.tcap.asn.comp.Problem; public class MAPListener implements MAPDialogListener, MAPServiceSmsListener { private static final Logger logger = Logger.getLogger(MAPListener.class); private MAPSimulator iHubManagement = null; private final AtomicLong mapMessagesReceivedCounter = new AtomicLong(0); private long currentMapMessageCount = 0; private long now = System.currentTimeMillis(); private final MAPErrorMessageFactory mAPErrorMessageFactory; // private final FastMap<Long, MAPDialog> liveDialogs = (new FastMap<Long, // MAPDialog>()).shared(); protected MAPListener(MAPSimulator iHubManagement) { this.iHubManagement = iHubManagement; this.mAPErrorMessageFactory = this.iHubManagement.getMapProvider().getMAPErrorMessageFactory(); } /** * Dialog Listener */ @Override public void onDialogAccept(MAPDialog arg0, MAPExtensionContainer arg1) { // TODO Auto-generated method stub } @Override public void onDialogClose(MAPDialog arg0) { // TODO Auto-generated method stub } @Override public void onDialogDelimiter(MAPDialog dialog) { if (logger.isDebugEnabled()) { logger.debug("onDialogDelimiter " + dialog.getState()); } Boolean falg = (Boolean) dialog.getUserObject(); try { if (falg != null) { dialog.close(false); } else { // Accept Dialog so other messages can come in dialog.send(); } } catch (MAPException e) { logger.error("Error while trying to send or close dialog", e); } } @Override public void onDialogNotice(MAPDialog arg0, MAPNoticeProblemDiagnostic arg1) { // TODO Auto-generated method stub } @Override public void onDialogProviderAbort(MAPDialog arg0, MAPAbortProviderReason arg1, MAPAbortSource arg2, MAPExtensionContainer arg3) { // TODO Auto-generated method stub } // @Override // public void onDialogReject(MAPDialog arg0, MAPRefuseReason arg1, // MAPProviderError arg2, // ApplicationContextName arg3, MAPExtensionContainer arg4) { // // TODO Auto-generated method stub // // } @Override public void onDialogRelease(MAPDialog dialog) { // TODO Auto-generated method stub // this.liveDialogs.remove(dialog.getLocalDialogId()); } @Override public void onDialogRequest(MAPDialog dialog, AddressString arg1, AddressString arg2, MAPExtensionContainer arg3) { // TODO Auto-generated method stub this.currentMapMessageCount = this.mapMessagesReceivedCounter.incrementAndGet(); // this.liveDialogs.put(dialog.getLocalDialogId(), dialog); if ((this.mapMessagesReceivedCounter.get() % 400) == 0) { long temp = System.currentTimeMillis(); logger.warn("Received 400 MAP Dialog requests in milli seconds " + (temp - this.now)); this.now = temp; } } @Override public void onDialogRequestEricsson(MAPDialog arg0, AddressString arg1, AddressString arg2, IMSI arg3, AddressString arg4) { // TODO Auto-generated method stub } @Override public void onDialogTimeout(MAPDialog arg0) { // TODO Auto-generated method stub } @Override public void onDialogUserAbort(MAPDialog arg0, MAPUserAbortChoice arg1, MAPExtensionContainer arg2) { // TODO Auto-generated method stub } /** * Component Listener */ @Override public void onErrorComponent(MAPDialog arg0, Long arg1, MAPErrorMessage arg2) { // TODO Auto-generated method stub } @Override public void onInvokeTimeout(MAPDialog arg0, Long arg1) { // TODO Auto-generated method stub } @Override public void onMAPMessage(MAPMessage arg0) { // TODO Auto-generated method stub } // @Override // public void onProviderErrorComponent(MAPDialog arg0, Long arg1, // MAPProviderError arg2) { // // TODO Auto-generated method stub // // } // @Override // public void onRejectComponent(MAPDialog arg0, Long arg1, Problem arg2) { // // TODO Auto-generated method stub // // } /** * SMS Listener */ @Override public void onAlertServiceCentreRequest(AlertServiceCentreRequest arg0) { // TODO Auto-generated method stub } @Override public void onAlertServiceCentreResponse(AlertServiceCentreResponse arg0) { // TODO Auto-generated method stub } @Override public void onForwardShortMessageRequest(ForwardShortMessageRequest event) { if (logger.isInfoEnabled()) { logger.info("Rx : onForwardShortMessageRequest=" + event); } // Lets first close the Dialog MAPDialogSms mapDialogSms = event.getMAPDialog(); try { if (this.currentMapMessageCount % 7 == 0) { // Send back AbsentSubscriber for every 7th MtSMS MAPErrorMessage mapErrorMessage = mAPErrorMessageFactory.createMAPErrorMessageAbsentSubscriberSM( AbsentSubscriberDiagnosticSM.IMSIDetached, null, null); mapDialogSms.sendErrorComponent(event.getInvokeId(), mapErrorMessage); // mapDialogSms.close(false); } else { mapDialogSms.addForwardShortMessageResponse(event.getInvokeId()); // mapDialogSms.close(false); } } catch (MAPException e) { logger.error("Error while sending MAPErrorMessageAbsentSubscriberSM ", e); } mapDialogSms.setUserObject(true); } @Override public void onForwardShortMessageResponse(ForwardShortMessageResponse arg0) { // TODO Auto-generated method stub } @Override public void onInformServiceCentreRequest(InformServiceCentreRequest arg0) { // TODO Auto-generated method stub } @Override public void onMoForwardShortMessageRequest(MoForwardShortMessageRequest request) { if (logger.isDebugEnabled()) { logger.debug("Rx : MoForwardShortMessageRequestIndication=" + request); } MAPDialogSms dialog = request.getMAPDialog(); try { // TODO Should we add PENDING SMS TPDU here itself? dialog.addMoForwardShortMessageResponse(request.getInvokeId(), null, null); // dialog.close(false); } catch (MAPException e) { logger.error("Error while sending MoForwardShortMessageResponse ", e); } dialog.setUserObject(true); try { SmsSignalInfo smsSignalInfo = request.getSM_RP_UI(); SmsTpdu smsTpdu = smsSignalInfo.decodeTpdu(true); if (smsTpdu.getSmsTpduType() != SmsTpduType.SMS_SUBMIT) { // TODO : Error, we should always receive SMS_SUBMIT for // MoForwardShortMessageRequestIndication logger.error("Rx : MoForwardShortMessageRequestIndication, but SmsTpduType is not SMS_SUBMIT. SmsTpdu=" + smsTpdu); return; } SmsSubmitTpdu smsSubmitTpdu = (SmsSubmitTpdu) smsTpdu; AddressField destinationAddress = smsSubmitTpdu.getDestinationAddress(); // TODO Normalize } catch (MAPException e1) { logger.error("Error while decoding SmsSignalInfo ", e1); } } @Override public void onMoForwardShortMessageResponse(MoForwardShortMessageResponse arg0) { // TODO Auto-generated method stub } @Override public void onMtForwardShortMessageRequest(MtForwardShortMessageRequest event) { if (logger.isInfoEnabled()) { logger.info("Rx : onMtForwardShortMessageIndication=" + event); } // Lets first close the Dialog MAPDialogSms mapDialogSms = event.getMAPDialog(); // boolean sendError = true; try { if (this.currentMapMessageCount % 7 == 0) { // if (sendError) { // Send back AbsentSubscriber for every 7th MtSMS MAPErrorMessage mapErrorMessage = mAPErrorMessageFactory.createMAPErrorMessageAbsentSubscriberSM( AbsentSubscriberDiagnosticSM.IMSIDetached, null, null); mapDialogSms.sendErrorComponent(event.getInvokeId(), mapErrorMessage); // mapDialogSms.close(false); } else { mapDialogSms.addMtForwardShortMessageResponse(event.getInvokeId(), null, null); // mapDialogSms.close(false); } } catch (MAPException e) { logger.error("Error while sending MAPErrorMessageAbsentSubscriberSM ", e); } mapDialogSms.setUserObject(true); } @Override public void onMtForwardShortMessageResponse(MtForwardShortMessageResponse arg0) { // TODO Auto-generated method stub } @Override public void onReportSMDeliveryStatusRequest(ReportSMDeliveryStatusRequest event) { if (logger.isInfoEnabled()) { logger.info("Rx : ReportSMDeliveryStatusRequest=" + event); } MAPDialogSms dialog = event.getMAPDialog(); try { dialog.addReportSMDeliveryStatusResponse(event.getInvokeId(), event.getMsisdn(), null); // dialog.close(false); } catch (MAPException e) { e.printStackTrace(); } dialog.setUserObject(true); } @Override public void onReportSMDeliveryStatusResponse(ReportSMDeliveryStatusResponse arg0) { // TODO Auto-generated method stub } @Override public void onSendRoutingInfoForSMRequest(SendRoutingInfoForSMRequest event) { if (logger.isInfoEnabled()) { logger.info("Rx : SendRoutingInfoForSMRequestIndication=" + event); } IMSI imsi = new IMSIImpl("410035001692061"); ISDNAddressString nnn = new ISDNAddressStringImpl(AddressNature.international_number, NumberingPlan.ISDN, "923330052001"); LocationInfoWithLMSI li = new LocationInfoWithLMSIImpl(nnn, null, null, false, null); MAPDialogSms mapDialogSms = event.getMAPDialog(); try { mapDialogSms.addSendRoutingInfoForSMResponse(event.getInvokeId(), imsi, li, null, null); // mapDialogSms.close(false); } catch (MAPException e) { e.printStackTrace(); } mapDialogSms.setUserObject(true); } @Override public void onSendRoutingInfoForSMResponse(SendRoutingInfoForSMResponse arg0) { // TODO Auto-generated method stub } @Override public void onRejectComponent(MAPDialog mapDialog, Long invokeId, Problem problem, boolean isLocalOriginated) { // TODO Auto-generated method stub } @Override public void onDialogReject(MAPDialog mapDialog, MAPRefuseReason refuseReason, ApplicationContextName alternativeApplicationContext, MAPExtensionContainer extensionContainer) { // TODO Auto-generated method stub } @Override public void onReadyForSMRequest(ReadyForSMRequest request) { // TODO Auto-generated method stub } @Override public void onReadyForSMResponse(ReadyForSMResponse response) { // TODO Auto-generated method stub } @Override public void onNoteSubscriberPresentRequest(NoteSubscriberPresentRequest request) { // TODO Auto-generated method stub } }