aboutsummaryrefslogtreecommitdiff
path: root/resources
diff options
context:
space:
mode:
authorRam Peri <ramperi@google.com>2023-05-24 17:21:52 -0400
committerRam Peri <ramperi@google.com>2023-05-24 17:21:52 -0400
commita717bd4b340a01f999ca5e519ed4b9b93851d22f (patch)
treede796fbe4db8c211749c223b4892dcae28fc0776 /resources
parent90b86c93a555a0d6a43db0a50bb4e1e70c32684e (diff)
parent68ec9953ea0ac7c47588db540145a728a1f00ba8 (diff)
downloadrobolectric-a717bd4b340a01f999ca5e519ed4b9b93851d22f.tar.gz
Merge branch 'upstream-google' into rng_import
Test: atest -c MyRoboTests Bug: 284193357 Change-Id: I493c1e89a6b0d179477e9be4427235aa789d5051
Diffstat (limited to 'resources')
-rw-r--r--resources/src/main/java/org/robolectric/res/android/LoadedArsc.java73
1 files changed, 60 insertions, 13 deletions
diff --git a/resources/src/main/java/org/robolectric/res/android/LoadedArsc.java b/resources/src/main/java/org/robolectric/res/android/LoadedArsc.java
index 0de3390e7..8b8165bd1 100644
--- a/resources/src/main/java/org/robolectric/res/android/LoadedArsc.java
+++ b/resources/src/main/java/org/robolectric/res/android/LoadedArsc.java
@@ -526,32 +526,79 @@ public class LoadedArsc {
return 0;
}
+ // for (const auto& type_entry : type_spec->type_entries) {
for (ResTable_type iter : type_spec.types) {
+ // const incfs::verified_map_ptr<ResTable_type>& type = type_entry.type;
ResTable_type type = iter;
+ // const size_t entry_count = dtohl(type->entryCount);
int entry_count = type.entryCount;
+ // const auto entry_offsets = type.offset(dtohs(type->header.headerSize));
+ // for (size_t entry_idx = 0; entry_idx < entry_count; entry_idx++) {
for (int entry_idx = 0; entry_idx < entry_count; entry_idx++) {
- // const uint32_t* entry_offsets = reinterpret_cast<const uint32_t*>(
- // reinterpret_cast<const uint8_t*>(type.type) + dtohs(type.type.header.headerSize));
- // ResTable_type entry_offsets = new ResTable_type(type.myBuf(),
- // type.myOffset() + type.header.headerSize);
- // int offset = dtohl(entry_offsets[entry_idx]);
- int offset = dtohl(type.entryOffset(entry_idx));
+ // uint32_t offset;
+ int offset;
+ // uint16_t res_idx;
+ short res_idx;
+ // if (type->flags & ResTable_type::FLAG_SPARSE) {
+ if (isTruthy(type.flags & ResTable_type.FLAG_SPARSE)) {
+ // auto sparse_entry = entry_offsets.convert<ResTable_sparseTypeEntry>() + entry_idx;
+
+ ResTable_sparseTypeEntry sparse_entry =
+ new ResTable_sparseTypeEntry(
+ type.myBuf(), type.myOffset() + entry_idx * ResTable_sparseTypeEntry.SIZEOF);
+ // if (!sparse_entry) {
+ // return base::unexpected(IOError::PAGES_MISSING);
+ // }
+ // TODO: implement above
+ // offset = dtohs(sparse_entry->offset) * 4u;
+ offset = dtohs(sparse_entry.offset) * 4;
+ // res_idx = dtohs(sparse_entry->idx);
+ res_idx = dtohs(sparse_entry.idx);
+ // } else if (type->flags & ResTable_type::FLAG_OFFSET16) {
+ } else if (isTruthy(type.flags & ResTable_type.FLAG_OFFSET16)) {
+ // auto entry = entry_offsets.convert<uint16_t>() + entry_idx;
+ int entry = type.entryOffset(entry_idx);
+ // if (!entry) {
+ // return base::unexpected(IOError::PAGES_MISSING);
+ // }
+ // offset = offset_from16(entry.value());
+ offset = entry;
+ // res_idx = entry_idx;
+ res_idx = (short) entry_idx;
+ } else {
+ // auto entry = entry_offsets.convert<uint32_t>() + entry_idx;
+ int entry = type.entryOffset(entry_idx);
+ // if (!entry) {
+ // return base::unexpected(IOError::PAGES_MISSING);
+ // }
+ // offset = dtohl(entry.value());
+ offset = dtohl(entry);
+ res_idx = (short) entry_idx;
+ }
+
if (offset != ResTable_type.NO_ENTRY) {
- // const ResTable_entry* entry =
- // reinterpret_cast<const ResTable_entry*>(reinterpret_cast<const uint8_t*>(type.type) +
- // dtohl(type.type.entriesStart) + offset);
+ // auto entry = type.offset(dtohl(type->entriesStart) +
+ // offset).convert<ResTable_entry>();
ResTable_entry entry =
- new ResTable_entry(type.myBuf(), type.myOffset() +
- dtohl(type.entriesStart) + offset);
+ new ResTable_entry(
+ type.myBuf(), type.myOffset() + dtohl(type.entriesStart) + offset);
+ // if (!entry) {
+ // return base::unexpected(IOError::PAGES_MISSING);
+ // }
+ // TODO implement above
+ // if (entry->key() == static_cast<uint32_t>(*key_idx)) {
if (dtohl(entry.getKeyIndex()) == key_idx) {
- // The package ID will be overridden by the caller (due to runtime assignment of package
+ // The package ID will be overridden by the caller (due to runtime assignment of
+ // package
// IDs for shared libraries).
- return make_resid((byte) 0x00, (byte) (type_idx + type_id_offset_ + 1), (short) entry_idx);
+ // return make_resid(0x00, *type_idx + type_id_offset_ + 1, res_idx);
+ return make_resid((byte) 0x00, (byte) (type_idx + type_id_offset_ + 1), res_idx);
}
}
}
}
+ // return base::unexpected(std::nullopt);
return 0;
}