LCOV - code coverage report
Current view: top level - cppu/source/uno - assign.hxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 134 295 45.4 %
Date: 2012-08-25 Functions: 4 5 80.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 89 251 35.5 %

           Branch data     Line data    Source code
       1                 :            : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2                 :            : /*
       3                 :            :  * This file is part of the LibreOffice project.
       4                 :            :  *
       5                 :            :  * This Source Code Form is subject to the terms of the Mozilla Public
       6                 :            :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7                 :            :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8                 :            :  *
       9                 :            :  * This file incorporates work covered by the following license notice:
      10                 :            :  *
      11                 :            :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12                 :            :  *   contributor license agreements. See the NOTICE file distributed
      13                 :            :  *   with this work for additional information regarding copyright
      14                 :            :  *   ownership. The ASF licenses this file to you under the Apache
      15                 :            :  *   License, Version 2.0 (the "License"); you may not use this file
      16                 :            :  *   except in compliance with the License. You may obtain a copy of
      17                 :            :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18                 :            :  */
      19                 :            : #ifndef ASSIGN_HXX
      20                 :            : #define ASSIGN_HXX
      21                 :            : 
      22                 :            : #include <string.h>
      23                 :            : 
      24                 :            : #include "prim.hxx"
      25                 :            : #include "destr.hxx"
      26                 :            : #include "constr.hxx"
      27                 :            : #include "copy.hxx"
      28                 :            : 
      29                 :            : 
      30                 :            : namespace cppu
      31                 :            : {
      32                 :            : 
      33                 :            : //##################################################################################################
      34                 :            : //#### assignment ##################################################################################
      35                 :            : //##################################################################################################
      36                 :            : 
      37                 :            : 
      38                 :            : //--------------------------------------------------------------------------------------------------
      39                 :    1047374 : inline void _assignInterface(
      40                 :            :     void ** ppDest, void * pSource,
      41                 :            :     uno_AcquireFunc acquire, uno_ReleaseFunc release )
      42                 :            :     SAL_THROW(())
      43                 :            : {
      44                 :    1047374 :     _acquire( pSource, acquire );
      45                 :    1047374 :     void * const pToBeReleased = *ppDest;
      46                 :    1047374 :     *ppDest = pSource;
      47                 :    1047374 :     _release( pToBeReleased, release );
      48                 :    1047374 : }
      49                 :            : //--------------------------------------------------------------------------------------------------
      50                 :     848285 : inline void * _queryInterface(
      51                 :            :     void * pSource,
      52                 :            :     typelib_TypeDescriptionReference * pDestType,
      53                 :            :     uno_QueryInterfaceFunc queryInterface )
      54                 :            :     SAL_THROW(())
      55                 :            : {
      56         [ +  - ]:     848285 :     if (pSource)
      57                 :            :     {
      58         [ -  + ]:     848285 :         if (0 == queryInterface)
      59                 :          0 :             queryInterface = binuno_queryInterface;
      60                 :     848285 :         pSource = (*queryInterface)( pSource, pDestType );
      61                 :            :     }
      62                 :     848285 :     return pSource;
      63                 :            : }
      64                 :            : //==================================================================================================
      65                 :            : sal_Bool assignStruct(
      66                 :            :     void * pDest, void * pSource,
      67                 :            :     typelib_CompoundTypeDescription * pTypeDescr,
      68                 :            :     uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
      69                 :            :     SAL_THROW(());
      70                 :            : //--------------------------------------------------------------------------------------------------
      71                 :    1227371 : inline sal_Bool _assignStruct(
      72                 :            :     void * pDest, void * pSource,
      73                 :            :     typelib_CompoundTypeDescription * pTypeDescr,
      74                 :            :     uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
      75                 :            :     SAL_THROW(())
      76                 :            : {
      77         [ +  + ]:    1227371 :     if (pTypeDescr->pBaseTypeDescription)
      78                 :            :     {
      79                 :            :         // copy base value
      80         [ -  + ]:      71722 :         if (! assignStruct( pDest, pSource, pTypeDescr->pBaseTypeDescription,
      81                 :      71722 :                             queryInterface, acquire, release ))
      82                 :            :         {
      83                 :          0 :             return sal_False;
      84                 :            :         }
      85                 :            :     }
      86                 :            :     // then copy members
      87                 :    1227371 :     typelib_TypeDescriptionReference ** ppTypeRefs = pTypeDescr->ppTypeRefs;
      88                 :    1227371 :     sal_Int32 * pMemberOffsets = pTypeDescr->pMemberOffsets;
      89                 :    1227371 :     sal_Int32 nDescr = pTypeDescr->nMembers;
      90         [ +  + ]:    6108006 :     while (nDescr--)
      91                 :            :     {
      92         [ -  + ]:    4880635 :         if (! ::uno_type_assignData( (char *)pDest + pMemberOffsets[nDescr],
      93                 :    4880635 :                                      ppTypeRefs[nDescr],
      94                 :    9761270 :                                      (char *)pSource + pMemberOffsets[nDescr],
      95                 :    4880635 :                                      ppTypeRefs[nDescr],
      96                 :    4880635 :                                      queryInterface, acquire, release ))
      97                 :            :         {
      98                 :          0 :             return sal_False;
      99                 :            :         }
     100                 :            :     }
     101                 :    1227371 :     return sal_True;
     102                 :            : }
     103                 :            : //--------------------------------------------------------------------------------------------------
     104                 :          0 : inline sal_Bool _assignArray(
     105                 :            :     void * pDest, void * pSource,
     106                 :            :     typelib_ArrayTypeDescription * pTypeDescr,
     107                 :            :     uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
     108                 :            : {
     109                 :            :     typelib_TypeDescriptionReference * pElementTypeRef =
     110                 :          0 :         ((typelib_IndirectTypeDescription *)pTypeDescr)->pType;
     111                 :          0 :     typelib_TypeDescription * pElementTypeDescr = NULL;
     112 [ #  # ][ #  # ]:          0 :     TYPELIB_DANGER_GET( &pElementTypeDescr, pElementTypeRef );
         [ #  # ][ #  # ]
                 [ #  # ]
     113                 :          0 :     sal_Int32 nTotalElements = pTypeDescr->nTotalElements;
     114                 :          0 :     sal_Int32 nElementSize = pElementTypeDescr->nSize;
     115                 :            :     sal_Int32 i;
     116                 :          0 :     sal_Bool bRet = sal_False;
     117                 :            : 
     118   [ #  #  #  #  :          0 :     switch ( pElementTypeRef->eTypeClass )
          #  #  #  #  #  
                      # ]
     119                 :            :     {
     120                 :            :     case typelib_TypeClass_CHAR:
     121                 :            :     case typelib_TypeClass_BOOLEAN:
     122                 :            :     case typelib_TypeClass_BYTE:
     123                 :            :     case typelib_TypeClass_SHORT:
     124                 :            :     case typelib_TypeClass_UNSIGNED_SHORT:
     125                 :            :     case typelib_TypeClass_LONG:
     126                 :            :     case typelib_TypeClass_UNSIGNED_LONG:
     127                 :            :     case typelib_TypeClass_HYPER:
     128                 :            :     case typelib_TypeClass_UNSIGNED_HYPER:
     129                 :            :     case typelib_TypeClass_FLOAT:
     130                 :            :     case typelib_TypeClass_DOUBLE:
     131         [ #  # ]:          0 :         for (i=0; i < nTotalElements; i++)
     132                 :            :         {
     133                 :          0 :             memcpy((sal_Char *)pDest + i * nElementSize,
     134                 :            :                              (sal_Char *)pSource + i * nElementSize,
     135                 :          0 :                              nElementSize);
     136                 :            :         }
     137                 :          0 :         bRet = sal_True;
     138                 :          0 :         break;
     139                 :            :     case typelib_TypeClass_STRING:
     140         [ #  # ]:          0 :         for (i=0; i < nTotalElements; i++)
     141                 :            :         {
     142                 :            :             ::rtl_uString_assign( (rtl_uString **)pDest + i,
     143                 :          0 :                                   ((rtl_uString **)pSource)[i] );
     144                 :            :         }
     145                 :          0 :         bRet = sal_True;
     146                 :          0 :         break;
     147                 :            :     case typelib_TypeClass_TYPE:
     148         [ #  # ]:          0 :         for (i=0; i < nTotalElements; i++)
     149                 :            :         {
     150                 :          0 :             typelib_TypeDescriptionReference ** pp = (typelib_TypeDescriptionReference **)pDest + i;
     151                 :          0 :             ::typelib_typedescriptionreference_release( *pp );
     152                 :          0 :             *pp = *((typelib_TypeDescriptionReference **)pSource + i);
     153         [ #  # ]:          0 :             TYPE_ACQUIRE( *pp );
     154                 :            :         }
     155                 :          0 :         bRet = sal_True;
     156                 :          0 :         break;
     157                 :            :     case typelib_TypeClass_ANY:
     158         [ #  # ]:          0 :         for (i=0; i < nTotalElements; i++)
     159                 :            :         {
     160         [ #  # ]:          0 :             _destructAny( (uno_Any *)pDest + i, release );
     161                 :          0 :             _copyConstructAny( (uno_Any *)pDest + i, (uno_Any *)pSource + i,
     162         [ #  # ]:          0 :                                pElementTypeRef, pElementTypeDescr, acquire, 0 );
     163                 :            :         }
     164                 :          0 :         bRet = sal_True;
     165                 :          0 :         break;
     166                 :            :     case typelib_TypeClass_ENUM:
     167         [ #  # ]:          0 :         for (i=0; i < nTotalElements; i++)
     168                 :            :         {
     169                 :          0 :             *((sal_Int32 *)pDest + i) = *((sal_Int32 *)pSource + i);
     170                 :            :         }
     171                 :          0 :         bRet = sal_True;
     172                 :          0 :         break;
     173                 :            :     case typelib_TypeClass_STRUCT:
     174                 :            :     case typelib_TypeClass_EXCEPTION:
     175         [ #  # ]:          0 :         for (i=0; i < nTotalElements; i++)
     176                 :            :         {
     177                 :          0 :             bRet = _assignStruct( (sal_Char *)pDest + i * nElementSize,
     178                 :          0 :                                   (sal_Char *)pSource + i * nElementSize,
     179                 :            :                                   (typelib_CompoundTypeDescription *)pElementTypeDescr,
     180         [ #  # ]:          0 :                                   queryInterface, acquire, release );
     181         [ #  # ]:          0 :             if (! bRet)
     182                 :          0 :                 break;
     183                 :            :         }
     184                 :          0 :         bRet = sal_True;
     185                 :          0 :         break;
     186                 :            :     case typelib_TypeClass_UNION:
     187         [ #  # ]:          0 :         for (i=0; i < nTotalElements; i++)
     188                 :            :         {
     189                 :          0 :             _destructUnion( (sal_Char*)pDest + i * nElementSize, pElementTypeDescr, release );
     190                 :          0 :             _copyConstructUnion( (sal_Char*)pDest + i * nElementSize,
     191                 :          0 :                                  (sal_Char*)pSource + i * nElementSize,
     192                 :          0 :                                  pElementTypeDescr, acquire, 0 );
     193                 :            :         }
     194                 :          0 :         bRet = sal_True;
     195                 :          0 :         break;
     196                 :            :     case typelib_TypeClass_SEQUENCE:
     197         [ #  # ]:          0 :         for (i=0; i < nTotalElements; i++)
     198                 :            :         {
     199                 :            :             ::osl_incrementInterlockedCount(
     200         [ #  # ]:          0 :                 &(*((uno_Sequence **)pSource + i))->nRefCount );
     201                 :            :             idestructSequence(
     202                 :          0 :                 *((uno_Sequence **)pDest + i),
     203         [ #  # ]:          0 :                 pElementTypeRef, pElementTypeDescr, release );
     204                 :          0 :             *((uno_Sequence **)pDest + i) = *((uno_Sequence **)pSource + i);
     205                 :            :         }
     206                 :          0 :         bRet = sal_True;
     207                 :          0 :         break;
     208                 :            :     case typelib_TypeClass_INTERFACE:
     209         [ #  # ]:          0 :         for (i=0; i < nTotalElements; i++)
     210                 :            :         {
     211                 :            :             _assignInterface(
     212                 :            :                 (void **)((sal_Char*)pDest + i * nElementSize),
     213                 :            :                 *(void **)((sal_Char*)pSource + i * nElementSize),
     214         [ #  # ]:          0 :                 acquire, release );
     215                 :            :         }
     216                 :          0 :         bRet = sal_True;
     217                 :          0 :         break;
     218                 :            :     default:
     219                 :            :         OSL_ASSERT(false);
     220                 :          0 :         break;
     221                 :            :     }
     222                 :            : 
     223 [ #  # ][ #  # ]:          0 :     TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     224                 :          0 :     return bRet;
     225                 :            : }
     226                 :            : //--------------------------------------------------------------------------------------------------
     227                 :   11118304 : inline sal_Bool _assignData(
     228                 :            :     void * pDest,
     229                 :            :     typelib_TypeDescriptionReference * pDestType, typelib_TypeDescription * pDestTypeDescr,
     230                 :            :     void * pSource,
     231                 :            :     typelib_TypeDescriptionReference * pSourceType, typelib_TypeDescription * pSourceTypeDescr,
     232                 :            :     uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
     233                 :            :     SAL_THROW(())
     234                 :            : {
     235         [ -  + ]:   11118304 :     if (pDest == pSource)
     236                 :          0 :         return _type_equals( pDestType, pSourceType );
     237                 :            : 
     238         [ -  + ]:   11118304 :     if (! pSource)
     239                 :            :     {
     240                 :          0 :         _destructData( pDest, pDestType, pDestTypeDescr, release );
     241                 :          0 :         _defaultConstructData( pDest, pDestType, pDestTypeDescr );
     242                 :          0 :         return sal_True;
     243                 :            :     }
     244         [ +  + ]:   11780978 :     while (typelib_TypeClass_ANY == pSourceType->eTypeClass)
     245                 :            :     {
     246                 :     662674 :         pSourceTypeDescr = 0;
     247                 :     662674 :         pSourceType = ((uno_Any *)pSource)->pType;
     248                 :     662674 :         pSource = ((uno_Any *)pSource)->pData;
     249         [ -  + ]:     662674 :         if (pDest == pSource)
     250                 :          0 :             return sal_True;
     251                 :            :     }
     252                 :            : 
     253   [ -  +  +  +  :   11118304 :     switch (pDestType->eTypeClass)
          +  +  +  +  +  
          -  +  +  +  +  
          +  +  +  -  -  
                +  +  - ]
     254                 :            :     {
     255                 :            :     case typelib_TypeClass_VOID:
     256                 :          0 :         return pSourceType->eTypeClass == typelib_TypeClass_VOID;
     257                 :            :     case typelib_TypeClass_CHAR:
     258         [ +  - ]:         30 :         switch (pSourceType->eTypeClass)
     259                 :            :         {
     260                 :            :         case typelib_TypeClass_CHAR:
     261                 :         30 :             *(sal_Unicode *)pDest = *(sal_Unicode *)pSource;
     262                 :         30 :             return sal_True;
     263                 :            :         default:
     264                 :          0 :             return sal_False;
     265                 :            :         }
     266                 :            :     case typelib_TypeClass_BOOLEAN:
     267         [ +  + ]:     196763 :         switch (pSourceType->eTypeClass)
     268                 :            :         {
     269                 :            :         case typelib_TypeClass_BOOLEAN:
     270                 :     196621 :             *(sal_Bool *)pDest = (*(sal_Bool *)pSource != sal_False);
     271                 :     196621 :             return sal_True;
     272                 :            :         default:
     273                 :        142 :             return sal_False;
     274                 :            :         }
     275                 :            :     case typelib_TypeClass_BYTE:
     276         [ +  - ]:          5 :         switch (pSourceType->eTypeClass)
     277                 :            :         {
     278                 :            :         case typelib_TypeClass_BYTE:
     279                 :          5 :             *(sal_Int8 *)pDest = *(sal_Int8 *)pSource;
     280                 :          5 :             return sal_True;
     281                 :            :         default:
     282                 :          0 :             return sal_False;
     283                 :            :         }
     284                 :            :     case typelib_TypeClass_SHORT:
     285      [ -  +  + ]:     568347 :         switch (pSourceType->eTypeClass)
     286                 :            :         {
     287                 :            :         case typelib_TypeClass_BYTE:
     288                 :          0 :             *(sal_Int16 *)pDest = *(sal_Int8 *)pSource;
     289                 :          0 :             return sal_True;
     290                 :            :         case typelib_TypeClass_SHORT:
     291                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     292                 :     568332 :             *(sal_Int16 *)pDest = *(sal_Int16 *)pSource;
     293                 :     568332 :             return sal_True;
     294                 :            :         default:
     295                 :         15 :             return sal_False;
     296                 :            :         }
     297                 :            :     case typelib_TypeClass_UNSIGNED_SHORT:
     298      [ -  +  - ]:       4202 :         switch (pSourceType->eTypeClass)
     299                 :            :         {
     300                 :            :         case typelib_TypeClass_BYTE:
     301                 :          0 :             *(sal_uInt16 *)pDest = *(sal_Int8 *)pSource;
     302                 :          0 :             return sal_True;
     303                 :            :         case typelib_TypeClass_SHORT:
     304                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     305                 :       4202 :             *(sal_uInt16 *)pDest = *(sal_uInt16 *)pSource;
     306                 :       4202 :             return sal_True;
     307                 :            :         default:
     308                 :          0 :             return sal_False;
     309                 :            :         }
     310                 :            :     case typelib_TypeClass_LONG:
     311   [ +  +  -  +  :     922867 :         switch (pSourceType->eTypeClass)
                      + ]
     312                 :            :         {
     313                 :            :         case typelib_TypeClass_BYTE:
     314                 :      11566 :             *(sal_Int32 *)pDest = *(sal_Int8 *)pSource;
     315                 :      11566 :             return sal_True;
     316                 :            :         case typelib_TypeClass_SHORT:
     317                 :       5371 :             *(sal_Int32 *)pDest = *(sal_Int16 *)pSource;
     318                 :       5371 :             return sal_True;
     319                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     320                 :          0 :             *(sal_Int32 *)pDest = *(sal_uInt16 *)pSource;
     321                 :          0 :             return sal_True;
     322                 :            :         case typelib_TypeClass_LONG:
     323                 :            :         case typelib_TypeClass_UNSIGNED_LONG:
     324                 :     900584 :             *(sal_Int32 *)pDest = *(sal_Int32 *)pSource;
     325                 :     900584 :             return sal_True;
     326                 :            :         default:
     327                 :       5346 :             return sal_False;
     328                 :            :         }
     329                 :            :     case typelib_TypeClass_UNSIGNED_LONG:
     330   [ -  -  -  +  :       7537 :         switch (pSourceType->eTypeClass)
                      - ]
     331                 :            :         {
     332                 :            :         case typelib_TypeClass_BYTE:
     333                 :          0 :             *(sal_uInt32 *)pDest = *(sal_Int8 *)pSource;
     334                 :          0 :             return sal_True;
     335                 :            :         case typelib_TypeClass_SHORT:
     336                 :          0 :             *(sal_uInt32 *)pDest = *(sal_Int16 *)pSource;
     337                 :          0 :             return sal_True;
     338                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     339                 :          0 :             *(sal_uInt32 *)pDest = *(sal_uInt16 *)pSource;
     340                 :          0 :             return sal_True;
     341                 :            :         case typelib_TypeClass_LONG:
     342                 :            :         case typelib_TypeClass_UNSIGNED_LONG:
     343                 :       7537 :             *(sal_uInt32 *)pDest = *(sal_uInt32 *)pSource;
     344                 :       7537 :             return sal_True;
     345                 :            :         default:
     346                 :          0 :             return sal_False;
     347                 :            :         }
     348                 :            :     case typelib_TypeClass_HYPER:
     349   [ -  -  -  -  :          5 :         switch (pSourceType->eTypeClass)
                -  +  - ]
     350                 :            :         {
     351                 :            :         case typelib_TypeClass_BYTE:
     352                 :          0 :             *(sal_Int64 *)pDest = *(sal_Int8 *)pSource;
     353                 :          0 :             return sal_True;
     354                 :            :         case typelib_TypeClass_SHORT:
     355                 :          0 :             *(sal_Int64 *)pDest = *(sal_Int16 *)pSource;
     356                 :          0 :             return sal_True;
     357                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     358                 :          0 :             *(sal_Int64 *)pDest = *(sal_uInt16 *)pSource;
     359                 :          0 :             return sal_True;
     360                 :            :         case typelib_TypeClass_LONG:
     361                 :          0 :             *(sal_Int64 *)pDest = *(sal_Int32 *)pSource;
     362                 :          0 :             return sal_True;
     363                 :            :         case typelib_TypeClass_UNSIGNED_LONG:
     364                 :          0 :             *(sal_Int64 *)pDest = *(sal_uInt32 *)pSource;
     365                 :          0 :             return sal_True;
     366                 :            :         case typelib_TypeClass_HYPER:
     367                 :            :         case typelib_TypeClass_UNSIGNED_HYPER:
     368                 :          5 :             *(sal_Int64 *)pDest = *(sal_Int64 *)pSource;
     369                 :          5 :             return sal_True;
     370                 :            :         default:
     371                 :          0 :             return sal_False;
     372                 :            :         }
     373                 :            :     case typelib_TypeClass_UNSIGNED_HYPER:
     374   [ #  #  #  #  :          0 :         switch (pSourceType->eTypeClass)
                #  #  # ]
     375                 :            :         {
     376                 :            :         case typelib_TypeClass_BYTE:
     377                 :          0 :             *(sal_uInt64 *)pDest = *(sal_Int8 *)pSource;
     378                 :          0 :             return sal_True;
     379                 :            :         case typelib_TypeClass_SHORT:
     380                 :          0 :             *(sal_uInt64 *)pDest = *(sal_Int16 *)pSource;
     381                 :          0 :             return sal_True;
     382                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     383                 :          0 :             *(sal_uInt64 *)pDest = *(sal_uInt16 *)pSource;
     384                 :          0 :             return sal_True;
     385                 :            :         case typelib_TypeClass_LONG:
     386                 :          0 :             *(sal_uInt64 *)pDest = *(sal_Int32 *)pSource;
     387                 :          0 :             return sal_True;
     388                 :            :         case typelib_TypeClass_UNSIGNED_LONG:
     389                 :          0 :             *(sal_uInt64 *)pDest = *(sal_uInt32 *)pSource;
     390                 :          0 :             return sal_True;
     391                 :            :         case typelib_TypeClass_HYPER:
     392                 :            :         case typelib_TypeClass_UNSIGNED_HYPER:
     393                 :          0 :             *(sal_uInt64 *)pDest = *(sal_uInt64 *)pSource;
     394                 :          0 :             return sal_True;
     395                 :            :         default:
     396                 :          0 :             return sal_False;
     397                 :            :         }
     398                 :            :     case typelib_TypeClass_FLOAT:
     399   [ -  -  -  +  :     195827 :         switch (pSourceType->eTypeClass)
                      - ]
     400                 :            :         {
     401                 :            :         case typelib_TypeClass_BYTE:
     402                 :          0 :             *(float *)pDest = *(sal_Int8 *)pSource;
     403                 :          0 :             return sal_True;
     404                 :            :         case typelib_TypeClass_SHORT:
     405                 :          0 :             *(float *)pDest = *(sal_Int16 *)pSource;
     406                 :          0 :             return sal_True;
     407                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     408                 :          0 :             *(float *)pDest = *(sal_uInt16 *)pSource;
     409                 :          0 :             return sal_True;
     410                 :            :         case typelib_TypeClass_FLOAT:
     411                 :     195827 :             *(float *)pDest = *(float *)pSource;
     412                 :     195827 :             return sal_True;
     413                 :            :         default:
     414                 :          0 :             return sal_False;
     415                 :            :         }
     416                 :            :     case typelib_TypeClass_DOUBLE:
     417   [ -  -  -  -  :     322946 :         switch (pSourceType->eTypeClass)
             -  -  +  - ]
     418                 :            :         {
     419                 :            :         case typelib_TypeClass_BYTE:
     420                 :          0 :             *(double *)pDest = *(sal_Int8 *)pSource;
     421                 :          0 :             return sal_True;
     422                 :            :         case typelib_TypeClass_SHORT:
     423                 :          0 :             *(double *)pDest = *(sal_Int16 *)pSource;
     424                 :          0 :             return sal_True;
     425                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     426                 :          0 :             *(double *)pDest = *(sal_uInt16 *)pSource;
     427                 :          0 :             return sal_True;
     428                 :            :         case typelib_TypeClass_LONG:
     429                 :          0 :             *(double *)pDest = *(sal_Int32 *)pSource;
     430                 :          0 :             return sal_True;
     431                 :            :         case typelib_TypeClass_UNSIGNED_LONG:
     432                 :          0 :             *(double *)pDest = *(sal_uInt32 *)pSource;
     433                 :          0 :             return sal_True;
     434                 :            :         case typelib_TypeClass_FLOAT:
     435                 :          0 :             *(double *)pDest = *(float *)pSource;
     436                 :          0 :             return sal_True;
     437                 :            :         case typelib_TypeClass_DOUBLE:
     438                 :     322946 :             *(double *)pDest = *(double *)pSource;
     439                 :     322946 :             return sal_True;
     440                 :            :         default:
     441                 :          0 :             return sal_False;
     442                 :            :         }
     443                 :            :     case typelib_TypeClass_STRING:
     444         [ +  + ]:    1106328 :         switch (pSourceType->eTypeClass)
     445                 :            :         {
     446                 :            :         case typelib_TypeClass_STRING:
     447                 :    1102998 :             ::rtl_uString_assign( (rtl_uString **)pDest, *(rtl_uString **)pSource );
     448                 :    1102998 :             return sal_True;
     449                 :            :         default:
     450                 :       3330 :             return sal_False;
     451                 :            :         }
     452                 :            :     case typelib_TypeClass_TYPE:
     453         [ +  - ]:       1151 :         switch (pSourceType->eTypeClass)
     454                 :            :         {
     455                 :            :         case typelib_TypeClass_TYPE:
     456                 :            :         {
     457                 :       1151 :             typelib_TypeDescriptionReference ** pp = (typelib_TypeDescriptionReference **)pDest;
     458                 :       1151 :             ::typelib_typedescriptionreference_release( *pp );
     459                 :       1151 :             *pp = *(typelib_TypeDescriptionReference **)pSource;
     460                 :       1151 :             TYPE_ACQUIRE( *pp );
     461                 :       1151 :             return sal_True;
     462                 :            :         }
     463                 :            :         default:
     464                 :          0 :             return sal_False;
     465                 :            :         }
     466                 :            :     case typelib_TypeClass_ANY:
     467                 :     662674 :         _destructAny( (uno_Any *)pDest, release );
     468                 :     662674 :         _copyConstructAny( (uno_Any *)pDest, pSource, pSourceType, pSourceTypeDescr, acquire, 0 );
     469                 :     662674 :         return sal_True;
     470                 :            :     case typelib_TypeClass_ENUM:
     471         [ +  + ]:     954928 :         if (_type_equals( pDestType, pSourceType ))
     472                 :            :         {
     473                 :     954327 :             *(sal_Int32 *)pDest = *(sal_Int32 *)pSource;
     474                 :     954327 :             return sal_True;
     475                 :            :         }
     476                 :        601 :         return sal_False;
     477                 :            :     case typelib_TypeClass_STRUCT:
     478                 :            :     case typelib_TypeClass_EXCEPTION:
     479 [ +  + ][ +  + ]:    1587802 :         if (typelib_TypeClass_STRUCT == pSourceType->eTypeClass ||
     480                 :            :             typelib_TypeClass_EXCEPTION == pSourceType->eTypeClass)
     481                 :            :         {
     482                 :    1240627 :             sal_Bool bRet = sal_False;
     483         [ +  + ]:    1240627 :             if (pSourceTypeDescr)
     484                 :            :             {
     485                 :            :                 typelib_CompoundTypeDescription * pTypeDescr =
     486                 :       2412 :                     (typelib_CompoundTypeDescription *)pSourceTypeDescr;
     487   [ +  -  -  + ]:       4824 :                 while (pTypeDescr &&
                 [ -  + ]
     488                 :            :                        !_type_equals(
     489                 :       2412 :                            ((typelib_TypeDescription *)pTypeDescr)->pWeakRef, pDestType ))
     490                 :            :                 {
     491                 :          0 :                     pTypeDescr = pTypeDescr->pBaseTypeDescription;
     492                 :            :                 }
     493         [ +  - ]:       2412 :                 if (pTypeDescr)
     494                 :            :                 {
     495                 :            :                     bRet = _assignStruct(
     496                 :       2412 :                         pDest, pSource, pTypeDescr, queryInterface, acquire, release );
     497                 :            :                 }
     498                 :            :             }
     499                 :            :             else
     500                 :            :             {
     501 [ +  - ][ -  + ]:    1238215 :                 TYPELIB_DANGER_GET( &pSourceTypeDescr, pSourceType );
         [ +  - ][ -  + ]
                 [ #  # ]
     502                 :            :                 typelib_CompoundTypeDescription * pTypeDescr =
     503                 :    1238215 :                     (typelib_CompoundTypeDescription *)pSourceTypeDescr;
     504   [ +  +  +  + ]:    2564742 :                 while (pTypeDescr &&
                 [ +  + ]
     505                 :            :                        !_type_equals(
     506                 :    1239882 :                            ((typelib_TypeDescription *)pTypeDescr)->pWeakRef, pDestType ))
     507                 :            :                 {
     508                 :      86645 :                     pTypeDescr = pTypeDescr->pBaseTypeDescription;
     509                 :            :                 }
     510         [ +  + ]:    1238215 :                 if (pTypeDescr)
     511                 :            :                 {
     512                 :            :                     bRet = _assignStruct(
     513                 :    1153237 :                         pDest, pSource, pTypeDescr, queryInterface, acquire, release );
     514                 :            :                 }
     515 [ +  - ][ -  + ]:    1238215 :                 TYPELIB_DANGER_RELEASE( pSourceTypeDescr );
     516                 :            :             }
     517                 :    1240627 :             return bRet;
     518                 :            :         }
     519                 :     347175 :         return sal_False;
     520                 :            :     case typelib_TypeClass_ARRAY:
     521                 :            :         {
     522                 :          0 :             sal_Bool bRet = sal_False;
     523         [ #  # ]:          0 :             if (pSourceTypeDescr)
     524                 :            :             {
     525                 :            :                 typelib_ArrayTypeDescription * pTypeDescr =
     526                 :          0 :                     (typelib_ArrayTypeDescription *)pSourceTypeDescr;
     527                 :          0 :                 bRet = _assignArray( pDest, pSource, pTypeDescr, queryInterface, acquire, release );
     528                 :            :             }
     529                 :            :             else
     530                 :            :             {
     531 [ #  # ][ #  # ]:          0 :                 TYPELIB_DANGER_GET( &pSourceTypeDescr, pSourceType );
         [ #  # ][ #  # ]
                 [ #  # ]
     532                 :            :                 typelib_ArrayTypeDescription * pTypeDescr =
     533                 :          0 :                     (typelib_ArrayTypeDescription *)pSourceTypeDescr;
     534         [ #  # ]:          0 :                 if ( pTypeDescr )
     535                 :            :                 {
     536                 :            :                     bRet = _assignArray(
     537                 :          0 :                         pDest, pSource, pTypeDescr, queryInterface, acquire, release );
     538                 :            :                 }
     539 [ #  # ][ #  # ]:          0 :                 TYPELIB_DANGER_RELEASE( pSourceTypeDescr );
     540                 :            :             }
     541                 :          0 :             return bRet;
     542                 :            :         }
     543                 :            :     case typelib_TypeClass_UNION:
     544         [ #  # ]:          0 :         if (_type_equals( pDestType, pSourceType ))
     545                 :            :         {
     546         [ #  # ]:          0 :             if (pDestTypeDescr)
     547                 :            :             {
     548                 :          0 :                 _destructUnion( pDest, pDestTypeDescr, release );
     549                 :          0 :                 _copyConstructUnion( pDest, pSource, pDestTypeDescr, acquire, 0 );
     550                 :            :             }
     551                 :            :             else
     552                 :            :             {
     553 [ #  # ][ #  # ]:          0 :                 TYPELIB_DANGER_GET( &pDestTypeDescr, pDestType );
         [ #  # ][ #  # ]
                 [ #  # ]
     554                 :          0 :                 _destructUnion( pDest, pDestTypeDescr, release );
     555                 :          0 :                 _copyConstructUnion( pDest, pSource, pDestTypeDescr, acquire, 0 );
     556 [ #  # ][ #  # ]:          0 :                 TYPELIB_DANGER_RELEASE( pDestTypeDescr );
     557                 :            :             }
     558                 :          0 :             return sal_True;
     559                 :            :         }
     560                 :          0 :         return sal_False;
     561                 :            :     case typelib_TypeClass_SEQUENCE:
     562         [ +  + ]:    2264673 :         if (typelib_TypeClass_SEQUENCE != pSourceType->eTypeClass)
     563                 :      29712 :             return sal_False;
     564                 :            :         // self assignment:
     565         [ +  + ]:    2234961 :         if (*(uno_Sequence **)pSource == *(uno_Sequence **)pDest)
     566                 :     129626 :             return sal_True;
     567         [ +  + ]:    2105335 :         if (_type_equals( pDestType, pSourceType ))
     568                 :            :         {
     569                 :            :             ::osl_incrementInterlockedCount(
     570                 :    2076225 :                 &(*(uno_Sequence **)pSource)->nRefCount );
     571                 :            :             idestructSequence(
     572                 :    2076225 :                 *(uno_Sequence **)pDest, pDestType, pDestTypeDescr, release );
     573                 :    2076225 :             *(uno_Sequence **)pDest = *(uno_Sequence **)pSource;
     574                 :    2076225 :             return sal_True;
     575                 :            :         }
     576                 :      29110 :         return sal_False;
     577                 :            :     case typelib_TypeClass_INTERFACE:
     578         [ +  + ]:    2322219 :         if (typelib_TypeClass_INTERFACE != pSourceType->eTypeClass)
     579                 :     129232 :             return sal_False;
     580         [ +  + ]:    2192987 :         if (_type_equals( pDestType, pSourceType ))
     581                 :            :         {
     582                 :    1047374 :             _assignInterface( (void **)pDest, *(void **)pSource, acquire, release );
     583                 :    1047374 :             return sal_True;
     584                 :            :         }
     585         [ +  + ]:    1145613 :         else if (*static_cast< void ** >(pSource) == 0)
     586                 :            :         {
     587                 :            :             // A null reference of any interface type can be converted to a null
     588                 :            :             // reference of any other interface type:
     589                 :     297328 :             void * const pToBeReleased = *static_cast< void ** >(pDest);
     590                 :     297328 :             *static_cast< void ** >(pDest) = 0;
     591                 :     297328 :             _release( pToBeReleased, release );
     592                 :     297328 :             return true;
     593                 :            :         }
     594                 :            :         else
     595                 :            :         {
     596         [ -  + ]:     848285 :             if (pSourceTypeDescr)
     597                 :            :             {
     598                 :          0 :                 typelib_TypeDescription * pTD = pSourceTypeDescr;
     599 [ #  # ][ #  # ]:          0 :                 while (pTD && !_type_equals( pTD->pWeakRef, pDestType ))
                 [ #  # ]
     600                 :            :                 {
     601                 :            :                     pTD = (typelib_TypeDescription *)
     602                 :          0 :                         ((typelib_InterfaceTypeDescription *)pTD)->pBaseTypeDescription;
     603                 :            :                 }
     604         [ #  # ]:          0 :                 if (pTD) // is base of dest
     605                 :            :                 {
     606                 :          0 :                     _assignInterface( (void **)pDest, *(void **)pSource, acquire, release );
     607                 :          0 :                     return true;
     608                 :            :                 }
     609                 :            :             }
     610                 :            : 
     611                 :            :             // query for interface:
     612                 :            :             void * pQueried = _queryInterface( *static_cast<void **>(pSource),
     613                 :     848285 :                                                pDestType, queryInterface );
     614         [ +  + ]:     848285 :             if (pQueried != 0) {
     615                 :     797277 :                 void * const pToBeReleased = *static_cast<void **>(pDest);
     616                 :     797277 :                 *static_cast<void **>(pDest) = pQueried;
     617                 :     797277 :                 _release( pToBeReleased, release );
     618                 :            :             }
     619                 :     848285 :             return (pQueried != 0);
     620                 :            :         }
     621                 :            :     default:
     622                 :            :         OSL_ASSERT(false);
     623                 :   11118304 :         return sal_False;
     624                 :            :     }
     625                 :            : }
     626                 :            : 
     627                 :            : }
     628                 :            : 
     629                 :            : #endif
     630                 :            : 
     631                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10