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
struct CellLink
{
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
{
ScAddress maPos;
std::vector<rtl::OUString> maFieldPaths;
std::vector<rtl::OString> maFieldPaths;
};
std::vector<CellLink> maCellLinks;
std::vector<RangeLink> maRangeLinks;
typedef std::vector<CellLink> CellLinksType;
typedef std::vector<RangeLink> RangeLinksType;
CellLinksType maCellLinks;
RangeLinksType maRangeLinks;
};
#endif
......
......@@ -24,7 +24,7 @@ const ScOrcusXMLTreeParam::EntryData* ScOrcusXMLTreeParam::getUserData(const SvT
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) {}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -20,6 +20,7 @@
#include <orcus/orcus_csv.hpp>
#include <orcus/xml_structure_tree.hpp>
#include <orcus/xml_namespace.hpp>
#include <orcus/orcus_xml.hpp>
#include <orcus/global.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
......@@ -36,6 +37,12 @@ using orcus::spreadsheet::formula_grammar_t;
namespace {
OString toSystemPath(const OUString& rPath)
{
INetURLObject aURL(rPath);
return rtl::OUStringToOString(aURL.getFSysPath(SYSTEM_PATH), RTL_TEXTENCODING_UTF8);
}
class ScOrcusSheet;
class ScOrcusFactory : public orcus::spreadsheet::iface::import_factory
......@@ -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
{
ScOrcusFactory aFactory(rDoc);
INetURLObject aURL(rPath);
OString aSysPath = rtl::OUStringToOString(aURL.getFSysPath(SYSTEM_PATH), RTL_TEXTENCODING_UTF8);
OString aSysPath = toSystemPath(rPath);
const char* path = aSysPath.getStr();
try
......@@ -262,8 +268,7 @@ bool ScOrcusFiltersImpl::loadXMLStructure(
{
rParam.maUserDataStore.clear();
INetURLObject aURL(rPath);
OString aSysPath = rtl::OUStringToOString(aURL.getFSysPath(SYSTEM_PATH), RTL_TEXTENCODING_UTF8);
OString aSysPath = toSystemPath(rPath);
const char* path = aSysPath.getStr();
// TODO: Use our own stream loading call instead of one from orcus.
......@@ -302,6 +307,34 @@ bool ScOrcusFiltersImpl::loadXMLStructure(
bool ScOrcusFiltersImpl::importXML(
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;
}
......
......@@ -428,10 +428,9 @@ void ScXMLSourceDlg::OkPressed()
const ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(rEntry);
ScAddress aPos = pUserData->maLinkedPos;
fprintf(stdout, "ScXMLSourceDlg::OkPressed: linked to (col=%d,row=%d) path = '%s'\n",
aPos.Col(), aPos.Row(), rtl::OUStringToOString(aPath, RTL_TEXTENCODING_UTF8).getStr());
aParam.maCellLinks.push_back(ScOrcusImportXMLParam::CellLink(aPos, aPath));
aParam.maCellLinks.push_back(
ScOrcusImportXMLParam::CellLink(
aPos, rtl::OUStringToOString(aPath, RTL_TEXTENCODING_UTF8)));
}
// 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