[Libreoffice-commits] core.git: Branch 'libreoffice-4-0' - sc/Library_scfilt.mk sc/source

Kohei Yoshida kohei.yoshida at gmail.com
Wed Apr 24 01:28:38 PDT 2013


 sc/Library_scfilt.mk                  |    1 +
 sc/source/filter/orcus/xmlcontext.cxx |   34 +++++++++++++++++++++++++++++-----
 2 files changed, 30 insertions(+), 5 deletions(-)

New commits:
commit 30d6b1d13da9808eb4544d4bffb0acc49c0e6c5c
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Mon Apr 22 18:05:53 2013 -0400

    fdo#61820: Avoid crasher when file URL contains unicode bytes.
    
    This is a cherry-pick of 6374df20c2a8378209cce21c0e9689e65b8bd9a2.
    
    Credit goes to Isamu Mogi for pin-pointing exactly what caused the crash
    and which commit fixed it on master.
    
    Change-Id: Ic5653c76c8c7d8eb8798a9c4ae0cbc43f0e946e4
    Reviewed-on: https://gerrit.libreoffice.org/3581
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Reviewed-by: Fridrich Strba <fridrich at documentfoundation.org>
    Tested-by: Fridrich Strba <fridrich at documentfoundation.org>

diff --git a/sc/Library_scfilt.mk b/sc/Library_scfilt.mk
index bdb99ca..0a849da 100644
--- a/sc/Library_scfilt.mk
+++ b/sc/Library_scfilt.mk
@@ -58,6 +58,7 @@ $(eval $(call gb_Library_use_libraries,scfilt,\
 	svxcore \
 	tk \
 	tl \
+	ucbhelper \
 	utl \
 	vcl \
 	i18nisolang1 \
diff --git a/sc/source/filter/orcus/xmlcontext.cxx b/sc/source/filter/orcus/xmlcontext.cxx
index ecbf35b..001c8f9 100644
--- a/sc/source/filter/orcus/xmlcontext.cxx
+++ b/sc/source/filter/orcus/xmlcontext.cxx
@@ -14,6 +14,7 @@
 
 #include "svtools/treelistbox.hxx"
 #include "svtools/treelistentry.hxx"
+#include "ucbhelper/content.hxx"
 
 #include <orcus/spreadsheet/import_interface.hpp>
 #include <orcus/xml_structure_tree.hpp>
@@ -21,7 +22,14 @@
 #include <orcus/orcus_xml.hpp>
 #include <orcus/global.hpp>
 
+#include <com/sun/star/ucb/XCommandEnvironment.hpp>
+
 #include <string>
+#include <sstream>
+
+#define BUFFER_SIZE 4096
+
+using namespace com::sun::star;
 
 namespace {
 
@@ -143,6 +151,26 @@ public:
     }
 };
 
+void loadContentFromURL(const OUString& rURL, std::string& rStrm)
+{
+    ucbhelper::Content aContent(
+        rURL, uno::Reference<ucb::XCommandEnvironment>(), comphelper::getProcessComponentContext());
+    uno::Reference<io::XInputStream> xStrm = aContent.openStream();
+
+    std::ostringstream aStrmBuf;
+    uno::Sequence<sal_Int8> aBytes;
+    size_t nBytesRead = 0;
+    do
+    {
+        nBytesRead = xStrm->readBytes(aBytes, BUFFER_SIZE);
+        const sal_Int8* p = aBytes.getConstArray();
+        aStrmBuf << std::string(p, p + nBytesRead);
+    }
+    while (nBytesRead == BUFFER_SIZE);
+
+    rStrm = aStrmBuf.str();
+}
+
 }
 
 ScOrcusXMLContextImpl::ScOrcusXMLContextImpl(ScDocument& rDoc, const OUString& rPath) :
@@ -154,12 +182,8 @@ bool ScOrcusXMLContextImpl::loadXMLStructure(SvTreeListBox& rTreeCtrl, ScOrcusXM
 {
     rParam.maUserDataStore.clear();
 
-    OString aSysPath = ScOrcusFiltersImpl::toSystemPath(maPath);
-    const char* path = aSysPath.getStr();
-
-    // TODO: Use our own stream loading call instead of one from orcus.
     std::string aStrm;
-    orcus::load_file_content(path, aStrm);
+    loadContentFromURL(maPath, aStrm);
 
     if (aStrm.empty())
         return false;


More information about the Libreoffice-commits mailing list