int DavXMLParser::parseChuck(const char *partial_string, size_t length){ int ret = ne_xml_parse(_ne_parser,partial_string,length); if(ret != 0){ if(ret > 0){ ret =-1; const char* ne_parser_err = ne_xml_get_error(_ne_parser); DavixError::setupError(&err, davix_scope_xml_parser(), StatusCode::WebDavPropertiesParsingError, "XML Parsing Error: " + std::string((ne_parser_err)?ne_parser_err:"Unknow ne error")); } if(!err){ DavixError::setupError(&err, davix_scope_xml_parser(), StatusCode::WebDavPropertiesParsingError, "Unknow XML parsing error "); } } return ret; }
int DavDeleteXMLParser::parserEndElemCb(int state, const char *nspace, const char *name){ (void) state; (void) nspace; Xml::XmlPTree node(Xml::ElementStart, name); if(node.compareNode(prop_response)){ d_ptr->store_new_elem(); } // find potential interesting data std::vector<Xml::XmlPTree::ptr_type> chain; if(d_ptr->char_buffer.size() != 0){ chain = webDavTree->findChain(d_ptr->_stack); if(chain.size() > 0){ properties_cb cb = ((properties_cb) chain.at(chain.size()-1)->getMeta()); if(cb){ StrUtil::trim(d_ptr->char_buffer); cb(*d_ptr, d_ptr->char_buffer); } } d_ptr->update_elem(); } // cleaning work if(d_ptr->_stack.size() == 0) throw DavixException(davix_scope_xml_parser(),StatusCode::ParsingError, "Corrupted Parser Stack, Invalid XML"); d_ptr->_stack.pop_back(); d_ptr->clear(); return 0; }
int start_elem(const std::string &elem){ // new tag, clean content; current.clear(); // check XML nested level, security protection if(stack_status.size() < 200){ stack_status.push(elem); }else{ throw DavixException(davix_scope_xml_parser(), StatusCode::ParsingError, "Impossible to parse S3 content, corrupted XML"); } // check element, if it is "deleted" this recource has beed deleted successfully // or the resource did not exist in the first place, either way, log it if( StrUtil::compare_ncase(delete_prop, elem) ==0){ DAVIX_SLOG(DAVIX_LOG_TRACE, DAVIX_LOG_XML, "deleted entry found", elem.c_str()); status.clear(); entry_count = 0; } // check element, if "Error" there has been problem with deleting this resource // the code returned will have to be mapped to http code if( StrUtil::compare_ncase(error_prop, elem) ==0){ DAVIX_SLOG(DAVIX_LOG_TRACE, DAVIX_LOG_XML, "error entry found", elem.c_str()); status.clear(); status.error = true; entry_count = 0; } return 1; }
int start_elem(const std::string &elem){ // new tag, clean content; current.clear(); // check XML nested level, security protection if(stack_status.size() < 200){ stack_status.push(elem); }else{ throw DavixException(davix_scope_xml_parser(), StatusCode::ParsingError, "Impossible to parse S3 content, corrupted XML"); } // check element, if collection name add first entry if( StrUtil::compare_ncase(col_prop, elem) ==0){ DAVIX_SLOG(DAVIX_LOG_TRACE, DAVIX_LOG_XML, "collection found", elem.c_str()); property.clear(); prop_count = 0; } // check element, if new entry clear current entry if( StrUtil::compare_ncase(delimiter_prop, elem) ==0){ DAVIX_SLOG(DAVIX_LOG_TRACE, DAVIX_LOG_XML, "new element found", elem.c_str()); property.clear(); } // check element, if common prefixes set flag if( (_s3_listing_mode == S3ListingMode::Hierarchical) && StrUtil::compare_ncase(com_prefix_prop, elem) ==0){ DAVIX_SLOG(DAVIX_LOG_TRACE, DAVIX_LOG_XML, "common prefixes found", elem.c_str()); inside_com_prefix = true; } // check element, if prefix clear current entry if( (_s3_listing_mode == S3ListingMode::Hierarchical) && StrUtil::compare_ncase(prefix_prop, elem) ==0){ DAVIX_SLOG(DAVIX_LOG_TRACE, DAVIX_LOG_XML, "prefix found", elem.c_str()); property.clear(); } return 1; }
Davix::DavixError* DavXMLParser::getLastErr(){ if(err) return err->clone(); return new Davix::DavixError(davix_scope_xml_parser(), StatusCode::OK, "Success"); }
int davParserNotImplemented(Davix::DavixError** err){ Davix::DavixError::setupError(err, davix_scope_xml_parser(), StatusCode::OperationNonSupported, "the parser callbacks not are not setup properly"); return -1; }