/* * TeleStax, Open Source Cloud Communications Copyright 2012. * and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.mobicents.protocols.ss7.map.service.callhandling; import java.io.IOException; import java.util.ArrayList; import org.mobicents.protocols.asn.AsnException; import org.mobicents.protocols.asn.AsnInputStream; import org.mobicents.protocols.asn.AsnOutputStream; import org.mobicents.protocols.asn.Tag; import org.mobicents.protocols.ss7.map.api.MAPException; import org.mobicents.protocols.ss7.map.api.MAPMessageType; import org.mobicents.protocols.ss7.map.api.MAPOperationCode; import org.mobicents.protocols.ss7.map.api.MAPParsingComponentException; import org.mobicents.protocols.ss7.map.api.MAPParsingComponentExceptionReason; import org.mobicents.protocols.ss7.map.api.primitives.ExternalSignalInfo; 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.NAEAPreferredCI; import org.mobicents.protocols.ss7.map.api.service.callhandling.AllowedServices; import org.mobicents.protocols.ss7.map.api.service.callhandling.CCBSIndicators; import org.mobicents.protocols.ss7.map.api.service.callhandling.CUGCheckInfo; import org.mobicents.protocols.ss7.map.api.service.callhandling.ExtendedRoutingInfo; import org.mobicents.protocols.ss7.map.api.service.callhandling.RoutingInfo; import org.mobicents.protocols.ss7.map.api.service.callhandling.SendRoutingInformationResponse; import org.mobicents.protocols.ss7.map.api.service.callhandling.UnavailabilityCause; import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberInformation.NumberPortabilityStatus; import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberInformation.SubscriberInfo; import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberManagement.ExtBasicServiceCode; import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberManagement.OfferedCamel4CSIs; import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberManagement.SupportedCamelPhases; import org.mobicents.protocols.ss7.map.api.service.supplementary.SSCode; import org.mobicents.protocols.ss7.map.primitives.ExternalSignalInfoImpl; import org.mobicents.protocols.ss7.map.primitives.IMSIImpl; import org.mobicents.protocols.ss7.map.primitives.ISDNAddressStringImpl; import org.mobicents.protocols.ss7.map.primitives.MAPExtensionContainerImpl; import org.mobicents.protocols.ss7.map.primitives.NAEAPreferredCIImpl; import org.mobicents.protocols.ss7.map.service.mobility.subscriberInformation.SubscriberInfoImpl; import org.mobicents.protocols.ss7.map.service.mobility.subscriberManagement.ExtBasicServiceCodeImpl; import org.mobicents.protocols.ss7.map.service.mobility.subscriberManagement.OfferedCamel4CSIsImpl; import org.mobicents.protocols.ss7.map.service.mobility.subscriberManagement.SupportedCamelPhasesImpl; import org.mobicents.protocols.ss7.map.service.supplementary.SSCodeImpl; /* * * @author cristian veliscu * */ public class SendRoutingInformationResponseImpl extends CallHandlingMessageImpl implements SendRoutingInformationResponse { private IMSI imsi; private ExtendedRoutingInfo extRoutingInfo; private CUGCheckInfo cugCheckInfo; private boolean cugSubscriptionFlag; private SubscriberInfo subscriberInfo; private ArrayList<SSCode> ssList; private ExtBasicServiceCode basicService; private boolean forwardingInterrogationRequired; private ISDNAddressString vmscAddress; private MAPExtensionContainer extensionContainer; private NAEAPreferredCI naeaPreferredCI; private CCBSIndicators ccbsIndicators; private ISDNAddressString msisdn; private NumberPortabilityStatus nrPortabilityStatus; private Integer istAlertTimer; private SupportedCamelPhases supportedCamelPhases; private OfferedCamel4CSIs offeredCamel4CSIs; private RoutingInfo routingInfo2; private ArrayList<SSCode> ssList2; private ExtBasicServiceCode basicService2; private AllowedServices allowedServices; private UnavailabilityCause unavailabilityCause; private boolean releaseResourcesSupported; private ExternalSignalInfo gsmBearerCapability; private long mapProtocolVersion; public static final int TAG_sendRoutingInfoRes = 3; private static final int TAG_imsi = 9; private static final int TAG_cugCheckInfo = 3; private static final int TAG_cugSubscriptionFlag = 6; private static final int TAG_subscriberInfo = 7; private static final int TAG_ssList = 1; private static final int TAG_basicService = 5; private static final int TAG_forwardingInterrogationRequired = 4; private static final int TAG_vmscAddress = 2; private static final int TAG_extensionContainer = 0; private static final int TAG_naeaPreferredCI = 10; private static final int TAG_ccbsIndicators = 11; private static final int TAG_msisdn = 12; private static final int TAG_numberPortabilityStatus = 13; private static final int TAG_istAlertTimer = 14; private static final int TAG_supportedCamelPhasesInVMSC = 15; private static final int TAG_offeredCamel4CSIsInVMSC = 16; private static final int TAG_routingInfo2 = 17; private static final int TAG_ssList2 = 18; private static final int TAG_basicService2 = 19; private static final int TAG_allowedServices = 20; private static final int TAG_unavailabilityCause = 21; private static final int TAG_releaseResourcesSupported = 22; private static final int TAG_gsmBearerCapability = 23; // private static final int TAG_camelRoutingInfo = 8; private static final String _PrimitiveName = "SendRoutingInformationResponse"; public SendRoutingInformationResponseImpl() { this(3); } public SendRoutingInformationResponseImpl(long mapProtocolVersion) { this.mapProtocolVersion = mapProtocolVersion; } public SendRoutingInformationResponseImpl(IMSI imsi, ExtendedRoutingInfo extRoutingInfo, SubscriberInfo subscriberInfo, MAPExtensionContainer extensionContainer) { this(3, imsi, extRoutingInfo, subscriberInfo, extensionContainer); } public SendRoutingInformationResponseImpl(long mapProtocolVersion, IMSI imsi, ExtendedRoutingInfo extRoutingInfo, SubscriberInfo subscriberInfo, MAPExtensionContainer extensionContainer) { this.imsi = imsi; this.extRoutingInfo = extRoutingInfo; this.subscriberInfo = subscriberInfo; this.extensionContainer = extensionContainer; this.mapProtocolVersion = mapProtocolVersion; } public SendRoutingInformationResponseImpl(long mapProtocolVersion, IMSI imsi, ExtendedRoutingInfo extRoutingInfo, CUGCheckInfo cugCheckInfo, boolean cugSubscriptionFlag, SubscriberInfo subscriberInfo, ArrayList<SSCode> ssList, ExtBasicServiceCode basicService, boolean forwardingInterrogationRequired, ISDNAddressString vmscAddress, MAPExtensionContainer extensionContainer, NAEAPreferredCI naeaPreferredCI, CCBSIndicators ccbsIndicators, ISDNAddressString msisdn, NumberPortabilityStatus nrPortabilityStatus, Integer istAlertTimer, SupportedCamelPhases supportedCamelPhases, OfferedCamel4CSIs offeredCamel4CSIs, RoutingInfo routingInfo2, ArrayList<SSCode> ssList2, ExtBasicServiceCode basicService2, AllowedServices allowedServices, UnavailabilityCause unavailabilityCause, boolean releaseResourcesSupported, ExternalSignalInfo gsmBearerCapability) { this.imsi = imsi; this.extRoutingInfo = extRoutingInfo; this.cugCheckInfo = cugCheckInfo; this.cugSubscriptionFlag = cugSubscriptionFlag; this.subscriberInfo = subscriberInfo; this.ssList = ssList; this.basicService = basicService; this.forwardingInterrogationRequired = forwardingInterrogationRequired; this.vmscAddress = vmscAddress; this.extensionContainer = extensionContainer; this.naeaPreferredCI = naeaPreferredCI; this.ccbsIndicators = ccbsIndicators; this.msisdn = msisdn; this.nrPortabilityStatus = nrPortabilityStatus; this.istAlertTimer = istAlertTimer; this.supportedCamelPhases = supportedCamelPhases; this.offeredCamel4CSIs = offeredCamel4CSIs; this.routingInfo2 = routingInfo2; this.ssList2 = ssList2; this.basicService2 = basicService2; this.allowedServices = allowedServices; this.unavailabilityCause = unavailabilityCause; this.releaseResourcesSupported = releaseResourcesSupported; this.gsmBearerCapability = gsmBearerCapability; this.mapProtocolVersion = mapProtocolVersion; } public long getMapProtocolVersion() { return mapProtocolVersion; } @Override public IMSI getIMSI() { return this.imsi; } @Override public ExtendedRoutingInfo getExtendedRoutingInfo() { return this.extRoutingInfo; } @Override public CUGCheckInfo getCUGCheckInfo() { return this.cugCheckInfo; } @Override public boolean getCUGSubscriptionFlag() { return this.cugSubscriptionFlag; } @Override public SubscriberInfo getSubscriberInfo() { return this.subscriberInfo; } @Override public ArrayList<SSCode> getSSList() { return this.ssList; } @Override public ExtBasicServiceCode getBasicService() { return this.basicService; } @Override public boolean getForwardingInterrogationRequired() { return this.forwardingInterrogationRequired; } @Override public ISDNAddressString getVmscAddress() { return this.vmscAddress; } @Override public MAPExtensionContainer getExtensionContainer() { return this.extensionContainer; } @Override public NAEAPreferredCI getNaeaPreferredCI() { return this.naeaPreferredCI; } @Override public CCBSIndicators getCCBSIndicators() { return this.ccbsIndicators; } @Override public ISDNAddressString getMsisdn() { return this.msisdn; } @Override public NumberPortabilityStatus getNumberPortabilityStatus() { return this.nrPortabilityStatus; } @Override public Integer getISTAlertTimer() { return this.istAlertTimer; } @Override public SupportedCamelPhases getSupportedCamelPhasesInVMSC() { return this.supportedCamelPhases; } @Override public OfferedCamel4CSIs getOfferedCamel4CSIsInVMSC() { return this.offeredCamel4CSIs; } @Override public RoutingInfo getRoutingInfo2() { return this.routingInfo2; } @Override public ArrayList<SSCode> getSSList2() { return this.ssList2; } @Override public ExtBasicServiceCode getBasicService2() { return this.basicService2; } @Override public AllowedServices getAllowedServices() { return this.allowedServices; } @Override public UnavailabilityCause getUnavailabilityCause() { return this.unavailabilityCause; } @Override public boolean getReleaseResourcesSupported() { return this.releaseResourcesSupported; } @Override public ExternalSignalInfo getGsmBearerCapability() { return this.gsmBearerCapability; } @Override public MAPMessageType getMessageType() { return MAPMessageType.sendRoutingInfo_Response; } @Override public int getOperationCode() { return MAPOperationCode.sendRoutingInfo; } @Override public int getTag() throws MAPException { if (this.mapProtocolVersion >= 3) { return TAG_sendRoutingInfoRes; } else { return Tag.SEQUENCE; } } @Override public int getTagClass() { if (this.mapProtocolVersion >= 3) { return Tag.CLASS_CONTEXT_SPECIFIC; } else { return Tag.CLASS_UNIVERSAL; } } @Override public boolean getIsPrimitive() { return false; } @Override public void decodeAll(AsnInputStream ansIS) throws MAPParsingComponentException { try { int length = ansIS.readLength(); this._decode(ansIS, length); } catch (IOException e) { throw new MAPParsingComponentException("IOException when decoding SendRoutingInformationResponse: ", e, MAPParsingComponentExceptionReason.MistypedParameter); } catch (AsnException e) { throw new MAPParsingComponentException("AsnException when decoding SendRoutingInformationResponse: ", e, MAPParsingComponentExceptionReason.MistypedParameter); } } @Override public void decodeData(AsnInputStream ansIS, int length) throws MAPParsingComponentException { try { this._decode(ansIS, length); } catch (IOException e) { throw new MAPParsingComponentException("IOException when decoding SendRoutingInformationResponse: ", e, MAPParsingComponentExceptionReason.MistypedParameter); } catch (AsnException e) { throw new MAPParsingComponentException("AsnException when decoding SendRoutingInformationResponse: ", e, MAPParsingComponentExceptionReason.MistypedParameter); } } private void _decode(AsnInputStream ansIS, int length) throws MAPParsingComponentException, IOException, AsnException { this.imsi = null; this.extRoutingInfo = null; this.cugCheckInfo = null; this.cugSubscriptionFlag = false; this.subscriberInfo = null; this.ssList = null; this.basicService = null; this.forwardingInterrogationRequired = false; this.vmscAddress = null; this.extensionContainer = null; this.naeaPreferredCI = null; this.ccbsIndicators = null; this.msisdn = null; this.nrPortabilityStatus = null; this.istAlertTimer = null; this.supportedCamelPhases = null; this.offeredCamel4CSIs = null; this.routingInfo2 = null; this.ssList2 = null; this.basicService2 = null; this.allowedServices = null; this.unavailabilityCause = null; this.releaseResourcesSupported = false; this.gsmBearerCapability = null; AsnInputStream ais = ansIS.readSequenceStreamData(length); int num = 0; if (this.mapProtocolVersion < 3) { while (true) { if (ais.available() == 0) break; int tag = ais.readTag(); switch (num) { case 0: // imsi if (ais.getTagClass() != Tag.CLASS_UNIVERSAL || tag != Tag.STRING_OCTET || !ais.isTagPrimitive()) throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ": Parameter 0 bad tag, tag class or not primitive", MAPParsingComponentExceptionReason.MistypedParameter); this.imsi = new IMSIImpl(); ((IMSIImpl) this.imsi).decodeAll(ais); break; case 1: // RoutingInfo if (ais.getTagClass() != Tag.CLASS_UNIVERSAL || (tag != Tag.STRING_OCTET && tag != Tag.SEQUENCE)) throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ": Parameter 1 bad tag or tag class", MAPParsingComponentExceptionReason.MistypedParameter); this.routingInfo2 = new RoutingInfoImpl(); ((RoutingInfoImpl) this.routingInfo2).decodeAll(ais); break; default: if (tag == Tag.SEQUENCE && ais.getTagClass() == Tag.CLASS_UNIVERSAL && !ais.isTagPrimitive()) { this.cugCheckInfo = new CUGCheckInfoImpl(); ((CUGCheckInfoImpl) this.cugCheckInfo).decodeAll(ais); break; } else { ais.advanceElement(); } break; } num++; } if (num < 2) throw new MAPParsingComponentException( "Error while decoding forwardShortMessageRequest: Needs at least 2 mandatory parameters, found " + num, MAPParsingComponentExceptionReason.MistypedParameter); } else { while (true) { if (ais.available() == 0) break; int tag = ais.readTag(); if (ais.getTagClass() == Tag.CLASS_UNIVERSAL) { switch (tag) { case Tag.STRING_OCTET: if (!ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".extRoutingInfo: is not primitive", MAPParsingComponentExceptionReason.MistypedParameter); } this.extRoutingInfo = new ExtendedRoutingInfoImpl(); ((ExtendedRoutingInfoImpl) this.extRoutingInfo).decodeAll(ais); break; case Tag.SEQUENCE: if (ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".extRoutingInfo: is primitive", MAPParsingComponentExceptionReason.MistypedParameter); } this.extRoutingInfo = new ExtendedRoutingInfoImpl(); ((ExtendedRoutingInfoImpl) this.extRoutingInfo).decodeAll(ais); break; default: ais.advanceElement(); break; } } else if (ais.getTagClass() == Tag.CLASS_CONTEXT_SPECIFIC) { switch (tag) { case TAG_imsi: if (!ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".imsi: is not primitive", MAPParsingComponentExceptionReason.MistypedParameter); } this.imsi = new IMSIImpl(); ((IMSIImpl) this.imsi).decodeAll(ais); break; case ExtendedRoutingInfoImpl.TAG_camel: if (ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".extRoutingInfo: is primitive", MAPParsingComponentExceptionReason.MistypedParameter); } this.extRoutingInfo = new ExtendedRoutingInfoImpl(); ((ExtendedRoutingInfoImpl) this.extRoutingInfo).decodeAll(ais); break; case TAG_cugCheckInfo: if (ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".cugCheckInfo: is primitive", MAPParsingComponentExceptionReason.MistypedParameter); } this.cugCheckInfo = new CUGCheckInfoImpl(); ((CUGCheckInfoImpl) this.cugCheckInfo).decodeAll(ais); break; case TAG_cugSubscriptionFlag: if (!ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".cugSubscriptionFlag: is not primitive", MAPParsingComponentExceptionReason.MistypedParameter); } ais.readNull(); this.cugSubscriptionFlag = true; break; case TAG_subscriberInfo: if (ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".subscriberInfo: is primitive", MAPParsingComponentExceptionReason.MistypedParameter); } this.subscriberInfo = new SubscriberInfoImpl(); ((SubscriberInfoImpl) this.subscriberInfo).decodeAll(ais); break; case TAG_ssList: if (ais.isTagPrimitive()) throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".ssList: is primitive", MAPParsingComponentExceptionReason.MistypedParameter); AsnInputStream aissSCd = ais.readSequenceStream(); SSCode sSCd = null; this.ssList = new ArrayList<SSCode>(); while (true) { if (aissSCd.available() == 0) break; int tag2 = aissSCd.readTag(); if (tag2 != Tag.STRING_OCTET || aissSCd.getTagClass() != Tag.CLASS_UNIVERSAL || !aissSCd.isTagPrimitive()) throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ": bad tag or tagClass or is not primitive when decoding ssList2", MAPParsingComponentExceptionReason.MistypedParameter); sSCd = new SSCodeImpl(); ((SSCodeImpl) sSCd).decodeAll(aissSCd); this.ssList.add(sSCd); } if (this.ssList.size() < 1 && this.ssList.size() > 10) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ": Parameter ssList size must be from 1 to 10, found: " + this.ssList.size(), MAPParsingComponentExceptionReason.MistypedParameter); } break; case TAG_basicService: // explicit tag encoding if (ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".basicService: is primitive", MAPParsingComponentExceptionReason.MistypedParameter); } AsnInputStream ais1 = ais.readSequenceStream(); ais1.readTag(); this.basicService = new ExtBasicServiceCodeImpl(); ((ExtBasicServiceCodeImpl) this.basicService).decodeAll(ais1); break; case TAG_forwardingInterrogationRequired: if (!ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".forwardingInterrogationRequired: is not primitive", MAPParsingComponentExceptionReason.MistypedParameter); } ais.readNull(); this.forwardingInterrogationRequired = true; break; case TAG_vmscAddress: if (!ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".vmscAddress: is not primitive", MAPParsingComponentExceptionReason.MistypedParameter); } this.vmscAddress = new ISDNAddressStringImpl(); ((ISDNAddressStringImpl) this.vmscAddress).decodeAll(ais); break; case TAG_extensionContainer: if (ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".extensionContainer: is primitive", MAPParsingComponentExceptionReason.MistypedParameter); } this.extensionContainer = new MAPExtensionContainerImpl(); ((MAPExtensionContainerImpl) this.extensionContainer).decodeAll(ais); break; case TAG_naeaPreferredCI: if (ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".naeaPreferredCI: is primitive", MAPParsingComponentExceptionReason.MistypedParameter); } this.naeaPreferredCI = new NAEAPreferredCIImpl(); ((NAEAPreferredCIImpl) this.naeaPreferredCI).decodeAll(ais); break; case TAG_ccbsIndicators: if (ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".ccbsIndicators: is primitive", MAPParsingComponentExceptionReason.MistypedParameter); } this.ccbsIndicators = new CCBSIndicatorsImpl(); ((CCBSIndicatorsImpl) this.ccbsIndicators).decodeAll(ais); break; case TAG_msisdn: if (!ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".msisdn: is not primitive", MAPParsingComponentExceptionReason.MistypedParameter); } this.msisdn = new ISDNAddressStringImpl(); ((ISDNAddressStringImpl) this.msisdn).decodeAll(ais); break; case TAG_numberPortabilityStatus: if (!ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".nrPortabilityStatus: is not primitive", MAPParsingComponentExceptionReason.MistypedParameter); } int type = (int) ais.readInteger(); this.nrPortabilityStatus = NumberPortabilityStatus.getInstance(type); break; case TAG_istAlertTimer: if (!ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".istAlertTimer: is not primitive", MAPParsingComponentExceptionReason.MistypedParameter); } this.istAlertTimer = (int) ais.readInteger(); break; case TAG_supportedCamelPhasesInVMSC: if (!ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".supportedCamelPhases: is not primitive", MAPParsingComponentExceptionReason.MistypedParameter); } this.supportedCamelPhases = new SupportedCamelPhasesImpl(); ((SupportedCamelPhasesImpl) this.supportedCamelPhases).decodeAll(ais); break; case TAG_offeredCamel4CSIsInVMSC: if (!ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".offeredCamel4CSIs: is not primitive", MAPParsingComponentExceptionReason.MistypedParameter); } this.offeredCamel4CSIs = new OfferedCamel4CSIsImpl(); ((OfferedCamel4CSIsImpl) this.offeredCamel4CSIs).decodeAll(ais); break; case TAG_routingInfo2: if (ais.isTagPrimitive()) throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".routingInfo2: primitive", MAPParsingComponentExceptionReason.MistypedParameter); AsnInputStream ais0 = ais.readSequenceStream(); ais0.readTag(); this.routingInfo2 = new RoutingInfoImpl(); ((RoutingInfoImpl) this.routingInfo2).decodeAll(ais0); break; case TAG_ssList2: if (ais.isTagPrimitive()) throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".ssEventList: is primitive", MAPParsingComponentExceptionReason.MistypedParameter); AsnInputStream aissSCode = ais.readSequenceStream(); SSCode sSCode = null; this.ssList2 = new ArrayList<SSCode>(); while (true) { if (aissSCode.available() == 0) break; int tag2 = aissSCode.readTag(); if (tag2 != Tag.STRING_OCTET || aissSCode.getTagClass() != Tag.CLASS_UNIVERSAL || !aissSCode.isTagPrimitive()) throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ": bad tag or tagClass or is not primitive when decoding ssList2", MAPParsingComponentExceptionReason.MistypedParameter); sSCode = new SSCodeImpl(); ((SSCodeImpl) sSCode).decodeAll(aissSCode); this.ssList2.add(sSCode); } if (this.ssList2.size() < 1 && this.ssList2.size() > 10) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ": Parameter ssList size must be from 1 to 10, found: " + this.ssList2.size(), MAPParsingComponentExceptionReason.MistypedParameter); } break; case TAG_basicService2: // explicit tag encoding if (ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".basicService2: is primitive", MAPParsingComponentExceptionReason.MistypedParameter); } AsnInputStream ais2 = ais.readSequenceStream(); ais2.readTag(); this.basicService2 = new ExtBasicServiceCodeImpl(); ((ExtBasicServiceCodeImpl) this.basicService2).decodeAll(ais2); break; case TAG_allowedServices: if (!ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".allowedServices: is not primitive", MAPParsingComponentExceptionReason.MistypedParameter); } this.allowedServices = new AllowedServicesImpl(); ((AllowedServicesImpl) this.allowedServices).decodeAll(ais); break; case TAG_unavailabilityCause: if (!ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".unavailabilityCause: is not primitive", MAPParsingComponentExceptionReason.MistypedParameter); } int code = (int) ais.readInteger(); this.unavailabilityCause = UnavailabilityCause.getUnavailabilityCause(code); break; case TAG_releaseResourcesSupported: if (!ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".releaseResourcesSupported: is not primitive", MAPParsingComponentExceptionReason.MistypedParameter); } ais.readNull(); this.releaseResourcesSupported = true; break; case TAG_gsmBearerCapability: if (ais.isTagPrimitive()) { throw new MAPParsingComponentException("Error while decoding " + _PrimitiveName + ".gsmBearerCapability: is primitive", MAPParsingComponentExceptionReason.MistypedParameter); } this.gsmBearerCapability = new ExternalSignalInfoImpl(); ((ExternalSignalInfoImpl) this.gsmBearerCapability).decodeAll(ais); break; default: ais.advanceElement(); break; } } else { ais.advanceElement(); } } } } @Override public void encodeAll(AsnOutputStream asnOs) throws MAPException { this.encodeAll(asnOs, this.getTagClass(), this.getTag()); } @Override public void encodeAll(AsnOutputStream asnOs, int tagClass, int tag) throws MAPException { try { asnOs.writeTag(tagClass, false, tag); int pos = asnOs.StartContentDefiniteLength(); this.encodeData(asnOs); asnOs.FinalizeContent(pos); } catch (AsnException e) { throw new MAPException("AsnException when encoding SendRoutingInformationResponse: " + e.getMessage(), e); } } @Override public void encodeData(AsnOutputStream asnOs) throws MAPException { if (this.mapProtocolVersion < 3) { if (this.imsi == null) throw new MAPException("Error while encoding " + _PrimitiveName + " the mandatory parameter imsi is not defined"); if (this.routingInfo2 == null) throw new MAPException("Error while encoding " + _PrimitiveName + " the mandatory parameter routingInfo2 is not defined"); ((IMSIImpl) this.imsi).encodeAll(asnOs); ((RoutingInfoImpl) this.routingInfo2).encodeAll(asnOs); if (this.mapProtocolVersion >= 2) { if (this.cugCheckInfo != null) { ((CUGCheckInfoImpl) this.cugCheckInfo).encodeAll(asnOs); } } } else { try { if (this.imsi != null) ((IMSIImpl) this.imsi).encodeAll(asnOs, Tag.CLASS_CONTEXT_SPECIFIC, TAG_imsi); if (this.extRoutingInfo != null) { // Universal TAG class here ((ExtendedRoutingInfoImpl) this.extRoutingInfo).encodeAll(asnOs); } if (this.cugCheckInfo != null) { ((CUGCheckInfoImpl) this.cugCheckInfo).encodeAll(asnOs, Tag.CLASS_CONTEXT_SPECIFIC, TAG_cugCheckInfo); } if (this.cugSubscriptionFlag) asnOs.writeNull(Tag.CLASS_CONTEXT_SPECIFIC, TAG_cugSubscriptionFlag); if (this.subscriberInfo != null) ((SubscriberInfoImpl) this.subscriberInfo).encodeAll(asnOs, Tag.CLASS_CONTEXT_SPECIFIC, TAG_subscriberInfo); if (this.ssList != null) { asnOs.writeTag(Tag.CLASS_CONTEXT_SPECIFIC, false, TAG_ssList); int pos = asnOs.StartContentDefiniteLength(); for (SSCode sSCode : this.ssList) { ((SSCodeImpl) sSCode).encodeAll(asnOs); } asnOs.FinalizeContent(pos); } if (this.basicService != null) { // explicit tag encoding asnOs.writeTag(Tag.CLASS_CONTEXT_SPECIFIC, false, TAG_basicService); int pos = asnOs.StartContentDefiniteLength(); ((ExtBasicServiceCodeImpl) this.basicService).encodeAll(asnOs); asnOs.FinalizeContent(pos); } if (this.forwardingInterrogationRequired) asnOs.writeNull(Tag.CLASS_CONTEXT_SPECIFIC, TAG_forwardingInterrogationRequired); if (this.vmscAddress != null) ((ISDNAddressStringImpl) this.vmscAddress).encodeAll(asnOs, Tag.CLASS_CONTEXT_SPECIFIC, TAG_vmscAddress); if (this.extensionContainer != null) ((MAPExtensionContainerImpl) this.extensionContainer).encodeAll(asnOs, Tag.CLASS_CONTEXT_SPECIFIC, TAG_extensionContainer); if (this.naeaPreferredCI != null) { ((NAEAPreferredCIImpl) this.naeaPreferredCI).encodeAll(asnOs, Tag.CLASS_CONTEXT_SPECIFIC, TAG_naeaPreferredCI); } if (this.ccbsIndicators != null) { ((CCBSIndicatorsImpl) this.ccbsIndicators).encodeAll(asnOs, Tag.CLASS_CONTEXT_SPECIFIC, TAG_ccbsIndicators); } if (this.msisdn != null) ((ISDNAddressStringImpl) this.msisdn).encodeAll(asnOs, Tag.CLASS_CONTEXT_SPECIFIC, TAG_msisdn); if (this.nrPortabilityStatus != null) asnOs.writeInteger(Tag.CLASS_CONTEXT_SPECIFIC, TAG_numberPortabilityStatus, this.nrPortabilityStatus.getType()); if (this.istAlertTimer != null) asnOs.writeInteger(Tag.CLASS_CONTEXT_SPECIFIC, TAG_istAlertTimer, this.istAlertTimer); if (this.supportedCamelPhases != null) ((SupportedCamelPhasesImpl) this.supportedCamelPhases).encodeAll(asnOs, Tag.CLASS_CONTEXT_SPECIFIC, TAG_supportedCamelPhasesInVMSC); if (this.offeredCamel4CSIs != null) ((OfferedCamel4CSIsImpl) this.offeredCamel4CSIs).encodeAll(asnOs, Tag.CLASS_CONTEXT_SPECIFIC, TAG_offeredCamel4CSIsInVMSC); if (this.routingInfo2 != null) { // explicit tag encoding asnOs.writeTag(Tag.CLASS_CONTEXT_SPECIFIC, false, TAG_routingInfo2); int pos = asnOs.StartContentDefiniteLength(); ((RoutingInfoImpl) this.routingInfo2).encodeAll(asnOs); asnOs.FinalizeContent(pos); } if (this.ssList2 != null) { asnOs.writeTag(Tag.CLASS_CONTEXT_SPECIFIC, false, TAG_ssList2); int pos = asnOs.StartContentDefiniteLength(); for (SSCode sSCode : this.ssList2) { ((SSCodeImpl) sSCode).encodeAll(asnOs); } asnOs.FinalizeContent(pos); } if (this.basicService2 != null) { asnOs.writeTag(Tag.CLASS_CONTEXT_SPECIFIC, false, TAG_basicService2); int pos = asnOs.StartContentDefiniteLength(); ((ExtBasicServiceCodeImpl) this.basicService2).encodeAll(asnOs); asnOs.FinalizeContent(pos); } if (this.allowedServices != null) ((AllowedServicesImpl) this.allowedServices).encodeAll(asnOs, Tag.CLASS_CONTEXT_SPECIFIC, TAG_allowedServices); if (this.unavailabilityCause != null) asnOs.writeInteger(Tag.CLASS_CONTEXT_SPECIFIC, TAG_unavailabilityCause, this.unavailabilityCause.getCode()); if (this.releaseResourcesSupported) asnOs.writeNull(Tag.CLASS_CONTEXT_SPECIFIC, TAG_releaseResourcesSupported); if (this.gsmBearerCapability != null) ((ExternalSignalInfoImpl) this.gsmBearerCapability).encodeAll(asnOs, Tag.CLASS_CONTEXT_SPECIFIC, TAG_gsmBearerCapability); } catch (IOException e) { throw new MAPException("IOException when encoding " + _PrimitiveName + ": " + e.getMessage(), e); } catch (AsnException e) { throw new MAPException("AsnException when encoding " + _PrimitiveName + ": " + e.getMessage(), e); } } } public String toString() { StringBuilder sb = new StringBuilder(); sb.append(_PrimitiveName); sb.append(" ["); sb.append("mapProtocolVersion="); sb.append(mapProtocolVersion); if (this.imsi != null) { sb.append(", imsi="); sb.append(this.imsi); } if (this.extRoutingInfo != null) { sb.append(", extRoutingInfo="); sb.append(this.extRoutingInfo); } if (this.cugCheckInfo != null) { sb.append(", cugCheckInfo="); sb.append(this.cugCheckInfo); } if (this.cugSubscriptionFlag != false) sb.append(", cugSubscriptionFlag=TRUE"); if (this.subscriberInfo != null) { sb.append(", subscriberInfo="); sb.append(this.subscriberInfo); } if (this.ssList != null) { sb.append("ssList=["); boolean firstItem = true; for (SSCode be : this.ssList) { if (firstItem) firstItem = false; else sb.append(", "); sb.append(be.toString()); } sb.append("]"); } if (this.basicService != null) { sb.append(", basicService="); sb.append(this.basicService); } if (this.forwardingInterrogationRequired != false) sb.append(", forwardingInterrogationRequired=TRUE"); if (this.vmscAddress != null) { sb.append(", vmscAddress="); sb.append(this.vmscAddress); } if (this.extensionContainer != null) { sb.append(", extensionContainer="); sb.append(this.extensionContainer); } if (this.naeaPreferredCI != null) { sb.append(", naeaPreferredCI="); sb.append(this.naeaPreferredCI); } if (this.ccbsIndicators != null) { sb.append(", ccbsIndicators="); sb.append(this.ccbsIndicators); } if (this.msisdn != null) { sb.append(", msisdn="); sb.append(this.msisdn); } if (this.nrPortabilityStatus != null) { sb.append(", nrPortabilityStatus="); sb.append(this.nrPortabilityStatus); } if (this.istAlertTimer != null) { sb.append(", istAlertTimer="); sb.append(this.istAlertTimer); } if (this.supportedCamelPhases != null) { sb.append(", supportedCamelPhases="); sb.append(this.supportedCamelPhases); } if (this.offeredCamel4CSIs != null) { sb.append(", offeredCamel4CSIs="); sb.append(this.offeredCamel4CSIs); } if (this.routingInfo2 != null) { sb.append(", routingInfo2="); sb.append(this.routingInfo2); } if (this.ssList2 != null) { sb.append(", ssList2="); sb.append(this.ssList2); } if (this.basicService2 != null) { sb.append(", basicService2="); sb.append(this.basicService2); } if (this.allowedServices != null) { sb.append(", allowedServices="); sb.append(this.allowedServices); } if (this.unavailabilityCause != null) { sb.append(", unavailabilityCause="); sb.append(this.unavailabilityCause); } if (this.releaseResourcesSupported != false) sb.append(", releaseResourcesSupported=TRUE"); if (this.gsmBearerCapability != null) { sb.append(", gsmBearerCapability="); sb.append(this.gsmBearerCapability); } sb.append("]"); return sb.toString(); } }