diff options
author | David Tardon <dtardon@redhat.com> | 2013-05-16 15:27:08 +0200 |
---|---|---|
committer | Petr Mladek <pmladek@suse.cz> | 2013-05-28 15:13:22 +0000 |
commit | 7096efde95732b613dfa76df61a343b96ec6f979 (patch) | |
tree | ea30c9e4905b251de8c38715eb153e5341af13bf /reportdesign | |
parent | 686e0e1397e30b156a92505ed40de6cc71b34b0d (diff) |
fdo#64279 do not crash opening report for editing
There are two problems:
1) The classes derived from SdrObject cache their SvxShape, but do not
implement impl_setUnoShape().
2) There is a lifetime issue in association of a SdrObject and its
SvxShape. SvxDrawPage::CreateSdrObject not only creates a new SdrObject
for a shape, but also inserts it into the page. At this point, the shape
has not been attached to the object yet. That means that the object
creates another shape at one point during the InsertObject call,
which is then destroyed again. But reportdesign shapes own their
objects, which means that destuction of the shape causes destruction
of the object too...
My first idea was to disable the insertion in
SvxDrawPage::CreateSdrObject, but it has been there since the dawn of
time, so I did not gather the courage to do that. Instead, I put in a
hack to allow to skip the insertion.
Change-Id: I888a54067be1934578434d8b476a13a7ff8d02b3
(cherry picked from commit 02d03eb4ad6e64744659c5fe04282b25b66c28d8)
Signed-off-by: David Tardon <dtardon@redhat.com>
Conflicts:
include/svx/svdobj.hxx
Change-Id: I36406f399092c2c85278633d2ee7c953fc76f1bc
Reviewed-on: https://gerrit.libreoffice.org/4071
Reviewed-by: Petr Mladek <pmladek@suse.cz>
Tested-by: Petr Mladek <pmladek@suse.cz>
Diffstat (limited to 'reportdesign')
-rw-r--r-- | reportdesign/inc/RptObject.hxx | 6 | ||||
-rw-r--r-- | reportdesign/source/core/sdr/RptObject.cxx | 24 |
2 files changed, 30 insertions, 0 deletions
diff --git a/reportdesign/inc/RptObject.hxx b/reportdesign/inc/RptObject.hxx index 7a11c4e52c50..25508bffdfdb 100644 --- a/reportdesign/inc/RptObject.hxx +++ b/reportdesign/inc/RptObject.hxx @@ -169,6 +169,9 @@ public: virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > getUnoShape(); virtual sal_uInt16 GetObjIdentifier() const; virtual sal_uInt32 GetObjInventor() const; + +private: + virtual void impl_setUnoShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& rxUnoShape ); }; //============================================================================ @@ -182,6 +185,8 @@ class REPORTDESIGN_DLLPUBLIC OOle2Obj: public SdrOle2Obj , public OObjectBase sal_uInt16 m_nType; bool m_bOnlyOnce; void impl_createDataProvider_nothrow( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel>& _xModel); + virtual void impl_setUnoShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& rxUnoShape ); + public: static OOle2Obj* Create( const ::com::sun::star::uno::Reference< ::com::sun::star::report::XReportComponent>& _xComponent,sal_uInt16 _nType ) { @@ -271,6 +276,7 @@ public: OUnoObject& operator=(const OUnoObject& rObj); private: + virtual void impl_setUnoShape( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& rxUnoShape ); void impl_setReportComponent_nothrow(); void impl_initializeModel_nothrow(); }; diff --git a/reportdesign/source/core/sdr/RptObject.cxx b/reportdesign/source/core/sdr/RptObject.cxx index 13fb18ae6372..d6b20c732ac1 100644 --- a/reportdesign/source/core/sdr/RptObject.cxx +++ b/reportdesign/source/core/sdr/RptObject.cxx @@ -166,6 +166,9 @@ SdrObject* OObjectBase::createObject(const uno::Reference< report::XReportCompon break; } + if ( pNewObj ) + pNewObj->SetDoNotInsertIntoPageAutomatically( true ); + ensureSdrObjectOwnership( _xComponent ); return pNewObj; @@ -609,6 +612,13 @@ uno::Reference< uno::XInterface > OCustomShape::getUnoShape() return xShape; } +void OCustomShape::impl_setUnoShape( const uno::Reference< uno::XInterface >& rxUnoShape ) +{ + SdrObjCustomShape::impl_setUnoShape( rxUnoShape ); + releaseUnoShape(); + m_xReportComponent.clear(); +} + //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- TYPEINIT1(OUnoObject, SdrUnoObj); @@ -932,6 +942,12 @@ uno::Reference< uno::XInterface > OUnoObject::getUnoShape() return OObjectBase::getUnoShapeOf( *this ); } +void OUnoObject::impl_setUnoShape( const uno::Reference< uno::XInterface >& rxUnoShape ) +{ + SdrUnoObj::impl_setUnoShape( rxUnoShape ); + releaseUnoShape(); +} + OUnoObject& OUnoObject::operator=(const OUnoObject& rObj) { if( this == &rObj ) @@ -1135,6 +1151,14 @@ uno::Reference< uno::XInterface > OOle2Obj::getUnoShape() } return xShape; } + +void OOle2Obj::impl_setUnoShape( const uno::Reference< uno::XInterface >& rxUnoShape ) +{ + SdrOle2Obj::impl_setUnoShape( rxUnoShape ); + releaseUnoShape(); + m_xReportComponent.clear(); +} + // ----------------------------------------------------------------------------- uno::Reference< chart2::data::XDatabaseDataProvider > lcl_getDataProvider(const uno::Reference < embed::XEmbeddedObject >& _xObj) { |