summaryrefslogtreecommitdiff
path: root/tools/aapt2/xml/XmlPullParser.cpp
diff options
context:
space:
mode:
authorAdam Lesinski <adamlesinski@google.com>2017-09-15 16:57:21 +0000
committerandroid-build-merger <android-build-merger@google.com>2017-09-15 16:57:21 +0000
commite33de76a16f6acc42858766460976f44e629657d (patch)
treece962def3f718730407e6863a14aaf0df9a66787 /tools/aapt2/xml/XmlPullParser.cpp
parentd2d6c257f141ed38da2cf0d0a2f84c6f7f055e92 (diff)
parente02983681ae85212c2263055fd4bcfd8097f19bc (diff)
Merge changes Id8bdb14e,I573a6735,Ia804777f,Ia68122cb,Ia1997800, ... into oc-mr1-dev
am: e02983681a Change-Id: I42369e6fb7bd121e45b5a002cd5f00e05221ead3
Diffstat (limited to 'tools/aapt2/xml/XmlPullParser.cpp')
-rw-r--r--tools/aapt2/xml/XmlPullParser.cpp32
1 files changed, 19 insertions, 13 deletions
diff --git a/tools/aapt2/xml/XmlPullParser.cpp b/tools/aapt2/xml/XmlPullParser.cpp
index c2a9c8283a6d..30bdc507303b 100644
--- a/tools/aapt2/xml/XmlPullParser.cpp
+++ b/tools/aapt2/xml/XmlPullParser.cpp
@@ -22,14 +22,15 @@
#include "xml/XmlPullParser.h"
#include "xml/XmlUtil.h"
-using android::StringPiece;
+using ::aapt::io::InputStream;
+using ::android::StringPiece;
namespace aapt {
namespace xml {
constexpr char kXmlNamespaceSep = 1;
-XmlPullParser::XmlPullParser(std::istream& in) : in_(in), empty_(), depth_(0) {
+XmlPullParser::XmlPullParser(InputStream* in) : in_(in), empty_(), depth_(0) {
parser_ = XML_ParserCreateNS(nullptr, kXmlNamespaceSep);
XML_SetUserData(parser_, this);
XML_SetElementHandler(parser_, StartElementHandler, EndElementHandler);
@@ -40,30 +41,35 @@ XmlPullParser::XmlPullParser(std::istream& in) : in_(in), empty_(), depth_(0) {
event_queue_.push(EventData{Event::kStartDocument, 0, depth_++});
}
-XmlPullParser::~XmlPullParser() { XML_ParserFree(parser_); }
+XmlPullParser::~XmlPullParser() {
+ XML_ParserFree(parser_);
+}
XmlPullParser::Event XmlPullParser::Next() {
const Event currentEvent = event();
- if (currentEvent == Event::kBadDocument ||
- currentEvent == Event::kEndDocument) {
+ if (currentEvent == Event::kBadDocument || currentEvent == Event::kEndDocument) {
return currentEvent;
}
event_queue_.pop();
while (event_queue_.empty()) {
- in_.read(buffer_, sizeof(buffer_) / sizeof(*buffer_));
+ const char* buffer = nullptr;
+ size_t buffer_size = 0;
+ bool done = false;
+ if (!in_->Next(reinterpret_cast<const void**>(&buffer), &buffer_size)) {
+ if (in_->HadError()) {
+ error_ = in_->GetError();
+ event_queue_.push(EventData{Event::kBadDocument});
+ break;
+ }
- const bool done = in_.eof();
- if (in_.bad() && !done) {
- error_ = strerror(errno);
- event_queue_.push(EventData{Event::kBadDocument});
- continue;
+ done = true;
}
- if (XML_Parse(parser_, buffer_, in_.gcount(), done) == XML_STATUS_ERROR) {
+ if (XML_Parse(parser_, buffer, buffer_size, done) == XML_STATUS_ERROR) {
error_ = XML_ErrorString(XML_GetErrorCode(parser_));
event_queue_.push(EventData{Event::kBadDocument});
- continue;
+ break;
}
if (done) {