summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorsushil_shinde <sushil.shinde@synerzip.com>2014-03-19 18:34:45 +0530
committerMiklos Vajna <vmiklos@collabora.co.uk>2014-03-23 11:02:16 +0100
commit23b65a84fd827555dfb84c7e2f78879c479c2f78 (patch)
tree67268495c42ca6639ab4e76d27eff53319c017d6 /writerfilter
parentcfde7ea8ee8526a66db22d690ef2de0f43c76d0b (diff)
fdo#76356 : Docx file contianing chart in footer/header gets corrupted.
- Docx file with chart in footer/header or .bin file referred in chart was getting corrupted. - Embedded file for footer.xml was not grabbaged. - .bin embedded files were not grab baged. - Added grab bag support for both case. - Added UT to check .bin files are grab baged properly. Reviewed on: https://gerrit.libreoffice.org/8674 Change-Id: I221e3867798fc2a3a42f6385d687e80b80a3678f
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/inc/ooxml/OOXMLDocument.hxx2
-rw-r--r--writerfilter/source/ooxml/OOXMLDocumentImpl.cxx68
-rw-r--r--writerfilter/source/ooxml/OOXMLDocumentImpl.hxx3
-rw-r--r--writerfilter/source/ooxml/OOXMLStreamImpl.cxx23
4 files changed, 79 insertions, 17 deletions
diff --git a/writerfilter/inc/ooxml/OOXMLDocument.hxx b/writerfilter/inc/ooxml/OOXMLDocument.hxx
index 7f104ab6aa6a..c7b4ec18bece 100644
--- a/writerfilter/inc/ooxml/OOXMLDocument.hxx
+++ b/writerfilter/inc/ooxml/OOXMLDocument.hxx
@@ -77,7 +77,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, CHARTS, EMBEDDINGS, SETTINGS, VBAPROJECT };
+ FOOTNOTES, ENDNOTES, COMMENTS, THEME, CUSTOMXML, CUSTOMXMLPROPS, ACTIVEX, ACTIVEXBIN, GLOSSARY, CHARTS, EMBEDDINGS, SETTINGS, VBAPROJECT, FOOTER, HEADER };
typedef boost::shared_ptr<OOXMLStream> Pointer_t;
virtual ~OOXMLStream() {}
diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
index 83cdb58c2ea5..9a1c50cf339f 100644
--- a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
+++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
@@ -233,6 +233,10 @@ void OOXMLDocumentImpl::importSubStreamRelations(OOXMLStream::Pointer_t pStream,
// imporing activex.bin files for activex.xml from activeX folder.
mxEmbeddings = xcpInputStream;
}
+ else if(OOXMLStream::CHARTS == nType)
+ {
+ importSubStreamRelations(cStream, OOXMLStream::EMBEDDINGS);
+ }
}
@@ -494,7 +498,7 @@ void OOXMLDocumentImpl::resolve(Stream & rStream)
if (mxGlossaryDocDom.is())
resolveGlossaryStream(rStream);
- resolveEmbeddingsStream(rStream);
+ resolveEmbeddingsStream(mpStream);
// Custom xml's are handled as part of grab bag.
resolveCustomXmlStream(rStream);
@@ -705,20 +709,25 @@ void OOXMLDocumentImpl::resolveGlossaryStream(Stream & /*rStream*/)
}
}
-void OOXMLDocumentImpl::resolveEmbeddingsStream(Stream & /*rStream*/)
+void OOXMLDocumentImpl::resolveEmbeddingsStream(OOXMLStream::Pointer_t pStream)
{
uno::Reference<embed::XRelationshipAccess> mxRelationshipAccess;
- mxRelationshipAccess.set((dynamic_cast<OOXMLStreamImpl&>(*mpStream.get())).accessDocumentStream(), uno::UNO_QUERY_THROW);
+ mxRelationshipAccess.set((dynamic_cast<OOXMLStreamImpl&>(*pStream.get())).accessDocumentStream(), uno::UNO_QUERY_THROW);
if (mxRelationshipAccess.is())
{
OUString sChartType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart");
OUString sChartTypeStrict("http://purl.oclc.org/ooxml/officeDocument/relationships/chart");
+ OUString sFootersType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer");
+ OUString sFootersTypeStrict("http://purl.oclc.org/ooxml/officeDocument/relationships/footer");
+ OUString sHeaderType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/header");
+ OUString sHeaderTypeStrict("http://purl.oclc.org/ooxml/officeDocument/relationships/header");
+
OUString sTarget("Target");
bool bFound = false;
- sal_Int32 counter = 0;
+ bool bHeaderFooterFound = false;
+ OOXMLStream::StreamType_t streamType;
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];
@@ -727,34 +736,65 @@ void OOXMLDocumentImpl::resolveEmbeddingsStream(Stream & /*rStream*/)
beans::StringPair aPair = aSeq[i];
if (aPair.Second.compareTo(sChartType) == 0 ||
aPair.Second.compareTo(sChartTypeStrict) == 0)
+ {
bFound = true;
- else if(aPair.First.compareTo(sTarget) == 0 && bFound)
+ }
+ else if(aPair.Second.compareTo(sFootersType) == 0 ||
+ aPair.Second.compareTo(sFootersTypeStrict) == 0)
+ {
+ bHeaderFooterFound = true;
+ streamType = OOXMLStream::FOOTER;
+ }
+ else if(aPair.Second.compareTo(sHeaderType) == 0 ||
+ aPair.Second.compareTo(sHeaderTypeStrict) == 0)
+ {
+ bHeaderFooterFound = true;
+ streamType = OOXMLStream::HEADER;
+ }
+ else if(aPair.First.compareTo(sTarget) == 0 && ( bFound || bHeaderFooterFound ))
{
// 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)
+ if(( bFound || bHeaderFooterFound))
{
- uno::Reference<xml::dom::XDocument> chartTemp = importSubStream(OOXMLStream::CHARTS);
+ if(bFound)
+ {
+ importSubStreamRelations(pStream, OOXMLStream::CHARTS);
+ }
+ if(bHeaderFooterFound)
+ {
+ OOXMLStream::Pointer_t Stream = OOXMLDocumentFactory::createStream(pStream, streamType);
+ if(Stream)
+ resolveEmbeddingsStream(Stream);
+ }
+
beans::PropertyValue embeddingsTemp;
- // This will add all ActiveX[n].xml to grabbag list.
- if(chartTemp.is())
+ // This will add all .xlsx and .bin to grabbag list.
+ if(bFound)
{
if(mxEmbeddings.is())
{
embeddingsTemp.Name = embeddingsTarget;
embeddingsTemp.Value = uno::makeAny(mxEmbeddings);
- mxEmbeddingsListTemp[counter] = embeddingsTemp;
+ mxEmbeddingsListTemp.push_back(embeddingsTemp);
+ mxEmbeddings.clear();
}
- counter++;
}
bFound = false;
+ bHeaderFooterFound = false;
}
}
- mxEmbeddingsListTemp.realloc(counter);
- mxEmbeddingsList = mxEmbeddingsListTemp;
+ }
+ if(0 != mxEmbeddingsListTemp.size())
+ {
+ mxEmbeddingsList.realloc(mxEmbeddingsListTemp.size());
+ for (size_t i = 0; i < mxEmbeddingsListTemp.size(); i++)
+ {
+ mxEmbeddingsList[i] = mxEmbeddingsListTemp[i];
+ }
}
}
diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
index 4af757030bbb..c36945af6aab 100644
--- a/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
+++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
@@ -53,6 +53,7 @@ class OOXMLDocumentImpl : public OOXMLDocument
uno::Reference<io::XInputStream> mxActiveXBin;
uno::Reference<io::XInputStream> mxEmbeddings;
uno::Sequence < beans::PropertyValue > mxEmbeddingsList;
+ std::vector<beans::PropertyValue> mxEmbeddingsListTemp;
bool mbIsSubstream;
/// How many paragraphs equal to 1 percent?
sal_Int32 mnPercentSize;
@@ -87,7 +88,7 @@ protected:
void resolveCustomXmlStream(Stream & rStream);
void resolveActiveXStream(Stream & rStream);
void resolveGlossaryStream(Stream & rStream);
- void resolveEmbeddingsStream(Stream & rStream);
+ void resolveEmbeddingsStream(OOXMLStream::Pointer_t pStream);
public:
OOXMLDocumentImpl(OOXMLStream::Pointer_t pStream, const uno::Reference<task::XStatusIndicator>& xStatusIndicator);
virtual ~OOXMLDocumentImpl();
diff --git a/writerfilter/source/ooxml/OOXMLStreamImpl.cxx b/writerfilter/source/ooxml/OOXMLStreamImpl.cxx
index 8f81842dd2ca..6c6b2ee3cdbb 100644
--- a/writerfilter/source/ooxml/OOXMLStreamImpl.cxx
+++ b/writerfilter/source/ooxml/OOXMLStreamImpl.cxx
@@ -119,6 +119,9 @@ bool OOXMLStreamImpl::lcl_getTarget(uno::Reference<embed::XRelationshipAccess>
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 sFooterType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer");
+ static OUString sHeaderType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/header");
+ static OUString sOleObjectType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject");
// OOXML strict
static OUString sDocumentTypeStrict("http://purl.oclc.org/ooxml/officeDocument/relationships/officeDocument");
static OUString sStylesTypeStrict("http://purl.oclc.org/ooxml/officeDocument/relationships/styles");
@@ -136,6 +139,9 @@ bool OOXMLStreamImpl::lcl_getTarget(uno::Reference<embed::XRelationshipAccess>
static OUString sSettingsTypeStrict("http://purl.oclc.org/ooxml/officeDocument/relationships/settings");
static OUString sChartTypeStrict("http://purl.oclc.org/ooxml/officeDocument/relationships/chart");
static OUString sEmbeddingsTypeStrict("http://purl.oclc.org/ooxml/officeDocument/relationships/package");
+ static OUString sFootersTypeStrict("http://purl.oclc.org/ooxml/officeDocument/relationships/footer");
+ static OUString sHeaderTypeStrict("http://purl.oclc.org/ooxml/officeDocument/relationships/header");
+ static OUString sOleObjectTypeStrict("http://purl.oclc.org/ooxml/officeDocument/relationships/oleObject");
static OUString sTarget("Target");
static OUString sTargetMode("TargetMode");
static OUString sExternal("External");
@@ -218,6 +224,14 @@ bool OOXMLStreamImpl::lcl_getTarget(uno::Reference<embed::XRelationshipAccess>
sStreamType = sEmbeddingsType;
sStreamTypeStrict = sEmbeddingsTypeStrict;
break;
+ case FOOTER:
+ sStreamType = sFooterType;
+ sStreamTypeStrict = sFootersTypeStrict;
+ break;
+ case HEADER:
+ sStreamType = sHeaderType;
+ sStreamTypeStrict = sHeaderTypeStrict;
+ break;
default:
break;
}
@@ -241,13 +255,20 @@ bool OOXMLStreamImpl::lcl_getTarget(uno::Reference<embed::XRelationshipAccess>
( aPair.Second.compareTo(sStreamType) == 0 ||
aPair.Second.compareTo(sStreamTypeStrict) == 0))
bFound = true;
+ else if(aPair.First.compareTo(sType) == 0 &&
+ ((aPair.Second.compareTo(sOleObjectType) == 0 ||
+ aPair.Second.compareTo(sOleObjectTypeStrict) == 0) &&
+ nStreamType == EMBEDDINGS))
+ {
+ bFound = true;
+ }
else if (aPair.First.compareTo(sId) == 0 &&
aPair.Second.compareTo(rId) == 0)
bFound = true;
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 || sStreamType == sChartType))
+ if(customTarget != aPair.Second && (sStreamType == sCustomType || sStreamType == sActiveXType || sStreamType == sChartType || sStreamType == sFooterType || sStreamType == sHeaderType))
{
bFound = false;
}