Kaydet (Commit) 0c3d5fb0 authored tarafından Zolnai Tamás's avatar Zolnai Tamás

bnc#822341: PPTX export of embedded text documents

-Make embedded text documents exported by analogy with spreadsheet
embedded documents.
-Convert MS ole objects to LO sepcific objecst to allow
exporting those ole objects too.

Plus use gb_CppunitTest_use_rdb instead of wasting time on
finding out which missing components cause test failing.
Especcially when we have platform dependent components
(e.g. related to embedded object)

Change-Id: Ic76d659b51274777a1669c215344a1169ebcba81
üst ce6f9cbb
...@@ -587,6 +587,17 @@ void SAL_CALL OleEmbeddedObject::changeState( sal_Int32 nNewState ) ...@@ -587,6 +587,17 @@ void SAL_CALL OleEmbeddedObject::changeState( sal_Int32 nNewState )
} }
} }
else else
#else
// if it is possible, the object will be converted to OOo format
if ( !m_bTriedConversion )
{
m_bTriedConversion = true;
if ( TryToConvertToOOo() )
{
changeState( nNewState );
return;
}
}
#endif #endif
{ {
throw embed::UnreachableStateException(); throw embed::UnreachableStateException();
......
...@@ -43,7 +43,7 @@ namespace oox { namespace drawingml { ...@@ -43,7 +43,7 @@ namespace oox { namespace drawingml {
class OOX_DLLPUBLIC ShapeExport : public DrawingML { class OOX_DLLPUBLIC ShapeExport : public DrawingML {
private: private:
static int mnSpreadsheetCounter; static int mnEmbeddeDocumentCounter;
struct ShapeCheck struct ShapeCheck
{ {
bool operator()( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape> s1, const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape> s2 ) const bool operator()( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape> s1, const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape> s2 ) const
......
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#include <com/sun/star/text/XSimpleText.hpp> #include <com/sun/star/text/XSimpleText.hpp>
#include <com/sun/star/text/XText.hpp> #include <com/sun/star/text/XText.hpp>
#include <com/sun/star/text/XTextContent.hpp> #include <com/sun/star/text/XTextContent.hpp>
#include <com/sun/star/text/XTextDocument.hpp>
#include <com/sun/star/text/XTextField.hpp> #include <com/sun/star/text/XTextField.hpp>
#include <com/sun/star/text/XTextRange.hpp> #include <com/sun/star/text/XTextRange.hpp>
#include <com/sun/star/table/XTable.hpp> #include <com/sun/star/table/XTable.hpp>
...@@ -111,7 +112,7 @@ namespace oox { namespace drawingml { ...@@ -111,7 +112,7 @@ namespace oox { namespace drawingml {
mAny >>= variable; mAny >>= variable;
// not thread safe // not thread safe
int ShapeExport::mnSpreadsheetCounter = 1; int ShapeExport::mnEmbeddeDocumentCounter = 1;
ShapeExport::ShapeExport( sal_Int32 nXmlNamespace, FSHelperPtr pFS, ShapeHashMap* pShapeMap, XmlFilterBase* pFB, DocumentType eDocumentType, DMLTextExport* pTextExport ) ShapeExport::ShapeExport( sal_Int32 nXmlNamespace, FSHelperPtr pFS, ShapeHashMap* pShapeMap, XmlFilterBase* pFB, DocumentType eDocumentType, DMLTextExport* pTextExport )
: DrawingML( pFS, pFB, eDocumentType, pTextExport ) : DrawingML( pFS, pFB, eDocumentType, pTextExport )
...@@ -988,47 +989,90 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape ) ...@@ -988,47 +989,90 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape )
} }
else else
{ {
// this part now supports only embedded spreadsheets, it can be extended to support remaining ooxml documents const bool bSpreadSheet = Reference< XSpreadsheetDocument >( mAny, UNO_QUERY ).is();
// only exporter, counter and object filename are specific to spreadsheet const bool bTextDocument = Reference< css::text::XTextDocument >( mAny, UNO_QUERY ).is();
Reference< XSpreadsheetDocument > xSheetDoc( mAny, UNO_QUERY ); if( ( bSpreadSheet || bTextDocument ) && mpFB)
if( xSheetDoc.is() && mpFB)
{ {
Reference< XComponent > xDocument( mAny, UNO_QUERY ); Reference< XComponent > xDocument( mAny, UNO_QUERY );
if( xDocument.is() ) if( xDocument.is() )
{ {
Reference< XOutputStream > xOutStream = mpFB->openFragmentStream( OUStringBuffer() Reference< XOutputStream > xOutStream;
.appendAscii( GetComponentDir() ) if( bSpreadSheet )
.appendAscii( "/embeddings/spreadsheet" ) {
.append( (sal_Int32) mnSpreadsheetCounter ) xOutStream = mpFB->openFragmentStream( OUStringBuffer()
.appendAscii( ".xlsx" ) .appendAscii( GetComponentDir() )
.makeStringAndClear(), .appendAscii( "/embeddings/spreadsheet" )
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ); .append( static_cast<sal_Int32>(mnEmbeddeDocumentCounter) )
.appendAscii( ".xlsx" )
.makeStringAndClear(),
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" );
}
else
{
xOutStream = mpFB->openFragmentStream( OUStringBuffer()
.appendAscii( GetComponentDir() )
.appendAscii( "/embeddings/textdocument" )
.append( static_cast<sal_Int32>(mnEmbeddeDocumentCounter) )
.appendAscii( ".docx" )
.makeStringAndClear(),
"application/vnd.openxmlformats-officedocument.wordprocessingml.document" );
}
// export the embedded document // export the embedded document
Sequence< PropertyValue > rMedia(1); Sequence< PropertyValue > rMedia(1);
rMedia[0].Name = utl::MediaDescriptor::PROP_STREAMFOROUTPUT(); rMedia[0].Name = utl::MediaDescriptor::PROP_STREAMFOROUTPUT();
rMedia[0].Value <<= xOutStream; rMedia[0].Value <<= xOutStream;
Reference< XExporter > xExporter( Reference< XExporter > xExporter;
mpFB->getComponentContext()->getServiceManager()-> if( bSpreadSheet )
createInstanceWithContext( {
"com.sun.star.comp.oox.xls.ExcelFilter", xExporter.set(
mpFB->getComponentContext() ), mpFB->getComponentContext()->getServiceManager()->
UNO_QUERY_THROW ); createInstanceWithContext(
"com.sun.star.comp.oox.xls.ExcelFilter",
mpFB->getComponentContext() ),
UNO_QUERY_THROW );
}
else
{
xExporter.set(
mpFB->getComponentContext()->getServiceManager()->
createInstanceWithContext(
"com.sun.star.comp.Writer.WriterFilter",
mpFB->getComponentContext() ),
UNO_QUERY_THROW );
}
xExporter->setSourceDocument( xDocument ); xExporter->setSourceDocument( xDocument );
Reference< XFilter >( xExporter, UNO_QUERY_THROW )-> Reference< XFilter >( xExporter, UNO_QUERY_THROW )->
filter( rMedia ); filter( rMedia );
xOutStream->closeOutput(); xOutStream->closeOutput();
OUString sRelId = mpFB->addRelation( mpFS->getOutputStream(), OUString sRelId;
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/package", if( bSpreadSheet )
OUStringBuffer() {
.appendAscii( GetRelationCompPrefix() ) sRelId = mpFB->addRelation( mpFS->getOutputStream(),
.appendAscii( "embeddings/spreadsheet" ) "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package",
.append( (sal_Int32) mnSpreadsheetCounter ++ ) OUStringBuffer()
.appendAscii( ".xlsx" ) .appendAscii( GetRelationCompPrefix() )
.makeStringAndClear() ); .appendAscii( "embeddings/spreadsheet" )
.append( static_cast<sal_Int32>(mnEmbeddeDocumentCounter++) )
.appendAscii( ".xlsx" )
.makeStringAndClear() );
}
else
{
sRelId = mpFB->addRelation( mpFS->getOutputStream(),
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/package",
OUStringBuffer()
.appendAscii( GetRelationCompPrefix() )
.appendAscii( "embeddings/textdocument" )
.append( static_cast<sal_Int32>(mnEmbeddeDocumentCounter++) )
.appendAscii( ".docx" )
.makeStringAndClear() );
}
mpFS->startElementNS( mnXmlNamespace, XML_graphicFrame, FSEND ); mpFS->startElementNS( mnXmlNamespace, XML_graphicFrame, FSEND );
...@@ -1053,10 +1097,20 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape ) ...@@ -1053,10 +1097,20 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape )
mpFS->startElementNS( XML_a, XML_graphicData, mpFS->startElementNS( XML_a, XML_graphicData,
XML_uri, "http://schemas.openxmlformats.org/presentationml/2006/ole", XML_uri, "http://schemas.openxmlformats.org/presentationml/2006/ole",
FSEND ); FSEND );
mpFS->startElementNS( mnXmlNamespace, XML_oleObj, if( bSpreadSheet )
{
mpFS->startElementNS( mnXmlNamespace, XML_oleObj,
XML_name, "Spreadsheet", XML_name, "Spreadsheet",
FSNS(XML_r, XML_id), USS( sRelId ), FSNS(XML_r, XML_id), USS( sRelId ),
FSEND ); FSEND );
}
else
{
mpFS->startElementNS( mnXmlNamespace, XML_oleObj,
XML_name, "Document",
FSNS(XML_r, XML_id), USS( sRelId ),
FSEND );
}
mpFS->singleElementNS( mnXmlNamespace, XML_embed, FSEND ); mpFS->singleElementNS( mnXmlNamespace, XML_embed, FSEND );
......
...@@ -65,46 +65,7 @@ $(eval $(call gb_CppunitTest_use_api,sd_export_tests,\ ...@@ -65,46 +65,7 @@ $(eval $(call gb_CppunitTest_use_api,sd_export_tests,\
$(eval $(call gb_CppunitTest_use_ure,sd_export_tests)) $(eval $(call gb_CppunitTest_use_ure,sd_export_tests))
$(eval $(call gb_CppunitTest_use_vcl,sd_export_tests)) $(eval $(call gb_CppunitTest_use_vcl,sd_export_tests))
$(eval $(call gb_CppunitTest_use_components,sd_export_tests,\ $(eval $(call gb_CppunitTest_use_rdb,sd_export_tests,services))
animations/source/animcore/animcore \
basic/util/sb \
chart2/source/chartcore \
chart2/source/controller/chartcontroller \
comphelper/util/comphelp \
configmgr/source/configmgr \
dbaccess/util/dba \
desktop/source/deployment/deployment \
embeddedobj/util/embobj \
filter/source/config/cache/filterconfig1 \
filter/source/svg/svgfilter \
forms/util/frm \
framework/util/fwk \
i18npool/util/i18npool \
linguistic/source/lng \
oox/util/oox \
package/source/xstor/xstor \
package/util/package2 \
sax/source/expatwrap/expwrap \
sd/util/sd \
sd/util/sdfilt \
sd/util/sdd \
sfx2/util/sfx \
sot/util/sot \
svl/source/fsstor/fsstorage \
svtools/util/svt \
toolkit/util/tk \
ucb/source/core/ucb1 \
ucb/source/ucp/expand/ucpexpand1 \
ucb/source/ucp/file/ucpfile1 \
ucb/source/ucp/package/ucppkg1 \
ucb/source/ucp/tdoc/ucptdoc1 \
unotools/util/utl \
unoxml/source/rdf/unordf \
unoxml/source/service/unoxml \
xmloff/util/xo \
xmlsecurity/util/xsec_fw \
xmlsecurity/util/xmlsecurity \
))
$(eval $(call gb_CppunitTest_use_custom_headers,sd_export_tests,\ $(eval $(call gb_CppunitTest_use_custom_headers,sd_export_tests,\
officecfg/registry \ officecfg/registry \
......
...@@ -81,6 +81,7 @@ public: ...@@ -81,6 +81,7 @@ public:
void testSwappedOutImageExport(); void testSwappedOutImageExport();
void testLinkedGraphicRT(); void testLinkedGraphicRT();
void testImageWithSpecialID(); void testImageWithSpecialID();
void testBnc822341();
CPPUNIT_TEST_SUITE(SdExportTest); CPPUNIT_TEST_SUITE(SdExportTest);
CPPUNIT_TEST(testN821567); CPPUNIT_TEST(testN821567);
...@@ -100,6 +101,7 @@ public: ...@@ -100,6 +101,7 @@ public:
CPPUNIT_TEST(testSwappedOutImageExport); CPPUNIT_TEST(testSwappedOutImageExport);
CPPUNIT_TEST(testLinkedGraphicRT); CPPUNIT_TEST(testLinkedGraphicRT);
CPPUNIT_TEST(testImageWithSpecialID); CPPUNIT_TEST(testImageWithSpecialID);
CPPUNIT_TEST(testBnc822341);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
}; };
...@@ -720,6 +722,41 @@ void SdExportTest::testImageWithSpecialID() ...@@ -720,6 +722,41 @@ void SdExportTest::testImageWithSpecialID()
} }
} }
void SdExportTest::testBnc822341()
{
// Check import / export of embedded text document
::sd::DrawDocShellRef xDocShRef = loadURL(getURLFromSrc("sd/qa/unit/data/odp/bnc822341.odp"), ODP);
xDocShRef = saveAndReload( xDocShRef, PPTX );
// Export an LO specific ole object (exported from an ODP document)
{
SdDrawDocument *pDoc = xDocShRef->GetDoc();
CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != NULL );
const SdrPage *pPage = pDoc->GetPage(1);
CPPUNIT_ASSERT_MESSAGE( "no page", pPage != NULL );
const SdrObject* pObj = dynamic_cast<SdrObject*>( pPage->GetObj(0) );
CPPUNIT_ASSERT_MESSAGE( "no object", pObj != NULL);
CPPUNIT_ASSERT_EQUAL( static_cast<sal_uInt16>(OBJ_OLE2), pObj->GetObjIdentifier() );
}
xDocShRef = saveAndReload( xDocShRef, PPTX );
// Export an MS specific ole object (exported from a PPTX document)
{
SdDrawDocument *pDoc = xDocShRef->GetDoc();
CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != NULL );
const SdrPage *pPage = pDoc->GetPage(1);
CPPUNIT_ASSERT_MESSAGE( "no page", pPage != NULL );
const SdrObject* pObj = dynamic_cast<SdrObject*>( pPage->GetObj(0) );
CPPUNIT_ASSERT_MESSAGE( "no object", pObj != NULL);
CPPUNIT_ASSERT_EQUAL( static_cast<sal_uInt16>(OBJ_OLE2), pObj->GetObjIdentifier() );
}
xDocShRef->DoClose();
}
CPPUNIT_TEST_SUITE_REGISTRATION(SdExportTest); CPPUNIT_TEST_SUITE_REGISTRATION(SdExportTest);
CPPUNIT_PLUGIN_IMPLEMENT(); CPPUNIT_PLUGIN_IMPLEMENT();
......
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