1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef IDMAP2_INCLUDE_IDMAP2_RESOURCEUTILS_H_ 18 #define IDMAP2_INCLUDE_IDMAP2_RESOURCEUTILS_H_ 19 20 #include <optional> 21 #include <string> 22 #include <android-base/unique_fd.h> 23 24 #include "androidfw/AssetManager2.h" 25 #include "idmap2/Result.h" 26 27 namespace android::idmap2 { 28 29 #define EXTRACT_TYPE(resid) ((0x00ff0000 & (resid)) >> 16) 30 #define EXTRACT_ENTRY(resid) (0x0000ffff & (resid)) 31 32 // use typedefs to let the compiler warn us about implicit casts 33 using ResourceId = android::ResourceId; // 0xpptteeee 34 using PackageId = uint8_t; // pp in 0xpptteeee 35 using TypeId = uint8_t; // tt in 0xpptteeee 36 using EntryId = uint16_t; // eeee in 0xpptteeee 37 38 using DataType = android::DataType; // Res_value::dataType 39 using DataValue = android::DataValue; // Res_value::data 40 41 struct TargetValue { 42 DataType data_type; 43 DataValue data_value; 44 std::string data_string_value; 45 std::optional<android::base::borrowed_fd> data_binary_value; 46 off64_t data_binary_offset; 47 size_t data_binary_size; 48 bool nine_patch; 49 }; 50 51 struct TargetValueWithConfig { 52 TargetValue value; 53 std::string config; 54 to_pairTargetValueWithConfig55 [[nodiscard]] std::pair<std::string, TargetValue> to_pair() const { 56 return std::make_pair(config, value); 57 } 58 }; 59 60 namespace utils { 61 62 // Returns whether the Res_value::data_type represents a dynamic or regular resource reference. 63 bool IsReference(uint8_t data_type); 64 65 // Converts the Res_value::data_type to a human-readable string representation. 66 StringPiece DataTypeToString(uint8_t data_type); 67 68 // Retrieves the type and entry name of the resource in the AssetManager in the form type/entry. 69 Result<std::string> ResToTypeEntryName(const AssetManager2& am, ResourceId resid); 70 71 } // namespace utils 72 } // namespace android::idmap2 73 74 #endif // IDMAP2_INCLUDE_IDMAP2_RESOURCEUTILS_H_ 75