xref: /AOO41X/main/cppu/inc/typelib/typedescription.hxx (revision c6ed87c9b37761ea466ee21111c4a4a314092829)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifndef _TYPELIB_TYPEDESCRIPTION_HXX_
24 #define _TYPELIB_TYPEDESCRIPTION_HXX_
25 
26 #include <rtl/alloc.h>
27 #include <rtl/ustring.hxx>
28 #include <com/sun/star/uno/Type.h>
29 #ifndef _TYPELIB_TYPEDESCRIPTION_H
30 #include <typelib/typedescription.h>
31 #endif
32 
33 
34 namespace com
35 {
36 namespace sun
37 {
38 namespace star
39 {
40 namespace uno
41 {
42 
43 /** C++ wrapper for typelib_TypeDescription.
44     Constructors by name, type, type description reference will get the full type description.
45 
46     @see typelib_TypeDescription
47 */
48 class TypeDescription
49 {
50     /** C typelib type description
51     */
52     mutable typelib_TypeDescription * _pTypeDescr;
53 
54 public:
55     // these are here to force memory de/allocation to sal lib.
56     /** @internal */
operator new(size_t nSize)57     inline static void * SAL_CALL operator new ( size_t nSize ) SAL_THROW( () )
58         { return ::rtl_allocateMemory( nSize ); }
59     /** @internal */
operator delete(void * pMem)60     inline static void SAL_CALL operator delete ( void * pMem ) SAL_THROW( () )
61         { ::rtl_freeMemory( pMem ); }
62     /** @internal */
operator new(size_t,void * pMem)63     inline static void * SAL_CALL operator new ( size_t, void * pMem ) SAL_THROW( () )
64         { return pMem; }
65     /** @internal */
operator delete(void *,void *)66     inline static void SAL_CALL operator delete ( void *, void * ) SAL_THROW( () )
67         {}
68 
69     /** Constructor:
70 
71         @param pTypeDescr a type description
72     */
73     inline TypeDescription( typelib_TypeDescription * pTypeDescr = 0 ) SAL_THROW( () );
74     /** Constructor:
75 
76         @param pTypeDescrRef a type description reference
77     */
78     inline TypeDescription( typelib_TypeDescriptionReference * pTypeDescrRef ) SAL_THROW( () );
79     /** Constructor:
80 
81         @param rType a type
82     */
83     inline TypeDescription( const ::com::sun::star::uno::Type & rType ) SAL_THROW( () );
84     /** Copy constructor:
85 
86         @param rDescr another TypeDescription
87     */
88     inline TypeDescription( const TypeDescription & rDescr ) SAL_THROW( () );
89     /** Constructor:
90 
91         @param pTypeName a type name
92     */
93     inline TypeDescription( rtl_uString * pTypeName ) SAL_THROW( () );
94     /** Constructor:
95 
96         @param rTypeName a type name
97     */
98     inline TypeDescription( const ::rtl::OUString & rTypeName ) SAL_THROW( () );
99     /** Destructor: releases type description
100     */
101     inline ~TypeDescription() SAL_THROW( () );
102 
103     /** Assignment operator: acquires given type description and releases a set one.
104 
105         @param pTypeDescr another type description
106         @return this TypeDescription
107     */
108     inline TypeDescription & SAL_CALL operator = ( typelib_TypeDescription * pTypeDescr ) SAL_THROW( () );
109     /** Assignment operator: acquires given type description and releases a set one.
110 
111         @param rTypeDescr another type description
112         @return this TypeDescription
113     */
operator =(const TypeDescription & rTypeDescr)114     inline TypeDescription & SAL_CALL operator =( const TypeDescription & rTypeDescr ) SAL_THROW( () )
115         { return this->operator =( rTypeDescr.get() ); }
116 
117     /** Tests whether two type descriptions are equal.
118 
119         @param pTypeDescr another type description
120         @return true, if both type descriptions are equal, false otherwise
121     */
122     inline sal_Bool SAL_CALL equals( const typelib_TypeDescription * pTypeDescr ) const SAL_THROW( () );
123     /** Tests whether two type descriptions are equal.
124 
125         @param rTypeDescr another type description
126         @return true, if both type descriptions are equal, false otherwise
127     */
equals(const TypeDescription & rTypeDescr) const128     inline sal_Bool SAL_CALL equals( const TypeDescription & rTypeDescr ) const SAL_THROW( () )
129         { return equals( rTypeDescr._pTypeDescr ); }
130 
131     /** Makes stored type description complete.
132     */
133     inline void SAL_CALL makeComplete() const SAL_THROW( () );
134 
135     /** Gets the UNacquired type description pointer.
136 
137         @return stored pointer of type description
138     */
get() const139     inline typelib_TypeDescription * SAL_CALL get() const SAL_THROW( () )
140         { return _pTypeDescr; }
141     /** Tests if a type description is set.
142 
143         @return true, if a type description is set, false otherwise
144     */
is() const145     inline sal_Bool SAL_CALL is() const SAL_THROW( () )
146         { return (_pTypeDescr != 0); }
147 };
148 //__________________________________________________________________________________________________
TypeDescription(typelib_TypeDescription * pTypeDescr)149 inline TypeDescription::TypeDescription( typelib_TypeDescription * pTypeDescr ) SAL_THROW( () )
150     : _pTypeDescr( pTypeDescr )
151 {
152     if (_pTypeDescr)
153         typelib_typedescription_acquire( _pTypeDescr );
154 }
155 //__________________________________________________________________________________________________
TypeDescription(typelib_TypeDescriptionReference * pTypeDescrRef)156 inline TypeDescription::TypeDescription( typelib_TypeDescriptionReference * pTypeDescrRef ) SAL_THROW( () )
157     : _pTypeDescr( 0 )
158 {
159     if (pTypeDescrRef)
160         typelib_typedescriptionreference_getDescription( &_pTypeDescr, pTypeDescrRef );
161 }
162 //__________________________________________________________________________________________________
TypeDescription(const::com::sun::star::uno::Type & rType)163 inline TypeDescription::TypeDescription( const ::com::sun::star::uno::Type & rType ) SAL_THROW( () )
164     : _pTypeDescr( 0 )
165 {
166     if (rType.getTypeLibType())
167         typelib_typedescriptionreference_getDescription( &_pTypeDescr, rType.getTypeLibType() );
168 }
169 //__________________________________________________________________________________________________
TypeDescription(const TypeDescription & rTypeDescr)170 inline TypeDescription::TypeDescription( const TypeDescription & rTypeDescr ) SAL_THROW( () )
171     : _pTypeDescr( rTypeDescr._pTypeDescr )
172 {
173     if (_pTypeDescr)
174         typelib_typedescription_acquire( _pTypeDescr );
175 }
176 //__________________________________________________________________________________________________
TypeDescription(rtl_uString * pTypeName)177 inline TypeDescription::TypeDescription( rtl_uString * pTypeName ) SAL_THROW( () )
178     : _pTypeDescr( 0 )
179 {
180     typelib_typedescription_getByName( &_pTypeDescr , pTypeName );
181 }
182 //__________________________________________________________________________________________________
TypeDescription(const::rtl::OUString & rTypeName)183 inline TypeDescription::TypeDescription( const ::rtl::OUString & rTypeName ) SAL_THROW( () )
184     : _pTypeDescr( 0 )
185 {
186     typelib_typedescription_getByName( &_pTypeDescr , rTypeName.pData );
187 }
188 //__________________________________________________________________________________________________
~TypeDescription()189 inline TypeDescription::~TypeDescription() SAL_THROW( () )
190 {
191     if (_pTypeDescr)
192         typelib_typedescription_release( _pTypeDescr );
193 }
194 //__________________________________________________________________________________________________
operator =(typelib_TypeDescription * pTypeDescr)195 inline TypeDescription & TypeDescription::operator = ( typelib_TypeDescription * pTypeDescr ) SAL_THROW( () )
196 {
197     if (pTypeDescr)
198         typelib_typedescription_acquire( pTypeDescr );
199     if (_pTypeDescr)
200         typelib_typedescription_release( _pTypeDescr );
201     _pTypeDescr = pTypeDescr;
202     return *this;
203 }
204 //__________________________________________________________________________________________________
equals(const typelib_TypeDescription * pTypeDescr) const205 inline sal_Bool TypeDescription::equals( const typelib_TypeDescription * pTypeDescr ) const SAL_THROW( () )
206 {
207     return (_pTypeDescr && pTypeDescr &&
208             typelib_typedescription_equals( _pTypeDescr, pTypeDescr ));
209 }
210 //__________________________________________________________________________________________________
makeComplete() const211 inline void TypeDescription::makeComplete() const SAL_THROW( () )
212 {
213     if (_pTypeDescr && !_pTypeDescr->bComplete)
214         ::typelib_typedescription_complete( &_pTypeDescr );
215 }
216 
217 }
218 }
219 }
220 }
221 
222 #endif
223