Home | History | Annotate | Download | only in base
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.location.cts.asn1.base;
     18 
     19 import com.google.common.base.Preconditions;
     20 import com.google.common.collect.ImmutableList;
     21 
     22 import java.nio.ByteBuffer;
     23 import java.nio.charset.StandardCharsets;
     24 import java.util.Collection;
     25 
     26 /**
     27  * Base class for representing ASN.1 objects of type UTF8String.
     28  */
     29 public class Asn1Utf8String extends Asn1Object {
     30   private static final Collection<Asn1Tag> possibleFirstTags =
     31       ImmutableList.of(Asn1Tag.UTF8STRING);
     32 
     33   private int minimumSize = 0;
     34   private Integer maximumSize = null; // null == unbounded.
     35   private String value;
     36 
     37   protected void setMinSize(int min) {
     38     minimumSize = min;
     39   }
     40 
     41   protected void setMaxSize(int max) {
     42     maximumSize = max;
     43   }
     44 
     45   public String getValue() {
     46     return value;
     47   }
     48 
     49   public void setValue(String value) {
     50     this.value = value;
     51   }
     52 
     53   private byte[] getValueBytes() {
     54     return value.getBytes(StandardCharsets.UTF_8);
     55   }
     56 
     57   private void setValueBytes(byte[] bytes) {
     58     value = new String(bytes, StandardCharsets.UTF_8);
     59   }
     60 
     61   public static Collection<Asn1Tag> getPossibleFirstTags() {
     62     return possibleFirstTags;
     63   }
     64 
     65   @Override Asn1Tag getDefaultTag() {
     66     return Asn1Tag.UTF8STRING;
     67   }
     68 
     69   @Override int getBerValueLength() {
     70     Preconditions.checkNotNull(value, "No value set.");
     71     return getValueBytes().length;
     72   }
     73 
     74   @Override void encodeBerValue(ByteBuffer buf) {
     75     Preconditions.checkNotNull(value, "No value set.");
     76     buf.put(getValueBytes());
     77   }
     78 
     79   @Override public void decodeBerValue(ByteBuffer buf) {
     80     setValueBytes(getRemaining(buf));
     81   }
     82 
     83   private Iterable<BitStream> encodePerImpl(boolean aligned) {
     84     Preconditions.checkNotNull(value, "No value set.");
     85     Preconditions.checkState(
     86         maximumSize == null || value.length() <= maximumSize, "Too large %s",
     87         value.length());
     88     byte[] bytes = getValueBytes();
     89     if (aligned) {
     90       return PerAlignedUtils.encodeSemiConstrainedLengthOfBytes(bytes);
     91     } else {
     92       return PerUnalignedUtils.encodeSemiConstrainedLengthOfBytes(bytes);
     93     }
     94   }
     95 
     96   @Override public Iterable<BitStream> encodePerUnaligned() {
     97     return encodePerImpl(false);
     98   }
     99 
    100   @Override public Iterable<BitStream> encodePerAligned() {
    101     return encodePerImpl(true);
    102   }
    103 
    104   private void decodePerImpl(BitStreamReader reader, boolean aligned) {
    105     if (aligned) {
    106       setValueBytes(PerAlignedUtils.decodeSemiConstrainedLengthOfBytes(reader));
    107     } else {
    108       setValueBytes(PerUnalignedUtils.decodeSemiConstrainedLengthOfBytes(reader));
    109     }
    110   }
    111 
    112   @Override public void decodePerUnaligned(BitStreamReader reader) {
    113     decodePerImpl(reader, false);
    114   }
    115 
    116   @Override public void decodePerAligned(BitStreamReader reader) {
    117     decodePerImpl(reader, true);
    118   }
    119 }
    120