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 )
}
}
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
{
throw embed::UnreachableStateException();
......
......@@ -43,7 +43,7 @@ namespace oox { namespace drawingml {
class OOX_DLLPUBLIC ShapeExport : public DrawingML {
private:
static int mnSpreadsheetCounter;
static int mnEmbeddeDocumentCounter;
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
......
......@@ -52,6 +52,7 @@
#include <com/sun/star/text/XSimpleText.hpp>
#include <com/sun/star/text/XText.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/XTextRange.hpp>
#include <com/sun/star/table/XTable.hpp>
......@@ -111,7 +112,7 @@ namespace oox { namespace drawingml {
mAny >>= variable;
// 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 )
: DrawingML( pFS, pFB, eDocumentType, pTextExport )
......@@ -988,47 +989,90 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape )
}
else
{
// this part now supports only embedded spreadsheets, it can be extended to support remaining ooxml documents
// only exporter, counter and object filename are specific to spreadsheet
Reference< XSpreadsheetDocument > xSheetDoc( mAny, UNO_QUERY );
if( xSheetDoc.is() && mpFB)
const bool bSpreadSheet = Reference< XSpreadsheetDocument >( mAny, UNO_QUERY ).is();
const bool bTextDocument = Reference< css::text::XTextDocument >( mAny, UNO_QUERY ).is();
if( ( bSpreadSheet || bTextDocument ) && mpFB)
{
Reference< XComponent > xDocument( mAny, UNO_QUERY );
if( xDocument.is() )
{
Reference< XOutputStream > xOutStream = mpFB->openFragmentStream( OUStringBuffer()
.appendAscii( GetComponentDir() )
.appendAscii( "/embeddings/spreadsheet" )
.append( (sal_Int32) mnSpreadsheetCounter )
.appendAscii( ".xlsx" )
.makeStringAndClear(),
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" );
Reference< XOutputStream > xOutStream;
if( bSpreadSheet )
{
xOutStream = mpFB->openFragmentStream( OUStringBuffer()
.appendAscii( GetComponentDir() )
.appendAscii( "/embeddings/spreadsheet" )
.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
Sequence< PropertyValue > rMedia(1);
rMedia[0].Name = utl::MediaDescriptor::PROP_STREAMFOROUTPUT();
rMedia[0].Value <<= xOutStream;
Reference< XExporter > xExporter(
mpFB->getComponentContext()->getServiceManager()->
createInstanceWithContext(
"com.sun.star.comp.oox.xls.ExcelFilter",
mpFB->getComponentContext() ),
UNO_QUERY_THROW );
Reference< XExporter > xExporter;
if( bSpreadSheet )
{
xExporter.set(
mpFB->getComponentContext()->getServiceManager()->
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 );
Reference< XFilter >( xExporter, UNO_QUERY_THROW )->
filter( rMedia );
xOutStream->closeOutput();
OUString sRelId = mpFB->addRelation( mpFS->getOutputStream(),
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/package",
OUStringBuffer()
.appendAscii( GetRelationCompPrefix() )
.appendAscii( "embeddings/spreadsheet" )
.append( (sal_Int32) mnSpreadsheetCounter ++ )
.appendAscii( ".xlsx" )
.makeStringAndClear() );
OUString sRelId;
if( bSpreadSheet )
{
sRelId = mpFB->addRelation( mpFS->getOutputStream(),
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/package",
OUStringBuffer()
.appendAscii( GetRelationCompPrefix() )
.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 );
......@@ -1053,10 +1097,20 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape )
mpFS->startElementNS( XML_a, XML_graphicData,
XML_uri, "http://schemas.openxmlformats.org/presentationml/2006/ole",
FSEND );
mpFS->startElementNS( mnXmlNamespace, XML_oleObj,
if( bSpreadSheet )
{
mpFS->startElementNS( mnXmlNamespace, XML_oleObj,
XML_name, "Spreadsheet",
FSNS(XML_r, XML_id), USS( sRelId ),
FSEND );
}
else
{
mpFS->startElementNS( mnXmlNamespace, XML_oleObj,
XML_name, "Document",
FSNS(XML_r, XML_id), USS( sRelId ),
FSEND );
}
mpFS->singleElementNS( mnXmlNamespace, XML_embed, FSEND );
......
......@@ -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_vcl,sd_export_tests))
$(eval $(call gb_CppunitTest_use_components,sd_export_tests,\
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_rdb,sd_export_tests,services))
$(eval $(call gb_CppunitTest_use_custom_headers,sd_export_tests,\
officecfg/registry \
......
......@@ -81,6 +81,7 @@ public:
void testSwappedOutImageExport();
void testLinkedGraphicRT();
void testImageWithSpecialID();
void testBnc822341();
CPPUNIT_TEST_SUITE(SdExportTest);
CPPUNIT_TEST(testN821567);
......@@ -100,6 +101,7 @@ public:
CPPUNIT_TEST(testSwappedOutImageExport);
CPPUNIT_TEST(testLinkedGraphicRT);
CPPUNIT_TEST(testImageWithSpecialID);
CPPUNIT_TEST(testBnc822341);
CPPUNIT_TEST_SUITE_END();
};
......@@ -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_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