summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorsushil_shinde <sushil.shinde@synerzip.com>2013-11-15 12:20:36 +0530
committerMiklos Vajna <vmiklos@collabora.co.uk>2013-11-15 18:40:33 +0100
commitb8a4abdda4e6a95535992c26a906226ede7f050a (patch)
tree2ede37f746ea38fd7a233635fa65f0ca3b85bec3 /writerfilter
parent9fbdb2b8a71e195ac2aa68740e66e84316b08ed7 (diff)
[docx] activeX reference files (.bin) saved in InteropGrabBag and exported.
The XInputStream for activeX.bin files is stored as the PropertyValue "OOXActiveXBin" into the "InteropGraBag" Added mxActiveXBinList object which holds XInputStreams for each activeX.bin from activeX folder. Added .bin files entry to respective acivex.xml's .rels file. Added Unit Test to test all .bin files are stores properly. Reviewed on: https://gerrit.libreoffice.org/6679 Change-Id: I3a0e9462a6cc53d8cbb9c7d59ed24631d77d4d30
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/inc/ooxml/OOXMLDocument.hxx3
-rw-r--r--writerfilter/source/filter/ImportFilter.cxx6
-rw-r--r--writerfilter/source/ooxml/OOXMLDocumentImpl.cxx66
-rw-r--r--writerfilter/source/ooxml/OOXMLDocumentImpl.hxx3
-rw-r--r--writerfilter/source/ooxml/OOXMLStreamImpl.cxx6
5 files changed, 59 insertions, 25 deletions
diff --git a/writerfilter/inc/ooxml/OOXMLDocument.hxx b/writerfilter/inc/ooxml/OOXMLDocument.hxx
index e75cf629510a..97bb8764494c 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, FONTTABLE, NUMBERING,
- FOOTNOTES, ENDNOTES, COMMENTS, THEME, CUSTOMXML, CUSTOMXMLPROPS, ACTIVEX, SETTINGS, VBAPROJECT };
+ FOOTNOTES, ENDNOTES, COMMENTS, THEME, CUSTOMXML, CUSTOMXMLPROPS, ACTIVEX, ACTIVEXBIN, SETTINGS, VBAPROJECT };
typedef boost::shared_ptr<OOXMLStream> Pointer_t;
virtual ~OOXMLStream() {}
@@ -245,6 +245,7 @@ public:
virtual uno::Sequence<uno::Reference<xml::dom::XDocument> > getCustomXmlDomList( ) = 0;
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;
};
diff --git a/writerfilter/source/filter/ImportFilter.cxx b/writerfilter/source/filter/ImportFilter.cxx
index f29e7ecac39a..ff47df9fbb83 100644
--- a/writerfilter/source/filter/ImportFilter.cxx
+++ b/writerfilter/source/filter/ImportFilter.cxx
@@ -203,11 +203,15 @@ sal_Bool WriterFilter::filter( const uno::Sequence< beans::PropertyValue >& aDes
// We want to keep the previous items
xDocProps->getPropertyValue( aGrabBagPropName ) >>= aGrabBag;
sal_Int32 length = aGrabBag.getLength();
- aGrabBag.realloc(length+1);
+ aGrabBag.realloc(length+2);
beans::PropertyValue* pValue = aGrabBag.getArray();
pValue[length].Name = "OOXActiveX";
pValue[length].Value = uno::makeAny( pDocument->getActiveXDomList() );
+
+ pValue[length+1].Name = "OOXActiveXBin";
+ pValue[length+1].Value = uno::makeAny( pDocument->getActiveXBinList() );
+
xDocProps->setPropertyValue( aGrabBagPropName, uno::Any( aGrabBag ) );
}
}
diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
index d71c339bf274..f272375b682a 100644
--- a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
+++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
@@ -153,6 +153,10 @@ uno::Reference<xml::dom::XDocument> OOXMLDocumentImpl::importSubStream(OOXMLStre
{
importSubStreamRelations(pStream, OOXMLStream::CUSTOMXMLPROPS);
}
+ if(OOXMLStream::ACTIVEX == nType)
+ {
+ importSubStreamRelations(pStream, OOXMLStream::ACTIVEXBIN);
+ }
return xRet;
}
@@ -160,46 +164,52 @@ uno::Reference<xml::dom::XDocument> OOXMLDocumentImpl::importSubStream(OOXMLStre
void OOXMLDocumentImpl::importSubStreamRelations(OOXMLStream::Pointer_t pStream, OOXMLStream::StreamType_t nType)
{
- // imporing itemprops files for item.xml from customXml.
- if(OOXMLStream::CUSTOMXMLPROPS == nType)
+ uno::Reference<xml::dom::XDocument> xRelation;
+ OOXMLStream::Pointer_t cStream;
+ try
{
- uno::Reference<xml::dom::XDocument> xCustomProps;
- OOXMLStream::Pointer_t cStream;
- try
- {
- cStream = OOXMLDocumentFactory::createStream(pStream, OOXMLStream::CUSTOMXMLPROPS);
- }
- catch (uno::Exception const& e)
- {
- SAL_WARN("writerfilter", "importSubStreamRelations: exception while "
- "importing stream " << nType << " : " << e.Message);
- mxCustomXmlProsDom = xCustomProps;
- }
+ cStream = OOXMLDocumentFactory::createStream(pStream, nType);
+ }
+ catch (uno::Exception const& e)
+ {
+ SAL_WARN("writerfilter", "importSubStreamRelations: exception while "
+ "importing stream " << nType << " : " << e.Message);
+ }
- uno::Reference<io::XInputStream> xcpInputStream =
- cStream->getDocumentStream();
+ uno::Reference<io::XInputStream> xcpInputStream =
+ cStream->getDocumentStream();
- if (xcpInputStream.is())
+ if (xcpInputStream.is())
+ {
+ // imporing itemprops files for item.xml from customXml.
+ if(OOXMLStream::CUSTOMXMLPROPS == nType)
{
try
{
uno::Reference<uno::XComponentContext> xcpContext(pStream->getContext());
uno::Reference<xml::dom::XDocumentBuilder> xDomBuilder(xml::dom::DocumentBuilder::create(xcpContext));
- xCustomProps = xDomBuilder->parse(xcpInputStream);
+ xRelation = xDomBuilder->parse(xcpInputStream);
}
catch (uno::Exception const& e)
{
SAL_WARN("writerfilter", "importSubStream: exception while "
"parsing stream " << nType << " : " << e.Message);
- mxCustomXmlProsDom = xCustomProps;
+ mxCustomXmlProsDom = xRelation;
}
- }
- if(xCustomProps.is())
+ if(xRelation.is())
+ {
+ mxCustomXmlProsDom = xRelation;
+ }
+ }
+ else if(OOXMLStream::ACTIVEXBIN == nType)
{
- mxCustomXmlProsDom = xCustomProps;
+ // imporing activex.bin files for activex.xml from activeX folder.
+ mxActiveXBin = xcpInputStream;
}
}
+
+
}
void OOXMLDocumentImpl::setXNoteId(const sal_Int32 nId)
@@ -527,6 +537,7 @@ void OOXMLDocumentImpl::resolveActiveXStream(Stream & rStream)
uno::Sequence< uno::Sequence< beans::StringPair > >aSeqs =
mxRelationshipAccess->getAllRelationships();
uno::Sequence<uno::Reference<xml::dom::XDocument> > mxActiveXDomListTemp(aSeqs.getLength());
+ uno::Sequence<uno::Reference<io::XInputStream> > mxActiveXBinListTemp(aSeqs.getLength());
for (sal_Int32 j = 0; j < aSeqs.getLength(); j++)
{
uno::Sequence< beans::StringPair > aSeq = aSeqs[j];
@@ -551,6 +562,10 @@ void OOXMLDocumentImpl::resolveActiveXStream(Stream & rStream)
if(activeXTemp.is())
{
mxActiveXDomListTemp[counter] = activeXTemp;
+ if(mxActiveXBin.is())
+ {
+ mxActiveXBinListTemp[counter] = mxActiveXBin;
+ }
counter++;
resolveFastSubStream(rStream, OOXMLStream::ACTIVEX);
}
@@ -558,7 +573,9 @@ void OOXMLDocumentImpl::resolveActiveXStream(Stream & rStream)
}
}
mxActiveXDomListTemp.realloc(counter);
+ mxActiveXBinListTemp.realloc(counter);
mxActiveXDomList = mxActiveXDomListTemp;
+ mxActiveXBinList = mxActiveXBinListTemp;
}
}
@@ -639,6 +656,11 @@ uno::Sequence<uno::Reference<xml::dom::XDocument> > OOXMLDocumentImpl::getActive
return mxActiveXDomList;
}
+uno::Sequence<uno::Reference<io::XInputStream> > OOXMLDocumentImpl::getActiveXBinList( )
+{
+ return mxActiveXBinList;
+}
+
OOXMLDocument *
OOXMLDocumentFactory::createDocument
(OOXMLStream::Pointer_t pStream)
diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
index 74c1006425eb..d7506cef7135 100644
--- a/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
+++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
@@ -46,6 +46,8 @@ class OOXMLDocumentImpl : public OOXMLDocument
uno::Sequence<uno::Reference<xml::dom::XDocument> > mxCustomXmlDomPropsList;
uno::Reference<xml::dom::XDocument> mxCustomXmlProsDom;
uno::Sequence<uno::Reference<xml::dom::XDocument> > mxActiveXDomList;
+ uno::Sequence<uno::Reference<io::XInputStream> > mxActiveXBinList;
+ uno::Reference<io::XInputStream> mxActiveXBin;
bool mbIsSubstream;
protected:
@@ -120,6 +122,7 @@ public:
virtual uno::Sequence<uno::Reference<xml::dom::XDocument> > getCustomXmlDomList();
virtual uno::Sequence<uno::Reference<xml::dom::XDocument> > getCustomXmlDomPropsList();
virtual uno::Sequence<uno::Reference<xml::dom::XDocument> > getActiveXDomList();
+ virtual uno::Sequence<uno::Reference<io::XInputStream> > getActiveXBinList();
};
}}
#endif // OOXML_DOCUMENT_IMPL_HXX
diff --git a/writerfilter/source/ooxml/OOXMLStreamImpl.cxx b/writerfilter/source/ooxml/OOXMLStreamImpl.cxx
index 8b658c51faeb..dd6875426b33 100644
--- a/writerfilter/source/ooxml/OOXMLStreamImpl.cxx
+++ b/writerfilter/source/ooxml/OOXMLStreamImpl.cxx
@@ -113,6 +113,7 @@ bool OOXMLStreamImpl::lcl_getTarget(uno::Reference<embed::XRelationshipAccess>
static OUString sCustomType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml");
static OUString sCustomPropsType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps");
static OUString sActiveXType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/control");
+ static OUString sActiveXBinType("http://schemas.microsoft.com/office/2006/relationships/activeXControlBinary");
static OUString sSettingsType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings");
static OUString sTarget("Target");
static OUString sTargetMode("TargetMode");
@@ -159,6 +160,9 @@ bool OOXMLStreamImpl::lcl_getTarget(uno::Reference<embed::XRelationshipAccess>
case ACTIVEX:
sStreamType = sActiveXType;
break;
+ case ACTIVEXBIN:
+ sStreamType = sActiveXBinType;
+ break;
case SETTINGS:
sStreamType = sSettingsType;
break;
@@ -189,7 +193,7 @@ bool OOXMLStreamImpl::lcl_getTarget(uno::Reference<embed::XRelationshipAccess>
bFound = true;
else if (aPair.First.compareTo(sTarget) == 0)
{
- // checking item[n].xml is not visited already.
+ // checking item[n].xml or activex[n].xml is not visited already.
if(customTarget != aPair.Second && (sStreamType == sCustomType || sStreamType == sActiveXType))
{
bFound = false;