Coverage Report

Created: 2026-08-14 10:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/cppuhelper/source/implbase.cxx
Line
Count
Source
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
#include <cppuhelper/compbase_ex.hxx>
21
#include <cppuhelper/exc_hlp.hxx>
22
#include <osl/diagnose.h>
23
#include <sal/log.hxx>
24
25
#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
26
#include <com/sun/star/uno/RuntimeException.hpp>
27
28
using namespace ::osl;
29
using namespace ::com::sun::star;
30
using namespace ::com::sun::star::uno;
31
32
33
namespace cppu
34
{
35
36
// WeakComponentImplHelperBase
37
38
WeakComponentImplHelperBase::WeakComponentImplHelperBase( Mutex & rMutex )
39
12.9k
    : rBHelper( rMutex )
40
12.9k
{
41
12.9k
}
42
43
WeakComponentImplHelperBase::~WeakComponentImplHelperBase()
44
8.28k
{
45
8.28k
}
46
47
void WeakComponentImplHelperBase::disposing()
48
4.14k
{
49
4.14k
}
50
51
Any WeakComponentImplHelperBase::queryInterface( Type const & rType )
52
133M
{
53
133M
    if (rType == cppu::UnoType<lang::XComponent>::get())
54
148
    {
55
148
        void * p = static_cast< lang::XComponent * >( this );
56
148
        return Any( &p, rType );
57
148
    }
58
133M
    return OWeakObject::queryInterface( rType );
59
133M
}
60
61
void WeakComponentImplHelperBase::acquire()
62
    noexcept
63
192M
{
64
192M
    OWeakObject::acquire();
65
192M
}
66
67
void WeakComponentImplHelperBase::release()
68
    noexcept
69
192M
{
70
192M
    if (osl_atomic_decrement( &m_refCount ) != 0)
71
192M
        return;
72
73
    // ensure no other references are created, via the weak connection point, from now on
74
8.28k
    disposeWeakConnectionPoint();
75
    // restore reference count:
76
8.28k
    osl_atomic_increment( &m_refCount );
77
8.28k
    if (! rBHelper.bDisposed) {
78
0
        try {
79
0
            dispose();
80
0
        }
81
0
        catch (RuntimeException const& exc) { // don't break throw ()
82
0
            SAL_WARN( "cppuhelper", exc );
83
0
        }
84
0
        OSL_ASSERT( rBHelper.bDisposed );
85
0
    }
86
8.28k
    OWeakObject::release();
87
8.28k
}
88
89
void WeakComponentImplHelperBase::dispose()
90
8.28k
{
91
8.28k
    ClearableMutexGuard aGuard( rBHelper.rMutex );
92
8.28k
    if (rBHelper.bDisposed || rBHelper.bInDispose)
93
0
        return;
94
95
8.28k
    rBHelper.bInDispose = true;
96
8.28k
    aGuard.clear();
97
8.28k
    try
98
8.28k
    {
99
        // side effect: keeping a reference to this
100
8.28k
        lang::EventObject aEvt( static_cast< OWeakObject * >( this ) );
101
8.28k
        try
102
8.28k
        {
103
8.28k
            rBHelper.aLC.disposeAndClear( aEvt );
104
8.28k
            disposing();
105
8.28k
        }
106
8.28k
        catch (...)
107
8.28k
        {
108
0
            MutexGuard aGuard2( rBHelper.rMutex );
109
            // bDisposed and bInDispose must be set in this order:
110
0
            rBHelper.bDisposed = true;
111
0
            rBHelper.bInDispose = false;
112
0
            throw;
113
0
        }
114
8.28k
        MutexGuard aGuard2( rBHelper.rMutex );
115
        // bDisposed and bInDispose must be set in this order:
116
8.28k
        rBHelper.bDisposed = true;
117
8.28k
        rBHelper.bInDispose = false;
118
8.28k
    }
119
8.28k
    catch (RuntimeException &)
120
8.28k
    {
121
0
        throw;
122
0
    }
123
8.28k
    catch (Exception & exc)
124
8.28k
    {
125
0
        css::uno::Any anyEx = cppu::getCaughtException();
126
0
        throw lang::WrappedTargetRuntimeException(
127
0
            "unexpected UNO exception caught: " + exc.Message,
128
0
            nullptr, anyEx );
129
0
    }
130
8.28k
}
131
132
void WeakComponentImplHelperBase::addEventListener(
133
    Reference< lang::XEventListener > const & xListener )
134
144
{
135
144
    ClearableMutexGuard aGuard( rBHelper.rMutex );
136
144
    if (rBHelper.bDisposed || rBHelper.bInDispose)
137
0
    {
138
0
        aGuard.clear();
139
0
        lang::EventObject aEvt( static_cast< OWeakObject * >( this ) );
140
0
        xListener->disposing( aEvt );
141
0
    }
142
144
    else
143
144
    {
144
144
        rBHelper.addListener( cppu::UnoType<decltype(xListener)>::get(), xListener );
145
144
    }
146
144
}
147
148
void WeakComponentImplHelperBase::removeEventListener(
149
    Reference< lang::XEventListener > const & xListener )
150
0
{
151
0
    rBHelper.removeListener( cppu::UnoType<decltype(xListener)>::get(), xListener );
152
0
}
153
154
// WeakAggComponentImplHelperBase
155
156
WeakAggComponentImplHelperBase::WeakAggComponentImplHelperBase( Mutex & rMutex )
157
0
    : rBHelper( rMutex )
158
0
{
159
0
}
160
161
WeakAggComponentImplHelperBase::~WeakAggComponentImplHelperBase()
162
0
{
163
0
}
164
165
void WeakAggComponentImplHelperBase::disposing()
166
0
{
167
0
}
168
169
Any WeakAggComponentImplHelperBase::queryInterface( Type const & rType )
170
0
{
171
0
    return OWeakAggObject::queryInterface( rType );
172
0
}
173
174
Any WeakAggComponentImplHelperBase::queryAggregation( Type const & rType )
175
0
{
176
0
    if (rType == cppu::UnoType<lang::XComponent>::get())
177
0
    {
178
0
        void * p = static_cast< lang::XComponent * >( this );
179
0
        return Any( &p, rType );
180
0
    }
181
0
    return OWeakAggObject::queryAggregation( rType );
182
0
}
183
184
void WeakAggComponentImplHelperBase::acquire()
185
    noexcept
186
0
{
187
0
    OWeakAggObject::acquire();
188
0
}
189
190
void WeakAggComponentImplHelperBase::release()
191
    noexcept
192
0
{
193
0
    Reference<XInterface> const xDelegator_(xDelegator);
194
0
    if (xDelegator_.is()) {
195
0
        OWeakAggObject::release();
196
0
    }
197
0
    else if (osl_atomic_decrement( &m_refCount ) == 0) {
198
        // ensure no other references are created, via the weak connection point, from now on
199
0
        disposeWeakConnectionPoint();
200
        // restore reference count:
201
0
        osl_atomic_increment( &m_refCount );
202
0
        if (! rBHelper.bDisposed) {
203
0
            try {
204
0
                dispose();
205
0
            }
206
0
            catch (RuntimeException const& exc) { // don't break throw ()
207
0
                SAL_WARN( "cppuhelper", exc );
208
0
            }
209
0
            OSL_ASSERT( rBHelper.bDisposed );
210
0
        }
211
0
        OWeakAggObject::release();
212
0
    }
213
0
}
214
215
void WeakAggComponentImplHelperBase::dispose()
216
0
{
217
0
    ClearableMutexGuard aGuard( rBHelper.rMutex );
218
0
    if (rBHelper.bDisposed || rBHelper.bInDispose)
219
0
        return;
220
221
0
    rBHelper.bInDispose = true;
222
0
    aGuard.clear();
223
0
    try
224
0
    {
225
        // side effect: keeping a reference to this
226
0
        lang::EventObject aEvt( static_cast< OWeakObject * >( this ) );
227
0
        try
228
0
        {
229
0
            rBHelper.aLC.disposeAndClear( aEvt );
230
0
            disposing();
231
0
        }
232
0
        catch (...)
233
0
        {
234
0
            MutexGuard aGuard2( rBHelper.rMutex );
235
            // bDisposed and bInDispose must be set in this order:
236
0
            rBHelper.bDisposed = true;
237
0
            rBHelper.bInDispose = false;
238
0
            throw;
239
0
        }
240
0
        MutexGuard aGuard2( rBHelper.rMutex );
241
        // bDisposed and bInDispose must be set in this order:
242
0
        rBHelper.bDisposed = true;
243
0
        rBHelper.bInDispose = false;
244
0
    }
245
0
    catch (RuntimeException &)
246
0
    {
247
0
        throw;
248
0
    }
249
0
    catch (Exception & exc)
250
0
    {
251
0
        css::uno::Any anyEx = cppu::getCaughtException();
252
0
        throw lang::WrappedTargetRuntimeException(
253
0
            "unexpected UNO exception caught: " + exc.Message,
254
0
            nullptr, anyEx );
255
0
    }
256
0
}
257
258
void WeakAggComponentImplHelperBase::addEventListener(
259
    Reference< lang::XEventListener > const & xListener )
260
0
{
261
0
    ClearableMutexGuard aGuard( rBHelper.rMutex );
262
0
    if (rBHelper.bDisposed || rBHelper.bInDispose)
263
0
    {
264
0
        aGuard.clear();
265
0
        lang::EventObject aEvt( static_cast< OWeakObject * >( this ) );
266
0
        xListener->disposing( aEvt );
267
0
    }
268
0
    else
269
0
    {
270
0
        rBHelper.addListener( cppu::UnoType<decltype(xListener)>::get(), xListener );
271
0
    }
272
0
}
273
274
void WeakAggComponentImplHelperBase::removeEventListener(
275
    Reference< lang::XEventListener > const & xListener )
276
0
{
277
    // if we have disposed, then we have cleared the list already
278
0
    MutexGuard aGuard( rBHelper.rMutex );
279
0
    if (!rBHelper.bDisposed)
280
0
        rBHelper.removeListener( cppu::UnoType<decltype(xListener)>::get(), xListener );
281
0
}
282
283
}
284
285
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */