[Libreoffice-commits] .: stoc/source udkapi/com

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Wed Jan 30 08:50:42 PST 2013


 stoc/source/corereflection/crefl.cxx                       |   42 +++++++------
 stoc/source/registry_tdprovider/tdprovider.cxx             |   17 ++++-
 udkapi/com/sun/star/reflection/TypeDescriptionManager.idl  |   16 +++-
 udkapi/com/sun/star/reflection/TypeDescriptionProvider.idl |   13 ++--
 4 files changed, 59 insertions(+), 29 deletions(-)

New commits:
commit 2356a480fea6cac8cccaae85c9a2b6a312a9048c
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Wed Jan 30 17:46:38 2013 +0100

    API CHANGE:  Make TypeDescriptionManager/Provider more consistent
    
    ...by letting their getByHierarchicalName methods return information about
    UNO constants as X(Constant)TypeDescription values, just as for (alomst -- see
    the odd enum member case) all other entities.  This will make future changes in
    this area easier.
    
    The only affected client I could find so far is the core reflection service, but
    there might be more that I overlooked.
    
    Change-Id: I6731f2914773d49e33eeaec6e256ff2e5409ad2d

diff --git a/stoc/source/corereflection/crefl.cxx b/stoc/source/corereflection/crefl.cxx
index 3357a54..a51f58a 100644
--- a/stoc/source/corereflection/crefl.cxx
+++ b/stoc/source/corereflection/crefl.cxx
@@ -21,6 +21,7 @@
 #include <cppuhelper/implementationentry.hxx>
 
 #include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/reflection/XConstantTypeDescription.hpp>
 #include <com/sun/star/reflection/XTypeDescription.hpp>
 #include "com/sun/star/uno/RuntimeException.hpp"
 
@@ -283,35 +284,42 @@ Any IdlReflectionServiceImpl::getByHierarchicalName( const OUString & rName )
     Any aRet( _aElements.getValue( rName ) );
     if (! aRet.hasValue())
     {
-        // first look for constants exclusivly!
         aRet = _xTDMgr->getByHierarchicalName( rName );
-        if (aRet.getValueTypeClass() == TypeClass_INTERFACE) // if no constant,
-                                                             // i.e. XTypeDescription for a type
+        if (aRet.getValueTypeClass() == TypeClass_INTERFACE)
         {
             // type retrieved from tdmgr
             OSL_ASSERT( (*(Reference< XInterface > *)aRet.getValue())->queryInterface(
                 ::getCppuType( (const Reference< XTypeDescription > *)0 ) ).hasValue() );
 
-            // if you are interested in a type then CALL forName()!!!
-            // this way is NOT recommended for types, because this method looks for constants first
+            css::uno::Reference< css::reflection::XConstantTypeDescription >
+                ctd;
+            if (aRet >>= ctd)
+            {
+                aRet = ctd->getConstantValue();
+            }
+            else
+            {
+                // if you are interested in a type then CALL forName()!!!
+                // this way is NOT recommended for types, because this method looks for constants first
 
-            // if td manager found some type, it will be in the cache (hopefully.. we just got it)
-            // so the second retrieving via c typelib callback chain should succeed...
+                // if td manager found some type, it will be in the cache (hopefully.. we just got it)
+                // so the second retrieving via c typelib callback chain should succeed...
 
-            // try to get _type_ by name
-            typelib_TypeDescription * pTD = 0;
-            typelib_typedescription_getByName( &pTD, rName.pData );
+                // try to get _type_ by name
+                typelib_TypeDescription * pTD = 0;
+                typelib_typedescription_getByName( &pTD, rName.pData );
 
-            aRet.clear(); // kick XTypeDescription interface
+                aRet.clear(); // kick XTypeDescription interface
 
-            if (pTD)
-            {
-                Reference< XIdlClass > xIdlClass( constructClass( pTD ) );
-                aRet.setValue( &xIdlClass, ::getCppuType( (const Reference< XIdlClass > *)0 ) );
-                typelib_typedescription_release( pTD );
+                if (pTD)
+                {
+                    Reference< XIdlClass > xIdlClass( constructClass( pTD ) );
+                    aRet.setValue( &xIdlClass, ::getCppuType( (const Reference< XIdlClass > *)0 ) );
+                    typelib_typedescription_release( pTD );
+                }
             }
         }
-        // else is constant
+        // else is enum member(?)
 
         // update
         if (aRet.hasValue())
diff --git a/stoc/source/registry_tdprovider/tdprovider.cxx b/stoc/source/registry_tdprovider/tdprovider.cxx
index 87089a9..92dbc92 100644
--- a/stoc/source/registry_tdprovider/tdprovider.cxx
+++ b/stoc/source/registry_tdprovider/tdprovider.cxx
@@ -365,9 +365,10 @@ Any ProviderImpl::getByHierarchicalNameImpl( const OUString & rName )
                                     aBytes.getConstArray(), aBytes.getLength(),
                                     false, TYPEREG_VERSION_1);
 
-                                if (aReader.getTypeClass() == RT_TYPE_MODULE ||
-                                    aReader.getTypeClass() == RT_TYPE_CONSTANTS ||
-                                    aReader.getTypeClass() == RT_TYPE_ENUM)
+                                RTTypeClass tc = aReader.getTypeClass();
+                                if (tc == RT_TYPE_MODULE ||
+                                    tc == RT_TYPE_CONSTANTS ||
+                                    tc == RT_TYPE_ENUM)
                                 {
                                     OUString aFieldName( aKey.copy( nIndex+1, aKey.getLength() - nIndex -1 ) );
                                     sal_Int16 nPos = aReader.getFieldCount();
@@ -378,8 +379,18 @@ Any ProviderImpl::getByHierarchicalNameImpl( const OUString & rName )
                                             break;
                                     }
                                     if (nPos >= 0)
+                                    {
                                         aRet = getRTValue(
                                             aReader.getFieldValue(nPos));
+                                        if (tc != RT_TYPE_ENUM)
+                                        {
+                                            aRet = css::uno::makeAny<
+                                                css::uno::Reference<
+                                                    css::reflection::XTypeDescription > >(
+                                                        new ConstantTypeDescriptionImpl(
+                                                            rName, aRet));
+                                        }
+                                    }
                                 }
                             }
                         }
diff --git a/udkapi/com/sun/star/reflection/TypeDescriptionManager.idl b/udkapi/com/sun/star/reflection/TypeDescriptionManager.idl
index 597dda2..467047a 100644
--- a/udkapi/com/sun/star/reflection/TypeDescriptionManager.idl
+++ b/udkapi/com/sun/star/reflection/TypeDescriptionManager.idl
@@ -47,9 +47,18 @@ published service TypeDescriptionManager
 {
     /** Interface to retrieve type descriptions.
 
+        In addition to the semantics specified for the corresponding interface
+        of the <type>TypeDescriptionProvider</type> service (which changed
+        slightly for LibreOffice 4.1; see there), this interface allows to
+        retrieve the following entities:
         <ul>
-            <li>Names are given in dotted notation, for example
-            <code>"com.sun.star.uno.XInterface"</code>.</li>
+            <li>The simple types are accessible via <code>"void"</code>,
+            <code>"boolean"</code>, <code>"byte"</code>, <code>"short"</code>,
+            <code>"unsigned short"</code>, <code>"long"</code>, <code>"unsigned
+            long"</code>, <code>"hyper"</code>, <code>"unsigned hyper"</code>,
+            <code>"float"</code>, <code>"double"</code>, <code>"char"</code>,
+            <code>"string"</code>, <code>"type"</code>, and
+            <code>"any"</code>.</li>
 
             <li>Sequence types are accessible via
             <code>"[]<var>ComponentType</var>"</code></li>
@@ -63,9 +72,6 @@ published service TypeDescriptionManager
             <code>"<var>InterfaceType</var>::<var>Member</var>"</code>.</li>
         </ul>
 
-        <p>The returned values are of interface type
-        <type>XTypeDescription</type>.</p>
-
         <p>Even though the name of this interface suggests that the used type
         names are hierarchic, this need not be the case.  (For example, consider
         the names of instantiated polymorphic struct types, like
diff --git a/udkapi/com/sun/star/reflection/TypeDescriptionProvider.idl b/udkapi/com/sun/star/reflection/TypeDescriptionProvider.idl
index 672274b..af84f3c 100644
--- a/udkapi/com/sun/star/reflection/TypeDescriptionProvider.idl
+++ b/udkapi/com/sun/star/reflection/TypeDescriptionProvider.idl
@@ -39,11 +39,16 @@ published service TypeDescriptionProvider
     /** Interface to retrieve type descriptions.
 
         <p>Names are given in dotted notation, for example
-        <code>"com.sun.star.uno.XInterface"</code>.  The returned values are of
-        interface type <type>XTypeDescription</type>.</p>
+        <code>"com.sun.star.uno.XInterface"</code>.</p>
 
-        <p>Even though the name of this interface suggests that the used type
-        names are hierarchic, this need not be the case.</p>
+        </p>The returned values are generally non-null references of type
+        <type>XTypeDescription</type>.  However, before LibreOffice 4.1,
+        the value returned for a UNO constant was the value of the constant,
+        rather than a reference to an <type>XConstantTypeDescription</type>
+        object.  (It also appears that some implementations return values for
+        individual UNO enum members, e.g.
+        <code>"com.sun.star.uno.TypeClass.VOID"</code>, though this is probably
+        best treated as an implementation obscurity.)</p>
     */
     interface com::sun::star::container::XHierarchicalNameAccess;
 


More information about the Libreoffice-commits mailing list