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 
23 #include "androidfw/AssetManager2.h"
24 #include "idmap2/Result.h"
25 #include "idmap2/ZipFile.h"
26 
27 namespace android::idmap2 {
28 
29 // use typedefs to let the compiler warn us about implicit casts
30 typedef uint32_t ResourceId;  // 0xpptteeee
31 typedef uint8_t PackageId;    // pp in 0xpptteeee
32 typedef uint8_t TypeId;       // tt in 0xpptteeee
33 typedef uint16_t EntryId;     // eeee in 0xpptteeee
34 
35 #define EXTRACT_TYPE(resid) ((0x00ff0000 & (resid)) >> 16)
36 #define EXTRACT_ENTRY(resid) (0x0000ffff & (resid))
37 
38 namespace utils {
39 
40 // Returns whether the Res_value::data_type represents a dynamic or regular resource reference.
41 bool IsReference(uint8_t data_type);
42 
43 // Converts the Res_value::data_type to a human-readable string representation.
44 StringPiece DataTypeToString(uint8_t data_type);
45 
46 struct OverlayManifestInfo {
47   std::string target_package;               // NOLINT(misc-non-private-member-variables-in-classes)
48   std::string target_name;                  // NOLINT(misc-non-private-member-variables-in-classes)
49   std::string requiredSystemPropertyName;   // NOLINT(misc-non-private-member-variables-in-classes)
50   std::string requiredSystemPropertyValue;  // NOLINT(misc-non-private-member-variables-in-classes)
51   uint32_t resource_mapping;                // NOLINT(misc-non-private-member-variables-in-classes)
52   bool is_static;                           // NOLINT(misc-non-private-member-variables-in-classes)
53   int priority = -1;                        // NOLINT(misc-non-private-member-variables-in-classes)
54 };
55 
56 Result<OverlayManifestInfo> ExtractOverlayManifestInfo(const std::string& path,
57                                                        bool assert_overlay = true);
58 
59 Result<std::string> ResToTypeEntryName(const AssetManager2& am, ResourceId resid);
60 
61 }  // namespace utils
62 
63 }  // namespace android::idmap2
64 
65 #endif  // IDMAP2_INCLUDE_IDMAP2_RESOURCEUTILS_H_
66