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 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_stoc.hxx"
26 #include "base.hxx"
27 
28 #include "registry/reader.hxx"
29 #include "registry/version.h"
30 
31 namespace stoc_rdbtdp
32 {
33 
34 //__________________________________________________________________________________________________
~CompoundTypeDescriptionImpl()35 CompoundTypeDescriptionImpl::~CompoundTypeDescriptionImpl()
36 {
37 	delete _pMembers;
38 	delete _pMemberNames;
39 	g_moduleCount.modCnt.release( &g_moduleCount.modCnt );
40 }
41 
42 // XTypeDescription
43 //__________________________________________________________________________________________________
getTypeClass()44 TypeClass CompoundTypeDescriptionImpl::getTypeClass()
45 	throw(::com::sun::star::uno::RuntimeException)
46 {
47 	return _eTypeClass;
48 }
49 //__________________________________________________________________________________________________
getName()50 OUString CompoundTypeDescriptionImpl::getName()
51 	throw(::com::sun::star::uno::RuntimeException)
52 {
53 	return _aName;
54 }
55 
56 // XCompoundTypeDescription
57 //__________________________________________________________________________________________________
getBaseType()58 Reference< XTypeDescription > CompoundTypeDescriptionImpl::getBaseType()
59 	throw(::com::sun::star::uno::RuntimeException)
60 {
61 	if (!_xBaseTD.is() && _aBaseType.getLength())
62 	{
63         try
64         {
65             Reference< XTypeDescription > xBaseTD;
66             if (_xTDMgr->getByHierarchicalName( _aBaseType ) >>= xBaseTD)
67             {
68                 MutexGuard aGuard( getMutex() );
69                 if (! _xBaseTD.is())
70                     _xBaseTD = xBaseTD;
71                 return _xBaseTD;
72             }
73         }
74         catch (NoSuchElementException &)
75         {
76         }
77         // never try again, if no base td was found
78         _aBaseType = OUString();
79 	}
80 	return _xBaseTD;
81 }
82 //__________________________________________________________________________________________________
83 
84 namespace {
85 
86 class TypeParameter: public WeakImplHelper1< XTypeDescription > {
87 public:
TypeParameter(OUString const & name)88     explicit TypeParameter(OUString const & name): m_name(name) {}
89 
getTypeClass()90     virtual TypeClass SAL_CALL getTypeClass() throw (RuntimeException)
91     { return TypeClass_UNKNOWN; }
92 
getName()93     virtual OUString SAL_CALL getName() throw (RuntimeException)
94     { return m_name; }
95 
96 private:
97     OUString m_name;
98 };
99 
100 }
101 
getMemberTypes()102 Sequence< Reference< XTypeDescription > > CompoundTypeDescriptionImpl::getMemberTypes()
103 	throw(::com::sun::star::uno::RuntimeException)
104 {
105 	if (! _pMembers)
106 	{
107         typereg::Reader aReader(
108             _aBytes.getConstArray(), _aBytes.getLength(), false,
109             TYPEREG_VERSION_1);
110 
111         sal_uInt16 nFields = aReader.getFieldCount();
112         Sequence< Reference< XTypeDescription > > * pTempMembers =
113             new Sequence< Reference< XTypeDescription > >( nFields );
114         Reference< XTypeDescription > * pMembers = pTempMembers->getArray();
115 
116         while (nFields--)
117         {
118             if ((aReader.getFieldFlags(nFields) & RT_ACCESS_PARAMETERIZED_TYPE)
119                 != 0)
120             {
121                 pMembers[nFields] = new TypeParameter(
122                     aReader.getFieldTypeName(nFields));
123             } else {
124                 try {
125                     _xTDMgr->getByHierarchicalName(
126                         aReader.getFieldTypeName(nFields).replace('/', '.'))
127                             >>= pMembers[nFields];
128                 } catch (NoSuchElementException &) {}
129                 OSL_ENSURE(
130                     pMembers[nFields].is(), "### compound member unknown!");
131             }
132         }
133 
134 		ClearableMutexGuard aGuard( getMutex() );
135 		if (_pMembers)
136         {
137             aGuard.clear();
138             delete pTempMembers;
139         }
140         else
141 		{
142 			_pMembers = pTempMembers;
143 		}
144 	}
145 
146 	return *_pMembers;
147 }
148 //__________________________________________________________________________________________________
getMemberNames()149 Sequence< OUString > CompoundTypeDescriptionImpl::getMemberNames()
150 	throw(::com::sun::star::uno::RuntimeException)
151 {
152 	if (! _pMemberNames)
153 	{
154         typereg::Reader aReader(
155             _aBytes.getConstArray(), _aBytes.getLength(), false,
156             TYPEREG_VERSION_1);
157 
158         sal_uInt16 nFields = aReader.getFieldCount();
159         Sequence< OUString > * pTempMemberNames = new Sequence< OUString >( nFields );
160         OUString * pMemberNames = pTempMemberNames->getArray();
161 
162         while (nFields--)
163         {
164             pMemberNames[nFields] = aReader.getFieldName( nFields );
165         }
166 
167 		ClearableMutexGuard aGuard( getMutex() );
168 		if (_pMemberNames)
169 		{
170             aGuard.clear();
171             delete pTempMemberNames;
172         }
173         else
174         {
175 			_pMemberNames = pTempMemberNames;
176 		}
177 	}
178 	return *_pMemberNames;
179 }
180 
181 }
182 
183 
184