/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "AppInfo.h" #include "Logger.h" #include "ManifestParser.h" #include "Source.h" #include "XmlPullParser.h" #include <string> namespace aapt { bool ManifestParser::parse(const Source& source, std::shared_ptr<XmlPullParser> parser, AppInfo* outInfo) { SourceLogger logger = { source }; int depth = 0; while (XmlPullParser::isGoodEvent(parser->next())) { XmlPullParser::Event event = parser->getEvent(); if (event == XmlPullParser::Event::kEndElement) { depth--; continue; } else if (event != XmlPullParser::Event::kStartElement) { continue; } depth++; const std::u16string& element = parser->getElementName(); if (depth == 1) { if (element == u"manifest") { if (!parseManifest(logger, parser, outInfo)) { return false; } } else { logger.error() << "unexpected top-level element '" << element << "'." << std::endl; return false; } } else { XmlPullParser::skipCurrentElement(parser.get()); } } if (parser->getEvent() == XmlPullParser::Event::kBadDocument) { logger.error(parser->getLineNumber()) << "failed to parse manifest: " << parser->getLastError() << "." << std::endl; return false; } return true; } bool ManifestParser::parseManifest(SourceLogger& logger, std::shared_ptr<XmlPullParser> parser, AppInfo* outInfo) { auto attrIter = parser->findAttribute(u"", u"package"); if (attrIter == parser->endAttributes() || attrIter->value.empty()) { logger.error() << "no 'package' attribute found for element <manifest>." << std::endl; return false; } outInfo->package = attrIter->value; return true; } } // namespace aapt