external/liborcus/0001-add-xml-path.patch | 119 ++++++++++++++++++++++++++++++ sc/source/filter/inc/orcusinterface.hxx | 4 - sc/source/filter/orcus/interface.cxx | 8 +- sc/source/filter/orcus/xmlcontext.cxx | 2 4 files changed, 126 insertions(+), 7 deletions(-)
New commits: commit 9313dcc624e3898d2b10f8b0d6efba403a190c88 Author: Vikas Mahato <vikasmaha...@gmail.com> Date: Sun Jun 24 20:38:12 2018 +0530 Changes to orcus for implementing XML data provider Change-Id: I70075f4240c75f0f46260bb77b160f0b75d6ae94 Reviewed-on: https://gerrit.libreoffice.org/56354 Tested-by: Jenkins Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com> diff --git a/external/liborcus/0001-add-xml-path.patch b/external/liborcus/0001-add-xml-path.patch new file mode 100644 index 000000000000..3f9a16bb880f --- /dev/null +++ b/external/liborcus/0001-add-xml-path.patch @@ -0,0 +1,119 @@ +diff --git a/include/orcus/xml_structure_tree.hpp b/include/orcus/xml_structure_tree.hpp +index 58cabfd116fa24e35ff27cf8d7512b6e73df33f4..c88808d24bd74c175fa4017328d3e54b4c588c5e 100644 +--- a/include/orcus/xml_structure_tree.hpp ++++ b/include/orcus/xml_structure_tree.hpp +@@ -127,6 +127,20 @@ public: + size_t get_xmlns_index(xmlns_id_t ns) const; + + std::string get_xmlns_short_name(xmlns_id_t ns) const; ++ ++ /** ++ * Get a XPath like ID for the element inside of the XML tree. ++ * ++ */ ++ std::string get_path() const; ++ ++ /** ++ * Select an element by a path expression. The path expression may be ++ * generated by <code>xml_structure_tree::walker::get_path</code>. ++ * ++ * @param path a simple XPath like expression ++ */ ++ element select_by_path(const std::string& path); + }; + + xml_structure_tree(xmlns_context& xmlns_cxt); +diff --git a/src/liborcus/xml_structure_tree.cpp b/src/liborcus/xml_structure_tree.cpp +index 2778bc05f32841a9441bf471913872e119256895..6622bc57cd2595f12bba80d4bbdb5c24cd6e7bc6 100644 +--- a/src/liborcus/xml_structure_tree.cpp ++++ b/src/liborcus/xml_structure_tree.cpp +@@ -12,6 +12,7 @@ + #include "orcus/exception.hpp" + + #include "orcus/string_pool.hpp" ++#include "string_helper.hpp" + + #include <iostream> + #include <sstream> +@@ -275,6 +276,15 @@ struct xml_structure_tree_impl + { + delete mp_root; + } ++ ++ std::string get_element_str(const xml_structure_tree::entity_name& name) const ++ { ++ ostringstream ss; ++ if (m_xmlns_cxt.get_index(name.ns) != index_not_found) ++ ss << m_xmlns_cxt.get_short_name(name.ns) << ":"; ++ ss << name.name; ++ return ss.str(); ++ } + }; + + struct xml_structure_tree::walker_impl +@@ -423,6 +433,66 @@ string xml_structure_tree::walker::get_xmlns_short_name(xmlns_id_t ns) const + return mp_impl->m_parent_impl.m_xmlns_cxt.get_short_name(ns); + } + ++string xml_structure_tree::walker::get_path() const ++{ ++ ostringstream ss; ++ for (auto& element : mp_impl->m_scopes) ++ { ++ ss << "/" << mp_impl->m_parent_impl.get_element_str(element.name); ++ } ++ ++ return ss.str(); ++} ++ ++xml_structure_tree::element xml_structure_tree::walker::select_by_path(const std::string& path) ++{ ++ pstring p(path); ++ std::vector<pstring> parts = string_helper::split_string(p, '/'); ++ if (parts.empty()) ++ throw general_error("invalid format for path"); ++ ++ // string_helper::split_string will create an empty first element due to leading '/' ++ if (parts[0] != "") ++ { ++ throw general_error("invalid format for path"); ++ } ++ else ++ { ++ parts.erase(parts.begin()); ++ } ++ ++ if (parts.empty()) ++ throw general_error("invalid format for path"); ++ ++ element_ref root_ref(mp_impl->mp_root->name, &mp_impl->mp_root->prop); ++ if (pstring(mp_impl->m_parent_impl.get_element_str(root_ref.name)) != parts[0]) ++ throw general_error("path does not match any element"); ++ ++ std::vector<element_ref> scopes; ++ scopes.push_back(root_ref); ++ ++ for (size_t i = 1; i < parts.size(); ++i) ++ { ++ const elem_prop& prop = *scopes.back().prop; ++ bool found = false; ++ for (auto& child : prop.child_elements) ++ { ++ if (pstring(mp_impl->m_parent_impl.get_element_str(child.first)) == parts[i]) ++ { ++ scopes.emplace_back(child.first, child.second); ++ found = true; ++ break; ++ } ++ } ++ if (!found) ++ throw general_error("path does not match any element"); ++ } ++ ++ std::swap(mp_impl->m_scopes, scopes); ++ const element_ref& ref = mp_impl->m_scopes.back(); ++ return element(ref.name, ref.prop->repeat); ++} ++ + xml_structure_tree::xml_structure_tree(xmlns_context& xmlns_cxt) : + mp_impl(new xml_structure_tree_impl(xmlns_cxt)) {} diff --git a/sc/source/filter/inc/orcusinterface.hxx b/sc/source/filter/inc/orcusinterface.hxx index 69773d557029..028fb4126f01 100644 --- a/sc/source/filter/inc/orcusinterface.hxx +++ b/sc/source/filter/inc/orcusinterface.hxx @@ -414,7 +414,7 @@ private: void applyXfToItemSet(SfxItemSet& rSet, const xf& rXf); public: - ScOrcusStyles(ScDocument& rDoc); + ScOrcusStyles(ScDocument& rDoc, bool bSkipDefaultStyles=false); void applyXfToItemSet(SfxItemSet& rSet, size_t xfId); @@ -566,7 +566,7 @@ class ScOrcusFactory : public orcus::spreadsheet::iface::import_factory css::uno::Reference<css::task::XStatusIndicator> mxStatusIndicator; public: - ScOrcusFactory(ScDocument& rDoc); + ScOrcusFactory(ScDocument& rDoc, bool bSkipDefaultStyles=false); virtual orcus::spreadsheet::iface::import_sheet* append_sheet( orcus::spreadsheet::sheet_t sheet_index, const char *sheet_name, size_t sheet_name_length) override; diff --git a/sc/source/filter/orcus/interface.cxx b/sc/source/filter/orcus/interface.cxx index e838bf5c75a3..113888fbe0ec 100644 --- a/sc/source/filter/orcus/interface.cxx +++ b/sc/source/filter/orcus/interface.cxx @@ -224,12 +224,12 @@ ScOrcusFactory::CellStoreToken::CellStoreToken(const ScAddress& rPos, const OUSt rtl::math::setNan(&mfValue); } -ScOrcusFactory::ScOrcusFactory(ScDocument& rDoc) : +ScOrcusFactory::ScOrcusFactory(ScDocument& rDoc, bool bSkipDefaultStyles) : maDoc(rDoc), maGlobalSettings(maDoc), maSharedStrings(*this), maNamedExpressions(maDoc, maGlobalSettings), - maStyles(rDoc), + maStyles(rDoc, bSkipDefaultStyles), mnProgress(0) {} orcus::spreadsheet::iface::import_sheet* ScOrcusFactory::append_sheet( @@ -1064,10 +1064,10 @@ size_t ScOrcusSharedStrings::commit_segments() return mrFactory.addString(OStringToOUString(aStr, RTL_TEXTENCODING_UTF8)); } -ScOrcusStyles::ScOrcusStyles(ScDocument& rDoc): +ScOrcusStyles::ScOrcusStyles(ScDocument& rDoc, bool bSkipDefaultStyles): mrDoc(rDoc) { - if (!mrDoc.GetStyleSheetPool()->HasStandardStyles()) + if (!bSkipDefaultStyles && !mrDoc.GetStyleSheetPool()->HasStandardStyles()) mrDoc.GetStyleSheetPool()->CreateStandardStyles(); } diff --git a/sc/source/filter/orcus/xmlcontext.cxx b/sc/source/filter/orcus/xmlcontext.cxx index 5e97db9f84e9..b2405212d8fa 100644 --- a/sc/source/filter/orcus/xmlcontext.cxx +++ b/sc/source/filter/orcus/xmlcontext.cxx @@ -243,7 +243,7 @@ public: void ScOrcusXMLContextImpl::importXML(const ScOrcusImportXMLParam& rParam) { - ScOrcusFactory aFactory(mrDoc); + ScOrcusFactory aFactory(mrDoc, true); OString aSysPath = ScOrcusFiltersImpl::toSystemPath(maPath); const char* path = aSysPath.getStr(); try _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits