import chart MSO 2007 streams correctly for docx files, tdf#82216

Change-Id: Icda809faf315dac5953d38781b2b401d51f7a40a
This commit is contained in:
Markus Mohrhard
2015-04-19 02:59:39 +02:00
parent 6f969d256f
commit 914b4fb5a3
6 changed files with 36 additions and 12 deletions

View File

@@ -236,6 +236,9 @@ public:
bool isMSO2007Document() const;
void checkDocumentProperties(
com::sun::star::uno::Reference<com::sun::star::document::XDocumentProperties> xDocProps);
protected:
virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >
implGetInputStream( utl::MediaDescriptor& rMediaDesc ) const SAL_OVERRIDE;

View File

@@ -24,6 +24,7 @@
#include <com/sun/star/drawing/XDrawPage.idl>
#include <com/sun/star/frame/XModel.idl>
#include <com/sun/star/io/XInputStream.idl>
#include <com/sun/star/document/XDocumentProperties.idl>
module com { module sun { module star { module xml { module sax {
@@ -43,6 +44,7 @@ interface XFastShapeContextHandler: com::sun::star::xml::sax::XFastContextHandle
[attribute] string RelationFragmentPath;
[attribute] long StartToken;
[attribute] com::sun::star::awt::Point Position;
[attribute] com::sun::star::document::XDocumentProperties DocumentProperties;
};

View File

@@ -223,33 +223,30 @@ XmlFilterBase::~XmlFilterBase()
mxImpl->maFastParser.setDocumentHandler( 0 );
}
namespace {
bool is2007MSODocument(Reference<XDocumentProperties> xDocProps)
void XmlFilterBase::checkDocumentProperties(Reference<XDocumentProperties> xDocProps)
{
mbMSO2007 = false;
if (!xDocProps->getGenerator().startsWithIgnoreAsciiCase("Microsoft"))
return false;
return;
uno::Reference<beans::XPropertyAccess> xUserDefProps(xDocProps->getUserDefinedProperties(), uno::UNO_QUERY);
if (!xUserDefProps.is())
return false;
return;
comphelper::SequenceAsHashMap aUserDefinedProperties(xUserDefProps->getPropertyValues());
comphelper::SequenceAsHashMap::iterator it = aUserDefinedProperties.find("AppVersion");
if (it == aUserDefinedProperties.end())
return false;
return;
OUString aValue;
if (!(it->second >>= aValue))
return false;
return;
if (!aValue.startsWithIgnoreAsciiCase("12."))
return false;
return;
SAL_WARN("oox", "a MSO 2007 document");
return true;
}
mbMSO2007 = true;
}
void XmlFilterBase::importDocumentProperties()
@@ -270,7 +267,7 @@ void XmlFilterBase::importDocumentProperties()
Reference< XDocumentPropertiesSupplier > xPropSupplier( xModel, UNO_QUERY);
Reference< XDocumentProperties > xDocProps = xPropSupplier->getDocumentProperties();
xImporter->importProperties( xDocumentStorage, xDocProps );
mbMSO2007 = is2007MSODocument(xDocProps);
checkDocumentProperties(xDocProps);
}
FastParser* XmlFilterBase::createParser() const

View File

@@ -620,6 +620,19 @@ void SAL_CALL ShapeContextHandler::setPosition(const awt::Point& rPosition) thro
maPosition = rPosition;
}
void SAL_CALL ShapeContextHandler::setDocumentProperties(const uno::Reference<document::XDocumentProperties>& xDocProps)
throw (css::uno::RuntimeException, std::exception)
{
mxDocumentProperties = xDocProps;
mxFilterBase->checkDocumentProperties(mxDocumentProperties);
}
uno::Reference<document::XDocumentProperties> SAL_CALL ShapeContextHandler::getDocumentProperties()
throw (css::uno::RuntimeException, std::exception)
{
return mxDocumentProperties;
}
OUString ShapeContextHandler::getImplementationName()
throw (css::uno::RuntimeException, std::exception)
{

View File

@@ -30,6 +30,7 @@
#include "oox/core/xmlfilterbase.hxx"
#include "ShapeFilterBase.hxx"
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/document/XDocumentProperties.hpp>
namespace oox { namespace shape {
@@ -138,6 +139,11 @@ public:
virtual css::awt::Point SAL_CALL getPosition() throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
virtual void SAL_CALL setPosition(const css::awt::Point& rPosition) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
virtual void SAL_CALL setDocumentProperties(const css::uno::Reference<css::document::XDocumentProperties>& xDocProps)
throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
virtual css::uno::Reference<css::document::XDocumentProperties> SAL_CALL getDocumentProperties()
throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
private:
ShapeContextHandler(ShapeContextHandler &) SAL_DELETED_FUNCTION;
void operator =(ShapeContextHandler &) SAL_DELETED_FUNCTION;
@@ -159,6 +165,7 @@ private:
css::uno::Reference<css::drawing::XShape> mxSavedShape;
css::uno::Reference<XFastContextHandler> mxWpgContext;
css::uno::Reference<XFastContextHandler> mxChartShapeContext;
css::uno::Reference<css::document::XDocumentProperties> mxDocumentProperties;
core::XmlFilterRef mxFilterBase;
drawingml::ThemePtr mpThemePtr;

View File

@@ -1532,6 +1532,8 @@ OOXMLFastContextHandlerShape::OOXMLFastContextHandlerShape
}
mrShapeContext->setModel(getDocument()->getModel());
uno::Reference<document::XDocumentPropertiesSupplier> xDocSupplier(getDocument()->getModel(), uno::UNO_QUERY_THROW);
mrShapeContext->setDocumentProperties(xDocSupplier->getDocumentProperties());
mrShapeContext->setDrawPage(getDocument()->getDrawPage());
mrShapeContext->setInputStream(getDocument()->getStorageStream());