org.restcomm.protocols.ss7.map.primitives.NAEACICImpl Maven / Gradle / Ivy
/*
* 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.restcomm.protocols.ss7.map.primitives;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.restcomm.protocols.ss7.map.api.MAPException;
import org.restcomm.protocols.ss7.map.api.MAPParsingComponentException;
import org.restcomm.protocols.ss7.map.api.primitives.NAEACIC;
import org.restcomm.protocols.ss7.map.api.primitives.NetworkIdentificationPlanValue;
import org.restcomm.protocols.ss7.map.api.primitives.NetworkIdentificationTypeValue;
/**
*
*
___________________________________________________________ | | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
* |___________|_____|_____|_____|_____|_____|_____|_____|_____| | Octet 1: |Spare| Type of net idn | network idn plan |
* |___________|_____|_________________|_______________________| | Octet 2: | DIGIT 2 | DIGIT 1 | |
* __________|_______________________|_______________________| | Octet 3: | DIGIT 4(or 0000) | DIGIT 3 |
* |___________|_______________________|_______________________|
*
*
* @author Lasith Waruna Perera
*
*/
public class NAEACICImpl extends OctetStringBase implements NAEACIC {
protected static final int NETWORK_IND_PLAN_MASK = 0x0F;
protected static final int NETWORK_IND_TYPE_MASK = 0x70;
protected static final int THREE_OCTET_CARRIER_CODE_MASK = 0x0F;
public NAEACICImpl() {
super(3, 3, "NAEACIC");
}
public NAEACICImpl(byte[] data) {
super(3, 3, "NAEACIC", data);
}
public NAEACICImpl(String carrierCode, NetworkIdentificationPlanValue networkIdentificationPlanValue,
NetworkIdentificationTypeValue networkIdentificationTypeValue) throws MAPException {
super(3, 3, "NAEACIC");
setParameters(carrierCode, networkIdentificationPlanValue, networkIdentificationTypeValue);
}
@Override
public byte[] getData() {
return data;
}
public String getCarrierCode() {
if (this.data == null || this.data.length == 0)
return null;
try {
ByteArrayInputStream stm = new ByteArrayInputStream(this.data);
stm.read();
String address = TbcdString.decodeString(stm, this.data.length - 1);
if (address.length() == 4
&& this.getNetworkIdentificationPlanValue().equals(
NetworkIdentificationPlanValue.threeDigitCarrierIdentification)) {
return address.substring(0, 3);
}
return address;
} catch (MAPParsingComponentException e) {
return null;
} catch (IOException e) {
return null;
}
}
public NetworkIdentificationPlanValue getNetworkIdentificationPlanValue() {
if (this.data == null || this.data.length == 0)
return null;
int planValue = this.data[0];
return NetworkIdentificationPlanValue.getInstance(planValue & NETWORK_IND_PLAN_MASK);
}
public NetworkIdentificationTypeValue getNetworkIdentificationTypeValue() {
if (this.data == null || this.data.length == 0)
return null;
int typeValue = this.data[0];
typeValue = ((typeValue & NETWORK_IND_TYPE_MASK) >> 4);
return NetworkIdentificationTypeValue.getInstance(typeValue);
}
private void setParameters(String carrierCode, NetworkIdentificationPlanValue networkIdentificationPlanValue,
NetworkIdentificationTypeValue networkIdentificationTypeValue) throws MAPException {
if (carrierCode == null || networkIdentificationPlanValue == null || networkIdentificationTypeValue == null)
throw new MAPException("Error when encoding " + _PrimitiveName
+ ": carrierCode, networkIdentificationPlanValue or networkIdentificationTypeValue is empty");
if (!(carrierCode.length() == 3 || carrierCode.length() == 4))
throw new MAPException("Error when encoding " + _PrimitiveName + ": carrierCode lenght should be 3 or 4");
ByteArrayOutputStream stm = new ByteArrayOutputStream();
int octOne = 0;
octOne = octOne | (networkIdentificationTypeValue.getCode() << 4);
octOne = octOne | networkIdentificationPlanValue.getCode();
stm.write(octOne);
try {
TbcdString.encodeString(stm, carrierCode);
} catch (MAPException e) {
throw new MAPException(e);
}
this.data = stm.toByteArray();
if (carrierCode.length() == 3) {
this.data[2] = (byte) (this.data[2] & THREE_OCTET_CARRIER_CODE_MASK);
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(_PrimitiveName);
sb.append(" [");
if (this.getNetworkIdentificationPlanValue() != null) {
sb.append("NetworkIdentificationPlanValue=");
sb.append(this.getNetworkIdentificationPlanValue());
}
if (this.getNetworkIdentificationTypeValue() != null) {
sb.append(", NetworkIdentificationTypeValue=");
sb.append(this.getNetworkIdentificationTypeValue());
}
if (this.getCarrierCode() != null) {
sb.append(", CarrierCode=");
sb.append(this.getCarrierCode());
}
sb.append("]");
return sb.toString();
}
}