On Thu, Aug 25, 2011 at 10:10:16PM +0200, Stephan Bergmann wrote:

> A number of comments on the patch:

> - The OPropertySetHelper2 ctor(s) should not be inline.  (See how eventually 
> making use of OPropertySetHelper::m_pReserved would not have worked if 
> OPropertySetHelper's ctors had been inline.)

Yes, good catch.

> - For the question of which symbols for OPropertySetHelper2 to list
> in the various map files, see
> <http://udk.openoffice.org/common/man/apicppclasses.html> (you
> probably need access to builds on the various platforms to find out
> the correct mangled names).

It does not say to export the vtable; I assume the vtable "obviously"
has to be exported.

It says:

  If the destructor of a class is declared virtual, declare the
  destructors of all its base classes virtual. (To have a dedicated
  place where RTTI for the base classes is generated, which is
  referenced by the RTTI for the derived class. Since in general you
  cannot control the ways a class is used, the best advice probably is
  to do this for each class that is intended to be subclassed.)

Well, we cannot do that anymore, since that would break ABI on
OPropertySetHelper2. Can we "safely" ignore this instruction here?


Revised patch attached; if it is good to go (especially with respect
to questions above), I'll commit (with a better commit message).

-- 
Lionel
>From 87dcabb49bac0c39a9af111562d40f4995099ca5 Mon Sep 17 00:00:00 2001
From: Lionel Elie Mamane <lio...@mamane.lu>
Date: Fri, 2 Sep 2011 14:57:30 +0200
Subject: [PATCH] TMP: in-progress-ABI-breakage-fix

---
 comphelper/inc/comphelper/propstate.hxx  |    4 +-
 comphelper/source/property/propstate.cxx |    4 +-
 cppuhelper/inc/cppuhelper/propshlp.hxx   |  111 +++++++++++++++++++++++++++---
 cppuhelper/source/gcc3.map               |    9 ++-
 cppuhelper/source/msvc_win32_intel.map   |    7 +-
 cppuhelper/source/propshlp.cxx           |   34 ++++++----
 6 files changed, 136 insertions(+), 33 deletions(-)

diff --git a/comphelper/inc/comphelper/propstate.hxx b/comphelper/inc/comphelper/propstate.hxx
index 2c8f06f..b99f75f 100644
--- a/comphelper/inc/comphelper/propstate.hxx
+++ b/comphelper/inc/comphelper/propstate.hxx
@@ -54,11 +54,11 @@ namespace comphelper
     //= OPropertyStateHelper
     //==================================================================
     /// helper class for implementing property states
-    class COMPHELPER_DLLPUBLIC OPropertyStateHelper :public ::cppu::OPropertySetHelper
+    class COMPHELPER_DLLPUBLIC OPropertyStateHelper :public ::cppu::OPropertySetHelper2
                                                     ,public ::com::sun::star::beans::XPropertyState
     {
     public:
-        OPropertyStateHelper(::cppu::OBroadcastHelper& rBHlp):OPropertySetHelper(rBHlp) { }
+        OPropertyStateHelper(::cppu::OBroadcastHelper& rBHlp):OPropertySetHelper2(rBHlp) { }
         OPropertyStateHelper(::cppu::OBroadcastHelper& rBHlp,
                              ::cppu::IEventNotificationHook *i_pFireEvents);
 
diff --git a/comphelper/source/property/propstate.cxx b/comphelper/source/property/propstate.cxx
index ec621cb..3859f6a 100644
--- a/comphelper/source/property/propstate.cxx
+++ b/comphelper/source/property/propstate.cxx
@@ -57,7 +57,7 @@ namespace comphelper
     //---------------------------------------------------------------------
     ::com::sun::star::uno::Any SAL_CALL OPropertyStateHelper::queryInterface(const  ::com::sun::star::uno::Type& _rType) throw( ::com::sun::star::uno::RuntimeException)
     {
-        ::com::sun::star::uno::Any aReturn = OPropertySetHelper::queryInterface(_rType);
+        ::com::sun::star::uno::Any aReturn = OPropertySetHelper2::queryInterface(_rType);
         // our own ifaces
         if ( !aReturn.hasValue() )
             aReturn = ::cppu::queryInterface(_rType, static_cast< ::com::sun::star::beans::XPropertyState*>(this));
@@ -82,7 +82,7 @@ namespace comphelper
     OPropertyStateHelper::OPropertyStateHelper(
         ::cppu::OBroadcastHelper& rBHlp,
         ::cppu::IEventNotificationHook *i_pFireEvents)
-        :   ::cppu::OPropertySetHelper(rBHlp, i_pFireEvents) { }
+        :   ::cppu::OPropertySetHelper2(rBHlp, i_pFireEvents) { }
 
     OPropertyStateHelper::~OPropertyStateHelper() {}
 
diff --git a/cppuhelper/inc/cppuhelper/propshlp.hxx b/cppuhelper/inc/cppuhelper/propshlp.hxx
index 670ce03..737aec9 100644
--- a/cppuhelper/inc/cppuhelper/propshlp.hxx
+++ b/cppuhelper/inc/cppuhelper/propshlp.hxx
@@ -351,8 +351,7 @@ public:
  */
 class OPropertySetHelper : public ::com::sun::star::beans::XMultiPropertySet,
                            public ::com::sun::star::beans::XFastPropertySet,
-                           public ::com::sun::star::beans::XPropertySet,
-                           public ::com::sun::star::beans::XPropertySetOption
+                           public ::com::sun::star::beans::XPropertySet
 {
 public:
     /**
@@ -412,7 +411,7 @@ public:
        Only returns a reference to XMultiPropertySet, XFastPropertySet, XPropertySet and
        XEventListener.
      */
-    ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType )
+    virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType )
         throw (::com::sun::star::uno::RuntimeException);
 
     /** eases implementing XTypeProvider::getTypes, returns the types of XMultiPropertySet, XFastPropertySet, XPropertySet
@@ -506,10 +505,6 @@ public:
         const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener > & Listener )
         throw(::com::sun::star::uno::RuntimeException);
 
-    // XPropertySetOption
-    virtual void SAL_CALL enableChangeListenerNotification( sal_Bool bEnable )
-        throw(::com::sun::star::uno::RuntimeException);
-
     /**
        The property sequence is created in the call. The interface isn't used after the call.
      */
@@ -637,8 +632,6 @@ protected:
      */
     OMultiTypeInterfaceContainerHelperInt32 aVetoableLC;
 
-    bool m_bFireEvent;
-
     class Impl;
 
     /** reserved for future use. finally, the future has arrived...
@@ -676,6 +669,106 @@ public:
 #pragma warning(pop)
 #endif
 
+/**
+   OPropertySetHelper plus XPropertySetOption
+ */
+class OPropertySetHelper2 : public OPropertySetHelper,
+                            public ::com::sun::star::beans::XPropertySetOption
+{
+public:
+    /**
+       @param rBHelper  this structure contains the basic members of
+                          a broadcaster.
+                          The lifetime must be longer than the lifetime
+                          of this object. Stored in the variable rBHelper.
+     */
+    OPropertySetHelper2( OBroadcastHelper & rBHelper ) SAL_THROW( () )
+    :OPropertySetHelper( rBHelper )
+    {
+    };
+
+    /** Constructor.
+
+        @param rBHelper
+                        this structure contains the basic members of
+                        a broadcaster.
+                          The lifetime must be longer than the lifetime
+                          of this object. Stored in the variable rBHelper.
+
+        @param bIgnoreRuntimeExceptionsWhileFiring
+                        indicates whether occuring RuntimeExceptions will be
+                        ignored when firing notifications (vetoableChange((),
+                        propertyChange()) to listeners.
+                        PropertyVetoExceptions may still be thrown.
+                        This flag is useful in a inter-process scenarios when
+                        remote bridges may break down
+                        (firing DisposedExceptions).
+    */
+    OPropertySetHelper2(
+        OBroadcastHelper & rBHelper, bool bIgnoreRuntimeExceptionsWhileFiring )
+            :OPropertySetHelper( rBHelper,  bIgnoreRuntimeExceptionsWhileFiring )
+    {
+    };
+
+    /** Constructor.
+
+        @param rBHelper
+                        this structure contains the basic members of
+                        a broadcaster.
+                        The lifetime must be longer than the lifetime
+                        of this object. Stored in the variable rBHelper.
+
+        @param i_pFireEvents
+                        additional event notifier
+
+        @param bIgnoreRuntimeExceptionsWhileFiring
+                        indicates whether occuring RuntimeExceptions will be
+                        ignored when firing notifications (vetoableChange((),
+                        propertyChange()) to listeners.
+                        PropertyVetoExceptions may still be thrown.
+                        This flag is useful in a inter-process scenarios when
+                        remote bridges may break down
+                        (firing DisposedExceptions).
+    */
+    OPropertySetHelper2(
+        OBroadcastHelper & rBHelper,
+        IEventNotificationHook *i_pFireEvents,
+        bool bIgnoreRuntimeExceptionsWhileFiring = false)
+            :OPropertySetHelper( rBHelper, i_pFireEvents, bIgnoreRuntimeExceptionsWhileFiring )
+    {
+    };
+
+    // XInterface
+    virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType )
+        throw (::com::sun::star::uno::RuntimeException);
+
+    // XPropertySetOption
+    virtual void SAL_CALL enableChangeListenerNotification( sal_Bool bEnable )
+        throw(::com::sun::star::uno::RuntimeException);
+
+
+
+private:
+    OPropertySetHelper2( const OPropertySetHelper & ) SAL_THROW( () );
+    OPropertySetHelper2 &    operator = ( const OPropertySetHelper & ) SAL_THROW( () );
+
+public:
+// Suppress warning about virtual functions but non-virtual destructor:
+#if defined __GNUC__
+#pragma GCC system_header
+#elif defined _MSC_VER
+#pragma warning(push)
+#pragma warning(disable: 4265)
+#endif
+    /**
+       You must call disposing before destruction.
+     */
+    ~OPropertySetHelper2() SAL_THROW( () );
+};
+#if defined _MSC_VER
+#pragma warning(pop)
+#endif
+
 } // end namespace cppuhelper
 #endif  //
 
diff --git a/cppuhelper/source/gcc3.map b/cppuhelper/source/gcc3.map
index fd5877bf..d833357 100644
--- a/cppuhelper/source/gcc3.map
+++ b/cppuhelper/source/gcc3.map
@@ -260,7 +260,6 @@ _ZThn*_N4cppu16OComponentHelper7releaseEv;
 _ZThn*_N4cppu18OPropertySetHelper14queryInterfaceERKN3com3sun4star3uno4TypeE;
 _ZThn*_N4cppu18OPropertySetHelper20getFastPropertyValueE?;
 _ZThn*_N4cppu18OPropertySetHelper20setFastPropertyValueE?RKN3com3sun4star3uno3AnyE;
-_ZThn*_N4cppu18OPropertySetHelper14queryInterfaceERKN3com3sun4star3uno4TypeE;
 _ZThn*_N4cppu18OPropertySetHelper16getPropertyValueERKN3rtl8OUStringE;
 _ZThn*_N4cppu18OPropertySetHelper16setPropertyValueERKN3rtl8OUStringERKN3com3sun4star3uno3AnyE;
 _ZThn*_N4cppu18OPropertySetHelper25addPropertyChangeListenerERKN3rtl8OUStringERKN3com3sun4star3uno9ReferenceINS7_5beans23XPropertyChangeListenerEEE;
@@ -392,6 +391,10 @@ UDK_3.7 { # OOo 3.4
 
 UDK_3.8 { # LibO 3.5
 global:
-        _ZN4cppu18OPropertySetHelper32enableChangeListenerNotificationEh;
-        _ZThn*_N4cppu18OPropertySetHelper32enableChangeListenerNotificationEh;
+	_ZTVN4cppu19OPropertySetHelper2E;
+	_ZN4cppu19OPropertySetHelper2D2Ev;
+	_ZN4cppu19OPropertySetHelper214queryInterfaceERKN3com3sun4star3uno4TypeE;
+	_ZThn*_N4cppu19OPropertySetHelper214queryInterfaceERKN3com3sun4star3uno4TypeE;
+        _ZN4cppu19OPropertySetHelper232enableChangeListenerNotificationEh;
+        _ZThn*_N4cppu19OPropertySetHelper232enableChangeListenerNotificationEh;
 } UDK_3.7;
diff --git a/cppuhelper/source/msvc_win32_intel.map b/cppuhelper/source/msvc_win32_intel.map
index bd30b1b..28e8afa 100644
--- a/cppuhelper/source/msvc_win32_intel.map
+++ b/cppuhelper/source/msvc_win32_intel.map
@@ -86,8 +86,6 @@ GetVersionInfo;
 ?hasPropertyByName@OPropertyArrayHelper@cppu@@UAAEABVOUString@rtl@@@Z;
 ?init@OPropertyArrayHelper@cppu@@AAEXE@Z;
 ?queryInterface@OPropertySetHelper@cppu@@UAA?AVAny@uno@star@sun@com@@ABVType@4567@@Z;
-?queryInterface@OPropertySetHelper@cppu@@W3AA?AVAny@uno@star@sun@com@@ABVType@4567@@Z;
-?queryInterface@OPropertySetHelper@cppu@@W7AA?AVAny@uno@star@sun@com@@ABVType@4567@@Z;
 ?removePropertiesChangeListener@OPropertySetHelper@cppu@@UAAXABV?$Reference@VXPropertiesChangeListener@beans@star@sun@com@@@uno@star@sun@com@@@Z;
 ?removePropertyChangeListener@OPropertySetHelper@cppu@@UAAXABVOUString@rtl@@ABV?$Reference@VXPropertyChangeListener@beans@star@sun@com@@@uno@star@sun@com@@@Z;
 ?removeVetoableChangeListener@OPropertySetHelper@cppu@@UAAXABVOUString@rtl@@ABV?$Reference@VXVetoableChangeListener@beans@star@sun@com@@@uno@star@sun@com@@@Z;
@@ -287,6 +285,7 @@ UDK_3.7 { # OOo 3.4
 
 UDK_3.8 { # LibO 3.5
     global:
-        ?enableChangeListenerNotification@OPropertySetHelper@cppu@@UAAXE@Z;
-        ??_7OPropertySetHelper@cppu@@6BXPropertySetOption@beans@star@sun@com@@@;
+	?queryInterface@OPropertySetHelper@cppu@@UAA?AVAny@uno@star@sun@com@@ABVType@4567@@Z;
+        ?enableChangeListenerNotification@OPropertySetHelper2@cppu@@UAAXE@Z;
+        ??_7OPropertySetHelper2@cppu@@6BXPropertySetOption@beans@star@sun@com@@@;
 } UDK_3.7;
diff --git a/cppuhelper/source/propshlp.cxx b/cppuhelper/source/propshlp.cxx
index 7878062..8cedaac 100644
--- a/cppuhelper/source/propshlp.cxx
+++ b/cppuhelper/source/propshlp.cxx
@@ -152,11 +152,13 @@ public:
             IEventNotificationHook *i_pFireEvents
         )
         :m_bIgnoreRuntimeExceptionsWhileFiring( i_bIgnoreRuntimeExceptionsWhileFiring )
+        ,m_bFireEvents(true)
         ,m_pFireEvents( i_pFireEvents )
     {
     }
 
     bool m_bIgnoreRuntimeExceptionsWhileFiring;
+    bool m_bFireEvents;
     class IEventNotificationHook * const m_pFireEvents;
 
     ::std::vector< sal_Int32 >  m_handles;
@@ -173,7 +175,6 @@ OPropertySetHelper::OPropertySetHelper(
     : rBHelper( rBHelper_ ),
       aBoundLC( rBHelper_.rMutex ),
       aVetoableLC( rBHelper_.rMutex ),
-      m_bFireEvent(true),
       m_pReserved( new Impl(false, 0) )
 {
 }
@@ -183,7 +184,6 @@ OPropertySetHelper::OPropertySetHelper(
     : rBHelper( rBHelper_ ),
       aBoundLC( rBHelper_.rMutex ),
       aVetoableLC( rBHelper_.rMutex ),
-      m_bFireEvent(true),
       m_pReserved( new Impl( bIgnoreRuntimeExceptionsWhileFiring, 0 ) )
 {
 }
@@ -194,7 +194,6 @@ OPropertySetHelper::OPropertySetHelper(
     : rBHelper( rBHelper_ ),
       aBoundLC( rBHelper_.rMutex ),
       aVetoableLC( rBHelper_.rMutex ),
-      m_bFireEvent(true),
       m_pReserved(
         new Impl( bIgnoreRuntimeExceptionsWhileFiring, i_pFireEvents) )
 {
@@ -206,23 +205,31 @@ OPropertySetHelper::OPropertySetHelper(
 OPropertySetHelper::~OPropertySetHelper() SAL_THROW( () )
 {
 }
+OPropertySetHelper2::~OPropertySetHelper2() SAL_THROW( () )
+{
+}
 
-/**
- * These method is called from queryInterface, if no delegator is set.
- * Otherwise this method is called from the delegator.
- */
-// XAggregation
+// XInterface
 Any OPropertySetHelper::queryInterface( const ::com::sun::star::uno::Type & rType )
     throw (RuntimeException)
 {
     return ::cppu::queryInterface(
         rType,
         static_cast< XPropertySet * >( this ),
-        static_cast< XPropertySetOption * >( this ),
         static_cast< XMultiPropertySet * >( this ),
         static_cast< XFastPropertySet * >( this ) );
 }
 
+Any OPropertySetHelper2::queryInterface( const ::com::sun::star::uno::Type & rType )
+    throw (RuntimeException)
+{
+    Any cnd(cppu::queryInterface(rType, static_cast< XPropertySetOption * >(this)));
+    if ( cnd.hasValue() )
+        return cnd;
+    else
+        return OPropertySetHelper::queryInterface(rType);
+}
+
 /**
  * called from the derivee's XTypeProvider::getTypes implementation
  */
@@ -631,10 +638,11 @@ void OPropertySetHelper::fire
     sal_Bool bVetoable
 )
 {
-    if (!m_bFireEvent)
+    OSL_ENSURE( m_pReserved.get(), "No OPropertySetHelper::Impl" );
+
+    if (! m_pReserved->m_bFireEvents)
         return;
 
-    OSL_ENSURE( m_pReserved.get(), "No OPropertySetHelper::Impl" );
     if (m_pReserved->m_pFireEvents) {
         m_pReserved->m_pFireEvents->fireEvents(
             pnHandles, nHandles, bVetoable,
@@ -1037,10 +1045,10 @@ void OPropertySetHelper::firePropertiesChangeEvent(
     delete [] pHandles;
 }
 
-void OPropertySetHelper::enableChangeListenerNotification( sal_Bool bEnable )
+void OPropertySetHelper2::enableChangeListenerNotification( sal_Bool bEnable )
     throw(::com::sun::star::uno::RuntimeException)
 {
-    m_bFireEvent = bEnable;
+    m_pReserved->m_bFireEvents = bEnable;
 }
 
 #ifdef xdvnsdfln
-- 
1.7.2.5

_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice

Reply via email to