xref: /trunk/main/extensions/source/logging/sysloghandler.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*448486c6SDamjan Jovanovic /**************************************************************
2*448486c6SDamjan Jovanovic  *
3*448486c6SDamjan Jovanovic  * Licensed to the Apache Software Foundation (ASF) under one
4*448486c6SDamjan Jovanovic  * or more contributor license agreements.  See the NOTICE file
5*448486c6SDamjan Jovanovic  * distributed with this work for additional information
6*448486c6SDamjan Jovanovic  * regarding copyright ownership.  The ASF licenses this file
7*448486c6SDamjan Jovanovic  * to you under the Apache License, Version 2.0 (the
8*448486c6SDamjan Jovanovic  * "License"); you may not use this file except in compliance
9*448486c6SDamjan Jovanovic  * with the License.  You may obtain a copy of the License at
10*448486c6SDamjan Jovanovic  *
11*448486c6SDamjan Jovanovic  *   http://www.apache.org/licenses/LICENSE-2.0
12*448486c6SDamjan Jovanovic  *
13*448486c6SDamjan Jovanovic  * Unless required by applicable law or agreed to in writing,
14*448486c6SDamjan Jovanovic  * software distributed under the License is distributed on an
15*448486c6SDamjan Jovanovic  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*448486c6SDamjan Jovanovic  * KIND, either express or implied.  See the License for the
17*448486c6SDamjan Jovanovic  * specific language governing permissions and limitations
18*448486c6SDamjan Jovanovic  * under the License.
19*448486c6SDamjan Jovanovic  *
20*448486c6SDamjan Jovanovic  *************************************************************/
21*448486c6SDamjan Jovanovic 
22*448486c6SDamjan Jovanovic 
23*448486c6SDamjan Jovanovic 
24*448486c6SDamjan Jovanovic // MARKER(update_precomp.py): autogen include statement, do not remove
25*448486c6SDamjan Jovanovic #include "precompiled_extensions.hxx"
26*448486c6SDamjan Jovanovic 
27*448486c6SDamjan Jovanovic #include "log_module.hxx"
28*448486c6SDamjan Jovanovic #include "methodguard.hxx"
29*448486c6SDamjan Jovanovic #include "loghandler.hxx"
30*448486c6SDamjan Jovanovic 
31*448486c6SDamjan Jovanovic /** === begin UNO includes === **/
32*448486c6SDamjan Jovanovic #include <com/sun/star/logging/XConsoleHandler.hpp>
33*448486c6SDamjan Jovanovic #include <com/sun/star/lang/XServiceInfo.hpp>
34*448486c6SDamjan Jovanovic #include <com/sun/star/logging/LogLevel.hpp>
35*448486c6SDamjan Jovanovic #include <com/sun/star/lang/XInitialization.hpp>
36*448486c6SDamjan Jovanovic #include <com/sun/star/ucb/AlreadyInitializedException.hpp>
37*448486c6SDamjan Jovanovic #include <com/sun/star/lang/IllegalArgumentException.hpp>
38*448486c6SDamjan Jovanovic #include <com/sun/star/beans/NamedValue.hpp>
39*448486c6SDamjan Jovanovic /** === end UNO includes === **/
40*448486c6SDamjan Jovanovic 
41*448486c6SDamjan Jovanovic #include <tools/diagnose_ex.h>
42*448486c6SDamjan Jovanovic 
43*448486c6SDamjan Jovanovic #include <comphelper/componentcontext.hxx>
44*448486c6SDamjan Jovanovic 
45*448486c6SDamjan Jovanovic #include <cppuhelper/compbase3.hxx>
46*448486c6SDamjan Jovanovic #include <cppuhelper/basemutex.hxx>
47*448486c6SDamjan Jovanovic 
48*448486c6SDamjan Jovanovic #include <rtl/strbuf.hxx>
49*448486c6SDamjan Jovanovic #include <osl/process.h>
50*448486c6SDamjan Jovanovic #include <osl/socket.hxx>
51*448486c6SDamjan Jovanovic #include <osl/time.h>
52*448486c6SDamjan Jovanovic 
53*448486c6SDamjan Jovanovic #include <stdio.h>
54*448486c6SDamjan Jovanovic 
55*448486c6SDamjan Jovanovic //........................................................................
56*448486c6SDamjan Jovanovic namespace logging
57*448486c6SDamjan Jovanovic {
58*448486c6SDamjan Jovanovic //........................................................................
59*448486c6SDamjan Jovanovic 
60*448486c6SDamjan Jovanovic     /** === begin UNO using === **/
61*448486c6SDamjan Jovanovic     using ::com::sun::star::logging::XLogHandler;
62*448486c6SDamjan Jovanovic     using ::com::sun::star::lang::XServiceInfo;
63*448486c6SDamjan Jovanovic     using ::com::sun::star::uno::Reference;
64*448486c6SDamjan Jovanovic     using ::com::sun::star::uno::XComponentContext;
65*448486c6SDamjan Jovanovic     using ::com::sun::star::uno::RuntimeException;
66*448486c6SDamjan Jovanovic     using ::com::sun::star::logging::XLogFormatter;
67*448486c6SDamjan Jovanovic     using ::com::sun::star::uno::Sequence;
68*448486c6SDamjan Jovanovic     using ::com::sun::star::logging::LogRecord;
69*448486c6SDamjan Jovanovic     using ::com::sun::star::uno::UNO_QUERY_THROW;
70*448486c6SDamjan Jovanovic     using ::com::sun::star::uno::Exception;
71*448486c6SDamjan Jovanovic     using ::com::sun::star::uno::Any;
72*448486c6SDamjan Jovanovic     using ::com::sun::star::uno::XInterface;
73*448486c6SDamjan Jovanovic     using ::com::sun::star::lang::XInitialization;
74*448486c6SDamjan Jovanovic     using ::com::sun::star::ucb::AlreadyInitializedException;
75*448486c6SDamjan Jovanovic     using ::com::sun::star::lang::IllegalArgumentException;
76*448486c6SDamjan Jovanovic     using ::com::sun::star::beans::NamedValue;
77*448486c6SDamjan Jovanovic     /** === end UNO using === **/
78*448486c6SDamjan Jovanovic     namespace LogLevel = ::com::sun::star::logging::LogLevel;
79*448486c6SDamjan Jovanovic 
80*448486c6SDamjan Jovanovic     //====================================================================
81*448486c6SDamjan Jovanovic     //= SyslogHandler - declaration
82*448486c6SDamjan Jovanovic     //====================================================================
83*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
84*448486c6SDamjan Jovanovic     typedef ::cppu::WeakComponentImplHelper3    <   XLogHandler
85*448486c6SDamjan Jovanovic                                                 ,   XServiceInfo
86*448486c6SDamjan Jovanovic                                                 ,   XInitialization
87*448486c6SDamjan Jovanovic                                                 >   SyslogHandler_Base;
88*448486c6SDamjan Jovanovic     class SyslogHandler    :public ::cppu::BaseMutex
89*448486c6SDamjan Jovanovic                             ,public SyslogHandler_Base
90*448486c6SDamjan Jovanovic     {
91*448486c6SDamjan Jovanovic     private:
92*448486c6SDamjan Jovanovic         ::comphelper::ComponentContext  m_aContext;
93*448486c6SDamjan Jovanovic         LogHandlerHelper                m_aHandlerHelper;
94*448486c6SDamjan Jovanovic         ::osl::SocketAddr               m_aSocketAddress;
95*448486c6SDamjan Jovanovic         ::osl::DatagramSocket           m_aSocket;
96*448486c6SDamjan Jovanovic 
97*448486c6SDamjan Jovanovic     protected:
98*448486c6SDamjan Jovanovic         SyslogHandler( const Reference< XComponentContext >& _rxContext );
99*448486c6SDamjan Jovanovic         virtual ~SyslogHandler();
100*448486c6SDamjan Jovanovic 
101*448486c6SDamjan Jovanovic         // XLogHandler
102*448486c6SDamjan Jovanovic         virtual ::rtl::OUString SAL_CALL getEncoding() throw (RuntimeException);
103*448486c6SDamjan Jovanovic         virtual void SAL_CALL setEncoding( const ::rtl::OUString& _encoding ) throw (RuntimeException);
104*448486c6SDamjan Jovanovic         virtual Reference< XLogFormatter > SAL_CALL getFormatter() throw (RuntimeException);
105*448486c6SDamjan Jovanovic         virtual void SAL_CALL setFormatter( const Reference< XLogFormatter >& _formatter ) throw (RuntimeException);
106*448486c6SDamjan Jovanovic         virtual ::sal_Int32 SAL_CALL getLevel() throw (RuntimeException);
107*448486c6SDamjan Jovanovic         virtual void SAL_CALL setLevel( ::sal_Int32 _level ) throw (RuntimeException);
108*448486c6SDamjan Jovanovic         virtual void SAL_CALL flush(  ) throw (RuntimeException);
109*448486c6SDamjan Jovanovic         virtual ::sal_Bool SAL_CALL publish( const LogRecord& Record ) throw (RuntimeException);
110*448486c6SDamjan Jovanovic 
111*448486c6SDamjan Jovanovic         // XInitialization
112*448486c6SDamjan Jovanovic         virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
113*448486c6SDamjan Jovanovic 
114*448486c6SDamjan Jovanovic         // XServiceInfo
115*448486c6SDamjan Jovanovic         virtual ::rtl::OUString SAL_CALL getImplementationName() throw(RuntimeException);
116*448486c6SDamjan Jovanovic         virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& _rServiceName ) throw(RuntimeException);
117*448486c6SDamjan Jovanovic         virtual Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw(RuntimeException);
118*448486c6SDamjan Jovanovic 
119*448486c6SDamjan Jovanovic         // OComponentHelper
120*448486c6SDamjan Jovanovic         virtual void SAL_CALL disposing();
121*448486c6SDamjan Jovanovic 
122*448486c6SDamjan Jovanovic     public:
123*448486c6SDamjan Jovanovic         // XServiceInfo - static version
124*448486c6SDamjan Jovanovic         static ::rtl::OUString SAL_CALL getImplementationName_static();
125*448486c6SDamjan Jovanovic         static Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames_static();
126*448486c6SDamjan Jovanovic         static Reference< XInterface > Create( const Reference< XComponentContext >& _rxContext );
127*448486c6SDamjan Jovanovic 
128*448486c6SDamjan Jovanovic     public:
129*448486c6SDamjan Jovanovic         typedef ComponentMethodGuard< SyslogHandler > MethodGuard;
130*448486c6SDamjan Jovanovic         void    enterMethod( MethodGuard::Access );
131*448486c6SDamjan Jovanovic         void    leaveMethod( MethodGuard::Access );
132*448486c6SDamjan Jovanovic     };
133*448486c6SDamjan Jovanovic 
134*448486c6SDamjan Jovanovic     //====================================================================
135*448486c6SDamjan Jovanovic     //= SyslogHandler - implementation
136*448486c6SDamjan Jovanovic     //====================================================================
137*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
SyslogHandler(const Reference<XComponentContext> & _rxContext)138*448486c6SDamjan Jovanovic     SyslogHandler::SyslogHandler( const Reference< XComponentContext >& _rxContext )
139*448486c6SDamjan Jovanovic         :SyslogHandler_Base( m_aMutex )
140*448486c6SDamjan Jovanovic         ,m_aContext( _rxContext )
141*448486c6SDamjan Jovanovic         ,m_aHandlerHelper( _rxContext, m_aMutex, rBHelper )
142*448486c6SDamjan Jovanovic         ,m_aSocketAddress()
143*448486c6SDamjan Jovanovic         ,m_aSocket()
144*448486c6SDamjan Jovanovic     {
145*448486c6SDamjan Jovanovic     }
146*448486c6SDamjan Jovanovic 
147*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
~SyslogHandler()148*448486c6SDamjan Jovanovic     SyslogHandler::~SyslogHandler()
149*448486c6SDamjan Jovanovic     {
150*448486c6SDamjan Jovanovic         if ( !rBHelper.bDisposed )
151*448486c6SDamjan Jovanovic         {
152*448486c6SDamjan Jovanovic             acquire();
153*448486c6SDamjan Jovanovic             dispose();
154*448486c6SDamjan Jovanovic         }
155*448486c6SDamjan Jovanovic     }
156*448486c6SDamjan Jovanovic 
157*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
disposing()158*448486c6SDamjan Jovanovic     void SAL_CALL SyslogHandler::disposing()
159*448486c6SDamjan Jovanovic     {
160*448486c6SDamjan Jovanovic         m_aHandlerHelper.setFormatter( NULL );
161*448486c6SDamjan Jovanovic     }
162*448486c6SDamjan Jovanovic 
163*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
enterMethod(MethodGuard::Access)164*448486c6SDamjan Jovanovic     void SyslogHandler::enterMethod( MethodGuard::Access )
165*448486c6SDamjan Jovanovic     {
166*448486c6SDamjan Jovanovic         m_aHandlerHelper.enterMethod();
167*448486c6SDamjan Jovanovic     }
168*448486c6SDamjan Jovanovic 
169*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
leaveMethod(MethodGuard::Access)170*448486c6SDamjan Jovanovic     void SyslogHandler::leaveMethod( MethodGuard::Access )
171*448486c6SDamjan Jovanovic     {
172*448486c6SDamjan Jovanovic         m_aMutex.release();
173*448486c6SDamjan Jovanovic     }
174*448486c6SDamjan Jovanovic 
175*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
getEncoding()176*448486c6SDamjan Jovanovic     ::rtl::OUString SAL_CALL SyslogHandler::getEncoding() throw (RuntimeException)
177*448486c6SDamjan Jovanovic     {
178*448486c6SDamjan Jovanovic         MethodGuard aGuard( *this );
179*448486c6SDamjan Jovanovic         ::rtl::OUString sEncoding;
180*448486c6SDamjan Jovanovic         OSL_VERIFY( m_aHandlerHelper.getEncoding( sEncoding ) );
181*448486c6SDamjan Jovanovic         return sEncoding;
182*448486c6SDamjan Jovanovic     }
183*448486c6SDamjan Jovanovic 
184*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
setEncoding(const::rtl::OUString & _rEncoding)185*448486c6SDamjan Jovanovic     void SAL_CALL SyslogHandler::setEncoding( const ::rtl::OUString& _rEncoding ) throw (RuntimeException)
186*448486c6SDamjan Jovanovic     {
187*448486c6SDamjan Jovanovic         MethodGuard aGuard( *this );
188*448486c6SDamjan Jovanovic         OSL_VERIFY( m_aHandlerHelper.setEncoding( _rEncoding ) );
189*448486c6SDamjan Jovanovic     }
190*448486c6SDamjan Jovanovic 
191*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
getFormatter()192*448486c6SDamjan Jovanovic     Reference< XLogFormatter > SAL_CALL SyslogHandler::getFormatter() throw (RuntimeException)
193*448486c6SDamjan Jovanovic     {
194*448486c6SDamjan Jovanovic         MethodGuard aGuard( *this );
195*448486c6SDamjan Jovanovic         return m_aHandlerHelper.getFormatter();
196*448486c6SDamjan Jovanovic     }
197*448486c6SDamjan Jovanovic 
198*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
setFormatter(const Reference<XLogFormatter> & _rxFormatter)199*448486c6SDamjan Jovanovic     void SAL_CALL SyslogHandler::setFormatter( const Reference< XLogFormatter >& _rxFormatter ) throw (RuntimeException)
200*448486c6SDamjan Jovanovic     {
201*448486c6SDamjan Jovanovic         MethodGuard aGuard( *this );
202*448486c6SDamjan Jovanovic         m_aHandlerHelper.setFormatter( _rxFormatter );
203*448486c6SDamjan Jovanovic     }
204*448486c6SDamjan Jovanovic 
205*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
getLevel()206*448486c6SDamjan Jovanovic     ::sal_Int32 SAL_CALL SyslogHandler::getLevel() throw (RuntimeException)
207*448486c6SDamjan Jovanovic     {
208*448486c6SDamjan Jovanovic         MethodGuard aGuard( *this );
209*448486c6SDamjan Jovanovic         return m_aHandlerHelper.getLevel();
210*448486c6SDamjan Jovanovic     }
211*448486c6SDamjan Jovanovic 
212*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
setLevel(::sal_Int32 _nLevel)213*448486c6SDamjan Jovanovic     void SAL_CALL SyslogHandler::setLevel( ::sal_Int32 _nLevel ) throw (RuntimeException)
214*448486c6SDamjan Jovanovic     {
215*448486c6SDamjan Jovanovic         MethodGuard aGuard( *this );
216*448486c6SDamjan Jovanovic         m_aHandlerHelper.setLevel( _nLevel );
217*448486c6SDamjan Jovanovic     }
218*448486c6SDamjan Jovanovic 
219*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
flush()220*448486c6SDamjan Jovanovic     void SAL_CALL SyslogHandler::flush(  ) throw (RuntimeException)
221*448486c6SDamjan Jovanovic     {
222*448486c6SDamjan Jovanovic         MethodGuard aGuard( *this );
223*448486c6SDamjan Jovanovic         fflush( stdout );
224*448486c6SDamjan Jovanovic         fflush( stderr );
225*448486c6SDamjan Jovanovic     }
226*448486c6SDamjan Jovanovic 
227*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
publish(const LogRecord & _rRecord)228*448486c6SDamjan Jovanovic     ::sal_Bool SAL_CALL SyslogHandler::publish( const LogRecord& _rRecord ) throw (RuntimeException)
229*448486c6SDamjan Jovanovic     {
230*448486c6SDamjan Jovanovic         MethodGuard aGuard( *this );
231*448486c6SDamjan Jovanovic 
232*448486c6SDamjan Jovanovic         ::rtl::OString sEntry;
233*448486c6SDamjan Jovanovic         if ( !m_aHandlerHelper.formatForPublishing( _rRecord, sEntry ) )
234*448486c6SDamjan Jovanovic             return sal_False;
235*448486c6SDamjan Jovanovic 
236*448486c6SDamjan Jovanovic         ::rtl::OStringBuffer buffer;
237*448486c6SDamjan Jovanovic         // PRI
238*448486c6SDamjan Jovanovic         const sal_Int32 facility = 1; // USER
239*448486c6SDamjan Jovanovic         sal_Int32 severity;
240*448486c6SDamjan Jovanovic         switch ( _rRecord.Level )
241*448486c6SDamjan Jovanovic         {
242*448486c6SDamjan Jovanovic             case LogLevel::SEVERE:
243*448486c6SDamjan Jovanovic                 severity = 3; // error
244*448486c6SDamjan Jovanovic                 break;
245*448486c6SDamjan Jovanovic             case LogLevel::WARNING:
246*448486c6SDamjan Jovanovic                 severity = 4; // warning
247*448486c6SDamjan Jovanovic                 break;
248*448486c6SDamjan Jovanovic             case LogLevel::INFO:
249*448486c6SDamjan Jovanovic             case LogLevel::CONFIG:
250*448486c6SDamjan Jovanovic                 severity = 5; // notice
251*448486c6SDamjan Jovanovic                 break;
252*448486c6SDamjan Jovanovic             default:
253*448486c6SDamjan Jovanovic                 severity = 7; // debug
254*448486c6SDamjan Jovanovic         }
255*448486c6SDamjan Jovanovic         buffer.append( '<' );
256*448486c6SDamjan Jovanovic         buffer.append( ( facility * 8 ) + severity );
257*448486c6SDamjan Jovanovic         buffer.append( '>' );
258*448486c6SDamjan Jovanovic 
259*448486c6SDamjan Jovanovic         // VERSION
260*448486c6SDamjan Jovanovic         buffer.append( '1' );
261*448486c6SDamjan Jovanovic         buffer.append( ' ' );
262*448486c6SDamjan Jovanovic 
263*448486c6SDamjan Jovanovic         // TIMESTAMP
264*448486c6SDamjan Jovanovic         char timestampBuffer[256];
265*448486c6SDamjan Jovanovic         snprintf( timestampBuffer, sizeof( timestampBuffer ),
266*448486c6SDamjan Jovanovic             "%04i-%02i-%02iT%02i:%02i:%02i.%02iZ",
267*448486c6SDamjan Jovanovic             (int)_rRecord.LogTime.Year, (int)_rRecord.LogTime.Month, (int)_rRecord.LogTime.Day,
268*448486c6SDamjan Jovanovic             (int)_rRecord.LogTime.Hours, (int)_rRecord.LogTime.Minutes, (int)_rRecord.LogTime.Seconds,
269*448486c6SDamjan Jovanovic             (int)_rRecord.LogTime.HundredthSeconds );
270*448486c6SDamjan Jovanovic         buffer.append( timestampBuffer );
271*448486c6SDamjan Jovanovic         buffer.append( ' ' );
272*448486c6SDamjan Jovanovic 
273*448486c6SDamjan Jovanovic         // HOSTNAME
274*448486c6SDamjan Jovanovic         ::rtl::OUString hostname = ::osl::SocketAddr::getLocalHostname( 0 );
275*448486c6SDamjan Jovanovic         if ( !hostname.isEmpty() )
276*448486c6SDamjan Jovanovic             buffer.append( ::rtl::OUStringToOString( hostname, RTL_TEXTENCODING_UTF8 ) );
277*448486c6SDamjan Jovanovic         else
278*448486c6SDamjan Jovanovic             buffer.append( '-' );
279*448486c6SDamjan Jovanovic         buffer.append( ' ' );
280*448486c6SDamjan Jovanovic 
281*448486c6SDamjan Jovanovic         // APP-NAME
282*448486c6SDamjan Jovanovic         buffer.append( "soffice" );
283*448486c6SDamjan Jovanovic         buffer.append( ' ' );
284*448486c6SDamjan Jovanovic 
285*448486c6SDamjan Jovanovic         // PROC-ID
286*448486c6SDamjan Jovanovic         oslProcessInfo pInfo;
287*448486c6SDamjan Jovanovic         pInfo.Size = sizeof(oslProcessInfo);
288*448486c6SDamjan Jovanovic         oslProcessError prerr = osl_getProcessInfo( NULL, osl_Process_IDENTIFIER, &pInfo );
289*448486c6SDamjan Jovanovic         if ( prerr == osl_Process_E_None )
290*448486c6SDamjan Jovanovic             buffer.append( (sal_Int64) pInfo.Ident );
291*448486c6SDamjan Jovanovic         else
292*448486c6SDamjan Jovanovic             buffer.append( '-' );
293*448486c6SDamjan Jovanovic         buffer.append( ' ' );
294*448486c6SDamjan Jovanovic 
295*448486c6SDamjan Jovanovic         // MESSAGE-ID
296*448486c6SDamjan Jovanovic         buffer.append( '-' );
297*448486c6SDamjan Jovanovic         buffer.append( ' ' );
298*448486c6SDamjan Jovanovic 
299*448486c6SDamjan Jovanovic         // STRUCTURED DATA
300*448486c6SDamjan Jovanovic         buffer.append( '-' );
301*448486c6SDamjan Jovanovic         buffer.append( ' ' );
302*448486c6SDamjan Jovanovic 
303*448486c6SDamjan Jovanovic         // MESSAGE
304*448486c6SDamjan Jovanovic         buffer.append( sEntry );
305*448486c6SDamjan Jovanovic 
306*448486c6SDamjan Jovanovic         sal_Int32 sockRes = m_aSocket.sendTo( m_aSocketAddress, buffer.getStr(), buffer.getLength() );
307*448486c6SDamjan Jovanovic 
308*448486c6SDamjan Jovanovic         return sockRes == osl_Socket_MsgNormal;
309*448486c6SDamjan Jovanovic     }
310*448486c6SDamjan Jovanovic 
311*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
initialize(const Sequence<Any> & _rArguments)312*448486c6SDamjan Jovanovic     void SAL_CALL SyslogHandler::initialize( const Sequence< Any >& _rArguments ) throw (Exception, RuntimeException)
313*448486c6SDamjan Jovanovic     {
314*448486c6SDamjan Jovanovic         ::osl::MutexGuard aGuard( m_aMutex );
315*448486c6SDamjan Jovanovic 
316*448486c6SDamjan Jovanovic         if ( m_aHandlerHelper.getIsInitialized() )
317*448486c6SDamjan Jovanovic             throw AlreadyInitializedException();
318*448486c6SDamjan Jovanovic 
319*448486c6SDamjan Jovanovic         if ( _rArguments.getLength() != 1 )
320*448486c6SDamjan Jovanovic             throw IllegalArgumentException( ::rtl::OUString(), *this, 1 );
321*448486c6SDamjan Jovanovic 
322*448486c6SDamjan Jovanovic         Sequence< NamedValue > aSettings;
323*448486c6SDamjan Jovanovic         if ( !( _rArguments[0] >>= aSettings ) )
324*448486c6SDamjan Jovanovic             throw IllegalArgumentException( ::rtl::OUString(), *this, 1 );
325*448486c6SDamjan Jovanovic 
326*448486c6SDamjan Jovanovic         // createWithSettings( [in] sequence< ::com::sun::star::beans::NamedValue > Settings )
327*448486c6SDamjan Jovanovic         ::comphelper::NamedValueCollection aTypedSettings( aSettings );
328*448486c6SDamjan Jovanovic         m_aHandlerHelper.initFromSettings( aTypedSettings );
329*448486c6SDamjan Jovanovic 
330*448486c6SDamjan Jovanovic         ::rtl::OUString host;
331*448486c6SDamjan Jovanovic         if ( !aTypedSettings.get_ensureType( "Host", host ) )
332*448486c6SDamjan Jovanovic             throw IllegalArgumentException( ::rtl::OUString(), *this, 1 );
333*448486c6SDamjan Jovanovic         sal_Int32 port;
334*448486c6SDamjan Jovanovic         if ( !aTypedSettings.get_ensureType( "Port", port ) )
335*448486c6SDamjan Jovanovic             throw IllegalArgumentException( ::rtl::OUString(), *this, 1 );
336*448486c6SDamjan Jovanovic         ::osl::SocketAddr address( host, port );
337*448486c6SDamjan Jovanovic         if ( address.is() )
338*448486c6SDamjan Jovanovic             m_aSocketAddress = address;
339*448486c6SDamjan Jovanovic         else
340*448486c6SDamjan Jovanovic             throw IllegalArgumentException( ::rtl::OUString(), *this, 1 );
341*448486c6SDamjan Jovanovic 
342*448486c6SDamjan Jovanovic         m_aHandlerHelper.setIsInitialized();
343*448486c6SDamjan Jovanovic     }
344*448486c6SDamjan Jovanovic 
345*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
getImplementationName()346*448486c6SDamjan Jovanovic     ::rtl::OUString SAL_CALL SyslogHandler::getImplementationName() throw(RuntimeException)
347*448486c6SDamjan Jovanovic     {
348*448486c6SDamjan Jovanovic         return getImplementationName_static();
349*448486c6SDamjan Jovanovic     }
350*448486c6SDamjan Jovanovic 
351*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
supportsService(const::rtl::OUString & _rServiceName)352*448486c6SDamjan Jovanovic     ::sal_Bool SAL_CALL SyslogHandler::supportsService( const ::rtl::OUString& _rServiceName ) throw(RuntimeException)
353*448486c6SDamjan Jovanovic     {
354*448486c6SDamjan Jovanovic         const Sequence< ::rtl::OUString > aServiceNames( getSupportedServiceNames() );
355*448486c6SDamjan Jovanovic         for (   const ::rtl::OUString* pServiceNames = aServiceNames.getConstArray();
356*448486c6SDamjan Jovanovic                 pServiceNames != aServiceNames.getConstArray() + aServiceNames.getLength();
357*448486c6SDamjan Jovanovic                 ++pServiceNames
358*448486c6SDamjan Jovanovic             )
359*448486c6SDamjan Jovanovic             if ( _rServiceName == *pServiceNames )
360*448486c6SDamjan Jovanovic                 return sal_True;
361*448486c6SDamjan Jovanovic         return sal_False;
362*448486c6SDamjan Jovanovic     }
363*448486c6SDamjan Jovanovic 
364*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
getSupportedServiceNames()365*448486c6SDamjan Jovanovic     Sequence< ::rtl::OUString > SAL_CALL SyslogHandler::getSupportedServiceNames() throw(RuntimeException)
366*448486c6SDamjan Jovanovic     {
367*448486c6SDamjan Jovanovic         return getSupportedServiceNames_static();
368*448486c6SDamjan Jovanovic     }
369*448486c6SDamjan Jovanovic 
370*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
getImplementationName_static()371*448486c6SDamjan Jovanovic     ::rtl::OUString SAL_CALL SyslogHandler::getImplementationName_static()
372*448486c6SDamjan Jovanovic     {
373*448486c6SDamjan Jovanovic         return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.extensions.SyslogHandler" ) );
374*448486c6SDamjan Jovanovic     }
375*448486c6SDamjan Jovanovic 
376*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
getSupportedServiceNames_static()377*448486c6SDamjan Jovanovic     Sequence< ::rtl::OUString > SAL_CALL SyslogHandler::getSupportedServiceNames_static()
378*448486c6SDamjan Jovanovic     {
379*448486c6SDamjan Jovanovic         Sequence< ::rtl::OUString > aServiceNames(1);
380*448486c6SDamjan Jovanovic         aServiceNames[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.logging.SyslogHandler" ) );
381*448486c6SDamjan Jovanovic         return aServiceNames;
382*448486c6SDamjan Jovanovic     }
383*448486c6SDamjan Jovanovic 
384*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
Create(const Reference<XComponentContext> & _rxContext)385*448486c6SDamjan Jovanovic     Reference< XInterface > SyslogHandler::Create( const Reference< XComponentContext >& _rxContext )
386*448486c6SDamjan Jovanovic     {
387*448486c6SDamjan Jovanovic         return *( new SyslogHandler( _rxContext ) );
388*448486c6SDamjan Jovanovic     }
389*448486c6SDamjan Jovanovic 
390*448486c6SDamjan Jovanovic     //--------------------------------------------------------------------
createRegistryInfo_SyslogHandler()391*448486c6SDamjan Jovanovic     void createRegistryInfo_SyslogHandler()
392*448486c6SDamjan Jovanovic     {
393*448486c6SDamjan Jovanovic         static OAutoRegistration< SyslogHandler > aAutoRegistration;
394*448486c6SDamjan Jovanovic     }
395*448486c6SDamjan Jovanovic 
396*448486c6SDamjan Jovanovic //........................................................................
397*448486c6SDamjan Jovanovic } // namespace logging
398*448486c6SDamjan Jovanovic //........................................................................
399