| 549 | } |
| 550 | |
| 551 | sp<XMLNode> XMLNode::parseFromZip(const sp<AaptFile>& file) { |
| 552 | AssetManager assets; |
| 553 | void* cookie; |
| 554 | |
| 555 | if (!assets.addAssetPath(file->getZipFile(), &cookie)) { |
| 556 | fprintf(stderr, "Error: Could not open path %s\n", file->getZipFile().string()); |
| 557 | return NULL; |
| 558 | } |
| 559 | |
| 560 | Asset* asset = assets.openNonAsset(cookie, file->getSourceFile(), Asset::ACCESS_BUFFER); |
| 561 | ssize_t len = asset->getLength(); |
| 562 | const void* buf = asset->getBuffer(false); |
| 563 | |
| 564 | XML_Parser parser = XML_ParserCreateNS(NULL, 1); |
| 565 | ParseState state; |
| 566 | state.filename = file->getPrintableSource(); |
| 567 | state.parser = parser; |
| 568 | XML_SetUserData(parser, &state); |
| 569 | XML_SetElementHandler(parser, startElement, endElement); |
| 570 | XML_SetNamespaceDeclHandler(parser, startNamespace, endNamespace); |
| 571 | XML_SetCharacterDataHandler(parser, characterData); |
| 572 | XML_SetCommentHandler(parser, commentData); |
| 573 | |
| 574 | bool done = true; |
| 575 | if (XML_Parse(parser, (char*) buf, len, done) == XML_STATUS_ERROR) { |
| 576 | SourcePos(file->getSourceFile(), (int)XML_GetCurrentLineNumber(parser)).error( |
| 577 | "Error parsing XML: %s\n", XML_ErrorString(XML_GetErrorCode(parser))); |
| 578 | return NULL; |
| 579 | } |
| 580 | XML_ParserFree(parser); |
| 581 | if (state.root == NULL) { |
| 582 | SourcePos(file->getSourceFile(), -1).error("No XML data generated when parsing"); |
| 583 | } |
| 584 | return state.root; |
| 585 | } |
| 586 | |
| 587 | sp<XMLNode> XMLNode::parse(const sp<AaptFile>& file) |
| 588 | { |
nothing calls this directly
no test coverage detected