| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| #ifndef PRIM_HXX |
| #define PRIM_HXX |
| |
| #include "typelib/typedescription.h" |
| #ifndef _typelib_TypeClass_H_ |
| #include "typelib/typeclass.h" |
| #endif |
| #include "uno/sequence2.h" |
| #include "uno/any2.h" |
| #include "uno/data.h" |
| #include "uno/mapping.h" |
| #include "uno/dispatcher.h" |
| |
| #ifndef _OSL_INTERLCK_H |
| #include "osl/interlck.h" |
| #endif |
| #include "osl/diagnose.h" |
| #ifndef _RTL_USTRING_HXX |
| #include "rtl/ustring.hxx" |
| #endif |
| #include "rtl/alloc.h" |
| |
| #if OSL_DEBUG_LEVEL > 1 |
| #include "rtl/ustrbuf.hxx" |
| #include "rtl/string.hxx" |
| #endif |
| |
| |
| namespace cppu |
| { |
| |
| extern uno_Sequence g_emptySeq; |
| extern typelib_TypeDescriptionReference * g_pVoidType; |
| |
| //-------------------------------------------------------------------------------------------------- |
| inline void * _map( |
| void * p, |
| typelib_TypeDescriptionReference * pType, typelib_TypeDescription * pTypeDescr, |
| uno_Mapping * mapping ) |
| SAL_THROW( () ) |
| { |
| void * pRet = 0; |
| if (p) |
| { |
| if (pTypeDescr) |
| { |
| (*mapping->mapInterface)( |
| mapping, &pRet, p, (typelib_InterfaceTypeDescription *)pTypeDescr ); |
| } |
| else |
| { |
| TYPELIB_DANGER_GET( &pTypeDescr, pType ); |
| (*mapping->mapInterface)( |
| mapping, &pRet, p, (typelib_InterfaceTypeDescription *)pTypeDescr ); |
| TYPELIB_DANGER_RELEASE( pTypeDescr ); |
| } |
| } |
| return pRet; |
| } |
| //-------------------------------------------------------------------------------------------------- |
| inline void _acquire( void * p, uno_AcquireFunc acquire ) SAL_THROW( () ) |
| { |
| if (p) |
| { |
| if (acquire) |
| { |
| (*acquire)( p ); |
| } |
| else |
| { |
| (*((uno_Interface *)p)->acquire)( (uno_Interface *)p ); |
| } |
| } |
| } |
| //-------------------------------------------------------------------------------------------------- |
| inline void _release( void * p, uno_ReleaseFunc release ) SAL_THROW( () ) |
| { |
| if (p) |
| { |
| if (release) |
| { |
| (*release)( p ); |
| } |
| else |
| { |
| (*((uno_Interface *)p)->release)( (uno_Interface *)p ); |
| } |
| } |
| } |
| |
| //------------------------------------------------------------------------------ |
| inline sal_uInt32 calcSeqMemSize( |
| sal_Int32 nElementSize, sal_Int32 nElements ) |
| { |
| sal_uInt64 nSize = |
| (sal_uInt64) SAL_SEQUENCE_HEADER_SIZE + |
| ((sal_uInt64) nElementSize * (sal_uInt64) nElements); |
| if (nSize > 0xffffffffU) |
| return 0; |
| else |
| return (sal_uInt32) nSize; |
| } |
| |
| //-------------------------------------------------------------------------------------------------- |
| inline uno_Sequence * createEmptySequence() SAL_THROW( () ) |
| { |
| ::osl_incrementInterlockedCount( &g_emptySeq.nRefCount ); |
| return &g_emptySeq; |
| } |
| //-------------------------------------------------------------------------------------------------- |
| inline typelib_TypeDescriptionReference * _getVoidType() |
| SAL_THROW( () ) |
| { |
| if (! g_pVoidType) |
| { |
| g_pVoidType = * ::typelib_static_type_getByTypeClass( typelib_TypeClass_VOID ); |
| } |
| ::typelib_typedescriptionreference_acquire( g_pVoidType ); |
| return g_pVoidType; |
| } |
| |
| //-------------------------------------------------------------------------------------------------- |
| #if OSL_DEBUG_LEVEL > 0 |
| #define CONSTRUCT_EMPTY_ANY( pAny ) \ |
| (pAny)->pType = _getVoidType(); \ |
| (pAny)->pData = (void *)0xdeadbeef; |
| #else |
| #define CONSTRUCT_EMPTY_ANY( pAny ) \ |
| (pAny)->pType = _getVoidType(); \ |
| (pAny)->pData = (pAny); |
| #endif |
| |
| //-------------------------------------------------------------------------------------------------- |
| #define TYPE_ACQUIRE( pType ) \ |
| ::osl_incrementInterlockedCount( &(pType)->nRefCount ); |
| |
| //-------------------------------------------------------------------------------------------------- |
| extern "C" void * binuno_queryInterface( |
| void * pUnoI, typelib_TypeDescriptionReference * pDestType ); |
| |
| //-------------------------------------------------------------------------------------------------- |
| inline typelib_TypeDescriptionReference * _unionGetSetType( |
| void * pUnion, typelib_TypeDescription * pTD ) |
| SAL_THROW( () ) |
| { |
| typelib_TypeDescriptionReference * pRet = 0; |
| sal_Int32 nPos; |
| |
| sal_Int64 * pDiscr = ((typelib_UnionTypeDescription *)pTD)->pDiscriminants; |
| sal_Int64 nDiscr = *(sal_Int64 *)pUnion; |
| for ( nPos = ((typelib_UnionTypeDescription *)pTD)->nMembers; nPos--; ) |
| { |
| if (pDiscr[nPos] == nDiscr) |
| { |
| pRet = ((typelib_UnionTypeDescription *)pTD)->ppTypeRefs[nPos]; |
| break; |
| } |
| } |
| if (nPos >= 0) |
| { |
| // default |
| pRet = ((typelib_UnionTypeDescription *)pTD)->pDefaultTypeRef; |
| } |
| typelib_typedescriptionreference_acquire( pRet ); |
| return pRet; |
| } |
| //-------------------------------------------------------------------------------------------------- |
| inline sal_Bool _type_equals( |
| typelib_TypeDescriptionReference * pType1, typelib_TypeDescriptionReference * pType2 ) |
| SAL_THROW( () ) |
| { |
| return (pType1 == pType2 || |
| (pType1->eTypeClass == pType2->eTypeClass && |
| pType1->pTypeName->length == pType2->pTypeName->length && |
| ::rtl_ustr_compare( pType1->pTypeName->buffer, pType2->pTypeName->buffer ) == 0)); |
| } |
| |
| } |
| |
| #endif |