ResourceTable.cpp revision 9411a39866b749ad0a47f15083f311847eb79178
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Copyright 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Build resource files from raw assets. 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "ResourceTable.h" 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "XMLNode.h" 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/ByteOrder.h> 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/ResourceTypes.h> 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdarg.h> 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NOISY(x) //x 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t compileXmlFile(const sp<AaptAssets>& assets, 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<AaptFile>& target, 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResourceTable* table, 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int options) 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<XMLNode> root = XMLNode::parse(target); 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (root == NULL) { 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((options&XML_COMPILE_STRIP_WHITESPACE) != 0) { 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project root->removeWhitespace(true, NULL); 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((options&XML_COMPILE_COMPACT_WHITESPACE) != 0) { 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project root->removeWhitespace(false, NULL); 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool hasErrors = false; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((options&XML_COMPILE_ASSIGN_ATTRIBUTE_IDS) != 0) { 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = root->assignResourceIds(assets, table); 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = true; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = root->parseValues(assets, table); 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = true; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasErrors) { 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(printf("Input XML Resource:\n")); 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(root->print()); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = root->flatten(target, 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (options&XML_COMPILE_STRIP_COMMENTS) != 0, 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (options&XML_COMPILE_STRIP_RAW_VALUES) != 0); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(printf("Output XML Resource:\n")); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(ResXMLTree tree; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tree.setTo(target->getData(), target->getSize()); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printXMLBlock(&tree)); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target->setCompressionMethod(ZipEntry::kCompressDeflated); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#undef NOISY 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NOISY(x) //x 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct flag_entry 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char16_t* name; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t nameLen; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t value; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* description; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char16_t referenceArray[] = 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 'r', 'e', 'f', 'e', 'r', 'e', 'n', 'c', 'e' }; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char16_t stringArray[] = 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 's', 't', 'r', 'i', 'n', 'g' }; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char16_t integerArray[] = 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 'i', 'n', 't', 'e', 'g', 'e', 'r' }; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char16_t booleanArray[] = 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 'b', 'o', 'o', 'l', 'e', 'a', 'n' }; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char16_t colorArray[] = 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 'c', 'o', 'l', 'o', 'r' }; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char16_t floatArray[] = 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 'f', 'l', 'o', 'a', 't' }; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char16_t dimensionArray[] = 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n' }; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char16_t fractionArray[] = 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 'f', 'r', 'a', 'c', 't', 'i', 'o', 'n' }; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char16_t enumArray[] = 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 'e', 'n', 'u', 'm' }; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char16_t flagsArray[] = 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 'f', 'l', 'a', 'g', 's' }; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const flag_entry gFormatFlags[] = { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { referenceArray, sizeof(referenceArray)/2, ResTable_map::TYPE_REFERENCE, 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "a reference to another resource, in the form \"<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>\"\n" 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "or to a theme attribute in the form \"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>\"."}, 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { stringArray, sizeof(stringArray)/2, ResTable_map::TYPE_STRING, 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "a string value, using '\\\\;' to escape characters such as '\\\\n' or '\\\\uxxxx' for a unicode character." }, 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { integerArray, sizeof(integerArray)/2, ResTable_map::TYPE_INTEGER, 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "an integer value, such as \"<code>100</code>\"." }, 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { booleanArray, sizeof(booleanArray)/2, ResTable_map::TYPE_BOOLEAN, 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "a boolean value, either \"<code>true</code>\" or \"<code>false</code>\"." }, 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { colorArray, sizeof(colorArray)/2, ResTable_map::TYPE_COLOR, 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "a color value, in the form of \"<code>#<i>rgb</i></code>\", \"<code>#<i>argb</i></code>\",\n" 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "\"<code>#<i>rrggbb</i></code>\", or \"<code>#<i>aarrggbb</i></code>\"." }, 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { floatArray, sizeof(floatArray)/2, ResTable_map::TYPE_FLOAT, 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "a floating point value, such as \"<code>1.2</code>\"."}, 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { dimensionArray, sizeof(dimensionArray)/2, ResTable_map::TYPE_DIMENSION, 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "a dimension value, which is a floating point number appended with a unit such as \"<code>14.5sp</code>\".\n" 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),\n" 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "in (inches), mm (millimeters)." }, 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { fractionArray, sizeof(fractionArray)/2, ResTable_map::TYPE_FRACTION, 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "a fractional value, which is a floating point number appended with either % or %p, such as \"<code>14.5%</code>\".\n" 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "The % suffix always means a percentage of the base size; the optional %p suffix provides a size relative to\n" 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "some parent container." }, 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { enumArray, sizeof(enumArray)/2, ResTable_map::TYPE_ENUM, NULL }, 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { flagsArray, sizeof(flagsArray)/2, ResTable_map::TYPE_FLAGS, NULL }, 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { NULL, 0, 0, NULL } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char16_t suggestedArray[] = { 's', 'u', 'g', 'g', 'e', 's', 't', 'e', 'd' }; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const flag_entry l10nRequiredFlags[] = { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { suggestedArray, sizeof(suggestedArray)/2, ResTable_map::L10N_SUGGESTED, NULL }, 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { NULL, 0, 0, NULL } 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char16_t nulStr[] = { 0 }; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic uint32_t parse_flags(const char16_t* str, size_t len, 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const flag_entry* flags, bool* outError = NULL) 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (len > 0 && isspace(*str)) { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str++; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len--; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (len > 0 && isspace(str[len-1])) { 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len--; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char16_t* const end = str + len; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t value = 0; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (str < end) { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char16_t* div = str; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (div < end && *div != '|') { 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project div++; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const flag_entry* cur = flags; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (cur->name) { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strzcmp16(cur->name, cur->nameLen, str, div-str) == 0) { 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value |= cur->value; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cur++; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!cur->name) { 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError) *outError = true; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = div < end ? div+1 : div; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError) *outError = false; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return value; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic String16 mayOrMust(int type, int flags) 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((type&(~flags)) == 0) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String16("<p>Must"); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String16("<p>May"); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void appendTypeInfo(ResourceTable* outTable, const String16& pkg, 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& typeName, const String16& ident, int type, 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const flag_entry* flags) 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool hadType = false; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (flags->name) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((type&flags->value) != 0 && flags->description != NULL) { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 fullMsg(mayOrMust(type, flags->value)); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fullMsg.append(String16(" be ")); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fullMsg.append(String16(flags->description)); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outTable->appendTypeComment(pkg, typeName, ident, fullMsg); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hadType = true; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags++; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hadType && (type&ResTable_map::TYPE_REFERENCE) == 0) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outTable->appendTypeComment(pkg, typeName, ident, 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16("<p>This may also be a reference to a resource (in the form\n" 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "\"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>\") or\n" 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "theme attribute (in the form\n" 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "\"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>\")\n" 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "containing a value of this type.")); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct PendingAttribute 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 myPackage; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SourcePos sourcePos; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const bool appendComment; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t type; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 ident; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 comment; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool hasErrors; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool added; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingAttribute(String16 _package, const sp<AaptFile>& in, 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLTree& block, bool _appendComment) 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : myPackage(_package) 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project , sourcePos(in->getPrintableSource(), block.getLineNumber()) 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project , appendComment(_appendComment) 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project , type(ResTable_map::TYPE_ANY) 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project , hasErrors(false) 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project , added(false) 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t createIfNeeded(ResourceTable* outTable) 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (added || hasErrors) { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project added = true; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 attr16("attr"); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outTable->hasBagOrEntry(myPackage, attr16, ident)) { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.error("Attribute \"%s\" has already been defined\n", 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(ident).string()); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = true; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char numberStr[16]; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf(numberStr, "%d", type); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = outTable->addBag(sourcePos, myPackage, 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr16, ident, String16(""), 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16("^type"), 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16(numberStr), NULL, NULL); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = true; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outTable->appendComment(myPackage, attr16, ident, comment, appendComment); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Attribute %s comment: %s\n", String8(ident).string(), 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // String8(comment).string()); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic status_t compileAttribute(const sp<AaptFile>& in, 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLTree& block, 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& myPackage, 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResourceTable* outTable, 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16* outIdent = NULL, 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool inStyleable = false) 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingAttribute attr(myPackage, in, block, inStyleable); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 attr16("attr"); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 id16("id"); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Attribute type constants. 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 enum16("enum"); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 flag16("flag"); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLTree::event_code_t code; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t len; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t identIdx = block.indexOfAttribute(NULL, "name"); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (identIdx >= 0) { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.ident = String16(block.getAttributeStringValue(identIdx, &len)); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outIdent) { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *outIdent = attr.ident; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.sourcePos.error("A 'name' attribute is required for <attr>\n"); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.comment = String16( 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block.getComment(&len) ? block.getComment(&len) : nulStr); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t typeIdx = block.indexOfAttribute(NULL, "format"); 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (typeIdx >= 0) { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 typeStr = String16(block.getAttributeStringValue(typeIdx, &len)); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.type = parse_flags(typeStr.string(), typeStr.size(), gFormatFlags); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attr.type == 0) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.sourcePos.error("Tag <attr> 'format' attribute value \"%s\" not valid\n", 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(typeStr).string()); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.createIfNeeded(outTable); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (!inStyleable) { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Attribute definitions outside of styleables always define the 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // attribute as a generic value. 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.createIfNeeded(outTable); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Attribute %s: type=0x%08x\n", String8(attr.ident).string(), attr.type); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t minIdx = block.indexOfAttribute(NULL, "min"); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (minIdx >= 0) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 val = String16(block.getAttributeStringValue(minIdx, &len)); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!ResTable::stringToInt(val.string(), val.size(), NULL)) { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.sourcePos.error("Tag <attr> 'min' attribute must be a number, not \"%s\"\n", 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(val).string()); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.createIfNeeded(outTable); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!attr.hasErrors) { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = outTable->addBag(attr.sourcePos, myPackage, attr16, attr.ident, 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16(""), String16("^min"), String16(val), NULL, NULL); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t maxIdx = block.indexOfAttribute(NULL, "max"); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (maxIdx >= 0) { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 val = String16(block.getAttributeStringValue(maxIdx, &len)); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!ResTable::stringToInt(val.string(), val.size(), NULL)) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.sourcePos.error("Tag <attr> 'max' attribute must be a number, not \"%s\"\n", 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(val).string()); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.createIfNeeded(outTable); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!attr.hasErrors) { 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = outTable->addBag(attr.sourcePos, myPackage, attr16, attr.ident, 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16(""), String16("^max"), String16(val), NULL, NULL); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((minIdx >= 0 || maxIdx >= 0) && (attr.type&ResTable_map::TYPE_INTEGER) == 0) { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.sourcePos.error("Tag <attr> must have format=integer attribute if using max or min\n"); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t l10nIdx = block.indexOfAttribute(NULL, "localization"); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (l10nIdx >= 0) { 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const uint16_t* str = block.getAttributeStringValue(l10nIdx, &len); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool error; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t l10n_required = parse_flags(str, len, l10nRequiredFlags, &error); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (error) { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.sourcePos.error("Tag <attr> 'localization' attribute value \"%s\" not valid\n", 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(str).string()); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.createIfNeeded(outTable); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!attr.hasErrors) { 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char buf[10]; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf(buf, "%d", l10n_required); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = outTable->addBag(attr.sourcePos, myPackage, attr16, attr.ident, 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16(""), String16("^l10n"), String16(buf), NULL, NULL); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 enumOrFlagsComment; 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == ResXMLTree::START_TAG) { 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t localType = 0; 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), enum16.string()) == 0) { 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project localType = ResTable_map::TYPE_ENUM; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), flag16.string()) == 0) { 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project localType = ResTable_map::TYPE_FLAGS; 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()) 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .error("Tag <%s> can not appear inside <attr>, only <enum> or <flag>\n", 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(block.getElementName(&len)).string()); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.createIfNeeded(outTable); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attr.type == ResTable_map::TYPE_ANY) { 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // No type was explicitly stated, so supplying enum tags 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // implicitly creates an enum or flag. 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.type = 0; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attr.type&(ResTable_map::TYPE_ENUM|ResTable_map::TYPE_FLAGS)) == 0) { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Wasn't originally specified as an enum, so update its type. 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.type |= localType; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!attr.hasErrors) { 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char numberStr[16]; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf(numberStr, "%d", attr.type); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = outTable->addBag(SourcePos(in->getPrintableSource(), block.getLineNumber()), 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project myPackage, attr16, attr.ident, String16(""), 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16("^type"), String16(numberStr), NULL, NULL, true); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((uint32_t)(attr.type&(ResTable_map::TYPE_ENUM|ResTable_map::TYPE_FLAGS)) != localType) { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localType == ResTable_map::TYPE_ENUM) { 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()) 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .error("<enum> attribute can not be used inside a flags format\n"); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()) 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .error("<flag> attribute can not be used inside a enum format\n"); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 itemIdent; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t itemIdentIdx = block.indexOfAttribute(NULL, "name"); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (itemIdentIdx >= 0) { 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemIdent = String16(block.getAttributeStringValue(itemIdentIdx, &len)); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()) 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .error("A 'name' attribute is required for <enum> or <flag>\n"); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 value; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t valueIdx = block.indexOfAttribute(NULL, "value"); 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (valueIdx >= 0) { 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value = String16(block.getAttributeStringValue(valueIdx, &len)); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()) 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .error("A 'value' attribute is required for <enum> or <flag>\n"); 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!attr.hasErrors && !ResTable::stringToInt(value.string(), value.size(), NULL)) { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()) 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .error("Tag <enum> or <flag> 'value' attribute must be a number," 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " not \"%s\"\n", 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(value).string()); 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make sure an id is defined for this enum/flag identifier... 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!attr.hasErrors && !outTable->hasBagOrEntry(itemIdent, &id16, &myPackage)) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = outTable->startBag(SourcePos(in->getPrintableSource(), block.getLineNumber()), 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project myPackage, id16, itemIdent, String16(), NULL); 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!attr.hasErrors) { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (enumOrFlagsComment.size() == 0) { 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enumOrFlagsComment.append(mayOrMust(attr.type, 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_map::TYPE_ENUM|ResTable_map::TYPE_FLAGS)); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enumOrFlagsComment.append((attr.type&ResTable_map::TYPE_ENUM) 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? String16(" be one of the following constant values.") 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : String16(" be one or more (separated by '|') of the following constant values.")); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enumOrFlagsComment.append(String16("</p>\n<table border=\"2\" width=\"85%\" align=\"center\" frame=\"hsides\" rules=\"all\" cellpadding=\"5\">\n" 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<colgroup align=\"left\" />\n" 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<colgroup align=\"left\" />\n" 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<colgroup align=\"left\" />\n" 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<tr><th>Constant<th>Value<th>Description</tr>")); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enumOrFlagsComment.append(String16("\n<tr><th><code>")); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enumOrFlagsComment.append(itemIdent); 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enumOrFlagsComment.append(String16("</code><td>")); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enumOrFlagsComment.append(value); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enumOrFlagsComment.append(String16("<td>")); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (block.getComment(&len)) { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enumOrFlagsComment.append(String16(block.getComment(&len))); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enumOrFlagsComment.append(String16("</tr>")); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = outTable->addBag(SourcePos(in->getPrintableSource(), block.getLineNumber()), 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project myPackage, 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr16, attr.ident, String16(""), 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemIdent, value, NULL, NULL, false, true); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr.hasErrors = true; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (code == ResXMLTree::END_TAG) { 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), attr16.string()) == 0) { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attr.type&ResTable_map::TYPE_ENUM) != 0) { 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), enum16.string()) != 0) { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()) 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .error("Found tag </%s> where </enum> is expected\n", 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(block.getElementName(&len)).string()); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), flag16.string()) != 0) { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()) 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .error("Found tag </%s> where </flag> is expected\n", 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(block.getElementName(&len)).string()); 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!attr.hasErrors && attr.added) { 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project appendTypeInfo(outTable, myPackage, attr16, attr.ident, attr.type, gFormatFlags); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!attr.hasErrors && enumOrFlagsComment.size() > 0) { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enumOrFlagsComment.append(String16("\n</table>")); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outTable->appendTypeComment(myPackage, attr16, attr.ident, enumOrFlagsComment); 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool localeIsDefined(const ResTable_config& config) 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return config.locale == 0; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t parseAndAddBag(Bundle* bundle, 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<AaptFile>& in, 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLTree* block, 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable_config& config, 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& myPackage, 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& curType, 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& ident, 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& parentIdent, 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& itemIdent, 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t curFormat, 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool pseudolocalize, 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const bool overwrite, 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResourceTable* outTable) 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 item16("item"); 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 str; 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector<StringPool::entry_style_span> spans; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = parseStyledString(bundle, in->getPrintableSource().string(), 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block, item16, &str, &spans, 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pseudolocalize); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(printf("Adding resource bag entry l=%c%c c=%c%c orien=%d d=%d " 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " pid=%s, bag=%s, id=%s: %s\n", 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.language[0], config.language[1], 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.country[0], config.country[1], 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.orientation, config.density, 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(parentIdent).string(), 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(ident).string(), 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(itemIdent).string(), 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(str).string())); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = outTable->addBag(SourcePos(in->getPrintableSource(), block->getLineNumber()), 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project myPackage, curType, ident, parentIdent, itemIdent, str, 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &spans, &config, overwrite, false, curFormat); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t parseAndAddEntry(Bundle* bundle, 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<AaptFile>& in, 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLTree* block, 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable_config& config, 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& myPackage, 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& curType, 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& ident, 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& curTag, 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool curIsStyled, 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t curFormat, 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool pseudolocalize, 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const bool overwrite, 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResourceTable* outTable) 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 str; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector<StringPool::entry_style_span> spans; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = parseStyledString(bundle, in->getPrintableSource().string(), block, 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curTag, &str, curIsStyled ? &spans : NULL, 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pseudolocalize); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err < NO_ERROR) { 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(printf("Adding resource entry l=%c%c c=%c%c orien=%d d=%d id=%s: %s\n", 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.language[0], config.language[1], 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.country[0], config.country[1], 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.orientation, config.density, 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(ident).string(), String8(str).string())); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = outTable->addEntry(SourcePos(in->getPrintableSource(), block->getLineNumber()), 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project myPackage, curType, ident, str, &spans, &config, 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, curFormat, overwrite); 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t compileResourceFile(Bundle* bundle, 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<AaptAssets>& assets, 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<AaptFile>& in, 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable_config& defParams, 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const bool overwrite, 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResourceTable* outTable) 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLTree block; 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = parseXMLResource(in, &block, false, true); 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Top-level tag. 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 resources16("resources"); 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Identifier declaration tags. 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 declare_styleable16("declare-styleable"); 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 attr16("attr"); 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Data creation organizational tags. 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 string16("string"); 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 drawable16("drawable"); 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 color16("color"); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 bool16("bool"); 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 integer16("integer"); 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 dimen16("dimen"); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 fraction16("fraction"); 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 style16("style"); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 plurals16("plurals"); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 array16("array"); 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 string_array16("string-array"); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 integer_array16("integer-array"); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 public16("public"); 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 private_symbols16("private-symbols"); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 skip16("skip"); 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 eat_comment16("eat-comment"); 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Data creation tags. 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 bag16("bag"); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 item16("item"); 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Attribute type constants. 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 enum16("enum"); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // plural values 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 other16("other"); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 quantityOther16("^other"); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 zero16("zero"); 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 quantityZero16("^zero"); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 one16("one"); 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 quantityOne16("^one"); 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 two16("two"); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 quantityTwo16("^two"); 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 few16("few"); 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 quantityFew16("^few"); 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 many16("many"); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 quantityMany16("^many"); 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // useful attribute names and special values 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 name16("name"); 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 translatable16("translatable"); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 false16("false"); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 myPackage(assets->getPackage()); 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool hasErrors = false; 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t nextPublicId = 0; 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLTree::event_code_t code; 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code = block.next(); 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (code == ResXMLTree::START_NAMESPACE); 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t len; 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code != ResXMLTree::START_TAG) { 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "No start tag found\n"); 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), resources16.string()) != 0) { 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Invalid start tag %s\n", String8(block.getElementName(&len)).string()); 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_config curParams(defParams); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_config pseudoParams(curParams); 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pseudoParams.language[0] = 'z'; 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pseudoParams.language[1] = 'z'; 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pseudoParams.country[0] = 'Z'; 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pseudoParams.country[1] = 'Z'; 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == ResXMLTree::START_TAG) { 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16* curTag = NULL; 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 curType; 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t curFormat = ResTable_map::TYPE_ANY; 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool curIsBag = false; 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool curIsStyled = false; 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool curIsPseudolocalizable = false; 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool localHasErrors = false; 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), skip16.string()) == 0) { 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((code=block.next()) != ResXMLTree::END_DOCUMENT 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && code != ResXMLTree::BAD_DOCUMENT) { 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == ResXMLTree::END_TAG) { 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), skip16.string()) == 0) { 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), eat_comment16.string()) == 0) { 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((code=block.next()) != ResXMLTree::END_DOCUMENT 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && code != ResXMLTree::BAD_DOCUMENT) { 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == ResXMLTree::END_TAG) { 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), eat_comment16.string()) == 0) { 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), public16.string()) == 0) { 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos srcPos(in->getPrintableSource(), block.getLineNumber()); 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 type; 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t typeIdx = block.indexOfAttribute(NULL, "type"); 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (typeIdx < 0) { 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project srcPos.error("A 'type' attribute is required for <public>\n"); 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type = String16(block.getAttributeStringValue(typeIdx, &len)); 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 name; 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t nameIdx = block.indexOfAttribute(NULL, "name"); 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameIdx < 0) { 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project srcPos.error("A 'name' attribute is required for <public>\n"); 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = String16(block.getAttributeStringValue(nameIdx, &len)); 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t ident = 0; 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t identIdx = block.indexOfAttribute(NULL, "id"); 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (identIdx >= 0) { 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char16_t* identStr = block.getAttributeStringValue(identIdx, &len); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value identValue; 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!ResTable::stringToInt(identStr, len, &identValue)) { 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project srcPos.error("Given 'id' attribute is not an integer: %s\n", 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(block.getAttributeStringValue(identIdx, &len)).string()); 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ident = identValue.data; 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextPublicId = ident+1; 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (nextPublicId == 0) { 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project srcPos.error("No 'id' attribute supplied <public>," 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " and no previous id defined in this file.\n"); 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (!localHasErrors) { 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ident = nextPublicId; 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextPublicId++; 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!localHasErrors) { 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = outTable->addPublic(srcPos, myPackage, type, name, ident); 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err < NO_ERROR) { 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!localHasErrors) { 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptSymbols> symbols = assets->getSymbolsFor(String8("R")); 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (symbols != NULL) { 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project symbols = symbols->addNestedSymbol(String8(type), srcPos); 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (symbols != NULL) { 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project symbols->makeSymbolPublic(String8(name), srcPos); 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 comment( 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block.getComment(&len) ? block.getComment(&len) : nulStr); 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project symbols->appendComment(String8(name), comment, srcPos); 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project srcPos.error("Unable to create symbols!\n"); 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == ResXMLTree::END_TAG) { 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), public16.string()) == 0) { 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), private_symbols16.string()) == 0) { 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 pkg; 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t pkgIdx = block.indexOfAttribute(NULL, "package"); 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkgIdx < 0) { 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "A 'package' attribute is required for <private-symbols>\n"); 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg = String16(block.getAttributeStringValue(pkgIdx, &len)); 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!localHasErrors) { 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assets->setSymbolsPrivatePackage(String8(pkg)); 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == ResXMLTree::END_TAG) { 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), private_symbols16.string()) == 0) { 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), declare_styleable16.string()) == 0) { 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos srcPos(in->getPrintableSource(), block.getLineNumber()); 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 ident; 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t identIdx = block.indexOfAttribute(NULL, "name"); 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (identIdx < 0) { 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project srcPos.error("A 'name' attribute is required for <declare-styleable>\n"); 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ident = String16(block.getAttributeStringValue(identIdx, &len)); 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptSymbols> symbols = assets->getSymbolsFor(String8("R")); 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!localHasErrors) { 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (symbols != NULL) { 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project symbols = symbols->addNestedSymbol(String8("styleable"), srcPos); 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptSymbols> styleSymbols = symbols; 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (symbols != NULL) { 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project symbols = symbols->addNestedSymbol(String8(ident), srcPos); 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (symbols == NULL) { 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project srcPos.error("Unable to create symbols!\n"); 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 comment( 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block.getComment(&len) ? block.getComment(&len) : nulStr); 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project styleSymbols->appendComment(String8(ident), comment, srcPos); 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project symbols = NULL; 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == ResXMLTree::START_TAG) { 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), skip16.string()) == 0) { 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((code=block.next()) != ResXMLTree::END_DOCUMENT 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && code != ResXMLTree::BAD_DOCUMENT) { 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == ResXMLTree::END_TAG) { 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), skip16.string()) == 0) { 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), eat_comment16.string()) == 0) { 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((code=block.next()) != ResXMLTree::END_DOCUMENT 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && code != ResXMLTree::BAD_DOCUMENT) { 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == ResXMLTree::END_TAG) { 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), eat_comment16.string()) == 0) { 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), attr16.string()) != 0) { 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Tag <%s> can not appear inside <declare-styleable>, only <attr>\n", 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(block.getElementName(&len)).string()); 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 comment( 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block.getComment(&len) ? block.getComment(&len) : nulStr); 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 itemIdent; 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = compileAttribute(in, block, myPackage, outTable, &itemIdent, true); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (symbols != NULL) { 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos srcPos(String8(in->getPrintableSource()), block.getLineNumber()); 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project symbols->addSymbol(String8(itemIdent), 0, srcPos); 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project symbols->appendComment(String8(itemIdent), comment, srcPos); 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Attribute %s comment: %s\n", String8(itemIdent).string(), 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // String8(comment).string()); 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (code == ResXMLTree::END_TAG) { 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), declare_styleable16.string()) == 0) { 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Found tag </%s> where </attr> is expected\n", 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(block.getElementName(&len)).string()); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), attr16.string()) == 0) { 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = compileAttribute(in, block, myPackage, outTable, NULL); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = true; 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), item16.string()) == 0) { 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curTag = &item16; 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t attri = block.indexOfAttribute(NULL, "type"); 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attri >= 0) { 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curType = String16(block.getAttributeStringValue(attri, &len)); 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t formatIdx = block.indexOfAttribute(NULL, "format"); 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (formatIdx >= 0) { 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 formatStr = String16(block.getAttributeStringValue( 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project formatIdx, &len)); 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFormat = parse_flags(formatStr.string(), formatStr.size(), 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFormatFlags); 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curFormat == 0) { 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Tag <item> 'format' attribute value \"%s\" not valid\n", 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(formatStr).string()); 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "A 'type' attribute is required for <item>\n"); 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curIsStyled = true; 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), string16.string()) == 0) { 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note the existence and locale of every string we process 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char rawLocale[16]; 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curParams.getLocale(rawLocale); 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 locale(rawLocale); 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 name; 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 translatable; 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t n = block.getAttributeCount(); 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i = 0; i < n; i++) { 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t length; 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const uint16_t* attr = block.getAttributeName(i, &length); 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(attr, name16.string()) == 0) { 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name.setTo(block.getAttributeStringValue(i, &length)); 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(attr, translatable16.string()) == 0) { 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project translatable.setTo(block.getAttributeStringValue(i, &length)); 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.size() > 0) { 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (translatable == false16) { 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Untranslatable strings must only exist in the default [empty] locale 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (locale.size() > 0) { 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "aapt: warning: string '%s' in %s marked untranslatable but exists" 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " in locale '%s'\n", String8(name).string(), 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle->getResourceSourceDirs()[0], 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project locale.string()); 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // hasErrors = localHasErrors = true; 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Intentionally empty block: 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't add untranslatable strings to the localization table; that 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // way if we later see localizations of them, they'll be flagged as 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // having no default translation. 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outTable->addLocalization(name, locale); 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curTag = &string16; 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curType = string16; 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_STRING; 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curIsStyled = true; 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curIsPseudolocalizable = true; 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), drawable16.string()) == 0) { 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curTag = &drawable16; 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curType = drawable16; 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_COLOR; 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), color16.string()) == 0) { 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curTag = &color16; 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curType = color16; 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_COLOR; 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), bool16.string()) == 0) { 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curTag = &bool16; 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curType = bool16; 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_BOOLEAN; 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), integer16.string()) == 0) { 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curTag = &integer16; 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curType = integer16; 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_INTEGER; 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), dimen16.string()) == 0) { 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curTag = &dimen16; 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curType = dimen16; 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_DIMENSION; 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), fraction16.string()) == 0) { 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curTag = &fraction16; 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curType = fraction16; 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_FRACTION; 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), bag16.string()) == 0) { 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curTag = &bag16; 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curIsBag = true; 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t attri = block.indexOfAttribute(NULL, "type"); 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attri >= 0) { 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curType = String16(block.getAttributeStringValue(attri, &len)); 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "A 'type' attribute is required for <bag>\n"); 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), style16.string()) == 0) { 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curTag = &style16; 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curType = style16; 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curIsBag = true; 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), plurals16.string()) == 0) { 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curTag = &plurals16; 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curType = plurals16; 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curIsBag = true; 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), array16.string()) == 0) { 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curTag = &array16; 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curType = array16; 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curIsBag = true; 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t formatIdx = block.indexOfAttribute(NULL, "format"); 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (formatIdx >= 0) { 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 formatStr = String16(block.getAttributeStringValue( 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project formatIdx, &len)); 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFormat = parse_flags(formatStr.string(), formatStr.size(), 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFormatFlags); 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curFormat == 0) { 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Tag <array> 'format' attribute value \"%s\" not valid\n", 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(formatStr).string()); 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), string_array16.string()) == 0) { 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curTag = &string_array16; 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curType = array16; 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_STRING; 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curIsBag = true; 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curIsPseudolocalizable = true; 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp16(block.getElementName(&len), integer_array16.string()) == 0) { 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curTag = &integer_array16; 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curType = array16; 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_INTEGER; 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curIsBag = true; 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Found tag %s where item is expected\n", 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(block.getElementName(&len)).string()); 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 ident; 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t identIdx = block.indexOfAttribute(NULL, "name"); 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (identIdx >= 0) { 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ident = String16(block.getAttributeStringValue(identIdx, &len)); 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "A 'name' attribute is required for <%s>\n", 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(*curTag).string()); 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 comment(block.getComment(&len) ? block.getComment(&len) : nulStr); 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curIsBag) { 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Figure out the parent of this bag... 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 parentIdent; 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t parentIdentIdx = block.indexOfAttribute(NULL, "parent"); 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parentIdentIdx >= 0) { 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parentIdent = String16(block.getAttributeStringValue(parentIdentIdx, &len)); 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t sep = ident.findLast('.'); 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sep >= 0) { 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parentIdent.setTo(ident, sep); 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!localHasErrors) { 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = outTable->startBag(SourcePos(in->getPrintableSource(), block.getLineNumber()), 11124b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt myPackage, curType, ident, parentIdent, &curParams, 11134b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt overwrite); 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t elmIndex = 0; 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char elmIndexStr[14]; 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((code=block.next()) != ResXMLTree::END_DOCUMENT 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && code != ResXMLTree::BAD_DOCUMENT) { 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == ResXMLTree::START_TAG) { 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), item16.string()) != 0) { 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Tag <%s> can not appear inside <%s>, only <item>\n", 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(block.getElementName(&len)).string(), 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(*curTag).string()); 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 itemIdent; 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curType == array16) { 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf(elmIndexStr, "^index_%d", (int)elmIndex++); 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemIdent = String16(elmIndexStr); 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (curType == plurals16) { 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t itemIdentIdx = block.indexOfAttribute(NULL, "quantity"); 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (itemIdentIdx >= 0) { 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 quantity16(block.getAttributeStringValue(itemIdentIdx, &len)); 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (quantity16 == other16) { 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemIdent = quantityOther16; 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (quantity16 == zero16) { 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemIdent = quantityZero16; 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (quantity16 == one16) { 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemIdent = quantityOne16; 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (quantity16 == two16) { 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemIdent = quantityTwo16; 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (quantity16 == few16) { 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemIdent = quantityFew16; 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (quantity16 == many16) { 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemIdent = quantityMany16; 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Illegal 'quantity' attribute is <item> inside <plurals>\n"); 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "A 'quantity' attribute is required for <item> inside <plurals>\n"); 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t itemIdentIdx = block.indexOfAttribute(NULL, "name"); 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (itemIdentIdx >= 0) { 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemIdent = String16(block.getAttributeStringValue(itemIdentIdx, &len)); 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "A 'name' attribute is required for <item>\n"); 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLParser::ResXMLPosition parserPosition; 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block.getPosition(&parserPosition); 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = parseAndAddBag(bundle, in, &block, curParams, myPackage, curType, 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ident, parentIdent, itemIdent, curFormat, 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, overwrite, outTable); 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err == NO_ERROR) { 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curIsPseudolocalizable && localeIsDefined(curParams) 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && bundle->getPseudolocalize()) { 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pseudolocalize here 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 1 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block.setPosition(parserPosition); 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = parseAndAddBag(bundle, in, &block, pseudoParams, myPackage, 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curType, ident, parentIdent, itemIdent, curFormat, true, 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overwrite, outTable); 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (code == ResXMLTree::END_TAG) { 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), curTag->string()) != 0) { 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Found tag </%s> where </%s> is expected\n", 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(block.getElementName(&len)).string(), 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(*curTag).string()); 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLParser::ResXMLPosition parserPosition; 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block.getPosition(&parserPosition); 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = parseAndAddEntry(bundle, in, &block, curParams, myPackage, curType, ident, 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *curTag, curIsStyled, curFormat, false, overwrite, outTable); 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err < NO_ERROR) { // Why err < NO_ERROR instead of err != NO_ERROR? 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (err == NO_ERROR) { 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curIsPseudolocalizable && localeIsDefined(curParams) 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && bundle->getPseudolocalize()) { 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pseudolocalize here 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block.setPosition(parserPosition); 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = parseAndAddEntry(bundle, in, &block, pseudoParams, myPackage, curType, 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ident, *curTag, curIsStyled, curFormat, true, false, outTable); 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = localHasErrors = true; 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (comment.size() > 0) { 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("Comment for @%s:%s/%s: %s\n", String8(myPackage).string(), 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(curType).string(), String8(ident).string(), 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(comment).string()); 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!localHasErrors) { 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outTable->appendComment(myPackage, curType, ident, comment, false); 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (code == ResXMLTree::END_TAG) { 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp16(block.getElementName(&len), resources16.string()) != 0) { 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unexpected end tag %s\n", String8(block.getElementName(&len)).string()); 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (code == ResXMLTree::START_NAMESPACE || code == ResXMLTree::END_NAMESPACE) { 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (code == ResXMLTree::TEXT) { 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isWhitespace(block.getText(&len))) { 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(in->getPrintableSource(), block.getLineNumber()).error( 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Found text \"%s\" where item tag is expected\n", 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(block.getText(&len)).string()); 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hasErrors ? UNKNOWN_ERROR : NO_ERROR; 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectResourceTable::ResourceTable(Bundle* bundle, const String16& assetsPackage) 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mAssetsPackage(assetsPackage), mNextPackageId(1), mHaveAppPackage(false), 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsAppPackage(!bundle->getExtending()), 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumLocal(0), 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBundle(bundle) 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::addIncludedResources(Bundle* bundle, const sp<AaptAssets>& assets) 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = assets->buildIncludedResources(bundle); 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For future reference to included resources. 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAssets = assets; 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& incl = assets->getIncludedResources(); 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Retrieve all the packages. 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = incl.getBasePackageCount(); 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t phase=0; phase<2; phase++) { 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<N; i++) { 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 name(incl.getBasePackageName(i)); 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t id = incl.getBasePackageId(i); 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First time through: only add base packages (id 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is not 0); second time through add the other 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // packages. 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (phase != 0) { 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id != 0) { 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Skip base packages -- already one. 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id = 0; 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Assign a dynamic id. 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id = mNextPackageId; 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (id != 0) { 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id == 127) { 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHaveAppPackage) { 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "Included resource have two application packages!\n"); 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveAppPackage = true; 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextPackageId > id) { 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "Included base package ID %d already in use!\n", id); 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id != 0) { 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(printf("Including package %s with ID=%d\n", 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(name).string(), id)); 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Package> p = new Package(name, id); 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackages.add(name, p); 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrderedPackages.add(p); 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id >= mNextPackageId) { 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextPackageId = id+1; 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Every resource table always has one first entry, the bag attributes. 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SourcePos unknown(String8("????"), 0); 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> attr = getType(mAssetsPackage, String16("attr"), unknown); 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::addPublic(const SourcePos& sourcePos, 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& package, 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& type, 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& name, 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const uint32_t ident) 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t rid = mAssets->getIncludedResources() 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .identifierForName(name.string(), name.size(), 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type.string(), type.size(), 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project package.string(), package.size()); 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rid != 0) { 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.error("Error declaring public resource %s/%s for included package %s\n", 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(type).string(), String8(name).string(), 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(package).string()); 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = getType(package, type, sourcePos); 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == NULL) { 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t->addPublic(sourcePos, name, ident); 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::addEntry(const SourcePos& sourcePos, 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& package, 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& type, 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& name, 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& value, 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Vector<StringPool::entry_style_span>* style, 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable_config* params, 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const bool doSetIndex, 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int32_t format, 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const bool overwrite) 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check for adding entries in other packages... for now we do 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // nothing. We need to do the right thing here to support skinning. 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t rid = mAssets->getIncludedResources() 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .identifierForName(name.string(), name.size(), 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type.string(), type.size(), 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project package.string(), package.size()); 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rid != 0) { 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == String16("left")) { 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("Adding entry left: file=%s, line=%d, type=%s, value=%s\n", 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.file.string(), sourcePos.line, String8(type).string(), 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(value).string()); 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Entry> e = getEntry(package, type, name, sourcePos, params, doSetIndex); 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e == NULL) { 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = e->setItem(sourcePos, value, style, format, overwrite); 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err == NO_ERROR) { 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumLocal++; 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::startBag(const SourcePos& sourcePos, 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& package, 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& type, 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& name, 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& bagParent, 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable_config* params, 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool replace, bool isId) 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14134b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt status_t result = NO_ERROR; 14144b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check for adding entries in other packages... for now we do 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // nothing. We need to do the right thing here to support skinning. 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t rid = mAssets->getIncludedResources() 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .identifierForName(name.string(), name.size(), 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type.string(), type.size(), 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project package.string(), package.size()); 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rid != 0) { 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == String16("left")) { 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("Adding bag left: file=%s, line=%d, type=%s\n", 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.file.striing(), sourcePos.line, String8(type).string()); 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Entry> e = getEntry(package, type, name, sourcePos, params); 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e == NULL) { 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If a parent is explicitly specified, set it. 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bagParent.size() > 0) { 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 curPar = e->getParent(); 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curPar.size() > 0 && curPar != bagParent) { 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.error("Conflicting parents specified, was '%s', now '%s'\n", 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(e->getParent()).string(), 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(bagParent).string()); 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e->setParent(bagParent); 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14484b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt 14494b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt if ((result = e->makeItABag(sourcePos)) != NO_ERROR) { 14504b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt return result; 14514b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt } 14529411a39866b749ad0a47f15083f311847eb79178Robert Greenwalt 14539411a39866b749ad0a47f15083f311847eb79178Robert Greenwalt if (replace) { 14549411a39866b749ad0a47f15083f311847eb79178Robert Greenwalt return e->emptyBag(sourcePos); 14559411a39866b749ad0a47f15083f311847eb79178Robert Greenwalt } 14569411a39866b749ad0a47f15083f311847eb79178Robert Greenwalt return result; 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::addBag(const SourcePos& sourcePos, 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& package, 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& type, 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& name, 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& bagParent, 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& bagKey, 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& value, 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Vector<StringPool::entry_style_span>* style, 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable_config* params, 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool replace, bool isId, const int32_t format) 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check for adding entries in other packages... for now we do 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // nothing. We need to do the right thing here to support skinning. 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t rid = mAssets->getIncludedResources() 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .identifierForName(name.string(), name.size(), 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type.string(), type.size(), 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project package.string(), package.size()); 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rid != 0) { 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == String16("left")) { 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("Adding bag left: file=%s, line=%d, type=%s\n", 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.file.striing(), sourcePos.line, String8(type).string()); 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Entry> e = getEntry(package, type, name, sourcePos, params); 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e == NULL) { 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If a parent is explicitly specified, set it. 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bagParent.size() > 0) { 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 curPar = e->getParent(); 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curPar.size() > 0 && curPar != bagParent) { 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.error("Conflicting parents specified, was '%s', now '%s'\n", 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(e->getParent()).string(), 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(bagParent).string()); 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e->setParent(bagParent); 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const bool first = e->getBag().indexOfKey(bagKey) < 0; 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = e->addToBag(sourcePos, bagKey, value, style, replace, isId, format); 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err == NO_ERROR && first) { 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumLocal++; 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ResourceTable::hasBagOrEntry(const String16& package, 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& type, 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& name) const 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First look for this in the included resources... 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t rid = mAssets->getIncludedResources() 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .identifierForName(name.string(), name.size(), 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type.string(), type.size(), 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project package.string(), package.size()); 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rid != 0) { 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Package> p = mPackages.valueFor(package); 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p != NULL) { 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = p->getTypes().valueFor(type); 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != NULL) { 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> c = t->getConfigs().valueFor(name); 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c != NULL) return true; 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ResourceTable::hasBagOrEntry(const String16& ref, 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16* defType, 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16* defPackage) 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 package, type, name; 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!ResTable::expandResourceRef(ref.string(), ref.size(), &package, &type, &name, 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project defType, defPackage ? defPackage:&mAssetsPackage, NULL)) { 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hasBagOrEntry(package, type, name); 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ResourceTable::appendComment(const String16& package, 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& type, 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& name, 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& comment, 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool onlyIfEmpty) 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (comment.size() <= 0) { 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Package> p = mPackages.valueFor(package); 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p != NULL) { 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = p->getTypes().valueFor(type); 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != NULL) { 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> c = t->getConfigs().valueFor(name); 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c != NULL) { 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->appendComment(comment, onlyIfEmpty); 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ResourceTable::appendTypeComment(const String16& package, 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& type, 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& name, 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& comment) 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (comment.size() <= 0) { 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Package> p = mPackages.valueFor(package); 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p != NULL) { 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = p->getTypes().valueFor(type); 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != NULL) { 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> c = t->getConfigs().valueFor(name); 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c != NULL) { 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->appendTypeComment(comment); 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsize_t ResourceTable::size() const { 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackages.size(); 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsize_t ResourceTable::numLocalResources() const { 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNumLocal; 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ResourceTable::hasResources() const { 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNumLocal > 0; 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<AaptFile> ResourceTable::flatten(Bundle* bundle) 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptFile> data = new AaptFile(String8(), AaptGroupEntry(), String8()); 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = flatten(bundle, data); 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err == NO_ERROR ? data : NULL; 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline uint32_t ResourceTable::getResId(const sp<Package>& p, 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<Type>& t, 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t nameId) 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return makeResId(p->getAssignedId(), t->getIndex(), nameId); 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t ResourceTable::getResId(const String16& package, 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& type, 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& name, 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool onlyPublic) const 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Package> p = mPackages.valueFor(package); 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == NULL) return 0; 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First look for this in the included resources... 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t specFlags = 0; 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t rid = mAssets->getIncludedResources() 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .identifierForName(name.string(), name.size(), 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type.string(), type.size(), 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project package.string(), package.size(), 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &specFlags); 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rid != 0) { 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (onlyPublic) { 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((specFlags & ResTable_typeSpec::SPEC_PUBLIC) == 0) { 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Res_INTERNALID(rid)) { 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rid; 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Res_MAKEID(p->getAssignedId()-1, 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_GETTYPE(rid), 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_GETENTRY(rid)); 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = p->getTypes().valueFor(type); 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == NULL) return 0; 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> c = t->getConfigs().valueFor(name); 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == NULL) return 0; 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t ei = c->getEntryIndex(); 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ei < 0) return 0; 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getResId(p, t, ei); 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t ResourceTable::getResId(const String16& ref, 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16* defType, 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16* defPackage, 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char** outErrorMsg, 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool onlyPublic) const 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 package, type, name; 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!ResTable::expandResourceRef( 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ref.string(), ref.size(), &package, &type, &name, 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project defType, defPackage ? defPackage:&mAssetsPackage, 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outErrorMsg)) { 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(printf("Expanding resource: ref=%s\n", 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(ref).string())); 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(printf("Expanding resource: defType=%s\n", 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project defType ? String8(*defType).string() : "NULL")); 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(printf("Expanding resource: defPackage=%s\n", 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project defPackage ? String8(*defPackage).string() : "NULL")); 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(printf("Expanding resource: ref=%s\n", String8(ref).string())); 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(printf("Expanded resource: p=%s, t=%s, n=%s, res=0\n", 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(package).string(), String8(type).string(), 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(name).string())); 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t res = getResId(package, type, name, onlyPublic); 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(printf("Expanded resource: p=%s, t=%s, n=%s, res=%d\n", 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(package).string(), String8(type).string(), 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(name).string(), res)); 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res == 0) { 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outErrorMsg) 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *outErrorMsg = "No resource found that matches the given name"; 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ResourceTable::isValidResourceName(const String16& s) 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char16_t* p = s.string(); 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool first = true; 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*p) { 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((*p >= 'a' && *p <= 'z') 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (*p >= 'A' && *p <= 'Z') 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || *p == '_' 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (!first && *p >= '0' && *p <= '9')) { 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project first = false; 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p++; 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ResourceTable::stringToValue(Res_value* outValue, StringPool* pool, 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& str, 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool preserveSpaces, bool coerceType, 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t attrID, 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Vector<StringPool::entry_style_span>* style, 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16* outStr, void* accessorCookie, 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t attrType) 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 finalStr; 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool res = true; 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (style == NULL || style->size() == 0) { 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Text is not styled so it can be any type... let's figure it out. 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = mAssets->getIncludedResources() 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .stringToValue(outValue, &finalStr, str.string(), str.size(), preserveSpaces, 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coerceType, attrID, NULL, &mAssetsPackage, this, 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project accessorCookie, attrType); 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Styled text can only be a string, and while collecting the style 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // information we have already processed that string! 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue->size = sizeof(Res_value); 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue->res0 = 0; 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue->dataType = outValue->TYPE_STRING; 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue->data = 0; 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finalStr = str; 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!res) { 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outValue->dataType == outValue->TYPE_STRING) { 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should do better merging styles. 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pool) { 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (style != NULL && style->size() > 0) { 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue->data = pool->add(finalStr, *style); 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue->data = pool->add(finalStr, true); 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Caller will fill this in later. 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue->data = 0; 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outStr) { 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *outStr = finalStr; 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t ResourceTable::getCustomResource( 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& package, const String16& type, const String16& name) const 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("getCustomResource: %s %s %s\n", String8(package).string(), 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // String8(type).string(), String8(name).string()); 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Package> p = mPackages.valueFor(package); 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == NULL) return 0; 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = p->getTypes().valueFor(type); 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == NULL) return 0; 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> c = t->getConfigs().valueFor(name); 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == NULL) return 0; 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t ei = c->getEntryIndex(); 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ei < 0) return 0; 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getResId(p, t, ei); 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t ResourceTable::getCustomResourceWithCreation( 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& package, const String16& type, const String16& name, 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const bool createIfNotFound) 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t resId = getCustomResource(package, type, name); 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resId != 0 || !createIfNotFound) { 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return resId; 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 value("false"); 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t status = addEntry(mCurrentXmlPos, package, type, name, value, NULL, NULL, true); 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status == NO_ERROR) { 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resId = getResId(package, type, name); 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return resId; 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t ResourceTable::getRemappedPackage(uint32_t origPackage) const 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return origPackage; 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ResourceTable::getAttributeType(uint32_t attrID, uint32_t* outType) 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("getAttributeType #%08x\n", attrID); 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getItemValue(attrID, ResTable_map::ATTR_TYPE, &value)) { 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("getAttributeType #%08x (%s): #%08x\n", attrID, 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // String8(getEntry(attrID)->getName()).string(), value.data); 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *outType = value.data; 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ResourceTable::getAttributeMin(uint32_t attrID, uint32_t* outMin) 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("getAttributeMin #%08x\n", attrID); 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getItemValue(attrID, ResTable_map::ATTR_MIN, &value)) { 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *outMin = value.data; 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ResourceTable::getAttributeMax(uint32_t attrID, uint32_t* outMax) 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("getAttributeMax #%08x\n", attrID); 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getItemValue(attrID, ResTable_map::ATTR_MAX, &value)) { 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *outMax = value.data; 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t ResourceTable::getAttributeL10N(uint32_t attrID) 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("getAttributeL10N #%08x\n", attrID); 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getItemValue(attrID, ResTable_map::ATTR_L10N, &value)) { 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return value.data; 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ResTable_map::L10N_NOT_REQUIRED; 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ResourceTable::getLocalizationSetting() 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBundle->getRequireLocalization(); 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid ResourceTable::reportError(void* accessorCookie, const char* fmt, ...) 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (accessorCookie != NULL && fmt != NULL) { 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AccessorCookie* ac = (AccessorCookie*)accessorCookie; 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int retval=0; 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char buf[1024]; 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project va_list ap; 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project va_start(ap, fmt); 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project retval = vsnprintf(buf, sizeof(buf), fmt, ap); 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project va_end(ap); 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ac->sourcePos.error("Error: %s (at '%s' with value '%s').\n", 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buf, ac->attr.string(), ac->value.string()); 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ResourceTable::getAttributeKeys( 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t attrID, Vector<String16>* outKeys) 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<const Entry> e = getEntry(attrID); 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e != NULL) { 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = e->getBag().size(); 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<N; i++) { 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& key = e->getBag().keyAt(i); 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (key.size() > 0 && key.string()[0] != '^') { 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outKeys->add(key); 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ResourceTable::getAttributeEnum( 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t attrID, const char16_t* name, size_t nameLen, 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value* outValue) 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("getAttributeEnum #%08x %s\n", attrID, String8(name, nameLen).string()); 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 nameStr(name, nameLen); 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<const Entry> e = getEntry(attrID); 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e != NULL) { 18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = e->getBag().size(); 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<N; i++) { 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Comparing %s to %s\n", String8(name, nameLen).string(), 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // String8(e->getBag().keyAt(i)).string()); 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e->getBag().keyAt(i) == nameStr) { 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getItemValue(attrID, e->getBag().valueAt(i).bagKeyId, outValue); 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ResourceTable::getAttributeFlags( 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t attrID, const char16_t* name, size_t nameLen, 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value* outValue) 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue->dataType = Res_value::TYPE_INT_HEX; 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue->data = 0; 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("getAttributeFlags #%08x %s\n", attrID, String8(name, nameLen).string()); 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 nameStr(name, nameLen); 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<const Entry> e = getEntry(attrID); 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e != NULL) { 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = e->getBag().size(); 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char16_t* end = name + nameLen; 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char16_t* pos = name; 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool failed = false; 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (pos < end && !failed) { 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char16_t* start = pos; 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project end++; 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (pos < end && *pos != '|') { 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 nameStr(start, pos-start); 19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t i; 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Comparing \"%s\" to \"%s\"\n", String8(nameStr).string(), 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // String8(e->getBag().keyAt(i)).string()); 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e->getBag().keyAt(i) == nameStr) { 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value val; 19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool got = getItemValue(attrID, e->getBag().valueAt(i).bagKeyId, &val); 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!got) { 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Got value: 0x%08x\n", val.data); 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue->data |= val.data; 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i >= N) { 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Didn't find this flag identifier. 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos < end) { 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::assignResourceIds() 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = mOrderedPackages.size(); 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t pi; 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t firstError = NO_ERROR; 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First generate all bag attributes and assign indices. 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (pi=0; pi<N; pi++) { 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Package> p = mOrderedPackages.itemAt(pi); 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == NULL || p->getTypes().size() == 0) { 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Empty, skip! 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = p->applyPublicTypeOrder(); 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR && firstError == NO_ERROR) { 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project firstError = err; 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Generate attributes... 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = p->getOrderedTypes().size(); 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t ti; 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (ti=0; ti<N; ti++) { 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = p->getOrderedTypes().itemAt(ti); 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == NULL) { 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = t->getOrderedConfigs().size(); 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t ci=0; ci<N; ci++) { 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> c = t->getOrderedConfigs().itemAt(ci); 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == NULL) { 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = c->getEntries().size(); 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t ei=0; ei<N; ei++) { 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Entry> e = c->getEntries().valueAt(ei); 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e == NULL) { 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = e->generateAttributes(this, p->getName()); 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR && firstError == NO_ERROR) { 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project firstError = err; 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SourcePos unknown(String8("????"), 0); 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> attr = p->getType(String16("attr"), unknown); 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Assign indices... 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (ti=0; ti<N; ti++) { 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = p->getOrderedTypes().itemAt(ti); 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == NULL) { 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = t->applyPublicEntryOrder(); 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR && firstError == NO_ERROR) { 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project firstError = err; 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = t->getOrderedConfigs().size(); 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t->setIndex(ti+1); 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_ALWAYS_FATAL_IF(ti == 0 && attr != t, 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "First type is not attr!"); 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t ei=0; ei<N; ei++) { 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> c = t->getOrderedConfigs().itemAt(ei); 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == NULL) { 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->setEntryIndex(ei); 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Assign resource IDs to keys in bags... 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (ti=0; ti<N; ti++) { 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = p->getOrderedTypes().itemAt(ti); 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == NULL) { 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = t->getOrderedConfigs().size(); 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t ci=0; ci<N; ci++) { 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> c = t->getOrderedConfigs().itemAt(ci); 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Ordered config #%d: %p\n", ci, c.get()); 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = c->getEntries().size(); 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t ei=0; ei<N; ei++) { 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Entry> e = c->getEntries().valueAt(ei); 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e == NULL) { 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = e->assignResourceIds(this, p->getName()); 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR && firstError == NO_ERROR) { 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project firstError = err; 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return firstError; 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::addSymbols(const sp<AaptSymbols>& outSymbols) { 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = mOrderedPackages.size(); 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t pi; 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (pi=0; pi<N; pi++) { 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Package> p = mOrderedPackages.itemAt(pi); 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p->getTypes().size() == 0) { 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Empty, skip! 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = p->getOrderedTypes().size(); 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t ti; 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (ti=0; ti<N; ti++) { 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = p->getOrderedTypes().itemAt(ti); 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == NULL) { 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = t->getOrderedConfigs().size(); 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptSymbols> typeSymbols; 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typeSymbols = outSymbols->addNestedSymbol(String8(t->getName()), t->getPos()); 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t ci=0; ci<N; ci++) { 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> c = t->getOrderedConfigs().itemAt(ci); 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == NULL) { 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t rid = getResId(p, t, ci); 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rid == 0) { 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Res_GETPACKAGE(rid) == (size_t)(p->getAssignedId()-1)) { 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typeSymbols->addSymbol(String8(c->getName()), rid, c->getPos()); 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 comment(c->getComment()); 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typeSymbols->appendComment(String8(c->getName()), comment, c->getPos()); 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Type symbol %s comment: %s\n", String8(e->getName()).string(), 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // String8(comment).string()); 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comment = c->getTypeComment(); 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typeSymbols->appendTypeComment(String8(c->getName()), comment); 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("**** NO MATCH: 0x%08x vs 0x%08x\n", 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_GETPACKAGE(rid), p->getAssignedId()); 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectResourceTable::addLocalization(const String16& name, const String8& locale) 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLocalizations[name].insert(locale); 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*! 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flag various sorts of localization problems. '+' indicates checks already implemented; 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * '-' indicates checks that will be implemented in the future. 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * + A localized string for which no default-locale version exists => warning 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * + A string for which no version in an explicitly-requested locale exists => warning 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * + A localized translation of an translateable="false" string => warning 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - A localized string not provided in every locale used by the table 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectResourceTable::validateLocalizations(void) 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = NO_ERROR; 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String8 defaultLocale; 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For all strings... 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (map<String16, set<String8> >::iterator nameIter = mLocalizations.begin(); 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nameIter != mLocalizations.end(); 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nameIter++) { 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const set<String8>& configSet = nameIter->second; // naming convenience 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Look for strings with no default localization 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (configSet.count(defaultLocale) == 0) { 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stdout, "aapt: warning: string '%s' has no default translation in %s; found:", 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(nameIter->first).string(), mBundle->getResourceSourceDirs()[0]); 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (set<String8>::iterator locales = configSet.begin(); 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project locales != configSet.end(); 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project locales++) { 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stdout, " %s", (*locales).string()); 21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stdout, "\n"); 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // !!! TODO: throw an error here in some circumstances 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check that all requested localizations are present for this string 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBundle->getConfigurations() != NULL && mBundle->getRequireLocalization()) { 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* allConfigs = mBundle->getConfigurations(); 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* start = allConfigs; 21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* comma; 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 config; 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comma = strchr(start, ','); 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (comma != NULL) { 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.setTo(start, comma - start); 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project start = comma + 1; 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.setTo(start); 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // don't bother with the pseudolocale "zz_ZZ" 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (config != "zz_ZZ") { 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (configSet.find(config) == configSet.end()) { 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // okay, no specific localization found. it's possible that we are 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // requiring a specific regional localization [e.g. de_DE] but there is an 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // available string in the generic language localization [e.g. de]; 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // consider that string to have fulfilled the localization requirement. 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 region(config.string(), 2); 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (configSet.find(region) == configSet.end()) { 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (configSet.count(defaultLocale) == 0) { 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stdout, "aapt: error: " 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "*** string '%s' has no default or required localization " 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "for '%s' in %s\n", 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(nameIter->first).string(), 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.string(), 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBundle->getResourceSourceDirs()[0]); 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = UNKNOWN_ERROR; 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (comma != NULL); 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectResourceFilter::parse(const char* arg) 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg == NULL) { 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* p = arg; 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* q; 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (true) { 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project q = strchr(p, ','); 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (q == NULL) { 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project q = p + strlen(p); 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 part(p, q-p); 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (part == "zz_ZZ") { 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContainsPseudo = true; 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int axis; 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t value; 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (AaptGroupEntry::parseNamePart(part, &axis, &value)) { 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "Invalid configuration: %s\n", arg); 22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, " "); 22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<p-arg; i++) { 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, " "); 22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<q-p; i++) { 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "^"); 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "\n"); 22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t index = mData.indexOfKey(axis); 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < 0) { 22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mData.add(axis, SortedVector<uint32_t>()); 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SortedVector<uint32_t>& sv = mData.editValueFor(axis); 22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sv.add(value); 22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if it's a locale with a region, also match an unmodified locale of the 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // same language 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (axis == AXIS_LANGUAGE) { 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value & 0xffff0000) { 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sv.add(value & 0x0000ffff); 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = q; 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!*p) break; 22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p++; 22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool 22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectResourceFilter::match(int axis, uint32_t value) 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == 0) { 22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // they didn't specify anything so take everything 22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t index = mData.indexOfKey(axis); 22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < 0) { 22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we didn't request anything on this axis so take everything 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SortedVector<uint32_t>& sv = mData.valueAt(index); 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sv.indexOf(value) >= 0; 22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectResourceFilter::match(const ResTable_config& config) 22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (config.locale) { 22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t locale = (config.country[1] << 24) | (config.country[0] << 16) 22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | (config.language[1] << 8) | (config.language[0]); 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!match(AXIS_LANGUAGE, locale)) { 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!match(AXIS_ORIENTATION, config.orientation)) { 22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!match(AXIS_DENSITY, config.density)) { 22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!match(AXIS_TOUCHSCREEN, config.touchscreen)) { 22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!match(AXIS_KEYSHIDDEN, config.inputFlags)) { 22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!match(AXIS_KEYBOARD, config.keyboard)) { 22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!match(AXIS_NAVIGATION, config.navigation)) { 23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!match(AXIS_SCREENSIZE, config.screenSize)) { 23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!match(AXIS_VERSION, config.version)) { 23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::flatten(Bundle* bundle, const sp<AaptFile>& dest) 23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResourceFilter filter; 23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = filter.parse(bundle->getConfigurations()); 23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = mOrderedPackages.size(); 23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t pi; 23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Iterate through all data, collecting all values (strings, 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // references, etc). 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringPool valueStrings; 23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (pi=0; pi<N; pi++) { 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Package> p = mOrderedPackages.itemAt(pi); 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p->getTypes().size() == 0) { 23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Empty, skip! 23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringPool typeStrings; 23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringPool keyStrings; 23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = p->getOrderedTypes().size(); 23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t ti=0; ti<N; ti++) { 23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = p->getOrderedTypes().itemAt(ti); 23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == NULL) { 23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typeStrings.add(String16("<empty>"), false); 23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typeStrings.add(t->getName(), false); 23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = t->getOrderedConfigs().size(); 23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t ci=0; ci<N; ci++) { 23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> c = t->getOrderedConfigs().itemAt(ci); 23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == NULL) { 23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = c->getEntries().size(); 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t ei=0; ei<N; ei++) { 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ConfigDescription config = c->getEntries().keyAt(ei); 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!filter.match(config)) { 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Entry> e = c->getEntries().valueAt(ei); 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e == NULL) { 23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e->setNameIndex(keyStrings.add(e->getName(), true)); 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = e->prepareFlatten(&valueStrings, this); 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p->setTypeStrings(typeStrings.createStringBlock()); 23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p->setKeyStrings(keyStrings.createStringBlock()); 23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t strAmt = 0; 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now build the array of package chunks. 23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector<sp<AaptFile> > flatPackages; 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (pi=0; pi<N; pi++) { 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Package> p = mOrderedPackages.itemAt(pi); 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p->getTypes().size() == 0) { 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Empty, skip! 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = p->getTypeStrings().size(); 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t baseSize = sizeof(ResTable_package); 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Start the package data. 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptFile> data = new AaptFile(String8(), AaptGroupEntry(), String8()); 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_package* header = (ResTable_package*)data->editData(baseSize); 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (header == NULL) { 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: out of memory creating ResTable_package\n"); 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_MEMORY; 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(header, 0, sizeof(*header)); 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header->header.type = htods(RES_TABLE_PACKAGE_TYPE); 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header->header.headerSize = htods(sizeof(*header)); 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header->id = htodl(p->getAssignedId()); 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strcpy16_htod(header->name, p->getName().string()); 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Write the string blocks. 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t typeStringsStart = data->getSize(); 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptFile> strFile = p->getTypeStringsData(); 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t amt = data->writeData(strFile->getData(), strFile->getSize()); 24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project #if PRINT_STRING_METRICS 24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "**** type strings: %d\n", amt); 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project #endif 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strAmt += amt; 24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (amt < 0) { 24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return amt; 24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t keyStringsStart = data->getSize(); 24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strFile = p->getKeyStringsData(); 24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project amt = data->writeData(strFile->getData(), strFile->getSize()); 24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project #if PRINT_STRING_METRICS 24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "**** key strings: %d\n", amt); 24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project #endif 24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strAmt += amt; 24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (amt < 0) { 24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return amt; 24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Build the type chunks inside of this package. 24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t ti=0; ti<N; ti++) { 24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Retrieve them in the same order as the type string block. 24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t len; 24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 typeName(p->getTypeStrings().stringAt(ti, &len)); 24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = p->getTypes().valueFor(typeName); 24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_ALWAYS_FATAL_IF(t == NULL && typeName != String16("<empty>"), 24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Type name %s not found", 24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(typeName).string()); 24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = t != NULL ? t->getOrderedConfigs().size() : 0; 24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First write the typeSpec chunk, containing information about 24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // each resource entry in this type. 24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t typeSpecSize = sizeof(ResTable_typeSpec) + sizeof(uint32_t)*N; 24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t typeSpecStart = data->getSize(); 24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_typeSpec* tsHeader = (ResTable_typeSpec*) 24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (((uint8_t*)data->editData(typeSpecStart+typeSpecSize)) + typeSpecStart); 24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tsHeader == NULL) { 24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: out of memory creating ResTable_typeSpec\n"); 24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_MEMORY; 24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(tsHeader, 0, sizeof(*tsHeader)); 24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tsHeader->header.type = htods(RES_TABLE_TYPE_SPEC_TYPE); 24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tsHeader->header.headerSize = htods(sizeof(*tsHeader)); 24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tsHeader->header.size = htodl(typeSpecSize); 24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tsHeader->id = ti+1; 24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tsHeader->entryCount = htodl(N); 24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t* typeSpecFlags = (uint32_t*) 24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (((uint8_t*)data->editData()) 24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + typeSpecStart + sizeof(ResTable_typeSpec)); 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(typeSpecFlags, 0, sizeof(uint32_t)*N); 24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t ei=0; ei<N; ei++) { 24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> cl = t->getOrderedConfigs().itemAt(ei); 24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cl->getPublic()) { 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typeSpecFlags[ei] |= htodl(ResTable_typeSpec::SPEC_PUBLIC); 24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t CN = cl->getEntries().size(); 24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t ci=0; ci<CN; ci++) { 24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!filter.match(cl->getEntries().keyAt(ci))) { 24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t cj=ci+1; cj<CN; cj++) { 24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!filter.match(cl->getEntries().keyAt(cj))) { 24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typeSpecFlags[ei] |= htodl( 24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cl->getEntries().keyAt(ci).diff(cl->getEntries().keyAt(cj))); 24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We need to write one type chunk for each configuration for 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // which we have entries in this type. 24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t NC = t->getUniqueConfigs().size(); 24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t typeSize = sizeof(ResTable_type) + sizeof(uint32_t)*N; 24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t ci=0; ci<NC; ci++) { 24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ConfigDescription config = t->getUniqueConfigs().itemAt(ci); 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(printf("Writing config %d config: imsi:%d/%d lang:%c%c cnt:%c%c " 24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "orien:%d touch:%d density:%d key:%d inp:%d nav:%d w:%d h:%d\n", 24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ti+1, 24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.mcc, config.mnc, 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.language[0] ? config.language[0] : '-', 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.language[1] ? config.language[1] : '-', 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.country[0] ? config.country[0] : '-', 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.country[1] ? config.country[1] : '-', 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.orientation, 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.touchscreen, 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.density, 25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.keyboard, 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.inputFlags, 25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.navigation, 25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.screenWidth, 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.screenHeight)); 25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!filter.match(config)) { 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t typeStart = data->getSize(); 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_type* tHeader = (ResTable_type*) 25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (((uint8_t*)data->editData(typeStart+typeSize)) + typeStart); 25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tHeader == NULL) { 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: out of memory creating ResTable_type\n"); 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_MEMORY; 25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(tHeader, 0, sizeof(*tHeader)); 25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->header.type = htods(RES_TABLE_TYPE_TYPE); 25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->header.headerSize = htods(sizeof(*tHeader)); 25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->id = ti+1; 25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->entryCount = htodl(N); 25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->entriesStart = htodl(typeSize); 25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->config = config; 25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(printf("Writing type %d config: imsi:%d/%d lang:%c%c cnt:%c%c " 25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "orien:%d touch:%d density:%d key:%d inp:%d nav:%d w:%d h:%d\n", 25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ti+1, 25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->config.mcc, tHeader->config.mnc, 25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->config.language[0] ? tHeader->config.language[0] : '-', 25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->config.language[1] ? tHeader->config.language[1] : '-', 25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->config.country[0] ? tHeader->config.country[0] : '-', 25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->config.country[1] ? tHeader->config.country[1] : '-', 25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->config.orientation, 25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->config.touchscreen, 25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->config.density, 25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->config.keyboard, 25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->config.inputFlags, 25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->config.navigation, 25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->config.screenWidth, 25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->config.screenHeight)); 25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->config.swapHtoD(); 25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Build the entries inside of this type. 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t ei=0; ei<N; ei++) { 25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> cl = t->getOrderedConfigs().itemAt(ei); 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Entry> e = cl->getEntries().valueFor(config); 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set the offset for this entry in its type. 25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t* index = (uint32_t*) 25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (((uint8_t*)data->editData()) 25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + typeStart + sizeof(ResTable_type)); 25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e != NULL) { 25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index[ei] = htodl(data->getSize()-typeStart-typeSize); 25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Create the entry. 25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t amt = e->flatten(bundle, data, cl->getPublic()); 25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (amt < 0) { 25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return amt; 25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index[ei] = htodl(ResTable_type::NO_ENTRY); 25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Fill in the rest of the type information. 25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader = (ResTable_type*) 25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (((uint8_t*)data->editData()) + typeStart); 25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tHeader->header.size = htodl(data->getSize()-typeStart); 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Fill in the rest of the package information. 25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header = (ResTable_package*)data->editData(); 25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header->header.size = htodl(data->getSize()); 25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header->typeStrings = htodl(typeStringsStart); 25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header->lastPublicType = htodl(p->getTypeStrings().size()); 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header->keyStrings = htodl(keyStringsStart); 25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header->lastPublicKey = htodl(p->getKeyStrings().size()); 25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flatPackages.add(data); 25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // And now write out the final chunks. 25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t dataStart = dest->getSize(); 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // blah 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_header header; 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(&header, 0, sizeof(header)); 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header.header.type = htods(RES_TABLE_TYPE); 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header.header.headerSize = htods(sizeof(header)); 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header.packageCount = htodl(flatPackages.size()); 25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = dest->writeData(&header, sizeof(header)); 25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: out of memory creating ResTable_header\n"); 25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t strStart = dest->getSize(); 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = valueStrings.writeStringBlock(dest); 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t amt = (dest->getSize()-strStart); 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strAmt += amt; 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project #if PRINT_STRING_METRICS 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "**** value strings: %d\n", amt); 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "**** total strings: %d\n", strAmt); 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project #endif 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (pi=0; pi<flatPackages.size(); pi++) { 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = dest->writeData(flatPackages[pi]->getData(), 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flatPackages[pi]->getSize()); 26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: out of memory creating package chunk for ResTable_header\n"); 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_header* header = (ResTable_header*) 26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (((uint8_t*)dest->getData()) + dataStart); 26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header->header.size = htodl(dest->getSize() - dataStart); 26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(aout << "Resource table:" 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project << HexDump(dest->getData(), dest->getSize()) << endl); 26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project #if PRINT_STRING_METRICS 26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "**** total resource table size: %d / %d%% strings\n", 26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest->getSize(), (strAmt*100)/dest->getSize()); 26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project #endif 26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid ResourceTable::writePublicDefinitions(const String16& package, FILE* fp) 26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(fp, 26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<!-- This file contains <public> resource definitions for all\n" 26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " resources that were generated from the source data. -->\n" 26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "\n" 26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<resources>\n"); 26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writePublicDefinitions(package, fp, true); 26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writePublicDefinitions(package, fp, false); 26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(fp, 26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "\n" 26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "</resources>\n"); 26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid ResourceTable::writePublicDefinitions(const String16& package, FILE* fp, bool pub) 26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool didHeader = false; 26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Package> pkg = mPackages.valueFor(package); 26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg != NULL) { 26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t NT = pkg->getOrderedTypes().size(); 26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<NT; i++) { 26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = pkg->getOrderedTypes().itemAt(i); 26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == NULL) { 26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool didType = false; 26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t NC = t->getOrderedConfigs().size(); 26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t j=0; j<NC; j++) { 26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> c = t->getOrderedConfigs().itemAt(j); 26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == NULL) { 26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c->getPublic() != pub) { 26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!didType) { 26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(fp, "\n"); 26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project didType = true; 26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!didHeader) { 26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pub) { 26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(fp," <!-- PUBLIC SECTION. These resources have been declared public.\n"); 26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(fp," Changes to these definitions will break binary compatibility. -->\n\n"); 26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(fp," <!-- PRIVATE SECTION. These resources have not been declared public.\n"); 26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(fp," You can make them public my moving these lines into a file in res/values. -->\n\n"); 26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project didHeader = true; 26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!pub) { 26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t NE = c->getEntries().size(); 26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t k=0; k<NE; k++) { 26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SourcePos& pos = c->getEntries().valueAt(k)->getPos(); 26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos.file != "") { 27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(fp," <!-- Declared at %s:%d -->\n", 27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos.file.string(), pos.line); 27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(fp, " <public type=\"%s\" name=\"%s\" id=\"0x%08x\" />\n", 27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(t->getName()).string(), 27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(c->getName()).string(), 27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getResId(pkg, t, c->getEntryIndex())); 27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectResourceTable::Item::Item(const SourcePos& _sourcePos, 27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool _isId, 27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& _value, 27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Vector<StringPool::entry_style_span>* _style, 27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t _format) 27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : sourcePos(_sourcePos) 27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project , isId(_isId) 27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project , value(_value) 27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project , format(_format) 27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project , bagKeyId(0) 27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project , evaluating(false) 27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (_style) { 27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project style = *_style; 27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::Entry::makeItABag(const SourcePos& sourcePos) 27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mType == TYPE_BAG) { 27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mType == TYPE_UNKNOWN) { 27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = TYPE_BAG; 27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.error("Resource entry %s is already defined as a single item.\n" 27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "%s:%d: Originally defined here.\n", 27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(mName).string(), 27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItem.sourcePos.file.string(), mItem.sourcePos.line); 27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::Entry::setItem(const SourcePos& sourcePos, 27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& value, 27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Vector<StringPool::entry_style_span>* style, 27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t format, 27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const bool overwrite) 27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Item item(sourcePos, false, value, style); 27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mType == TYPE_BAG) { 27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Item& item(mBag.valueAt(0)); 27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.error("Resource entry %s is already defined as a bag.\n" 27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "%s:%d: Originally defined here.\n", 27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(mName).string(), 27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.sourcePos.file.string(), item.sourcePos.line); 27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( (mType != TYPE_UNKNOWN) && (overwrite == false) ) { 27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.error("Resource entry %s is already defined.\n" 27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "%s:%d: Originally defined here.\n", 27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(mName).string(), 27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItem.sourcePos.file.string(), mItem.sourcePos.line); 27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = TYPE_ITEM; 27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItem = item; 27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItemFormat = format; 27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::Entry::addToBag(const SourcePos& sourcePos, 27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& key, const String16& value, 27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Vector<StringPool::entry_style_span>* style, 27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool replace, bool isId, int32_t format) 27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = makeItABag(sourcePos); 27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Item item(sourcePos, isId, value, style, format); 27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX NOTE: there is an error if you try to have a bag with two keys, 27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // one an attr and one an id, with the same name. Not something we 27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // currently ever have to worry about. 27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t origKey = mBag.indexOfKey(key); 27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (origKey >= 0) { 27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!replace) { 27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Item& item(mBag.valueAt(origKey)); 27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.error("Resource entry %s already has bag item %s.\n" 27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "%s:%d: Originally defined here.\n", 27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(mName).string(), String8(key).string(), 27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.sourcePos.file.string(), item.sourcePos.line); 28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Replacing %s with %s\n", 28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // String8(mBag.valueFor(key).value).string(), String8(value).string()); 28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBag.replaceValueFor(key, item); 28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBag.add(key, item); 28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28114b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwaltstatus_t ResourceTable::Entry::emptyBag(const SourcePos& sourcePos) 28124b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt{ 28134b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt status_t err = makeItABag(sourcePos); 28144b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt if (err != NO_ERROR) { 28154b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt return err; 28164b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt } 28174b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt 28184b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt mBag.clear(); 28194b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt return NO_ERROR; 28204b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt} 28214b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt 28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::Entry::generateAttributes(ResourceTable* table, 28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& package) 28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 attr16("attr"); 28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 id16("id"); 28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = mBag.size(); 28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<N; i++) { 28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& key = mBag.keyAt(i); 28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Item& it = mBag.valueAt(i); 28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (it.isId) { 28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!table->hasBagOrEntry(key, &id16, &package)) { 28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 value("false"); 28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = table->addEntry(SourcePos(String8("<generated>"), 0), package, 28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id16, key, value); 28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (!table->hasBagOrEntry(key, &attr16, &package)) { 28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 1 28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// fprintf(stderr, "ERROR: Bag attribute '%s' has not been defined.\n", 28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// String8(key).string()); 28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// const Item& item(mBag.valueAt(i)); 28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// fprintf(stderr, "Referenced from file %s line %d\n", 28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// item.sourcePos.file.string(), item.sourcePos.line); 28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// return UNKNOWN_ERROR; 28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char numberStr[16]; 28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf(numberStr, "%d", ResTable_map::TYPE_ANY); 28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = table->addBag(SourcePos("<generated>", 0), package, 28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr16, key, String16(""), 28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16("^type"), 28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16(numberStr), NULL, NULL); 28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::Entry::assignResourceIds(ResourceTable* table, 28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& package) 28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool hasErrors = false; 28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mType == TYPE_BAG) { 28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* errorMsg; 28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 style16("style"); 28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 attr16("attr"); 28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16 id16("id"); 28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParentId = 0; 28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mParent.size() > 0) { 28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParentId = table->getResId(mParent, &style16, NULL, &errorMsg); 28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mParentId == 0) { 28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPos.error("Error retrieving parent for item: %s '%s'.\n", 28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project errorMsg, String8(mParent).string()); 28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = true; 28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = mBag.size(); 28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<N; i++) { 28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& key = mBag.keyAt(i); 28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Item& it = mBag.editValueAt(i); 28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project it.bagKeyId = table->getResId(key, 28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project it.isId ? &id16 : &attr16, NULL, &errorMsg); 28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Bag key of %s: #%08x\n", String8(key).string(), it.bagKeyId); 28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (it.bagKeyId == 0) { 28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project it.sourcePos.error("Error: %s: %s '%s'.\n", errorMsg, 28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(it.isId ? id16 : attr16).string(), 28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(key).string()); 28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasErrors = true; 28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hasErrors ? UNKNOWN_ERROR : NO_ERROR; 29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::Entry::prepareFlatten(StringPool* strings, ResourceTable* table) 29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mType == TYPE_ITEM) { 29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Item& it = mItem; 29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AccessorCookie ac(it.sourcePos, String8(mName), String8(it.value)); 29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!table->stringToValue(&it.parsedValue, strings, 29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project it.value, false, true, 0, 29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &it.style, NULL, &ac, mItemFormat)) { 29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mType == TYPE_BAG) { 29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = mBag.size(); 29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<N; i++) { 29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& key = mBag.keyAt(i); 29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Item& it = mBag.editValueAt(i); 29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AccessorCookie ac(it.sourcePos, String8(key), String8(it.value)); 29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!table->stringToValue(&it.parsedValue, strings, 29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project it.value, false, true, it.bagKeyId, 29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &it.style, NULL, &ac, it.format)) { 29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPos.error("Error: entry %s is not a single item or a bag.\n", 29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(mName).string()); 29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t ResourceTable::Entry::flatten(Bundle* bundle, const sp<AaptFile>& data, bool isPublic) 29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t amt = 0; 29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_entry header; 29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(&header, 0, sizeof(header)); 29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header.size = htods(sizeof(header)); 29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const type ty = this != NULL ? mType : TYPE_ITEM; 29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this != NULL) { 29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ty == TYPE_BAG) { 29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header.flags |= htods(header.FLAG_COMPLEX); 29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isPublic) { 29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header.flags |= htods(header.FLAG_PUBLIC); 29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project header.key.index = htodl(mNameIndex); 29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ty != TYPE_BAG) { 29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = data->writeData(&header, sizeof(header)); 29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: out of memory creating ResTable_entry\n"); 29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Item& it = mItem; 29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value par; 29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(&par, 0, sizeof(par)); 29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project par.size = htods(it.parsedValue.size); 29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project par.dataType = it.parsedValue.dataType; 29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project par.res0 = it.parsedValue.res0; 29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project par.data = htodl(it.parsedValue.data); 29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project #if 0 29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("Writing item (%s): type=%d, data=0x%x, res0=0x%x\n", 29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(mName).string(), it.parsedValue.dataType, 29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project it.parsedValue.data, par.res0); 29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project #endif 29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = data->writeData(&par, it.parsedValue.size); 29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: out of memory creating Res_value\n"); 29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project amt += it.parsedValue.size; 29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t N = mBag.size(); 29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t i; 29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Create correct ordering of items. 29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project KeyedVector<uint32_t, const Item*> items; 29789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Item& it = mBag.valueAt(i); 29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project items.add(it.bagKeyId, &it); 29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N = items.size(); 29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_map_entry mapHeader; 29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(&mapHeader, &header, sizeof(header)); 29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mapHeader.size = htods(sizeof(mapHeader)); 29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mapHeader.parent.ident = htodl(mParentId); 29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mapHeader.count = htodl(N); 29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = data->writeData(&mapHeader, sizeof(mapHeader)); 29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: out of memory creating ResTable_entry\n"); 29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Item& it = *items.valueAt(i); 29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_map map; 29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.name.ident = htodl(it.bagKeyId); 29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.value.size = htods(it.parsedValue.size); 30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.value.dataType = it.parsedValue.dataType; 30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.value.res0 = it.parsedValue.res0; 30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.value.data = htodl(it.parsedValue.data); 30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = data->writeData(&map, sizeof(map)); 30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: out of memory creating Res_value\n"); 30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project amt += sizeof(map); 30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return amt; 30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid ResourceTable::ConfigList::appendComment(const String16& comment, 30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool onlyIfEmpty) 30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (comment.size() <= 0) { 30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (onlyIfEmpty && mComment.size() > 0) { 30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mComment.size() > 0) { 30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mComment.append(String16("\n")); 30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mComment.append(comment); 30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid ResourceTable::ConfigList::appendTypeComment(const String16& comment) 30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (comment.size() <= 0) { 30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTypeComment.size() > 0) { 30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTypeComment.append(String16("\n")); 30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTypeComment.append(comment); 30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::Type::addPublic(const SourcePos& sourcePos, 30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& name, 30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const uint32_t ident) 30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project #if 0 30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t entryIdx = Res_GETENTRY(ident); 30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (entryIdx < 0) { 30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.error("Public resource %s/%s has an invalid 0 identifier (0x%08x).\n", 30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(mName).string(), String8(name).string(), ident); 30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project #endif 30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t typeIdx = Res_GETTYPE(ident); 30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (typeIdx >= 0) { 30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typeIdx++; 30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPublicIndex > 0 && mPublicIndex != typeIdx) { 30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.error("Public resource %s/%s has conflicting type codes for its" 30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " public identifiers (0x%x vs 0x%x).\n", 30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(mName).string(), String8(name).string(), 30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPublicIndex, typeIdx); 30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPublicIndex = typeIdx; 30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFirstPublicSourcePos == NULL) { 30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFirstPublicSourcePos = new SourcePos(sourcePos); 30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPublic.indexOfKey(name) < 0) { 30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPublic.add(name, Public(sourcePos, String16(), ident)); 30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Public& p = mPublic.editValueFor(name); 30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p.ident != ident) { 30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.error("Public resource %s/%s has conflicting public identifiers" 30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " (0x%08x vs 0x%08x).\n" 30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "%s:%d: Originally defined here.\n", 30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(mName).string(), String8(name).string(), p.ident, ident, 30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.sourcePos.file.string(), p.sourcePos.line); 30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<ResourceTable::Entry> ResourceTable::Type::getEntry(const String16& entry, 30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SourcePos& sourcePos, 30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable_config* config, 30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool doSetIndex) 30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = -1; 30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> c = mConfigs.valueFor(entry); 30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == NULL) { 30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c = new ConfigList(entry, sourcePos); 30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConfigs.add(entry, c); 30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = (int)mOrderedConfigs.size(); 30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrderedConfigs.add(c); 30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (doSetIndex) { 31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->setEntryIndex(pos); 31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ConfigDescription cdesc; 31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (config) cdesc = *config; 31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Entry> e = c->getEntries().valueFor(cdesc); 31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e == NULL) { 31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (config != NULL) { 31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(printf("New entry at %s:%d: imsi:%d/%d lang:%c%c cnt:%c%c " 31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "orien:%d touch:%d density:%d key:%d inp:%d nav:%d w:%d h:%d\n", 31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.file.string(), sourcePos.line, 31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config->mcc, config->mnc, 31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config->language[0] ? config->language[0] : '-', 31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config->language[1] ? config->language[1] : '-', 31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config->country[0] ? config->country[0] : '-', 31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config->country[1] ? config->country[1] : '-', 31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config->orientation, 31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config->touchscreen, 31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config->density, 31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config->keyboard, 31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config->inputFlags, 31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config->navigation, 31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config->screenWidth, 31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config->screenHeight)); 31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(printf("New entry at %s:%d: NULL config\n", 31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.file.string(), sourcePos.line)); 31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e = new Entry(entry, sourcePos); 31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->addEntry(cdesc, e); 31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (doSetIndex) { 31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos < 0) { 31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (pos=0; pos<(int)mOrderedConfigs.size(); pos++) { 31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOrderedConfigs[pos] == c) { 31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos >= (int)mOrderedConfigs.size()) { 31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sourcePos.error("Internal error: config not found in mOrderedConfigs when adding entry"); 31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e->setEntryIndex(pos); 31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUniqueConfigs.add(cdesc); 31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return e; 31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::Type::applyPublicEntryOrder() 31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t N = mOrderedConfigs.size(); 31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector<sp<ConfigList> > origOrder(mOrderedConfigs); 31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool hasError = false; 31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t i; 31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrderedConfigs.replaceAt(NULL, i); 31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t NP = mPublic.size(); 31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Ordering %d configs from %d public defs\n", N, NP); 31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t j; 31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (j=0; j<NP; j++) { 31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& name = mPublic.keyAt(j); 31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Public& p = mPublic.valueAt(j); 31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t idx = Res_GETENTRY(p.ident); 31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Looking for entry \"%s\"/\"%s\" (0x%08x) in %d...\n", 31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // String8(mName).string(), String8(name).string(), p.ident, N); 31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool found = false; 31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> e = origOrder.itemAt(i); 31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("#%d: \"%s\"\n", i, String8(e->getName()).string()); 31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e->getName() == name) { 31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idx >= (int32_t)mOrderedConfigs.size()) { 31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.sourcePos.error("Public entry identifier 0x%x entry index " 31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "is larger than available symbols (index %d, total symbols %d).\n", 31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.ident, idx, mOrderedConfigs.size()); 31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasError = true; 31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mOrderedConfigs.itemAt(idx) == NULL) { 31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e->setPublic(true); 31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e->setPublicSourcePos(p.sourcePos); 31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrderedConfigs.replaceAt(e, idx); 31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project origOrder.removeAt(i); 31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project found = true; 31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> oe = mOrderedConfigs.itemAt(idx); 31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.sourcePos.error("Multiple entry names declared for public entry" 31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " identifier 0x%x in type %s (%s vs %s).\n" 31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "%s:%d: Originally defined here.", 31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project idx+1, String8(mName).string(), 32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(oe->getName()).string(), 32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(name).string(), 32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oe->getPublicSourcePos().file.string(), 32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oe->getPublicSourcePos().line); 32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasError = true; 32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!found) { 32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.sourcePos.error("Public symbol %s/%s declared here is not defined.", 32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(mName).string(), String8(name).string()); 32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasError = true; 32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Copying back in %d non-public configs, have %d\n", N, origOrder.size()); 32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N != origOrder.size()) { 32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("Internal error: remaining private symbol count mismatch\n"); 32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N = origOrder.size(); 32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project j = 0; 32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> e = origOrder.itemAt(i); 32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // There will always be enough room for the remaining entries. 32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (mOrderedConfigs.itemAt(j) != NULL) { 32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project j++; 32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrderedConfigs.replaceAt(e, j); 32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project j++; 32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hasError ? UNKNOWN_ERROR : NO_ERROR; 32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectResourceTable::Package::Package(const String16& name, ssize_t includedId) 32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mName(name), mIncludedId(includedId), 32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTypeStringsMapping(0xffffffff), 32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mKeyStringsMapping(0xffffffff) 32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<ResourceTable::Type> ResourceTable::Package::getType(const String16& type, 32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SourcePos& sourcePos, 32469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool doSetIndex) 32479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 32489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = mTypes.valueFor(type); 32499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == NULL) { 32509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = new Type(type, sourcePos); 32519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTypes.add(type, t); 32529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrderedTypes.add(t); 32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (doSetIndex) { 32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For some reason the type's index is set to one plus the index 32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // in the mOrderedTypes list, rather than just the index. 32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t->setIndex(mOrderedTypes.size()); 32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::Package::setTypeStrings(const sp<AaptFile>& data) 32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTypeStringsData = data; 32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = setStrings(data, &mTypeStrings, &mTypeStringsMapping); 32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: Type string data is corrupt!\n"); 32689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::Package::setKeyStrings(const sp<AaptFile>& data) 32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mKeyStringsData = data; 32759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = setStrings(data, &mKeyStrings, &mKeyStringsMapping); 32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: Key string data is corrupt!\n"); 32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::Package::setStrings(const sp<AaptFile>& data, 32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResStringPool* strings, 32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DefaultKeyedVector<String16, uint32_t>* mappings) 32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data->getData() == NULL) { 32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY(aout << "Setting restable string pool: " 32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project << HexDump(data->getData(), data->getSize()) << endl); 32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = strings->setTo(data->getData(), data->getSize()); 32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err == NO_ERROR) { 32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = strings->size(); 32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<N; i++) { 32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t len; 32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mappings->add(String16(strings->stringAt(i, &len)), i); 32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t ResourceTable::Package::applyPublicTypeOrder() 33059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 33069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t N = mOrderedTypes.size(); 33079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector<sp<Type> > origOrder(mOrderedTypes); 33089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t i; 33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrderedTypes.replaceAt(NULL, i); 33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = origOrder.itemAt(i); 33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t idx = t->getPublicIndex(); 33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idx > 0) { 33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project idx--; 33199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (idx >= (int32_t)mOrderedTypes.size()) { 33209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrderedTypes.add(); 33219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOrderedTypes.itemAt(idx) != NULL) { 33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> ot = mOrderedTypes.itemAt(idx); 33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t->getFirstPublicSourcePos().error("Multiple type names declared for public type" 33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " identifier 0x%x (%s vs %s).\n" 33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "%s:%d: Originally defined here.", 33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project idx, String8(ot->getName()).string(), 33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(t->getName()).string(), 33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ot->getFirstPublicSourcePos().file.string(), 33309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ot->getFirstPublicSourcePos().line); 33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 33329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrderedTypes.replaceAt(t, idx); 33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project origOrder.removeAt(i); 33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 33379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t j=0; 33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 33429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = origOrder.itemAt(i); 33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // There will always be enough room for the remaining types. 33449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (mOrderedTypes.itemAt(j) != NULL) { 33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project j++; 33469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrderedTypes.replaceAt(t, j); 33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 33529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<ResourceTable::Package> ResourceTable::getPackage(const String16& package) 33549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 33559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Package> p = mPackages.valueFor(package); 33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == NULL) { 33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIsAppPackage) { 33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHaveAppPackage) { 33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "Adding multiple application package resources; only one is allowed.\n" 33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Use -x to create extended resources.\n"); 33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 33629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveAppPackage = true; 33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = new Package(package, 127); 33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = new Package(package, mNextPackageId); 33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("*** NEW PACKAGE: \"%s\" id=%d\n", 33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // String8(package).string(), p->getAssignedId()); 33709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackages.add(package, p); 33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrderedPackages.add(p); 33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextPackageId++; 33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<ResourceTable::Type> ResourceTable::getType(const String16& package, 33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& type, 33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SourcePos& sourcePos, 33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool doSetIndex) 33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Package> p = getPackage(package); 33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == NULL) { 33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p->getType(type, sourcePos, doSetIndex); 33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<ResourceTable::Entry> ResourceTable::getEntry(const String16& package, 33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& type, 33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& name, 33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SourcePos& sourcePos, 33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable_config* config, 33949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool doSetIndex) 33959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 33969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = getType(package, type, sourcePos, doSetIndex); 33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == NULL) { 33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t->getEntry(name, sourcePos, config, doSetIndex); 34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<const ResourceTable::Entry> ResourceTable::getEntry(uint32_t resID, 34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable_config* config) const 34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid = Res_GETPACKAGE(resID)+1; 34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = mOrderedPackages.size(); 34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t i; 34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Package> p; 34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Package> check = mOrderedPackages[i]; 34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (check->getAssignedId() == pid) { 34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = check; 34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == NULL) { 34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "WARNING: Package not found for resource #%08x\n", resID); 34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int tid = Res_GETTYPE(resID); 34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tid < 0 || tid >= (int)p->getOrderedTypes().size()) { 34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "WARNING: Type not found for resource #%08x\n", resID); 34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Type> t = p->getOrderedTypes()[tid]; 34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int eid = Res_GETENTRY(resID); 34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (eid < 0 || eid >= (int)t->getOrderedConfigs().size()) { 34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "WARNING: Entry not found for resource #%08x\n", resID); 34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ConfigList> c = t->getOrderedConfigs()[eid]; 34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == NULL) { 34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "WARNING: Entry not found for resource #%08x\n", resID); 34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ConfigDescription cdesc; 34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (config) cdesc = *config; 34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Entry> e = c->getEntries().valueFor(cdesc); 34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == NULL) { 34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "WARNING: Entry configuration not found for resource #%08x\n", resID); 34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return e; 34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst ResourceTable::Item* ResourceTable::getItem(uint32_t resID, uint32_t attrID) const 34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<const Entry> e = getEntry(resID); 34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e == NULL) { 34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = e->getBag().size(); 34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<N; i++) { 34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Item& it = e->getBag().valueAt(i); 34639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (it.bagKeyId == 0) { 34649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "WARNING: ID not yet assigned to '%s' in bag '%s'\n", 34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(e->getName()).string(), 34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(e->getBag().keyAt(i)).string()); 34679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (it.bagKeyId == attrID) { 34699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ⁢ 34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ResourceTable::getItemValue( 34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t resID, uint32_t attrID, Res_value* outValue) 34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Item* item = getItem(resID, attrID); 34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool res = false; 34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item != NULL) { 34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item->evaluating) { 34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<const Entry> e = getEntry(resID); 34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = e->getBag().size(); 34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t i; 34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (&e->getBag().valueAt(i) == item) { 34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "WARNING: Circular reference detected in key '%s' of bag '%s'\n", 34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(e->getName()).string(), 34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(e->getBag().keyAt(i)).string()); 34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item->evaluating = true; 34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = stringToValue(outValue, NULL, item->value, false, false, item->bagKeyId); 34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NOISY( 35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res) { 35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("getItemValue of #%08x[#%08x] (%s): type=#%08x, data=#%08x\n", 35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resID, attrID, String8(getEntry(resID)->getName()).string(), 35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue->dataType, outValue->data); 35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("getItemValue of #%08x[#%08x]: failed\n", 35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resID, attrID); 35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ); 35099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item->evaluating = false; 35109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3513