File: | comphelper/source/misc/logging.cxx |
Location: | line 259, column 13 |
Description: | Called C++ object pointer is null |
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 <comphelper/logging.hxx> | ||
22 | #include <comphelper/componentcontext.hxx> | ||
23 | |||
24 | #include <com/sun/star/logging/LoggerPool.hpp> | ||
25 | #include <com/sun/star/logging/LogLevel.hpp> | ||
26 | #include <com/sun/star/resource/XResourceBundle.hpp> | ||
27 | #include <com/sun/star/resource/XResourceBundleLoader.hpp> | ||
28 | |||
29 | #include <rtl/ustrbuf.hxx> | ||
30 | |||
31 | //........................................................................ | ||
32 | namespace comphelper | ||
33 | { | ||
34 | //........................................................................ | ||
35 | |||
36 | /** === begin UNO using === **/ | ||
37 | using ::com::sun::star::uno::Reference; | ||
38 | using ::com::sun::star::uno::XComponentContext; | ||
39 | using ::com::sun::star::logging::XLoggerPool; | ||
40 | using ::com::sun::star::logging::LoggerPool; | ||
41 | using ::com::sun::star::logging::XLogger; | ||
42 | using ::com::sun::star::uno::UNO_QUERY_THROW; | ||
43 | using ::com::sun::star::uno::Exception; | ||
44 | using ::com::sun::star::logging::XLogHandler; | ||
45 | using ::com::sun::star::resource::XResourceBundle; | ||
46 | using ::com::sun::star::resource::XResourceBundleLoader; | ||
47 | /** === end UNO using === **/ | ||
48 | namespace LogLevel = ::com::sun::star::logging::LogLevel; | ||
49 | |||
50 | //==================================================================== | ||
51 | //= EventLogger_Impl - declaration | ||
52 | //==================================================================== | ||
53 | class EventLogger_Impl | ||
54 | { | ||
55 | private: | ||
56 | ::comphelper::ComponentContext m_aContext; | ||
57 | ::rtl::OUString m_sLoggerName; | ||
58 | Reference< XLogger > m_xLogger; | ||
59 | |||
60 | public: | ||
61 | EventLogger_Impl( const Reference< XComponentContext >& _rxContext, const ::rtl::OUString& _rLoggerName ) | ||
62 | :m_aContext( _rxContext ) | ||
63 | ,m_sLoggerName( _rLoggerName ) | ||
64 | { | ||
65 | impl_createLogger_nothrow(); | ||
66 | } | ||
67 | |||
68 | inline bool isValid() const { return m_xLogger.is(); } | ||
69 | inline const ::rtl::OUString& getName() const { return m_sLoggerName; } | ||
70 | inline const Reference< XLogger >& getLogger() const { return m_xLogger; } | ||
71 | inline const ::comphelper::ComponentContext& getContext() const { return m_aContext; } | ||
72 | |||
73 | private: | ||
74 | void impl_createLogger_nothrow(); | ||
75 | }; | ||
76 | |||
77 | //==================================================================== | ||
78 | //= EventLogger_Impl - implementation | ||
79 | //==================================================================== | ||
80 | //-------------------------------------------------------------------- | ||
81 | void EventLogger_Impl::impl_createLogger_nothrow() | ||
82 | { | ||
83 | try | ||
84 | { | ||
85 | Reference< XLoggerPool > xPool( LoggerPool::get( m_aContext.getUNOContext() ), UNO_QUERY_THROW ); | ||
86 | if ( !m_sLoggerName.isEmpty() ) | ||
87 | m_xLogger = xPool->getNamedLogger( m_sLoggerName ); | ||
88 | else | ||
89 | m_xLogger = xPool->getDefaultLogger(); | ||
90 | } | ||
91 | catch( const Exception& e ) | ||
92 | { | ||
93 | (void)e; | ||
94 | OSL_FAIL( "EventLogger_Impl::impl_createLogger_nothrow: caught an exception!" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/comphelper/source/misc/logging.cxx" ":" "94" ": "), "%s", "EventLogger_Impl::impl_createLogger_nothrow: caught an exception!" ); } } while (false); | ||
95 | } | ||
96 | } | ||
97 | |||
98 | //==================================================================== | ||
99 | //= EventLogger | ||
100 | //==================================================================== | ||
101 | //-------------------------------------------------------------------- | ||
102 | EventLogger::EventLogger( const Reference< XComponentContext >& _rxContext, const sal_Char* _pAsciiLoggerName ) | ||
103 | :m_pImpl( new EventLogger_Impl( _rxContext, ::rtl::OUString::createFromAscii( _pAsciiLoggerName ) ) ) | ||
104 | { | ||
105 | } | ||
106 | |||
107 | //-------------------------------------------------------------------- | ||
108 | EventLogger::~EventLogger() | ||
109 | { | ||
110 | } | ||
111 | |||
112 | //-------------------------------------------------------------------- | ||
113 | bool EventLogger::isLoggable( const sal_Int32 _nLogLevel ) const | ||
114 | { | ||
115 | if ( !m_pImpl->isValid() ) | ||
116 | return false; | ||
117 | |||
118 | try | ||
119 | { | ||
120 | return m_pImpl->getLogger()->isLoggable( _nLogLevel ); | ||
121 | } | ||
122 | catch( const Exception& e ) | ||
123 | { | ||
124 | (void)e; | ||
125 | OSL_FAIL( "EventLogger::isLoggable: caught an exception!" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/comphelper/source/misc/logging.cxx" ":" "125" ": "), "%s", "EventLogger::isLoggable: caught an exception!" ); } } while (false); | ||
126 | } | ||
127 | |||
128 | return false; | ||
129 | } | ||
130 | |||
131 | //-------------------------------------------------------------------- | ||
132 | namespace | ||
133 | { | ||
134 | void lcl_replaceParameter( ::rtl::OUString& _inout_Message, const ::rtl::OUString& _rPlaceHolder, const ::rtl::OUString& _rReplacement ) | ||
135 | { | ||
136 | sal_Int32 nPlaceholderPosition = _inout_Message.indexOf( _rPlaceHolder ); | ||
137 | OSL_ENSURE( nPlaceholderPosition >= 0, "lcl_replaceParameter: placeholder not found!" )do { if (true && (!(nPlaceholderPosition >= 0))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/comphelper/source/misc/logging.cxx" ":" "137" ": "), "%s", "lcl_replaceParameter: placeholder not found!" ); } } while (false); | ||
138 | if ( nPlaceholderPosition < 0 ) | ||
139 | return; | ||
140 | |||
141 | _inout_Message = _inout_Message.replaceAt( nPlaceholderPosition, _rPlaceHolder.getLength(), _rReplacement ); | ||
142 | } | ||
143 | } | ||
144 | |||
145 | //-------------------------------------------------------------------- | ||
146 | bool EventLogger::impl_log( const sal_Int32 _nLogLevel, | ||
147 | const sal_Char* _pSourceClass, const sal_Char* _pSourceMethod, const ::rtl::OUString& _rMessage, | ||
148 | const OptionalString& _rArgument1, const OptionalString& _rArgument2, | ||
149 | const OptionalString& _rArgument3, const OptionalString& _rArgument4, | ||
150 | const OptionalString& _rArgument5, const OptionalString& _rArgument6 ) const | ||
151 | { | ||
152 | // (if ::rtl::OUString had an indexOfAscii, we could save those ugly statics ...) | ||
153 | static ::rtl::OUString sPH1( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "$1$" )(&("$1$")[0]), ((sal_Int32)((sizeof ("$1$") / sizeof (("$1$" )[0]))-1)), (((rtl_TextEncoding) 11)) ) ); | ||
154 | static ::rtl::OUString sPH2( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "$2$" )(&("$2$")[0]), ((sal_Int32)((sizeof ("$2$") / sizeof (("$2$" )[0]))-1)), (((rtl_TextEncoding) 11)) ) ); | ||
155 | static ::rtl::OUString sPH3( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "$3$" )(&("$3$")[0]), ((sal_Int32)((sizeof ("$3$") / sizeof (("$3$" )[0]))-1)), (((rtl_TextEncoding) 11)) ) ); | ||
156 | static ::rtl::OUString sPH4( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "$4$" )(&("$4$")[0]), ((sal_Int32)((sizeof ("$4$") / sizeof (("$4$" )[0]))-1)), (((rtl_TextEncoding) 11)) ) ); | ||
157 | static ::rtl::OUString sPH5( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "$5$" )(&("$5$")[0]), ((sal_Int32)((sizeof ("$5$") / sizeof (("$5$" )[0]))-1)), (((rtl_TextEncoding) 11)) ) ); | ||
158 | static ::rtl::OUString sPH6( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "$6$" )(&("$6$")[0]), ((sal_Int32)((sizeof ("$6$") / sizeof (("$6$" )[0]))-1)), (((rtl_TextEncoding) 11)) ) ); | ||
159 | |||
160 | ::rtl::OUString sMessage( _rMessage ); | ||
161 | if ( !!_rArgument1 ) | ||
162 | lcl_replaceParameter( sMessage, sPH1, *_rArgument1 ); | ||
163 | |||
164 | if ( !!_rArgument2 ) | ||
165 | lcl_replaceParameter( sMessage, sPH2, *_rArgument2 ); | ||
166 | |||
167 | if ( !!_rArgument3 ) | ||
168 | lcl_replaceParameter( sMessage, sPH3, *_rArgument3 ); | ||
169 | |||
170 | if ( !!_rArgument4 ) | ||
171 | lcl_replaceParameter( sMessage, sPH4, *_rArgument4 ); | ||
172 | |||
173 | if ( !!_rArgument5 ) | ||
174 | lcl_replaceParameter( sMessage, sPH5, *_rArgument5 ); | ||
175 | |||
176 | if ( !!_rArgument6 ) | ||
177 | lcl_replaceParameter( sMessage, sPH6, *_rArgument6 ); | ||
178 | |||
179 | try | ||
180 | { | ||
181 | Reference< XLogger > xLogger( m_pImpl->getLogger() ); | ||
182 | OSL_PRECOND( xLogger.is(), "EventLogger::impl_log: should never be called without a logger!" )do { if (true && (!(xLogger.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/comphelper/source/misc/logging.cxx" ":" "182" ": "), "%s", "EventLogger::impl_log: should never be called without a logger!" ); } } while (false); | ||
183 | if ( _pSourceClass && _pSourceMethod ) | ||
184 | { | ||
185 | xLogger->logp( | ||
186 | _nLogLevel, | ||
187 | ::rtl::OUString::createFromAscii( _pSourceClass ), | ||
188 | ::rtl::OUString::createFromAscii( _pSourceMethod ), | ||
189 | sMessage | ||
190 | ); | ||
191 | } | ||
192 | else | ||
193 | { | ||
194 | xLogger->log( _nLogLevel, sMessage ); | ||
195 | } | ||
196 | } | ||
197 | catch( const Exception& e ) | ||
198 | { | ||
199 | (void)e; | ||
200 | OSL_FAIL( "EventLogger::impl_log: caught an exception!" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/comphelper/source/misc/logging.cxx" ":" "200" ": "), "%s", "EventLogger::impl_log: caught an exception!" ); } } while (false); | ||
201 | } | ||
202 | |||
203 | return false; | ||
204 | } | ||
205 | |||
206 | //==================================================================== | ||
207 | //= ResourceBasedEventLogger_Data | ||
208 | //==================================================================== | ||
209 | struct ResourceBasedEventLogger_Data | ||
210 | { | ||
211 | /// the base name of the resource bundle | ||
212 | ::rtl::OUString sBundleBaseName; | ||
213 | /// did we already attempt to load the bundle? | ||
214 | bool bBundleLoaded; | ||
215 | /// the lazily loaded bundle | ||
216 | Reference< XResourceBundle > xBundle; | ||
217 | |||
218 | ResourceBasedEventLogger_Data() | ||
219 | :sBundleBaseName() | ||
220 | ,bBundleLoaded( false ) | ||
221 | ,xBundle() | ||
222 | { | ||
223 | } | ||
224 | }; | ||
225 | |||
226 | //-------------------------------------------------------------------- | ||
227 | bool lcl_loadBundle_nothrow( const ComponentContext& _rContext, ResourceBasedEventLogger_Data& _rLoggerData ) | ||
228 | { | ||
229 | if ( _rLoggerData.bBundleLoaded ) | ||
230 | return _rLoggerData.xBundle.is(); | ||
231 | |||
232 | // no matter what happens below, don't attempt creation ever again | ||
233 | _rLoggerData.bBundleLoaded = true; | ||
234 | |||
235 | try | ||
236 | { | ||
237 | Reference< XResourceBundleLoader > xLoader( _rContext.getSingleton( "com.sun.star.resource.OfficeResourceLoader" ), UNO_QUERY_THROW ); | ||
238 | _rLoggerData.xBundle = Reference< XResourceBundle >( xLoader->loadBundle_Default( _rLoggerData.sBundleBaseName ), UNO_QUERY_THROW ); | ||
239 | } | ||
240 | catch( const Exception& e ) | ||
241 | { | ||
242 | (void)e; | ||
243 | OSL_FAIL( "lcl_loadBundle_nothrow: caught an exception!" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/comphelper/source/misc/logging.cxx" ":" "243" ": "), "%s", "lcl_loadBundle_nothrow: caught an exception!" ); } } while (false); | ||
244 | } | ||
245 | |||
246 | return _rLoggerData.xBundle.is(); | ||
247 | } | ||
248 | |||
249 | //-------------------------------------------------------------------- | ||
250 | ::rtl::OUString lcl_loadString_nothrow( const Reference< XResourceBundle >& _rxBundle, const sal_Int32 _nMessageResID ) | ||
251 | { | ||
252 | OSL_PRECOND( _rxBundle.is(), "lcl_loadString_nothrow: this will crash!" )do { if (true && (!(_rxBundle.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/comphelper/source/misc/logging.cxx" ":" "252" ": "), "%s", "lcl_loadString_nothrow: this will crash!" ); } } while (false); | ||
253 | ::rtl::OUString sMessage; | ||
254 | try | ||
255 | { | ||
256 | ::rtl::OUStringBuffer aBuffer; | ||
257 | aBuffer.appendAscii( "string:" ); | ||
258 | aBuffer.append( _nMessageResID ); | ||
259 | OSL_VERIFY( _rxBundle->getDirectElement( aBuffer.makeStringAndClear() ) >>= sMessage )do { if (!(_rxBundle->getDirectElement( aBuffer.makeStringAndClear () ) >>= sMessage)) do { if (true && (!(0))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/comphelper/source/misc/logging.cxx" ":" "259" ": "), "OSL_ASSERT: %s", "0"); } } while (false); } while (0); | ||
Within the expansion of the macro 'OSL_VERIFY':
| |||
260 | } | ||
261 | catch( const Exception& e ) | ||
262 | { | ||
263 | (void)e; | ||
264 | OSL_FAIL( "lcl_loadString_nothrow: caught an exception!" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/comphelper/source/misc/logging.cxx" ":" "264" ": "), "%s", "lcl_loadString_nothrow: caught an exception!" ); } } while (false); | ||
265 | } | ||
266 | return sMessage; | ||
267 | } | ||
268 | |||
269 | //==================================================================== | ||
270 | //= ResourceBasedEventLogger | ||
271 | //==================================================================== | ||
272 | //-------------------------------------------------------------------- | ||
273 | ResourceBasedEventLogger::ResourceBasedEventLogger( const Reference< XComponentContext >& _rxContext, const sal_Char* _pResourceBundleBaseName, | ||
274 | const sal_Char* _pAsciiLoggerName ) | ||
275 | :EventLogger( _rxContext, _pAsciiLoggerName ) | ||
276 | ,m_pData( new ResourceBasedEventLogger_Data ) | ||
277 | { | ||
278 | m_pData->sBundleBaseName = ::rtl::OUString::createFromAscii( _pResourceBundleBaseName ); | ||
279 | } | ||
280 | |||
281 | //-------------------------------------------------------------------- | ||
282 | ::rtl::OUString ResourceBasedEventLogger::impl_loadStringMessage_nothrow( const sal_Int32 _nMessageResID ) const | ||
283 | { | ||
284 | ::rtl::OUString sMessage; | ||
285 | if ( lcl_loadBundle_nothrow( m_pImpl->getContext(), *m_pData ) ) | ||
286 | sMessage = lcl_loadString_nothrow( m_pData->xBundle, _nMessageResID ); | ||
287 | if ( sMessage.isEmpty() ) | ||
288 | { | ||
289 | ::rtl::OUStringBuffer aBuffer; | ||
290 | aBuffer.appendAscii( "<invalid event resource: '" ); | ||
291 | aBuffer.append( m_pData->sBundleBaseName ); | ||
292 | aBuffer.appendAscii( ":" ); | ||
293 | aBuffer.append( _nMessageResID ); | ||
294 | aBuffer.appendAscii( "'>" ); | ||
295 | sMessage = aBuffer.makeStringAndClear(); | ||
296 | } | ||
297 | return sMessage; | ||
298 | } | ||
299 | |||
300 | //........................................................................ | ||
301 | } // namespace comphelper | ||
302 | //........................................................................ | ||
303 | |||
304 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |