| 585 | } |
| 586 | |
| 587 | sp<XMLNode> XMLNode::parse(const sp<AaptFile>& file) |
| 588 | { |
| 589 | char buf[16384]; |
| 590 | |
| 591 | //Check for zip first |
| 592 | if (file->getZipFile().length() > 0) { |
| 593 | return parseFromZip(file); |
| 594 | } |
| 595 | |
| 596 | int fd = open(file->getSourceFile().string(), O_RDONLY | O_BINARY); |
| 597 | if (fd < 0) { |
| 598 | SourcePos(file->getSourceFile(), -1).error("Unable to open file for read: %s", |
| 599 | strerror(errno)); |
| 600 | return NULL; |
| 601 | } |
| 602 | |
| 603 | XML_Parser parser = XML_ParserCreateNS(NULL, 1); |
| 604 | ParseState state; |
| 605 | state.filename = file->getPrintableSource(); |
| 606 | state.parser = parser; |
| 607 | XML_SetUserData(parser, &state); |
| 608 | XML_SetElementHandler(parser, startElement, endElement); |
| 609 | XML_SetNamespaceDeclHandler(parser, startNamespace, endNamespace); |
| 610 | XML_SetCharacterDataHandler(parser, characterData); |
| 611 | XML_SetCommentHandler(parser, commentData); |
| 612 | |
| 613 | ssize_t len; |
| 614 | bool done; |
| 615 | do { |
| 616 | len = read(fd, buf, sizeof(buf)); |
| 617 | done = len < (ssize_t)sizeof(buf); |
| 618 | if (len < 0) { |
| 619 | SourcePos(file->getSourceFile(), -1).error("Error reading file: %s\n", strerror(errno)); |
| 620 | close(fd); |
| 621 | return NULL; |
| 622 | } |
| 623 | if (XML_Parse(parser, buf, len, done) == XML_STATUS_ERROR) { |
| 624 | SourcePos(file->getSourceFile(), (int)XML_GetCurrentLineNumber(parser)).error( |
| 625 | "Error parsing XML: %s\n", XML_ErrorString(XML_GetErrorCode(parser))); |
| 626 | close(fd); |
| 627 | return NULL; |
| 628 | } |
| 629 | } while (!done); |
| 630 | |
| 631 | XML_ParserFree(parser); |
| 632 | if (state.root == NULL) { |
| 633 | SourcePos(file->getSourceFile(), -1).error("No XML data generated when parsing"); |
| 634 | } |
| 635 | close(fd); |
| 636 | return state.root; |
| 637 | } |
| 638 | |
| 639 | XMLNode::XMLNode(const String8& filename, const String16& s1, const String16& s2, bool isNamespace) |
| 640 | : mNextAttributeIndex(0x80000000) |
nothing calls this directly
no test coverage detected