+
+#define DEBUG_LANG(x) printf("lang=%c%c cnt=%c%c ", \
+ (x).language[0] ? (x).language[0] : '-', \
+ (x).language[1] ? (x).language[1] : '-', \
+ (x).country[0] ? (x).country[0] : '-', \
+ (x).country[1] ? (x).country[1] : '-');
+
+status_t ResourceConfigReferences::add(uint32_t id, const ResTable_config& config)
+{
+ ssize_t index = mRoots.indexOfKey(id);
+ if (index < 0) {
+ index = mRoots.add(id, Vector<const ResTable_config*>());
+ }
+ Vector<const ResTable_config*>& configRoots = mRoots.editValueFor(id);
+
+ if (!configRoots.isEmpty()) {
+ ssize_t NR = configRoots.size();
+ for (int ri=0; ri<NR; ++ri) {
+ const ResTable_config* current = configRoots[ri];
+
+ if (config.match(*current)) {
+ // We already have something more generic than our incoming string.
+ NOISY_REF(
+ printf(" ConfigRef %d: ignoring ", id);
+ DEBUG_LANG(config)
+ printf("\n");
+ )
+ return NO_ERROR;
+ } else if (current->match(config)) {
+ // more generic
+ NOISY_REF(
+ printf(" ConfigRef %d: remove ", id);
+ DEBUG_LANG(current)
+ printf("\n");
+ )
+ configRoots.removeItemsAt(ri);
+ --ri; --NR;
+ }
+ }
+ }
+ NOISY_REF(
+ printf(" ConfigRef %d: add ", id);
+ DEBUG_LANG(config)
+ printf("\n");
+ )
+ ResTable_config *configCopy = (ResTable_config*)malloc(sizeof(ResTable_config));
+ memcpy(configCopy, &config, sizeof(ResTable_config));
+ configRoots.add(configCopy);
+
+ return NO_ERROR;
+}
+
+void ResourceConfigReferences::dump()
+{
+ printf("ResourceConfigReferences\n");
+ const ssize_t NR = mRoots.size();
+ for (int ri=0; ri<NR; ++ri) {
+ const Vector<const ResTable_config*>& configRoots = mRoots.valueAt(ri);
+ printf(" String %d\n", mRoots.keyAt(ri));
+ const ssize_t NC = configRoots.size();
+ for (int ci=0; ci<NC; ++ci) {
+ printf(" ");
+ DEBUG_LANG(*configRoots[ci])
+ printf("\n");
+ }
+ }
+}
+
+bool ResourceConfigReferences::isRoot(uint32_t id, const ResTable_config& config)
+{
+ const Vector<const ResTable_config*>& configRoots = mRoots.editValueFor(id);
+ const ssize_t NR = configRoots.size();
+ for (int ri = 0; ri<NR; ++ri) {
+ if (configRoots[ri]->match(config)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+ResourceConfigReferences::~ResourceConfigReferences()
+{
+ const ssize_t NR = mRoots.size();
+ for (int ri=0; ri<NR; ++ri) {
+ Vector<const ResTable_config*> configRoots = mRoots.editValueAt(ri);
+ const ssize_t NC = configRoots.size();
+ for (int ci=0; ci<NC; ++ci) {
+ ResTable_config* config = const_cast<ResTable_config*>(configRoots[ci]);
+ free(config);
+ }
+ }
+}