12ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller/* GENERATED SOURCE. DO NOT MODIFY. */
2f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// © 2016 and later: Unicode, Inc. and others.
3f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
42ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller/*
52ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *******************************************************************************
62ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Copyright (C) 1996-2015, International Business Machines Corporation and
72ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * others. All Rights Reserved.
82ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *******************************************************************************
92ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */
102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerpackage android.icu.impl;
122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport java.io.IOException;
142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport java.nio.ByteBuffer;
152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport java.util.Arrays;
162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller/**
18f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert* <p>Internal reader class for ICU data file uname.dat containing
19f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert* Unicode codepoint name data.</p>
202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller* <p>This class simply reads unames.icu, authenticates that it is a valid
212ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller* ICU data file and split its contents up into blocks of data for use in
221fba789ac68efdd9120a7373f49daef42833e674Neil Fuller* <a href=UCharacterName.html>android.icu.impl.UCharacterName</a>.
23f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert* </p>
24f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert* <p>unames.icu which is in big-endian format is jared together with this
252ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller* package.</p>
262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller* @author Syn Wee Quek
272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller*/
282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerfinal class UCharacterNameReader implements ICUBinary.Authenticate
30f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert{
312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    // public methods ----------------------------------------------------
32f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
33f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Override
342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public boolean isDataVersionAcceptable(byte version[])
352ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return version[0] == 1;
372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
392ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    // protected constructor ---------------------------------------------
402ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
422ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * <p>Protected constructor.</p>
432ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * @param bytes ICU uprop.dat file buffer
442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * @exception IOException throw if data file fails authentication
452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    */
462ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    protected UCharacterNameReader(ByteBuffer bytes) throws IOException
472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        ICUBinary.readHeader(bytes, DATA_FORMAT_ID_, this);
492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_byteBuffer_ = bytes;
502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
522ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    // protected methods -------------------------------------------------
532ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
542ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
552ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * Read and break up the stream of data passed in as arguments
562ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * and fills up UCharacterName.
572ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * If unsuccessful false will be returned.
582ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * @param data instance of datablock
592ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * @exception IOException thrown when there's a data error.
602ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    */
612ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    protected void read(UCharacterName data) throws IOException
622ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
632ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        // reading index
642ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_tokenstringindex_ = m_byteBuffer_.getInt();
652ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_groupindex_       = m_byteBuffer_.getInt();
662ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_groupstringindex_ = m_byteBuffer_.getInt();
672ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_algnamesindex_    = m_byteBuffer_.getInt();
68f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
692ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        // reading tokens
702ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        int count = m_byteBuffer_.getChar();
712ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        char token[] = ICUBinary.getChars(m_byteBuffer_, count, 0);
722ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        int size = m_groupindex_ - m_tokenstringindex_;
732ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        byte tokenstr[] = new byte[size];
742ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_byteBuffer_.get(tokenstr);
752ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        data.setToken(token, tokenstr);
76f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
772ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        // reading the group information records
782ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        count = m_byteBuffer_.getChar();
792ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        data.setGroupCountSize(count, GROUP_INFO_SIZE_);
802ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        count *= GROUP_INFO_SIZE_;
812ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        char group[] = ICUBinary.getChars(m_byteBuffer_, count, 0);
822ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
832ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        size = m_algnamesindex_ - m_groupstringindex_;
842ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        byte groupstring[] = new byte[size];
852ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_byteBuffer_.get(groupstring);
86f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
872ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        data.setGroup(group, groupstring);
88f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
892ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        count = m_byteBuffer_.getInt();
90f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert        UCharacterName.AlgorithmName alg[] =
912ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                                 new UCharacterName.AlgorithmName[count];
92f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
932ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        for (int i = 0; i < count; i ++)
942ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        {
952ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            UCharacterName.AlgorithmName an = readAlg();
962ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if (an == null) {
972ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                throw new IOException("unames.icu read error: Algorithmic names creation error");
982ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
992ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            alg[i] = an;
1002ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1012ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        data.setAlgorithm(alg);
1022ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
103f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
1042ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
1052ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * <p>Checking the file for the correct format.</p>
1062ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * @param dataformatid
1072ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * @param dataformatversion
1082ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * @return true if the file format version is correct
1092ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    */
1102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    ///CLOVER:OFF
1112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    protected boolean authenticate(byte dataformatid[],
1122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                                   byte dataformatversion[])
1132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
1142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return Arrays.equals(
1152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                ICUBinary.getVersionByteArrayFromCompactInt(DATA_FORMAT_ID_),
1162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                dataformatid) &&
1172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller               isDataVersionAcceptable(dataformatversion);
1182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    ///CLOVER:ON
120f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
1212ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    // private variables -------------------------------------------------
1222ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1232ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
1242ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * Byte buffer for names
1252ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    */
1262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private ByteBuffer m_byteBuffer_;
1272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
1282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * Size of the group information block in number of char
1292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    */
1302ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private static final int GROUP_INFO_SIZE_ = 3;
1312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1322ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
1332ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * Index of the offset information
1342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    */
1352ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private int m_tokenstringindex_;
1362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private int m_groupindex_;
1372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private int m_groupstringindex_;
1382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private int m_algnamesindex_;
139f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
1402ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
1412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * Size of an algorithmic name information group
142f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    * start code point size + end code point size + type size + variant size +
1432ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * size of data size
1442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    */
1452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private static final int ALG_INFO_SIZE_ = 12;
1462ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
1482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * File format id that this class understands.
1492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    */
1502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private static final int DATA_FORMAT_ID_ = 0x756E616D;
1512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1522ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    // private methods ---------------------------------------------------
153f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
1542ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
1552ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * Reads an individual record of AlgorithmNames
1562ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * @return an instance of AlgorithNames if read is successful otherwise null
1572ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    * @exception IOException thrown when file read error occurs or data is corrupted
1582ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    */
1592ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private UCharacterName.AlgorithmName readAlg() throws IOException
1602ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
161f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert        UCharacterName.AlgorithmName result =
1622ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                                       new UCharacterName.AlgorithmName();
1632ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        int rangestart = m_byteBuffer_.getInt();
1642ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        int rangeend   = m_byteBuffer_.getInt();
1652ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        byte type      = m_byteBuffer_.get();
1662ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        byte variant   = m_byteBuffer_.get();
1672ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (!result.setInfo(rangestart, rangeend, type, variant)) {
1682ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            return null;
1692ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
170f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
1712ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        int size = m_byteBuffer_.getChar();
1722ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (type == UCharacterName.AlgorithmName.TYPE_1_)
1732ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        {
1742ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            char factor[] = ICUBinary.getChars(m_byteBuffer_, variant, 0);
1752ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1762ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            result.setFactor(factor);
1772ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            size -= (variant << 1);
1782ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
179f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
1802ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        StringBuilder prefix = new StringBuilder();
1812ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        char c = (char)(m_byteBuffer_.get() & 0x00FF);
1822ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        while (c != 0)
1832ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        {
1842ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            prefix.append(c);
1852ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            c = (char)(m_byteBuffer_.get() & 0x00FF);
1862ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
187f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
1882ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        result.setPrefix(prefix.toString());
189f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
1902ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        size -= (ALG_INFO_SIZE_ + prefix.length() + 1);
191f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
1922ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (size > 0)
1932ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        {
1942ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            byte string[] = new byte[size];
1952ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            m_byteBuffer_.get(string);
1962ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            result.setFactorString(string);
1972ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1982ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return result;
1992ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
2002ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller}
201