diff options
author | Scott Lobdell <slobdell@google.com> | 2019-01-31 11:53:41 -0800 |
---|---|---|
committer | Scott Lobdell <slobdell@google.com> | 2019-02-01 14:08:42 -0800 |
commit | 88b45c586d461df38b866d529bc98d1dfa3e8838 (patch) | |
tree | ae57a86275dac94c0899015923778f3016c865b2 /cmds/idmap2/libidmap2/ResourceUtils.cpp | |
parent | 067596650927fa91a97355e84b152b21826f7ae2 (diff) | |
parent | 9b9ca46fc2d3da231bf9ef6ff630105720f94cf2 (diff) |
Merge QP1A.190122.001
Conflicts:
api/system-current.txt
core/java/android/bluetooth/BluetoothAdapter.java
core/jni/android_util_Process.cpp
core/jni/com_android_internal_os_Zygote.cpp
core/res/res/values/config.xml
core/res/res/values/symbols.xml
media/java/android/media/MediaCodecInfo.java
packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
services/core/java/com/android/server/ConnectivityService.java
services/core/java/com/android/server/LocationManagerService.java
services/core/java/com/android/server/am/ActivityManagerService.java
services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
services/core/java/com/android/server/location/GnssLocationProvider.java
services/core/java/com/android/server/wm/ActivityStack.java
services/net/java/android/net/ip/IpClient.java
telecomm/java/android/telecom/Connection.java
telephony/java/android/telephony/ims/ImsCallSession.java
telephony/java/android/telephony/ims/ImsCallSessionListener.java
telephony/java/android/telephony/ims/aidl/IImsCallSessionListener.aidl
telephony/java/android/telephony/ims/compat/stub/ImsCallSessionImplBase.java
telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl
wifi/java/android/net/wifi/WifiConfiguration.java
Change-Id: I367301986f2ae80a528050c3d78776b5a4c6b5ee
Diffstat (limited to 'cmds/idmap2/libidmap2/ResourceUtils.cpp')
-rw-r--r-- | cmds/idmap2/libidmap2/ResourceUtils.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/cmds/idmap2/libidmap2/ResourceUtils.cpp b/cmds/idmap2/libidmap2/ResourceUtils.cpp index 04e0ec756045..7a984f3f98ad 100644 --- a/cmds/idmap2/libidmap2/ResourceUtils.cpp +++ b/cmds/idmap2/libidmap2/ResourceUtils.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#include <memory> #include <string> #include "androidfw/StringPiece.h" @@ -21,8 +22,13 @@ #include "idmap2/ResourceUtils.h" #include "idmap2/Result.h" +#include "idmap2/Xml.h" +#include "idmap2/ZipFile.h" using android::StringPiece16; +using android::idmap2::Result; +using android::idmap2::Xml; +using android::idmap2::ZipFile; using android::util::Utf16ToUtf8; namespace android::idmap2::utils { @@ -47,4 +53,63 @@ Result<std::string> WARN_UNUSED ResToTypeEntryName(const AssetManager2& am, Reso return {out}; } +Result<OverlayManifestInfo> ExtractOverlayManifestInfo(const std::string& path, + std::ostream& out_error, + bool assert_overlay) { + std::unique_ptr<const ZipFile> zip = ZipFile::Open(path); + if (!zip) { + out_error << "error: failed to open " << path << " as a zip file" << std::endl; + return kResultError; + } + + std::unique_ptr<const MemoryChunk> entry = zip->Uncompress("AndroidManifest.xml"); + if (!entry) { + out_error << "error: failed to uncompress AndroidManifest.xml from " << path << std::endl; + return kResultError; + } + + std::unique_ptr<const Xml> xml = Xml::Create(entry->buf, entry->size); + if (!xml) { + out_error << "error: failed to parse AndroidManifest.xml from " << path << std::endl; + return kResultError; + } + + OverlayManifestInfo info{}; + const auto tag = xml->FindTag("overlay"); + if (!tag) { + if (assert_overlay) { + out_error << "error: <overlay> missing from AndroidManifest.xml of " << path << std::endl; + return kResultError; + } + return info; + } + + auto iter = tag->find("targetPackage"); + if (iter == tag->end()) { + if (assert_overlay) { + out_error << "error: android:targetPackage missing from <overlay> of " << path << std::endl; + return kResultError; + } + } else { + info.target_package = iter->second; + } + + iter = tag->find("targetName"); + if (iter != tag->end()) { + info.target_name = iter->second; + } + + iter = tag->find("isStatic"); + if (iter != tag->end()) { + info.is_static = std::stoul(iter->second) != 0U; + } + + iter = tag->find("priority"); + if (iter != tag->end()) { + info.priority = std::stoi(iter->second); + } + + return info; +} + } // namespace android::idmap2::utils |