LibreOffice Module cppu (master) 1
data.cxx
Go to the documentation of this file.
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 <sal/log.hxx>
22#include <uno/data.h>
23
24#include "constr.hxx"
25#include "destr.hxx"
26#include "copy.hxx"
27#include "assign.hxx"
28#include "eq.hxx"
29
30using namespace ::cppu;
31
32namespace cppu
33{
34
35// Sequence<>() (default ctor) relies on this being static:
36uno_Sequence g_emptySeq = { 1, 0, { 0 } };
37typelib_TypeDescriptionReference * g_pVoidType = nullptr;
38
39
40void * binuno_queryInterface( void * pUnoI, typelib_TypeDescriptionReference * pDestType )
41{
42 // init queryInterface() td
43 static typelib_TypeDescription* g_pQITD = []() {
44 typelib_TypeDescriptionReference* type_XInterface
45 = *typelib_static_type_getByTypeClass(typelib_TypeClass_INTERFACE);
46 typelib_InterfaceTypeDescription* pTXInterfaceDescr = nullptr;
47 TYPELIB_DANGER_GET(reinterpret_cast<typelib_TypeDescription**>(&pTXInterfaceDescr),
48 type_XInterface);
49 assert(pTXInterfaceDescr->ppAllMembers);
50 typelib_TypeDescription* pQITD = nullptr;
52 pTXInterfaceDescr->ppAllMembers[0]);
53 // coverity[callee_ptr_arith] - not a bug
54 TYPELIB_DANGER_RELEASE(&pTXInterfaceDescr->aBase);
55 return pQITD;
56 }();
57
58 uno_Any aRet, aExc;
59 uno_Any * pExc = &aExc;
60 void * aArgs[ 1 ];
61 aArgs[ 0 ] = &pDestType;
62 (*static_cast<uno_Interface *>(pUnoI)->pDispatcher)(
63 static_cast<uno_Interface *>(pUnoI), g_pQITD, &aRet, aArgs, &pExc );
64
65 uno_Interface * ret = nullptr;
66 if (nullptr == pExc)
67 {
68 typelib_TypeDescriptionReference * ret_type = aRet.pType;
69 switch (ret_type->eTypeClass)
70 {
71 case typelib_TypeClass_VOID: // common case
73 break;
74 case typelib_TypeClass_INTERFACE:
75 // tweaky... avoiding acquire/ release pair
77 ret = static_cast<uno_Interface *>(aRet.pReserved); // serving acquired interface
78 break;
79 default:
80 _destructAny( &aRet, nullptr );
81 break;
82 }
83 }
84 else
85 {
87 "cppu",
88 "exception occurred querying for interface "
89 << OUString(pDestType->pTypeName) << ": ["
90 << OUString(pExc->pType->pTypeName) << "] "
91 << *static_cast<OUString const *>(pExc->pData));
92 // Message is very first member
93 uno_any_destruct( pExc, nullptr );
94 }
95 return ret;
96}
97
98
100 void * pMem,
101 typelib_CompoundTypeDescription * pCompType )
102{
103 _defaultConstructStruct( pMem, pCompType );
104}
105
107 void * pDest, void * pSource,
108 typelib_CompoundTypeDescription * pTypeDescr,
109 uno_AcquireFunc acquire, uno_Mapping * mapping )
110{
111 _copyConstructStruct( pDest, pSource, pTypeDescr, acquire, mapping );
112}
113
115 void * pValue,
116 typelib_CompoundTypeDescription * pTypeDescr,
117 uno_ReleaseFunc release )
118{
119 _destructStruct( pValue, pTypeDescr, release );
120}
121
123 void * pDest, void *pSource,
124 typelib_CompoundTypeDescription * pTypeDescr,
125 uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
126{
127 return _equalStruct( pDest, pSource, pTypeDescr, queryInterface, release );
128}
129
131 void * pDest, void * pSource,
132 typelib_CompoundTypeDescription * pTypeDescr,
133 uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
134{
135 return _assignStruct( pDest, pSource, pTypeDescr, queryInterface, acquire, release );
136}
137
138
140 uno_Sequence * pSource,
141 typelib_TypeDescriptionReference * pElementType,
142 uno_AcquireFunc acquire, uno_Mapping * mapping )
143{
144 return icopyConstructSequence( pSource, pElementType, acquire, mapping );
145}
146
147
149 uno_Sequence * pSequence,
150 typelib_TypeDescriptionReference * pType,
151 typelib_TypeDescription * pTypeDescr,
152 uno_ReleaseFunc release )
153{
154 idestructSequence( pSequence, pType, pTypeDescr, release );
155}
156
157
159 uno_Sequence * pDest, uno_Sequence * pSource,
160 typelib_TypeDescriptionReference * pElementType,
161 uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
162{
163 return _equalSequence( pDest, pSource, pElementType, queryInterface, release );
164}
165
166}
167
168extern "C"
169{
170
172 void * pMem, typelib_TypeDescriptionReference * pType )
174{
175 _defaultConstructData( pMem, pType, nullptr );
176}
177
178void SAL_CALL uno_constructData(
179 void * pMem, typelib_TypeDescription * pTypeDescr )
181{
182 _defaultConstructData( pMem, pTypeDescr->pWeakRef, pTypeDescr );
183}
184
186 void * pValue, typelib_TypeDescriptionReference * pType,
187 uno_ReleaseFunc release )
189{
190 _destructData( pValue, pType, nullptr, release );
191}
192
193void SAL_CALL uno_destructData(
194 void * pValue,
195 typelib_TypeDescription * pTypeDescr,
196 uno_ReleaseFunc release )
198{
199 _destructData( pValue, pTypeDescr->pWeakRef, pTypeDescr, release );
200}
201
202void SAL_CALL uno_type_copyData(
203 void * pDest, void * pSource,
204 typelib_TypeDescriptionReference * pType,
205 uno_AcquireFunc acquire )
207{
208 _copyConstructData( pDest, pSource, pType, nullptr, acquire, nullptr );
209}
210
211void SAL_CALL uno_copyData(
212 void * pDest, void * pSource,
213 typelib_TypeDescription * pTypeDescr,
214 uno_AcquireFunc acquire )
216{
217 _copyConstructData( pDest, pSource, pTypeDescr->pWeakRef, pTypeDescr, acquire, nullptr );
218}
219
221 void * pDest, void * pSource,
222 typelib_TypeDescriptionReference * pType,
223 uno_Mapping * mapping )
225{
226 _copyConstructData( pDest, pSource, pType, nullptr, nullptr, mapping );
227}
228
230 void * pDest, void * pSource,
231 typelib_TypeDescription * pTypeDescr,
232 uno_Mapping * mapping )
234{
235 _copyConstructData( pDest, pSource, pTypeDescr->pWeakRef, pTypeDescr, nullptr, mapping );
236}
237
239 void * pVal1, typelib_TypeDescriptionReference * pVal1Type,
240 void * pVal2, typelib_TypeDescriptionReference * pVal2Type,
241 uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
243{
244 return _equalData(
245 pVal1, pVal1Type, nullptr,
246 pVal2, pVal2Type,
247 queryInterface, release );
248}
249
251 void * pVal1, typelib_TypeDescription * pVal1TD,
252 void * pVal2, typelib_TypeDescription * pVal2TD,
253 uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
255{
256 return _equalData(
257 pVal1, pVal1TD->pWeakRef, pVal1TD,
258 pVal2, pVal2TD->pWeakRef,
259 queryInterface, release );
260}
261
263 void * pDest, typelib_TypeDescriptionReference * pDestType,
264 void * pSource, typelib_TypeDescriptionReference * pSourceType,
265 uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
267{
268 return _assignData(
269 pDest, pDestType, nullptr,
270 pSource, pSourceType, nullptr,
271 queryInterface, acquire, release );
272}
273
275 void * pDest, typelib_TypeDescription * pDestTD,
276 void * pSource, typelib_TypeDescription * pSourceTD,
277 uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
279{
280 return _assignData(
281 pDest, pDestTD->pWeakRef, pDestTD,
282 pSource, pSourceTD->pWeakRef, pSourceTD,
283 queryInterface, acquire, release );
284}
285
287 typelib_TypeDescriptionReference * pAssignable,
288 void * pFrom, typelib_TypeDescriptionReference * pFromType,
289 uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
291{
292 if (::typelib_typedescriptionreference_isAssignableFrom( pAssignable, pFromType ))
293 return true;
294 if (typelib_TypeClass_INTERFACE != pFromType->eTypeClass ||
295 typelib_TypeClass_INTERFACE != pAssignable->eTypeClass)
296 {
297 return false;
298 }
299
300 // query
301 if (nullptr == pFrom)
302 return false;
303 void * pInterface = *static_cast<void **>(pFrom);
304 if (nullptr == pInterface)
305 return false;
306
307 if (nullptr == queryInterface)
309 void * p = (*queryInterface)( pInterface, pAssignable );
310 _release( p, release );
311 return (nullptr != p);
312}
313
314}
315
316/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
void SAL_CALL uno_any_destruct(uno_Any *pValue, uno_ReleaseFunc release) SAL_THROW_EXTERN_C()
Definition: any.cxx:128
sal_Bool SAL_CALL uno_assignData(void *pDest, typelib_TypeDescription *pDestTD, void *pSource, typelib_TypeDescription *pSourceTD, uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release) SAL_THROW_EXTERN_C()
Definition: data.cxx:274
void SAL_CALL uno_type_destructData(void *pValue, typelib_TypeDescriptionReference *pType, uno_ReleaseFunc release) SAL_THROW_EXTERN_C()
Definition: data.cxx:185
void SAL_CALL uno_destructData(void *pValue, typelib_TypeDescription *pTypeDescr, uno_ReleaseFunc release) SAL_THROW_EXTERN_C()
Definition: data.cxx:193
sal_Bool SAL_CALL uno_equalData(void *pVal1, typelib_TypeDescription *pVal1TD, void *pVal2, typelib_TypeDescription *pVal2TD, uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release) SAL_THROW_EXTERN_C()
Definition: data.cxx:250
void SAL_CALL uno_type_copyAndConvertData(void *pDest, void *pSource, typelib_TypeDescriptionReference *pType, uno_Mapping *mapping) SAL_THROW_EXTERN_C()
Definition: data.cxx:220
void SAL_CALL uno_constructData(void *pMem, typelib_TypeDescription *pTypeDescr) SAL_THROW_EXTERN_C()
Definition: data.cxx:178
void SAL_CALL uno_type_copyData(void *pDest, void *pSource, typelib_TypeDescriptionReference *pType, uno_AcquireFunc acquire) SAL_THROW_EXTERN_C()
Definition: data.cxx:202
sal_Bool SAL_CALL uno_type_equalData(void *pVal1, typelib_TypeDescriptionReference *pVal1Type, void *pVal2, typelib_TypeDescriptionReference *pVal2Type, uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release) SAL_THROW_EXTERN_C()
Definition: data.cxx:238
void SAL_CALL uno_copyData(void *pDest, void *pSource, typelib_TypeDescription *pTypeDescr, uno_AcquireFunc acquire) SAL_THROW_EXTERN_C()
Definition: data.cxx:211
void SAL_CALL uno_type_constructData(void *pMem, typelib_TypeDescriptionReference *pType) SAL_THROW_EXTERN_C()
Definition: data.cxx:171
sal_Bool SAL_CALL uno_type_isAssignableFromData(typelib_TypeDescriptionReference *pAssignable, void *pFrom, typelib_TypeDescriptionReference *pFromType, uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release) SAL_THROW_EXTERN_C()
Definition: data.cxx:286
sal_Bool SAL_CALL uno_type_assignData(void *pDest, typelib_TypeDescriptionReference *pDestType, void *pSource, typelib_TypeDescriptionReference *pSourceType, uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release) SAL_THROW_EXTERN_C()
Definition: data.cxx:262
void SAL_CALL uno_copyAndConvertData(void *pDest, void *pSource, typelib_TypeDescription *pTypeDescr, uno_Mapping *mapping) SAL_THROW_EXTERN_C()
Definition: data.cxx:229
void * p
#define SAL_WARN(area, stream)
struct _uno_Mapping uno_Mapping
struct _typelib_TypeDescription typelib_TypeDescription
struct _uno_Any uno_Any
void _release(void *p, uno_ReleaseFunc release)
Definition: prim.hxx:79
typelib_TypeDescriptionReference * g_pVoidType
Definition: data.cxx:37
uno_Sequence * copyConstructSequence(uno_Sequence *pSource, typelib_TypeDescriptionReference *pElementType, uno_AcquireFunc acquire, uno_Mapping *mapping)
Definition: data.cxx:139
void _destructData(void *pValue, typelib_TypeDescriptionReference *pType, typelib_TypeDescription *pTypeDescr, uno_ReleaseFunc release)
Definition: destr.hxx:303
css::uno::Any SAL_CALL queryInterface(const css::uno::Type &rType, Interface1 *p1)
bool equalSequence(uno_Sequence *pDest, uno_Sequence *pSource, typelib_TypeDescriptionReference *pElementType, uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release)
Definition: data.cxx:158
void _destructStruct(void *pValue, typelib_CompoundTypeDescription *pTypeDescr, uno_ReleaseFunc release)
Definition: destr.hxx:41
void destructSequence(uno_Sequence *pSequence, typelib_TypeDescriptionReference *pType, typelib_TypeDescription *pTypeDescr, uno_ReleaseFunc release)
Definition: data.cxx:148
void copyConstructStruct(void *pDest, void *pSource, typelib_CompoundTypeDescription *pTypeDescr, uno_AcquireFunc acquire, uno_Mapping *mapping)
Definition: data.cxx:106
void _defaultConstructStruct(void *pMem, typelib_CompoundTypeDescription *pTypeDescr)
Definition: constr.hxx:35
void _copyConstructStruct(void *pDest, void *pSource, typelib_CompoundTypeDescription *pTypeDescr, uno_AcquireFunc acquire, uno_Mapping *mapping)
Definition: copy.hxx:78
bool assignStruct(void *pDest, void *pSource, typelib_CompoundTypeDescription *pTypeDescr, uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release)
Definition: data.cxx:130
void _defaultConstructData(void *pMem, typelib_TypeDescriptionReference *pType, typelib_TypeDescription *pTypeDescr)
Definition: constr.hxx:55
bool equalStruct(void *pDest, void *pSource, typelib_CompoundTypeDescription *pTypeDescr, uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release)
Definition: data.cxx:122
void _copyConstructData(void *pDest, void *pSource, typelib_TypeDescriptionReference *pType, typelib_TypeDescription *pTypeDescr, uno_AcquireFunc acquire, uno_Mapping *mapping)
Definition: copy.hxx:543
bool _equalSequence(uno_Sequence *pDest, uno_Sequence *pSource, typelib_TypeDescriptionReference *pElementType, uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release)
Definition: eq.hxx:107
uno_Sequence g_emptySeq
Definition: data.cxx:36
bool _equalStruct(void *pDest, void *pSource, typelib_CompoundTypeDescription *pTypeDescr, uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release)
Definition: eq.hxx:72
bool _assignData(void *pDest, typelib_TypeDescriptionReference *pDestType, typelib_TypeDescription *pDestTypeDescr, void *pSource, typelib_TypeDescriptionReference *pSourceType, typelib_TypeDescription *pSourceTypeDescr, uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release)
Definition: assign.hxx:96
void idestructSequence(uno_Sequence *pSeq, typelib_TypeDescriptionReference *pType, typelib_TypeDescription *pTypeDescr, uno_ReleaseFunc release)
Definition: destr.hxx:291
void defaultConstructStruct(void *pMem, typelib_CompoundTypeDescription *pCompType)
Definition: data.cxx:99
void destructStruct(void *pValue, typelib_CompoundTypeDescription *pTypeDescr, uno_ReleaseFunc release)
Definition: data.cxx:114
void * binuno_queryInterface(void *pUnoI, typelib_TypeDescriptionReference *pDestType)
Definition: data.cxx:40
void _destructAny(uno_Any *pAny, uno_ReleaseFunc release)
Definition: destr.hxx:70
bool _assignStruct(void *pDest, void *pSource, typelib_CompoundTypeDescription *pTypeDescr, uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release)
Definition: assign.hxx:64
uno_Sequence * icopyConstructSequence(uno_Sequence *pSource, typelib_TypeDescriptionReference *pElementType, uno_AcquireFunc acquire, uno_Mapping *mapping)
Definition: copy.hxx:398
bool _equalData(void *pDest, typelib_TypeDescriptionReference *pDestType, typelib_TypeDescription *pDestTypeDescr, void *pSource, typelib_TypeDescriptionReference *pSourceType, uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release)
Definition: eq.hxx:263
typelib_TypeDescriptionReference **SAL_CALL typelib_static_type_getByTypeClass(typelib_TypeClass eTypeClass) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_typedescriptionreference_getDescription(typelib_TypeDescription **ppRet, typelib_TypeDescriptionReference *pRef) SAL_THROW_EXTERN_C()
Definition: typelib.cxx:2174
sal_Bool SAL_CALL typelib_typedescriptionreference_isAssignableFrom(typelib_TypeDescriptionReference *pAssignable, typelib_TypeDescriptionReference *pFrom) SAL_THROW_EXTERN_C()
Definition: typelib.cxx:2301
void SAL_CALL typelib_typedescriptionreference_release(typelib_TypeDescriptionReference *pRef) SAL_THROW_EXTERN_C()
Definition: typelib.cxx:2141
unsigned char sal_Bool
#define SAL_THROW_EXTERN_C()