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 : :
20 : :
21 : : #include "tdmgr_common.hxx"
22 : : #include "rtl/ustrbuf.hxx"
23 : : #include "typelib/typedescription.h"
24 : : #include "com/sun/star/beans/PropertyAttribute.hpp"
25 : : #include "com/sun/star/reflection/XConstantsTypeDescription.hpp"
26 : : #include "com/sun/star/reflection/XIndirectTypeDescription.hpp"
27 : : #include "com/sun/star/reflection/XEnumTypeDescription.hpp"
28 : : #include "com/sun/star/reflection/XStructTypeDescription.hpp"
29 : : #include "com/sun/star/reflection/XInterfaceTypeDescription2.hpp"
30 : : #include "com/sun/star/reflection/XInterfaceMethodTypeDescription.hpp"
31 : : #include "com/sun/star/reflection/XInterfaceAttributeTypeDescription2.hpp"
32 : : #include "com/sun/star/reflection/XServiceTypeDescription2.hpp"
33 : : #include "com/sun/star/reflection/XSingletonTypeDescription2.hpp"
34 : :
35 : :
36 : : using ::rtl::OUString;
37 : : using ::rtl::OUStringBuffer;
38 : : using namespace ::com::sun::star;
39 : : using namespace ::com::sun::star::uno;
40 : : using namespace ::stoc_tdmgr;
41 : :
42 : : namespace {
43 : :
44 : 0 : OUString getTypeClassName( TypeClass tc )
45 : : {
46 : 0 : typelib_EnumTypeDescription * typeDescr = 0;
47 [ # # ]: 0 : OUString name = OUSTR("com.sun.star.uno.TypeClass");
48 : : typelib_typedescription_getByName(
49 : 0 : reinterpret_cast<typelib_TypeDescription **>(&typeDescr), name.pData );
50 : : OSL_ASSERT( typeDescr != 0 );
51 [ # # ]: 0 : if (typeDescr == 0)
52 [ # # ]: 0 : return OUSTR("Cannot get type description of ") + name;
53 : : typelib_typedescription_complete(
54 : 0 : reinterpret_cast<typelib_TypeDescription **>(&typeDescr) );
55 : :
56 : 0 : sal_Int32 const * pValues = typeDescr->pEnumValues;
57 : 0 : sal_Int32 nPos = typeDescr->nEnumValues;
58 [ # # ]: 0 : while (nPos--)
59 : : {
60 [ # # ]: 0 : if (pValues[ nPos ] == (sal_Int32) tc)
61 : 0 : break;
62 : : }
63 [ # # ]: 0 : if (nPos >= 0)
64 : 0 : name = typeDescr->ppEnumNames[ nPos ];
65 : : else
66 : : name = OUSTR("unknown TypeClass value: ") +
67 [ # # ]: 0 : OUString::valueOf( (sal_Int32) tc );
68 : :
69 : : typelib_typedescription_release(
70 : 0 : reinterpret_cast<typelib_TypeDescription *>(typeDescr) );
71 : 0 : return name;
72 : : }
73 : :
74 : 0 : OUString getPropertyFlagsAsString( sal_Int16 attributes )
75 : : {
76 : 0 : OUStringBuffer buf;
77 [ # # ]: 0 : if ((attributes & beans::PropertyAttribute::MAYBEVOID) != 0)
78 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("MAYBEVOID, ") );
79 [ # # ]: 0 : if ((attributes & beans::PropertyAttribute::BOUND) != 0)
80 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("BOUND, ") );
81 [ # # ]: 0 : if ((attributes & beans::PropertyAttribute::CONSTRAINED) != 0)
82 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("CONSTRAINED, ") );
83 [ # # ]: 0 : if ((attributes & beans::PropertyAttribute::TRANSIENT) != 0)
84 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("TRANSIENT, ") );
85 [ # # ]: 0 : if ((attributes & beans::PropertyAttribute::READONLY) != 0)
86 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("READONLY, ") );
87 [ # # ]: 0 : if ((attributes & beans::PropertyAttribute::MAYBEAMBIGUOUS) != 0)
88 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("MAYBEAMBIGUOUS, ") );
89 [ # # ]: 0 : if ((attributes & beans::PropertyAttribute::MAYBEDEFAULT) != 0)
90 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("MAYBEDEFAULT, ") );
91 [ # # ]: 0 : if ((attributes & beans::PropertyAttribute::REMOVEABLE) != 0)
92 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("REMOVEABLE, ") );
93 [ # # ]: 0 : if ((attributes & beans::PropertyAttribute::OPTIONAL) != 0)
94 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("OPTIONAL") );
95 [ # # ]: 0 : else if (buf.getLength() > 0)
96 [ # # ]: 0 : buf.setLength( buf.getLength() - 2 ); // truncate ", "
97 [ # # ]: 0 : return buf.makeStringAndClear();
98 : : }
99 : :
100 : 0 : void typeError( OUString const & msg, OUString const & context )
101 : : {
102 : 0 : OUStringBuffer buf;
103 [ # # ]: 0 : if (!context.isEmpty()) {
104 [ # # ]: 0 : buf.append( static_cast<sal_Unicode>('[') );
105 [ # # ]: 0 : buf.append( context );
106 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("] ") );
107 : : }
108 [ # # ]: 0 : buf.append( msg );
109 [ # # ]: 0 : throw IncompatibleTypeException( buf.makeStringAndClear() );
110 : : }
111 : :
112 : : template<typename T>
113 : 0 : void checkSeq( Sequence< Reference<T> > const & newTypes,
114 : : Sequence< Reference<T> > const & existingTypes,
115 : : OUString const & context,
116 : : bool optionalMode = false )
117 : : {
118 : 0 : sal_Int32 len = newTypes.getLength();
119 [ # # # # : 0 : if (len != existingTypes.getLength())
# # # # #
# # # #
# ]
120 : : {
121 [ # # ][ # # ]: 0 : if (!optionalMode || len < newTypes.getLength())
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
122 [ # # ][ # # ]: 0 : typeError( OUSTR("Different number of types!"), context );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
123 : 0 : len = existingTypes.getLength();
124 : : }
125 : :
126 : 0 : Reference<T> const * pNewTypes = newTypes.getConstArray();
127 : 0 : Reference<T> const * pExistingTypes = existingTypes.getConstArray();
128 [ # # ][ # # ]: 0 : for ( sal_Int32 pos = 0; pos < len; ++pos )
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
129 : : {
130 : 0 : OUStringBuffer buf;
131 [ # # # # : 0 : buf.append( context );
# # # # #
# # # #
# ]
132 [ # # ][ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(", position ") );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
133 [ # # ][ # # ]: 0 : buf.append( pos );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
134 [ # # ][ # # ]: 0 : check( pNewTypes[pos].get(), pExistingTypes[pos].get(),
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
135 : : buf.makeStringAndClear() );
136 : : }
137 : 0 : }
138 : :
139 : 0 : void checkEnum(
140 : : Reference<reflection::XEnumTypeDescription> const & xNewTD,
141 : : Reference<reflection::XEnumTypeDescription> const & xExistingTD )
142 : : {
143 [ # # ][ # # ]: 0 : if (xNewTD->getEnumNames() != xExistingTD->getEnumNames())
[ # # ][ # # ]
[ # # ]
144 [ # # ][ # # ]: 0 : typeError( OUSTR("ENUM names don't match!"), xNewTD->getName() );
145 [ # # ][ # # ]: 0 : if (xNewTD->getEnumValues() != xExistingTD->getEnumValues())
[ # # ][ # # ]
[ # # ]
146 [ # # ][ # # ]: 0 : typeError( OUSTR("ENUM values don't match!"), xNewTD->getName() );
147 : 0 : }
148 : :
149 : 0 : void checkStruct(
150 : : Reference<reflection::XCompoundTypeDescription> const & xNewTD,
151 : : Reference<reflection::XCompoundTypeDescription> const & xExistingTD )
152 : : {
153 [ # # ][ # # ]: 0 : check( xNewTD->getBaseType(), xExistingTD->getBaseType(),
154 [ # # ][ # # ]: 0 : xNewTD->getName() + OUSTR(", base type") );
[ # # ][ # # ]
[ # # ]
155 [ # # ][ # # ]: 0 : checkSeq( xNewTD->getMemberTypes(), xExistingTD->getMemberTypes(),
156 [ # # ][ # # ]: 0 : xNewTD->getName() + OUSTR(", member types") );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
157 : :
158 [ # # ][ # # ]: 0 : if (xNewTD->getMemberNames() != xExistingTD->getMemberNames())
[ # # ][ # # ]
[ # # ]
159 [ # # ][ # # ]: 0 : typeError( OUSTR("Different member names!"), xNewTD->getName() );
160 : :
161 [ # # ]: 0 : if (xNewTD->getTypeClass() == TypeClass_STRUCT)
162 : : {
163 : : Reference<reflection::XStructTypeDescription> xNewStructTD(
164 [ # # ]: 0 : xNewTD, UNO_QUERY );
165 : : Reference<reflection::XStructTypeDescription> xExistingStructTD(
166 [ # # ]: 0 : xExistingTD, UNO_QUERY );
167 [ # # ][ # # ]: 0 : if (xNewStructTD.is() && xExistingStructTD.is())
[ # # ]
168 : : {
169 [ # # ][ # # ]: 0 : if (xNewStructTD->getTypeParameters() !=
170 [ # # ][ # # ]: 0 : xExistingStructTD->getTypeParameters())
[ # # ][ # # ]
[ # # ][ # # ]
171 : : typeError( OUSTR("Different type parameters of instantiated "
172 [ # # ][ # # ]: 0 : "polymorphic STRUCT!"), xNewTD->getName() );
[ # # ][ # # ]
173 [ # # ]: 0 : checkSeq( xNewStructTD->getTypeArguments(),
174 [ # # ]: 0 : xExistingStructTD->getTypeArguments(),
175 [ # # ][ # # ]: 0 : xNewTD->getName() + OUSTR(", argument types") );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
176 : : }
177 [ # # ][ # # ]: 0 : else if (xNewStructTD.is() || xExistingStructTD.is())
[ # # ]
178 : : typeError( OUSTR("Mixing polymorphic STRUCT types "
179 [ # # ][ # # ]: 0 : "with non-polymorphic!"), xNewTD->getName() );
[ # # ][ # # ]
180 : : }
181 : 0 : }
182 : :
183 : 0 : void checkInterface(
184 : : Reference<reflection::XInterfaceTypeDescription2> const & xNewTD,
185 : : Reference<reflection::XInterfaceTypeDescription2> const & xExistingTD )
186 : : {
187 [ # # ][ # # ]: 0 : checkSeq( xNewTD->getBaseTypes(), xExistingTD->getBaseTypes(),
188 [ # # ][ # # ]: 0 : xNewTD->getName() + OUSTR(", base types") );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
189 [ # # ][ # # ]: 0 : checkSeq(xNewTD->getOptionalBaseTypes(),xExistingTD->getOptionalBaseTypes(),
190 [ # # ][ # # ]: 0 : xNewTD->getName() + OUSTR(", optional base types") );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
191 [ # # ][ # # ]: 0 : checkSeq( xNewTD->getMembers(), xExistingTD->getMembers(),
192 [ # # ][ # # ]: 0 : xNewTD->getName() + OUSTR(", members") );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
193 : 0 : }
194 : :
195 : 0 : void checkRestParam( Reference<reflection::XParameter> const & xNewParam,
196 : : Reference<reflection::XParameter> const & xExistingParam,
197 : : OUString const & context )
198 : : {
199 [ # # ]: 0 : if (xNewParam->isRestParameter() != xExistingParam->isRestParameter())
200 [ # # ]: 0 : typeError( OUSTR("Different ... parameters specified!"), context );
201 : 0 : }
202 : :
203 : 0 : void checkRestParam(
204 : : SAL_UNUSED_PARAMETER Reference<reflection::XMethodParameter> const &,
205 : : SAL_UNUSED_PARAMETER Reference<reflection::XMethodParameter> const &,
206 : : SAL_UNUSED_PARAMETER OUString const & )
207 : 0 : {}
208 : :
209 : : template<typename T>
210 : 0 : void checkParameters( Sequence< Reference<T> > const & newParams,
211 : : Sequence< Reference<T> > const & existingParams,
212 : : OUString const & context_ )
213 : : {
214 : 0 : sal_Int32 len = newParams.getLength();
215 [ # # # # ]: 0 : if (len != existingParams.getLength())
216 [ # # ][ # # ]: 0 : typeError( OUSTR("Different number of parameters!"), context_ );
217 : 0 : Reference<T> const * pNewParams = newParams.getConstArray();
218 : 0 : Reference<T> const * pExistingParams = existingParams.getConstArray();
219 [ # # ][ # # ]: 0 : for ( sal_Int32 pos = 0; pos < len; ++pos )
220 : : {
221 : 0 : Reference<T> const & xNewParam = pNewParams[pos];
222 : 0 : Reference<T> const & xExistingParam = pExistingParams[pos];
223 : :
224 : 0 : OUStringBuffer buf;
225 [ # # # # ]: 0 : buf.append( context_ );
226 [ # # ][ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(", parameter ") );
227 [ # # ][ # # ]: 0 : buf.append( pos );
228 : : OSL_ASSERT( pos == xNewParam->getPosition() &&
229 : : pos == xExistingParam->getPosition() );
230 [ # # ][ # # ]: 0 : OUString context( buf.makeStringAndClear() );
231 : :
232 [ # # ][ # # ]: 0 : if (xNewParam->getName() != xExistingParam->getName())
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
233 : : {
234 [ # # ][ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("Name differs: ") );
235 [ # # ][ # # ]: 0 : buf.append( xNewParam->getName() );
[ # # ][ # # ]
[ # # ][ # # ]
236 [ # # # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(", ") );
237 [ # # ][ # # ]: 0 : buf.append( xExistingParam->getName() );
[ # # ][ # # ]
[ # # ][ # # ]
238 [ # # ][ # # ]: 0 : typeError( buf.makeStringAndClear(), context );
[ # # ][ # # ]
239 : : }
240 [ # # ][ # # ]: 0 : check( xNewParam->getType(), xExistingParam->getType(), context );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
241 : :
242 [ # # ][ # # ]: 0 : if (xNewParam->isIn() != xExistingParam->isIn())
[ # # ]
[ # # # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
243 [ # # ][ # # ]: 0 : typeError( OUSTR("IN attribute differs!"), context );
[ # # ][ # # ]
244 [ # # ][ # # ]: 0 : if (xNewParam->isOut() != xExistingParam->isOut())
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
245 [ # # ][ # # ]: 0 : typeError( OUSTR("OUT attribute differs!"), context );
[ # # ][ # # ]
246 [ # # ]: 0 : checkRestParam( xNewParam, xExistingParam, context );
247 : : }
248 : 0 : }
249 : :
250 : 0 : static void checkMethod(
251 : : Reference<reflection::XInterfaceMethodTypeDescription> const & xNewTD,
252 : : Reference<reflection::XInterfaceMethodTypeDescription> const & xExistingTD )
253 : : {
254 [ # # ][ # # ]: 0 : check( xNewTD->getReturnType(), xExistingTD->getReturnType(),
255 [ # # ][ # # ]: 0 : xNewTD->getName() );
[ # # ]
256 : :
257 [ # # ]: 0 : if (xNewTD->isOneway() != xExistingTD->isOneway())
258 : : typeError( OUSTR("Methods have differing OneWay attribute!"),
259 [ # # ][ # # ]: 0 : xNewTD->getName() );
260 : :
261 [ # # ][ # # ]: 0 : checkParameters( xNewTD->getParameters(), xExistingTD->getParameters(),
262 [ # # ][ # # ]: 0 : xNewTD->getName() );
[ # # ][ # # ]
[ # # ]
263 : :
264 [ # # ][ # # ]: 0 : checkSeq( xNewTD->getExceptions(), xExistingTD->getExceptions(),
265 [ # # ][ # # ]: 0 : xNewTD->getName() + OUSTR(", declared exceptions") );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
266 : 0 : }
267 : :
268 : 0 : void checkAttribute(
269 : : Reference<reflection::XInterfaceAttributeTypeDescription2> const & xNewTD,
270 : : Reference<reflection::XInterfaceAttributeTypeDescription2>
271 : : const & xExistingTD )
272 : : {
273 [ # # ]: 0 : if (xNewTD->isReadOnly() != xExistingTD->isReadOnly())
274 [ # # ][ # # ]: 0 : typeError( OUSTR("ReadOnly attribute differs!"), xNewTD->getName() );
275 : :
276 [ # # ][ # # ]: 0 : check( xNewTD->getType(), xExistingTD->getType(),
277 [ # # ][ # # ]: 0 : xNewTD->getName() + OUSTR(", attribute type") );
[ # # ][ # # ]
[ # # ]
278 : :
279 [ # # ]: 0 : if (xNewTD->isBound() != xExistingTD->isBound())
280 [ # # ][ # # ]: 0 : typeError( OUSTR("Bound attribute differs!"), xNewTD->getName() );
281 : :
282 [ # # ][ # # ]: 0 : checkSeq( xNewTD->getGetExceptions(), xExistingTD->getGetExceptions(),
283 [ # # ][ # # ]: 0 : xNewTD->getName() + OUSTR(", getter exceptions") );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
284 [ # # ][ # # ]: 0 : checkSeq( xNewTD->getSetExceptions(), xExistingTD->getSetExceptions(),
285 [ # # ][ # # ]: 0 : xNewTD->getName() + OUSTR(", setter exceptions") );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
286 : 0 : }
287 : :
288 : 0 : void checkProperty(
289 : : Reference<reflection::XPropertyTypeDescription> const & xNewTD,
290 : : Reference<reflection::XPropertyTypeDescription> const & xExistingTD )
291 : : {
292 [ # # ]: 0 : if (xNewTD->getPropertyFlags() != xExistingTD->getPropertyFlags())
293 : : {
294 : 0 : OUStringBuffer buf;
295 : : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(
296 [ # # ]: 0 : "Different set of property flags: { ") );
297 : : buf.append( getPropertyFlagsAsString(
298 [ # # ][ # # ]: 0 : xNewTD->getPropertyFlags() ) );
[ # # ][ # # ]
299 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(" } (new), { ") );
300 : : buf.append( getPropertyFlagsAsString(
301 [ # # ][ # # ]: 0 : xExistingTD->getPropertyFlags() ) );
[ # # ][ # # ]
302 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(" } (existing)!") );
303 [ # # ][ # # ]: 0 : typeError( buf.makeStringAndClear(), xNewTD->getName() );
[ # # ][ # # ]
304 : : }
305 : :
306 [ # # ]: 0 : check( xNewTD->getPropertyTypeDescription(),
307 [ # # ]: 0 : xExistingTD->getPropertyTypeDescription(),
308 [ # # ][ # # ]: 0 : xNewTD->getName() );
[ # # ]
309 : 0 : }
310 : :
311 : 0 : void checkSingleton(
312 : : Reference<reflection::XSingletonTypeDescription2> const & xNewTD,
313 : : Reference<reflection::XSingletonTypeDescription2> const & xExistingTD )
314 : : {
315 : 0 : sal_Bool ifaceBased = xNewTD->isInterfaceBased();
316 [ # # ]: 0 : if (ifaceBased != xExistingTD->isInterfaceBased())
317 : : typeError(
318 : : OUSTR("Mixing interface and NON-interface based singletons!"),
319 [ # # ][ # # ]: 0 : xNewTD->getName() );
320 [ # # ]: 0 : if (ifaceBased)
321 [ # # ][ # # ]: 0 : check( xNewTD->getInterface(), xExistingTD->getInterface(),
322 [ # # ][ # # ]: 0 : xNewTD->getName() );
[ # # ]
323 : : else
324 [ # # ][ # # ]: 0 : check( xNewTD->getService().get(), xExistingTD->getService().get(),
[ # # ][ # # ]
[ # # ][ # # ]
325 [ # # ][ # # ]: 0 : xNewTD->getName() );
[ # # ]
326 : 0 : }
327 : :
328 : 0 : void checkService(
329 : : Reference<reflection::XServiceTypeDescription2> const & xNewTD,
330 : : Reference<reflection::XServiceTypeDescription2> const & xExistingTD )
331 : : {
332 : 0 : sal_Bool singleIfaceBased = xNewTD->isSingleInterfaceBased();
333 [ # # ]: 0 : if (singleIfaceBased != xExistingTD->isSingleInterfaceBased())
334 : : typeError( OUSTR("Mixing interface and NON-interface based services!"),
335 [ # # ][ # # ]: 0 : xNewTD->getName() );
336 [ # # ]: 0 : if (singleIfaceBased)
337 : : {
338 [ # # ][ # # ]: 0 : check( xNewTD->getInterface(), xExistingTD->getInterface(),
339 [ # # ][ # # ]: 0 : xNewTD->getName() );
[ # # ][ # # ]
[ # # ]
340 : : Sequence< Reference<reflection::XServiceConstructorDescription> >
341 [ # # ][ # # ]: 0 : newCtors( xNewTD->getConstructors() );
342 : : Sequence< Reference<reflection::XServiceConstructorDescription> >
343 [ # # ][ # # ]: 0 : existingCtors( xExistingTD->getConstructors() );
344 : 0 : sal_Int32 len = newCtors.getLength();
345 [ # # ]: 0 : if (len != existingCtors.getLength())
346 : : typeError( OUSTR("Different number of service constructors!"),
347 [ # # ][ # # ]: 0 : xNewTD->getName() );
[ # # ][ # # ]
348 : : Reference<reflection::XServiceConstructorDescription> const *
349 : 0 : pNewCtors = newCtors.getConstArray();
350 : : Reference<reflection::XServiceConstructorDescription> const *
351 : 0 : pExistingCtors = existingCtors.getConstArray();
352 [ # # ]: 0 : for ( sal_Int32 pos = 0; pos < len; ++pos )
353 : : {
354 : : Reference<reflection::XServiceConstructorDescription> const &
355 : 0 : xNewCtor = pNewCtors[pos];
356 : : Reference<reflection::XServiceConstructorDescription> const &
357 : 0 : xExistingCtor = pExistingCtors[pos];
358 : :
359 [ # # ][ # # ]: 0 : if (xNewCtor->getName() != xExistingCtor->getName())
[ # # ][ # # ]
[ # # ]
360 : : {
361 : 0 : OUStringBuffer buf;
362 : : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(
363 [ # # ]: 0 : "Different constructor names: ") );
364 [ # # ][ # # ]: 0 : buf.append( xNewCtor->getName() );
[ # # ]
365 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(" (new), ") );
366 [ # # ][ # # ]: 0 : buf.append( xExistingCtor->getName() );
[ # # ]
367 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(" (existing)!") );
368 [ # # ][ # # ]: 0 : typeError( buf.makeStringAndClear(), xNewTD->getName() );
[ # # ][ # # ]
369 : : }
370 : :
371 : 0 : OUStringBuffer buf;
372 [ # # ][ # # ]: 0 : buf.append( xNewTD->getName() );
[ # # ]
373 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(", constructor ") );
374 [ # # ][ # # ]: 0 : buf.append( xNewCtor->getName() );
[ # # ]
375 [ # # ]: 0 : OUString context( buf.makeStringAndClear() );
376 [ # # ]: 0 : checkParameters( xNewCtor->getParameters(),
377 [ # # ]: 0 : xExistingCtor->getParameters(),
378 [ # # ][ # # ]: 0 : context );
[ # # ][ # # ]
[ # # ]
379 [ # # ][ # # ]: 0 : checkSeq( xNewCtor->getExceptions(), xExistingCtor->getExceptions(),
380 [ # # ][ # # ]: 0 : context + OUSTR(", exceptions") );
[ # # ][ # # ]
[ # # ][ # # ]
381 [ # # ][ # # ]: 0 : }
382 : : }
383 : : else // old-style service descriptions:
384 : : {
385 [ # # ]: 0 : checkSeq( xNewTD->getMandatoryServices(),
386 [ # # ]: 0 : xExistingTD->getMandatoryServices(),
387 [ # # ][ # # ]: 0 : xNewTD->getName() + OUSTR(", mandatory services") );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
388 [ # # ]: 0 : checkSeq( xNewTD->getOptionalServices(),
389 [ # # ]: 0 : xExistingTD->getOptionalServices(),
390 [ # # ]: 0 : xNewTD->getName() + OUSTR(", optional services"),
391 [ # # ][ # # ]: 0 : true /* optionalMode */ );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
392 [ # # ]: 0 : checkSeq( xNewTD->getMandatoryInterfaces(),
393 [ # # ]: 0 : xExistingTD->getMandatoryInterfaces(),
394 [ # # ][ # # ]: 0 : xNewTD->getName() + OUSTR(", mandatory interfaces") );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
395 [ # # ]: 0 : checkSeq( xNewTD->getOptionalInterfaces(),
396 [ # # ]: 0 : xExistingTD->getOptionalInterfaces(),
397 [ # # ]: 0 : xNewTD->getName() + OUSTR(", optional interfaces"),
398 [ # # ][ # # ]: 0 : true /* optionalMode */ );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
399 : :
400 : : Sequence< Reference<reflection::XPropertyTypeDescription> >
401 [ # # ][ # # ]: 0 : newProperties( xNewTD->getProperties() );
402 : : Sequence< Reference<reflection::XPropertyTypeDescription> >
403 [ # # ][ # # ]: 0 : existingProperties( xExistingTD->getProperties() );
404 : : checkSeq( newProperties, existingProperties,
405 [ # # ]: 0 : xNewTD->getName() + OUSTR(", properties"),
406 [ # # ][ # # ]: 0 : true /* optionalMode */ );
[ # # ]
407 [ # # ]: 0 : if (newProperties.getLength() > existingProperties.getLength())
408 : : {
409 : : // check whether all added properties are OPTIONAL:
410 : : Reference<reflection::XPropertyTypeDescription> const *
411 : 0 : pNewProperties = newProperties.getConstArray();
412 [ # # ]: 0 : for ( sal_Int32 pos = existingProperties.getLength() + 1;
413 : 0 : pos < newProperties.getLength(); ++pos )
414 : : {
415 [ # # ][ # # ]: 0 : if ((pNewProperties[pos]->getPropertyFlags() &
[ # # ]
416 : : beans::PropertyAttribute::OPTIONAL) == 0)
417 : : typeError( OUSTR("New property is not OPTIONAL!"),
418 [ # # ][ # # ]: 0 : pNewProperties[pos]->getName() );
[ # # ][ # # ]
419 : : }
420 [ # # ][ # # ]: 0 : }
421 : : }
422 : 0 : }
423 : :
424 : : }
425 : :
426 : : namespace stoc_tdmgr {
427 : :
428 : 0 : void check( Reference<reflection::XTypeDescription> const & xNewTD,
429 : : Reference<reflection::XTypeDescription> const & xExistingTD,
430 : : OUString const & context )
431 : : {
432 [ # # ]: 0 : if (xNewTD == xExistingTD)
433 : 0 : return;
434 [ # # ][ # # ]: 0 : if (xNewTD->getName() != xExistingTD->getName())
[ # # ]
435 : : {
436 : 0 : OUStringBuffer buf;
437 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("Different type names: ") );
438 [ # # ][ # # ]: 0 : buf.append( xNewTD->getName() );
[ # # ]
439 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(" (new), ") );
440 [ # # ][ # # ]: 0 : buf.append( xExistingTD->getName() );
[ # # ]
441 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(" (existing)!") );
442 [ # # ][ # # ]: 0 : typeError( buf.makeStringAndClear(), context );
443 : : }
444 : :
445 : 0 : TypeClass tc = xNewTD->getTypeClass();
446 [ # # ]: 0 : if (tc != xExistingTD->getTypeClass())
447 : : {
448 : 0 : OUStringBuffer buf;
449 [ # # ][ # # ]: 0 : buf.append( xNewTD->getName() );
[ # # ]
450 : : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(
451 [ # # ]: 0 : " has different type classes: ") );
452 [ # # ][ # # ]: 0 : buf.append( getTypeClassName( tc ) );
453 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(" (new), ") );
454 [ # # ][ # # ]: 0 : buf.append( getTypeClassName( xExistingTD->getTypeClass() ) );
[ # # ][ # # ]
455 [ # # ]: 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(" (existing)!") );
456 [ # # ][ # # ]: 0 : typeError( buf.makeStringAndClear(), context );
457 : : }
458 : :
459 [ # # # # : 0 : switch (tc)
# # # # #
# # # ]
460 : : {
461 : : case TypeClass_ENUM:
462 : : checkEnum( Reference<reflection::XEnumTypeDescription>(
463 : : xNewTD, UNO_QUERY_THROW ),
464 : : Reference<reflection::XEnumTypeDescription>(
465 [ # # ][ # # ]: 0 : xExistingTD, UNO_QUERY_THROW ) );
466 : 0 : break;
467 : :
468 : : case TypeClass_TYPEDEF:
469 : : case TypeClass_SEQUENCE:
470 : : check( Reference<reflection::XIndirectTypeDescription>(
471 [ # # ][ # # ]: 0 : xNewTD, UNO_QUERY_THROW )->getReferencedType(),
472 : : Reference<reflection::XIndirectTypeDescription>(
473 [ # # ][ # # ]: 0 : xExistingTD, UNO_QUERY_THROW )->getReferencedType() );
[ # # ][ # # ]
[ # # ]
474 : 0 : break;
475 : :
476 : : case TypeClass_STRUCT:
477 : : case TypeClass_EXCEPTION:
478 : : checkStruct( Reference<reflection::XCompoundTypeDescription>(
479 : : xNewTD, UNO_QUERY_THROW ),
480 : : Reference<reflection::XCompoundTypeDescription>(
481 [ # # ][ # # ]: 0 : xExistingTD, UNO_QUERY_THROW ) );
482 : 0 : break;
483 : :
484 : : case TypeClass_INTERFACE:
485 : : checkInterface( Reference<reflection::XInterfaceTypeDescription2>(
486 : : xNewTD, UNO_QUERY_THROW ),
487 : : Reference<reflection::XInterfaceTypeDescription2>(
488 [ # # ][ # # ]: 0 : xExistingTD, UNO_QUERY_THROW ) );
489 : 0 : break;
490 : :
491 : : case TypeClass_SERVICE:
492 : : checkService( Reference<reflection::XServiceTypeDescription2>(
493 : : xNewTD, UNO_QUERY_THROW ),
494 : : Reference<reflection::XServiceTypeDescription2>(
495 [ # # ][ # # ]: 0 : xExistingTD, UNO_QUERY_THROW ) );
496 : 0 : break;
497 : :
498 : : case TypeClass_INTERFACE_METHOD:
499 : : checkMethod( Reference<reflection::XInterfaceMethodTypeDescription>(
500 : : xNewTD, UNO_QUERY_THROW ),
501 : : Reference<reflection::XInterfaceMethodTypeDescription>(
502 [ # # ][ # # ]: 0 : xExistingTD, UNO_QUERY_THROW ) );
503 : 0 : break;
504 : : case TypeClass_INTERFACE_ATTRIBUTE:
505 : : checkAttribute(
506 : : Reference<reflection::XInterfaceAttributeTypeDescription2>(
507 : : xNewTD, UNO_QUERY_THROW ),
508 : : Reference<reflection::XInterfaceAttributeTypeDescription2>(
509 [ # # ][ # # ]: 0 : xExistingTD, UNO_QUERY_THROW ) );
510 : 0 : break;
511 : :
512 : : case TypeClass_PROPERTY:
513 : : checkProperty( Reference<reflection::XPropertyTypeDescription>(
514 : : xNewTD, UNO_QUERY_THROW ),
515 : : Reference<reflection::XPropertyTypeDescription>(
516 [ # # ][ # # ]: 0 : xExistingTD, UNO_QUERY_THROW ) );
517 : 0 : break;
518 : :
519 : : case TypeClass_CONSTANT:
520 [ # # ]: 0 : if (Reference<reflection::XConstantTypeDescription>(
521 [ # # ][ # # ]: 0 : xNewTD, UNO_QUERY_THROW )->getConstantValue() !=
522 : : Reference<reflection::XConstantTypeDescription>(
523 [ # # ][ # # ]: 0 : xExistingTD, UNO_QUERY_THROW )->getConstantValue())
[ # # ]
524 [ # # ][ # # ]: 0 : typeError( OUSTR("Different constant value!"), xNewTD->getName() );
525 : 0 : break;
526 : : case TypeClass_CONSTANTS:
527 : : checkSeq( Reference<reflection::XConstantsTypeDescription>(
528 [ # # ][ # # ]: 0 : xNewTD, UNO_QUERY_THROW )->getConstants(),
529 : : Reference<reflection::XConstantsTypeDescription>(
530 [ # # ][ # # ]: 0 : xExistingTD, UNO_QUERY_THROW )->getConstants(),
531 [ # # ][ # # ]: 0 : xNewTD->getName() );
[ # # ]
[ # # # # ]
532 : 0 : break;
533 : :
534 : : case TypeClass_SINGLETON:
535 : : checkSingleton( Reference<reflection::XSingletonTypeDescription2>(
536 : : xNewTD, UNO_QUERY_THROW ),
537 : : Reference<reflection::XSingletonTypeDescription2>(
538 [ # # ][ # # ]: 0 : xExistingTD, UNO_QUERY_THROW ) );
539 : 0 : break;
540 : :
541 : : default:
542 : 0 : break;
543 : : }
544 : : }
545 : :
546 : : }
547 : :
548 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|