[Libreoffice-commits] core.git: writerfilter/inc writerfilter/source
sushil_shinde
sushil.shinde at synerzip.com
Fri Jan 10 04:16:10 PST 2014
writerfilter/inc/ooxml/OOXMLDocument.hxx | 3 -
writerfilter/source/filter/ImportFilter.cxx | 6 +-
writerfilter/source/ooxml/OOXMLDocumentImpl.cxx | 68 ++++++++++++++++++++++++
writerfilter/source/ooxml/OOXMLDocumentImpl.hxx | 4 +
writerfilter/source/ooxml/OOXMLStreamImpl.cxx | 12 +++-
writerfilter/source/ooxml/OOXMLStreamImpl.hxx | 1
6 files changed, 91 insertions(+), 3 deletions(-)
New commits:
commit 0e114b9967ddfb490cd9865220520701004db7ab
Author: sushil_shinde <sushil.shinde at synerzip.com>
Date: Fri Dec 27 14:25:16 2013 +0530
fdo#72520 : Added embedded data of docx file to InteropGrabBag.
- Added embedded exel sheet data for charts to grab bag.
Change-Id: I7f52b56de2306671fea9247c8a789c0e2a5a8874
Reviewed-on: https://gerrit.libreoffice.org/7211
Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
Tested-by: Miklos Vajna <vmiklos at collabora.co.uk>
diff --git a/writerfilter/inc/ooxml/OOXMLDocument.hxx b/writerfilter/inc/ooxml/OOXMLDocument.hxx
index 13f365e..4bbc31b 100644
--- a/writerfilter/inc/ooxml/OOXMLDocument.hxx
+++ b/writerfilter/inc/ooxml/OOXMLDocument.hxx
@@ -76,7 +76,7 @@ class WRITERFILTER_OOXML_DLLPUBLIC OOXMLStream
{
public:
enum StreamType_t { UNKNOWN, DOCUMENT, STYLES, WEBSETTINGS, FONTTABLE, NUMBERING,
- FOOTNOTES, ENDNOTES, COMMENTS, THEME, CUSTOMXML, CUSTOMXMLPROPS, ACTIVEX, ACTIVEXBIN, GLOSSARY, SETTINGS, VBAPROJECT };
+ FOOTNOTES, ENDNOTES, COMMENTS, THEME, CUSTOMXML, CUSTOMXMLPROPS, ACTIVEX, ACTIVEXBIN, GLOSSARY, CHARTS, EMBEDDINGS, SETTINGS, VBAPROJECT };
typedef boost::shared_ptr<OOXMLStream> Pointer_t;
virtual ~OOXMLStream() {}
@@ -248,6 +248,7 @@ public:
virtual uno::Sequence<uno::Reference<xml::dom::XDocument> > getCustomXmlDomPropsList( ) = 0;
virtual uno::Sequence<uno::Reference<xml::dom::XDocument> > getActiveXDomList( ) = 0;
virtual uno::Sequence<uno::Reference<io::XInputStream> > getActiveXBinList() = 0;
+ virtual uno::Sequence<beans::PropertyValue > getEmbeddingsList() = 0;
};
diff --git a/writerfilter/source/filter/ImportFilter.cxx b/writerfilter/source/filter/ImportFilter.cxx
index 90c4c98..ac2902d 100644
--- a/writerfilter/source/filter/ImportFilter.cxx
+++ b/writerfilter/source/filter/ImportFilter.cxx
@@ -119,7 +119,7 @@ sal_Bool WriterFilter::filter( const uno::Sequence< beans::PropertyValue >& aDes
pDocument->resolve(*pStream);
// Adding some properties to the document's grab bag for interoperability purposes:
- uno::Sequence<beans::PropertyValue> aGrabBagProperties(8);
+ uno::Sequence<beans::PropertyValue> aGrabBagProperties(9);
// Adding the saved Theme DOM
aGrabBagProperties[0].Name = "OOXTheme";
@@ -147,6 +147,10 @@ sal_Bool WriterFilter::filter( const uno::Sequence< beans::PropertyValue >& aDes
aGrabBagProperties[7].Name = "OOXGlossaryDom";
aGrabBagProperties[7].Value = uno::makeAny( pDocument->getGlossaryDomList() );
+ // Adding the saved embedding document to document's grab bag
+ aGrabBagProperties[8].Name = "OOXEmbeddings";
+ aGrabBagProperties[8].Value = uno::makeAny( pDocument->getEmbeddingsList() );
+
putPropertiesToDocumentGrabBag( aGrabBagProperties );
writerfilter::ooxml::OOXMLStream::Pointer_t pVBAProjectStream(writerfilter::ooxml::OOXMLDocumentFactory::createStream( pDocStream, writerfilter::ooxml::OOXMLStream::VBAPROJECT ));
diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
index cf4de5c..05292a5 100644
--- a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
+++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
@@ -35,6 +35,7 @@
// this extern variable is declared in OOXMLStreamImpl.hxx
OUString customTarget;
+OUString embeddingsTarget;
using ::com::sun::star::xml::sax::SAXException;
namespace writerfilter {
namespace ooxml
@@ -157,6 +158,10 @@ uno::Reference<xml::dom::XDocument> OOXMLDocumentImpl::importSubStream(OOXMLStre
{
importSubStreamRelations(pStream, OOXMLStream::ACTIVEXBIN);
}
+ if(OOXMLStream::CHARTS == nType)
+ {
+ importSubStreamRelations(pStream, OOXMLStream::EMBEDDINGS);
+ }
return xRet;
}
@@ -207,6 +212,11 @@ void OOXMLDocumentImpl::importSubStreamRelations(OOXMLStream::Pointer_t pStream,
// imporing activex.bin files for activex.xml from activeX folder.
mxActiveXBin = xcpInputStream;
}
+ else if(OOXMLStream::EMBEDDINGS == nType)
+ {
+ // imporing activex.bin files for activex.xml from activeX folder.
+ mxEmbeddings = xcpInputStream;
+ }
}
@@ -441,6 +451,9 @@ void OOXMLDocumentImpl::resolve(Stream & rStream)
mxGlossaryDocDom = importSubStream(OOXMLStream::GLOSSARY);
if (mxGlossaryDocDom.is())
resolveGlossaryStream(rStream);
+
+ resolveEmbeddingsStream(rStream);
+
// Custom xml's are handled as part of grab bag.
resolveCustomXmlStream(rStream);
@@ -627,6 +640,56 @@ void OOXMLDocumentImpl::resolveGlossaryStream(Stream & /*rStream*/)
}
}
+void OOXMLDocumentImpl::resolveEmbeddingsStream(Stream & /*rStream*/)
+{
+ uno::Reference<embed::XRelationshipAccess> mxRelationshipAccess;
+ mxRelationshipAccess.set((*dynamic_cast<OOXMLStreamImpl *>(mpStream.get())).accessDocumentStream(), uno::UNO_QUERY_THROW);
+ if (mxRelationshipAccess.is())
+ {
+ OUString sChartType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart");
+ OUString sTarget("Target");
+ bool bFound = false;
+ sal_Int32 counter = 0;
+ uno::Sequence< uno::Sequence< beans::StringPair > >aSeqs =
+ mxRelationshipAccess->getAllRelationships();
+ uno::Sequence<beans::PropertyValue > mxEmbeddingsListTemp(aSeqs.getLength());
+ for (sal_Int32 j = 0; j < aSeqs.getLength(); j++)
+ {
+ uno::Sequence< beans::StringPair > aSeq = aSeqs[j];
+ for (sal_Int32 i = 0; i < aSeq.getLength(); i++)
+ {
+ beans::StringPair aPair = aSeq[i];
+ if (aPair.Second.compareTo(sChartType) == 0)
+ bFound = true;
+ else if(aPair.First.compareTo(sTarget) == 0 && bFound)
+ {
+ // Adding value to extern variable customTarget. It will be used in ooxmlstreamimpl
+ // to ensure chart.xml target is visited in lcl_getTarget.
+ customTarget = aPair.Second;
+ }
+ }
+ if(bFound)
+ {
+ uno::Reference<xml::dom::XDocument> chartTemp = importSubStream(OOXMLStream::CHARTS);
+ beans::PropertyValue embeddingsTemp;
+ // This will add all ActiveX[n].xml to grabbag list.
+ if(chartTemp.is())
+ {
+ if(mxEmbeddings.is())
+ {
+ embeddingsTemp.Name = embeddingsTarget;
+ embeddingsTemp.Value = uno::makeAny(mxEmbeddings);
+ mxEmbeddingsListTemp[counter] = embeddingsTemp;
+ }
+ counter++;
+ }
+ bFound = false;
+ }
+ }
+ mxEmbeddingsListTemp.realloc(counter);
+ mxEmbeddingsList = mxEmbeddingsListTemp;
+ }
+}
void OOXMLDocumentImpl::resolveActiveXStream(Stream & rStream)
{
@@ -776,6 +839,11 @@ uno::Sequence<uno::Reference<io::XInputStream> > OOXMLDocumentImpl::getActiveXBi
return mxActiveXBinList;
}
+uno::Sequence<beans::PropertyValue > OOXMLDocumentImpl::getEmbeddingsList( )
+{
+ return mxEmbeddingsList;
+}
+
OOXMLDocument *
OOXMLDocumentFactory::createDocument
(OOXMLStream::Pointer_t pStream)
diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
index ae4d695..0c4cd01b 100644
--- a/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
+++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
@@ -50,6 +50,8 @@ class OOXMLDocumentImpl : public OOXMLDocument
uno::Sequence<uno::Reference<xml::dom::XDocument> > mxActiveXDomList;
uno::Sequence<uno::Reference<io::XInputStream> > mxActiveXBinList;
uno::Reference<io::XInputStream> mxActiveXBin;
+ uno::Reference<io::XInputStream> mxEmbeddings;
+ uno::Sequence < beans::PropertyValue > mxEmbeddingsList;
bool mbIsSubstream;
protected:
@@ -76,6 +78,7 @@ protected:
void resolveCustomXmlStream(Stream & rStream);
void resolveActiveXStream(Stream & rStream);
void resolveGlossaryStream(Stream & rStream);
+ void resolveEmbeddingsStream(Stream & rStream);
public:
OOXMLDocumentImpl(OOXMLStream::Pointer_t pStream);
virtual ~OOXMLDocumentImpl();
@@ -127,6 +130,7 @@ public:
virtual uno::Sequence<uno::Reference<io::XInputStream> > getActiveXBinList();
virtual uno::Reference<xml::dom::XDocument> getGlossaryDocDom();
virtual uno::Sequence<uno::Sequence< uno::Any> > getGlossaryDomList();
+ virtual uno::Sequence<beans::PropertyValue > getEmbeddingsList();
};
}}
#endif // OOXML_DOCUMENT_IMPL_HXX
diff --git a/writerfilter/source/ooxml/OOXMLStreamImpl.cxx b/writerfilter/source/ooxml/OOXMLStreamImpl.cxx
index c119cfb..d278805 100644
--- a/writerfilter/source/ooxml/OOXMLStreamImpl.cxx
+++ b/writerfilter/source/ooxml/OOXMLStreamImpl.cxx
@@ -117,6 +117,8 @@ bool OOXMLStreamImpl::lcl_getTarget(uno::Reference<embed::XRelationshipAccess>
static OUString sGlossaryType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/glossaryDocument");
static OUString sWebSettings("http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings");
static OUString sSettingsType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings");
+ static OUString sChartType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart");
+ static OUString sEmbeddingsType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/package");
static OUString sTarget("Target");
static OUString sTargetMode("TargetMode");
static OUString sExternal("External");
@@ -174,6 +176,12 @@ bool OOXMLStreamImpl::lcl_getTarget(uno::Reference<embed::XRelationshipAccess>
case WEBSETTINGS:
sStreamType = sWebSettings;
break;
+ case CHARTS:
+ sStreamType = sChartType;
+ break;
+ case EMBEDDINGS:
+ sStreamType = sEmbeddingsType;
+ break;
default:
break;
}
@@ -202,7 +210,7 @@ bool OOXMLStreamImpl::lcl_getTarget(uno::Reference<embed::XRelationshipAccess>
else if (aPair.First.compareTo(sTarget) == 0)
{
// checking item[n].xml or activex[n].xml is not visited already.
- if(customTarget != aPair.Second && (sStreamType == sCustomType || sStreamType == sActiveXType))
+ if(customTarget != aPair.Second && (sStreamType == sCustomType || sStreamType == sActiveXType || sStreamType == sChartType))
{
bFound = false;
}
@@ -233,6 +241,8 @@ bool OOXMLStreamImpl::lcl_getTarget(uno::Reference<embed::XRelationshipAccess>
// path will start with the fragment separator. need to
// remove that
rDocumentTarget = rDocumentTarget.copy( 1 );
+ if(sStreamType == sEmbeddingsType)
+ embeddingsTarget = rDocumentTarget;
}
break;
diff --git a/writerfilter/source/ooxml/OOXMLStreamImpl.hxx b/writerfilter/source/ooxml/OOXMLStreamImpl.hxx
index 8c0c21b..4db03a2 100644
--- a/writerfilter/source/ooxml/OOXMLStreamImpl.hxx
+++ b/writerfilter/source/ooxml/OOXMLStreamImpl.hxx
@@ -25,6 +25,7 @@
#include <com/sun/star/io/XStream.hpp>
extern OUString customTarget;
+extern OUString embeddingsTarget;
namespace writerfilter {
namespace ooxml
More information about the Libreoffice-commits
mailing list