Kaydet (Commit) 071928f2 authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Set all single cell links to orcus_xml, and start reading the file.

Alas, data won't get imported because I haven't implemented get_sheet()
interface method.

Change-Id: Id53b2c68b2fdf4c03fa6d6de25dd7762a51bd610
üst 971f0e32
...@@ -57,19 +57,22 @@ struct ScOrcusImportXMLParam ...@@ -57,19 +57,22 @@ struct ScOrcusImportXMLParam
struct CellLink struct CellLink
{ {
ScAddress maPos; ScAddress maPos;
rtl::OUString maPath; rtl::OString maPath;
CellLink(const ScAddress& rPos, const rtl::OUString& rPath); CellLink(const ScAddress& rPos, const rtl::OString& rPath);
}; };
struct RangeLink struct RangeLink
{ {
ScAddress maPos; ScAddress maPos;
std::vector<rtl::OUString> maFieldPaths; std::vector<rtl::OString> maFieldPaths;
}; };
std::vector<CellLink> maCellLinks; typedef std::vector<CellLink> CellLinksType;
std::vector<RangeLink> maRangeLinks; typedef std::vector<RangeLink> RangeLinksType;
CellLinksType maCellLinks;
RangeLinksType maRangeLinks;
}; };
#endif #endif
......
...@@ -24,7 +24,7 @@ const ScOrcusXMLTreeParam::EntryData* ScOrcusXMLTreeParam::getUserData(const SvT ...@@ -24,7 +24,7 @@ const ScOrcusXMLTreeParam::EntryData* ScOrcusXMLTreeParam::getUserData(const SvT
return static_cast<const ScOrcusXMLTreeParam::EntryData*>(rEntry.GetUserData()); return static_cast<const ScOrcusXMLTreeParam::EntryData*>(rEntry.GetUserData());
} }
ScOrcusImportXMLParam::CellLink::CellLink(const ScAddress& rPos, const OUString& rPath) : ScOrcusImportXMLParam::CellLink::CellLink(const ScAddress& rPos, const OString& rPath) :
maPos(rPos), maPath(rPath) {} maPos(rPos), maPath(rPath) {}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <orcus/orcus_csv.hpp> #include <orcus/orcus_csv.hpp>
#include <orcus/xml_structure_tree.hpp> #include <orcus/xml_structure_tree.hpp>
#include <orcus/xml_namespace.hpp> #include <orcus/xml_namespace.hpp>
#include <orcus/orcus_xml.hpp>
#include <orcus/global.hpp> #include <orcus/global.hpp>
#include <boost/ptr_container/ptr_vector.hpp> #include <boost/ptr_container/ptr_vector.hpp>
...@@ -36,6 +37,12 @@ using orcus::spreadsheet::formula_grammar_t; ...@@ -36,6 +37,12 @@ using orcus::spreadsheet::formula_grammar_t;
namespace { namespace {
OString toSystemPath(const OUString& rPath)
{
INetURLObject aURL(rPath);
return rtl::OUStringToOString(aURL.getFSysPath(SYSTEM_PATH), RTL_TEXTENCODING_UTF8);
}
class ScOrcusSheet; class ScOrcusSheet;
class ScOrcusFactory : public orcus::spreadsheet::iface::import_factory class ScOrcusFactory : public orcus::spreadsheet::iface::import_factory
...@@ -156,8 +163,7 @@ void ScOrcusSheet::set_value(row_t /*row*/, col_t /*col*/, double /*value*/) ...@@ -156,8 +163,7 @@ void ScOrcusSheet::set_value(row_t /*row*/, col_t /*col*/, double /*value*/)
bool ScOrcusFiltersImpl::importCSV(ScDocument& rDoc, const OUString& rPath) const bool ScOrcusFiltersImpl::importCSV(ScDocument& rDoc, const OUString& rPath) const
{ {
ScOrcusFactory aFactory(rDoc); ScOrcusFactory aFactory(rDoc);
INetURLObject aURL(rPath); OString aSysPath = toSystemPath(rPath);
OString aSysPath = rtl::OUStringToOString(aURL.getFSysPath(SYSTEM_PATH), RTL_TEXTENCODING_UTF8);
const char* path = aSysPath.getStr(); const char* path = aSysPath.getStr();
try try
...@@ -262,8 +268,7 @@ bool ScOrcusFiltersImpl::loadXMLStructure( ...@@ -262,8 +268,7 @@ bool ScOrcusFiltersImpl::loadXMLStructure(
{ {
rParam.maUserDataStore.clear(); rParam.maUserDataStore.clear();
INetURLObject aURL(rPath); OString aSysPath = toSystemPath(rPath);
OString aSysPath = rtl::OUStringToOString(aURL.getFSysPath(SYSTEM_PATH), RTL_TEXTENCODING_UTF8);
const char* path = aSysPath.getStr(); const char* path = aSysPath.getStr();
// TODO: Use our own stream loading call instead of one from orcus. // TODO: Use our own stream loading call instead of one from orcus.
...@@ -302,6 +307,34 @@ bool ScOrcusFiltersImpl::loadXMLStructure( ...@@ -302,6 +307,34 @@ bool ScOrcusFiltersImpl::loadXMLStructure(
bool ScOrcusFiltersImpl::importXML( bool ScOrcusFiltersImpl::importXML(
ScDocument& rDoc, const rtl::OUString& rPath, const ScOrcusImportXMLParam& rParam) const ScDocument& rDoc, const rtl::OUString& rPath, const ScOrcusImportXMLParam& rParam) const
{ {
ScOrcusFactory aFactory(rDoc);
OString aSysPath = toSystemPath(rPath);
const char* path = aSysPath.getStr();
try
{
orcus::orcus_xml filter(&aFactory, NULL);
// Set cell links.
ScOrcusImportXMLParam::CellLinksType::const_iterator it = rParam.maCellLinks.begin();
ScOrcusImportXMLParam::CellLinksType::const_iterator itEnd = rParam.maCellLinks.end();
for (; it != itEnd; ++it)
{
const ScOrcusImportXMLParam::CellLink& rLink = *it;
OUString aTabName;
rDoc.GetName(rLink.maPos.Tab(), aTabName);
filter.set_cell_link(
rLink.maPath.getStr(),
rtl::OUStringToOString(aTabName, RTL_TEXTENCODING_UTF8).getStr(),
rLink.maPos.Row(), rLink.maPos.Col());
}
filter.read_file(path);
}
catch (const std::exception&)
{
return false;
}
return true; return true;
} }
......
...@@ -428,10 +428,9 @@ void ScXMLSourceDlg::OkPressed() ...@@ -428,10 +428,9 @@ void ScXMLSourceDlg::OkPressed()
const ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(rEntry); const ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(rEntry);
ScAddress aPos = pUserData->maLinkedPos; ScAddress aPos = pUserData->maLinkedPos;
fprintf(stdout, "ScXMLSourceDlg::OkPressed: linked to (col=%d,row=%d) path = '%s'\n", aParam.maCellLinks.push_back(
aPos.Col(), aPos.Row(), rtl::OUStringToOString(aPath, RTL_TEXTENCODING_UTF8).getStr()); ScOrcusImportXMLParam::CellLink(
aPos, rtl::OUStringToOString(aPath, RTL_TEXTENCODING_UTF8)));
aParam.maCellLinks.push_back(ScOrcusImportXMLParam::CellLink(aPos, aPath));
} }
// TODO: Process range links. // TODO: Process range links.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment