Rev

Rev 1822 | Details | Compare with Previous | Last modification | View Log | SVN | Bug Tracker

Rev Author Line No. Line
1133 berge 1
/**
2
 * @author      ETSI / STF462 / Alexandre Berge
3
 * @version     $URL: file:///D:/RepositoriesNew/ITS/trunk/javasrc/codec/org/etsi/ttcn/codec/generic/Integer.java $
4
 *              $Id: Integer.java 2655 2017-01-26 10:46:08Z filatov $
5
 */
6
package org.etsi.ttcn.codec.generic;
7
 
1201 berge 8
import java.math.BigInteger;
1161 berge 9
import java.util.regex.Matcher;
10
import java.util.regex.Pattern;
11
 
1133 berge 12
import org.etsi.ttcn.tci.Type;
13
import org.etsi.ttcn.tci.Value;
14
import org.etsi.ttcn.tci.IntegerValue;
2655 filatov 15
import org.etsi.common.ByteHelper;
1133 berge 16
import org.etsi.ttcn.codec.ICodec;
17
import org.etsi.ttcn.codec.MainCodec;
18
import org.etsi.ttcn.codec.CodecBuffer;
19
 
20
public class Integer extends ICodec {
21
 
1822 berge 22
    protected final static Pattern UNSIGNED_VARIANT = Pattern.compile("\\w*unsigned\\w*|UInt");
1161 berge 23
 
1133 berge 24
    public Integer(MainCodec mainCodec) {
25
        super(mainCodec);
26
    }
27
 
28
    @Override
29
    public Value decode(CodecBuffer buf, Type decodingHypothesis) {
2655 filatov 30
        //TERFactory.getInstance().logDebug(">>> Integer.decode: " + decodingHypothesis.getName());
1133 berge 31
 
1822 berge 32
        IntegerValue iv = null;
1155 berge 33
        int lengthInBits;
34
        byte[] value = null;
35
 
36
        // Get length
37
        String hint = mainCodec.getHint(decodingHypothesis.getName() + "Len");
38
        if(hint == null) {
1822 berge 39
            if (decodingHypothesis.getTypeEncodingVariant() == null) {
40
                lengthInBits = getVariantBitLength(decodingHypothesis.getName()); // TCT3
41
            } else {
42
                lengthInBits = getVariantBitLength(decodingHypothesis.getTypeEncodingVariant());
43
            }
1154 garciay 44
        }
1155 berge 45
        else {
46
            lengthInBits = java.lang.Integer.parseInt(hint);
47
        }
48
 
1133 berge 49
        value = buf.readBits(lengthInBits);
1161 berge 50
 
51
        try {
2655 filatov 52
            hint = mainCodec.getHint(decodingHypothesis.getName() + "Sign");
53
            Matcher matcher;
54
            if (hint==null) {
55
                matcher = UNSIGNED_VARIANT.matcher(decodingHypothesis.getTypeEncodingVariant());
56
            }
57
            else {
58
                matcher = UNSIGNED_VARIANT.matcher(hint);
59
            }
1161 berge 60
            if(matcher.find()) {
1822 berge 61
                // Unsigned integer
62
                if(lengthInBits >= java.lang.Integer.SIZE) {
63
                    iv = mainCodec.getTciCDRequired().setInteger(new BigInteger(1, value));
1201 berge 64
                }
65
                else {
1822 berge 66
                    iv = mainCodec.getTciCDRequired().setInteger(ByteHelper.byteArrayToInt(value));
1201 berge 67
                }
1161 berge 68
            }
69
            else {
1173 berge 70
                // Signed integer 
1822 berge 71
                iv = mainCodec.getTciCDRequired().setInteger(ByteHelper.byteArrayToSignedInt(value, lengthInBits));
1161 berge 72
            }
73
        }
74
        catch(Exception e) {
2655 filatov 75
//            TERFactory.getInstance().logDebug("Integer.encode: " + decodingHypothesis.getTypeEncoding() + ", " + decodingHypothesis.getTypeEncodingVariant());
1822 berge 76
            // Assume unsigned integer
77
            if(lengthInBits >= java.lang.Integer.SIZE) {
78
                iv = mainCodec.getTciCDRequired().setInteger(new BigInteger(1, value));
79
            }
80
            else {
81
                iv = mainCodec.getTciCDRequired().setInteger(ByteHelper.byteArrayToInt(value));
82
            } // else, empty on purpose
1161 berge 83
        }
84
 
1133 berge 85
        return iv;
86
    }
87
 
88
    @Override
89
    public CodecBuffer encode(Value value) {
2655 filatov 90
//        TERFactory.getInstance().logDebug(">>> Integer.encode: " + value.getType().getName());
1133 berge 91
 
92
        IntegerValue iv = (IntegerValue)value;
93
        byte[] encoded = null;
94
        CodecBuffer res = new CodecBuffer();
1155 berge 95
        int lengthInBits = 0;
96
        int lengthInBytes = 0;
97
 
98
        // Get length
99
        String hint = mainCodec.getHint(value.getType().getName() + "Len");
100
        if(hint == null) {
2655 filatov 101
//            TERFactory.getInstance().logDebug("Integer.encode: " + value.getValueEncodingVariant() + ", " + value.getValueEncoding());
102
//            TERFactory.getInstance().logDebug("Integer.encode: " + value.getType().getTypeEncodingVariant() + ", " + value.getType().getTypeEncoding());
1822 berge 103
            if (value.getType().getTypeEncodingVariant() != null) {
104
                lengthInBits = getVariantBitLength(value.getType().getTypeEncodingVariant());
105
            } else {
106
                lengthInBits = getVariantBitLength(value.getType().getName()); // TCT3
107
            }
1154 garciay 108
        }
1155 berge 109
        else {
110
            lengthInBits = java.lang.Integer.parseInt(hint);
111
        }
112
        lengthInBytes = lengthInBits / 8 + (((lengthInBits % 8) > 0)?1:0);
113
 
2655 filatov 114
//        TERFactory.getInstance().logDebug(String.format("Integer.encode: length: %d", lengthInBytes));
1313 garciay 115
        if (lengthInBits > java.lang.Integer.SIZE) {
1822 berge 116
            encoded = ByteHelper.longToByteArray(mainCodec.getTciCDRequired().getBigInteger(iv), lengthInBytes);
1313 garciay 117
        } else {
1822 berge 118
            encoded = ByteHelper.intToByteArray(mainCodec.getTciCDRequired().getInteger(iv), lengthInBytes);
1313 garciay 119
        }
1133 berge 120
        res.setBits(encoded, lengthInBits);
121
 
122
        return res;
123
    }
124
 
125
}