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