1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_extensions.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "log_module.hxx"
28*b1cdbd2cSJim Jagielski #include "methodguard.hxx"
29*b1cdbd2cSJim Jagielski #include "loghandler.hxx"
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/
32*b1cdbd2cSJim Jagielski #include <com/sun/star/logging/XLogHandler.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceInfo.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/AlreadyInitializedException.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XInitialization.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/IllegalArgumentException.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XStringSubstitution.hpp>
38*b1cdbd2cSJim Jagielski /** === end UNO includes === **/
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski #include <comphelper/componentcontext.hxx>
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski #include <cppuhelper/compbase3.hxx>
45*b1cdbd2cSJim Jagielski #include <cppuhelper/basemutex.hxx>
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski #include <osl/thread.h>
48*b1cdbd2cSJim Jagielski #include <osl/file.hxx>
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski #include <rtl/strbuf.hxx>
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski #include <memory>
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski //........................................................................
55*b1cdbd2cSJim Jagielski namespace logging
56*b1cdbd2cSJim Jagielski {
57*b1cdbd2cSJim Jagielski //........................................................................
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski 	/** === begin UNO using === **/
60*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::Reference;
61*b1cdbd2cSJim Jagielski     using ::com::sun::star::logging::LogRecord;
62*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::RuntimeException;
63*b1cdbd2cSJim Jagielski     using ::com::sun::star::logging::XLogFormatter;
64*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::Sequence;
65*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::XInterface;
66*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::XComponentContext;
67*b1cdbd2cSJim Jagielski     using ::com::sun::star::logging::XLogHandler;
68*b1cdbd2cSJim Jagielski     using ::com::sun::star::lang::XServiceInfo;
69*b1cdbd2cSJim Jagielski     using ::com::sun::star::ucb::AlreadyInitializedException;
70*b1cdbd2cSJim Jagielski     using ::com::sun::star::lang::XInitialization;
71*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::Any;
72*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::Exception;
73*b1cdbd2cSJim Jagielski     using ::com::sun::star::lang::IllegalArgumentException;
74*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::UNO_QUERY_THROW;
75*b1cdbd2cSJim Jagielski     using ::com::sun::star::util::XStringSubstitution;
76*b1cdbd2cSJim Jagielski     using ::com::sun::star::beans::NamedValue;
77*b1cdbd2cSJim Jagielski 	/** === end UNO using === **/
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski 	//====================================================================
80*b1cdbd2cSJim Jagielski 	//= FileHandler - declaration
81*b1cdbd2cSJim Jagielski 	//====================================================================
82*b1cdbd2cSJim Jagielski     typedef ::cppu::WeakComponentImplHelper3    <   XLogHandler
83*b1cdbd2cSJim Jagielski                                                 ,   XServiceInfo
84*b1cdbd2cSJim Jagielski                                                 ,   XInitialization
85*b1cdbd2cSJim Jagielski                                                 >   FileHandler_Base;
86*b1cdbd2cSJim Jagielski     class FileHandler   :public ::cppu::BaseMutex
87*b1cdbd2cSJim Jagielski                         ,public FileHandler_Base
88*b1cdbd2cSJim Jagielski 	{
89*b1cdbd2cSJim Jagielski     private:
90*b1cdbd2cSJim Jagielski         enum FileValidity
91*b1cdbd2cSJim Jagielski         {
92*b1cdbd2cSJim Jagielski             /// never attempted to open the file
93*b1cdbd2cSJim Jagielski             eUnknown,
94*b1cdbd2cSJim Jagielski             /// file is valid
95*b1cdbd2cSJim Jagielski             eValid,
96*b1cdbd2cSJim Jagielski             /// file is invalid
97*b1cdbd2cSJim Jagielski             eInvalid
98*b1cdbd2cSJim Jagielski         };
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski     private:
101*b1cdbd2cSJim Jagielski         ::comphelper::ComponentContext  m_aContext;
102*b1cdbd2cSJim Jagielski         LogHandlerHelper                m_aHandlerHelper;
103*b1cdbd2cSJim Jagielski         ::rtl::OUString                 m_sFileURL;
104*b1cdbd2cSJim Jagielski         ::std::auto_ptr< ::osl::File >  m_pFile;
105*b1cdbd2cSJim Jagielski         FileValidity                    m_eFileValidity;
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski     protected:
108*b1cdbd2cSJim Jagielski         FileHandler( const Reference< XComponentContext >& _rxContext );
109*b1cdbd2cSJim Jagielski         virtual ~FileHandler();
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski         // XLogHandler
112*b1cdbd2cSJim Jagielski         virtual ::rtl::OUString SAL_CALL getEncoding() throw (RuntimeException);
113*b1cdbd2cSJim Jagielski         virtual void SAL_CALL setEncoding( const ::rtl::OUString& _encoding ) throw (RuntimeException);
114*b1cdbd2cSJim Jagielski         virtual Reference< XLogFormatter > SAL_CALL getFormatter() throw (RuntimeException);
115*b1cdbd2cSJim Jagielski         virtual void SAL_CALL setFormatter( const Reference< XLogFormatter >& _formatter ) throw (RuntimeException);
116*b1cdbd2cSJim Jagielski         virtual ::sal_Int32 SAL_CALL getLevel() throw (RuntimeException);
117*b1cdbd2cSJim Jagielski         virtual void SAL_CALL setLevel( ::sal_Int32 _level ) throw (RuntimeException);
118*b1cdbd2cSJim Jagielski         virtual void SAL_CALL flush(  ) throw (RuntimeException);
119*b1cdbd2cSJim Jagielski         virtual ::sal_Bool SAL_CALL publish( const LogRecord& Record ) throw (RuntimeException);
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski         // XInitialization
122*b1cdbd2cSJim Jagielski         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);
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski         // XServiceInfo
125*b1cdbd2cSJim Jagielski 		virtual ::rtl::OUString SAL_CALL getImplementationName() throw(RuntimeException);
126*b1cdbd2cSJim Jagielski         virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& _rServiceName ) throw(RuntimeException);
127*b1cdbd2cSJim Jagielski         virtual Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw(RuntimeException);
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski         // OComponentHelper
130*b1cdbd2cSJim Jagielski         virtual void SAL_CALL disposing();
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski     public:
133*b1cdbd2cSJim Jagielski         // XServiceInfo - static version
134*b1cdbd2cSJim Jagielski 		static ::rtl::OUString SAL_CALL getImplementationName_static();
135*b1cdbd2cSJim Jagielski         static Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames_static();
136*b1cdbd2cSJim Jagielski         static Reference< XInterface > Create( const Reference< XComponentContext >& _rxContext );
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski     public:
139*b1cdbd2cSJim Jagielski         typedef ComponentMethodGuard< FileHandler > MethodGuard;
140*b1cdbd2cSJim Jagielski         void    enterMethod( MethodGuard::Access );
141*b1cdbd2cSJim Jagielski         void    leaveMethod( MethodGuard::Access );
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski     private:
144*b1cdbd2cSJim Jagielski         /** prepares our output file for writing
145*b1cdbd2cSJim Jagielski         */
146*b1cdbd2cSJim Jagielski         bool    impl_prepareFile_nothrow();
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski         /// writes the given string to our file
149*b1cdbd2cSJim Jagielski         void    impl_writeString_nothrow( const ::rtl::OString& _rEntry );
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski         /** does string substitution on a (usually externally provided) file url
152*b1cdbd2cSJim Jagielski         */
153*b1cdbd2cSJim Jagielski         void    impl_doStringsubstitution_nothrow( ::rtl::OUString& _inout_rURL );
154*b1cdbd2cSJim Jagielski 	};
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski     //====================================================================
157*b1cdbd2cSJim Jagielski 	//= FileHandler - implementation
158*b1cdbd2cSJim Jagielski 	//====================================================================
159*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
FileHandler(const Reference<XComponentContext> & _rxContext)160*b1cdbd2cSJim Jagielski     FileHandler::FileHandler( const Reference< XComponentContext >& _rxContext )
161*b1cdbd2cSJim Jagielski         :FileHandler_Base( m_aMutex )
162*b1cdbd2cSJim Jagielski         ,m_aContext( _rxContext )
163*b1cdbd2cSJim Jagielski         ,m_aHandlerHelper( _rxContext, m_aMutex, rBHelper )
164*b1cdbd2cSJim Jagielski         ,m_sFileURL( )
165*b1cdbd2cSJim Jagielski         ,m_pFile( )
166*b1cdbd2cSJim Jagielski         ,m_eFileValidity( eUnknown )
167*b1cdbd2cSJim Jagielski     {
168*b1cdbd2cSJim Jagielski     }
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
~FileHandler()171*b1cdbd2cSJim Jagielski     FileHandler::~FileHandler()
172*b1cdbd2cSJim Jagielski     {
173*b1cdbd2cSJim Jagielski         if ( !rBHelper.bDisposed )
174*b1cdbd2cSJim Jagielski         {
175*b1cdbd2cSJim Jagielski             acquire();
176*b1cdbd2cSJim Jagielski             dispose();
177*b1cdbd2cSJim Jagielski         }
178*b1cdbd2cSJim Jagielski     }
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
impl_prepareFile_nothrow()181*b1cdbd2cSJim Jagielski     bool FileHandler::impl_prepareFile_nothrow()
182*b1cdbd2cSJim Jagielski     {
183*b1cdbd2cSJim Jagielski         if ( m_eFileValidity == eUnknown )
184*b1cdbd2cSJim Jagielski         {
185*b1cdbd2cSJim Jagielski             m_pFile.reset( new ::osl::File( m_sFileURL ) );
186*b1cdbd2cSJim Jagielski             // check whether the log file already exists
187*b1cdbd2cSJim Jagielski             ::osl::DirectoryItem aFileItem;
188*b1cdbd2cSJim Jagielski             ::osl::DirectoryItem::get( m_sFileURL, aFileItem );
189*b1cdbd2cSJim Jagielski             ::osl::FileStatus aStatus( FileStatusMask_Validate );
190*b1cdbd2cSJim Jagielski             if ( ::osl::FileBase::E_None == aFileItem.getFileStatus( aStatus ) )
191*b1cdbd2cSJim Jagielski                 ::osl::File::remove( m_sFileURL );
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski             ::osl::FileBase::RC res = m_pFile->open( osl_File_OpenFlag_Write | osl_File_OpenFlag_Create );
194*b1cdbd2cSJim Jagielski             m_eFileValidity =   res == ::osl::FileBase::E_None
195*b1cdbd2cSJim Jagielski                             ?   eValid
196*b1cdbd2cSJim Jagielski                             :   eInvalid;
197*b1cdbd2cSJim Jagielski         #if OSL_DEBUG_LEVEL > 0
198*b1cdbd2cSJim Jagielski             if ( m_eFileValidity == eInvalid )
199*b1cdbd2cSJim Jagielski             {
200*b1cdbd2cSJim Jagielski                 ::rtl::OStringBuffer sMessage;
201*b1cdbd2cSJim Jagielski                 sMessage.append( "FileHandler::impl_prepareFile_nothrow: could not open the designated log file:" );
202*b1cdbd2cSJim Jagielski                 sMessage.append( "\nURL: " );
203*b1cdbd2cSJim Jagielski                 sMessage.append( ::rtl::OString( m_sFileURL.getStr(), m_sFileURL.getLength(), osl_getThreadTextEncoding() ) );
204*b1cdbd2cSJim Jagielski                 sMessage.append( "\nerror code: " );
205*b1cdbd2cSJim Jagielski                 sMessage.append( (sal_Int32)res );
206*b1cdbd2cSJim Jagielski                 OSL_ENSURE( false, sMessage.getStr() );
207*b1cdbd2cSJim Jagielski             }
208*b1cdbd2cSJim Jagielski         #endif
209*b1cdbd2cSJim Jagielski             if ( m_eFileValidity == eValid )
210*b1cdbd2cSJim Jagielski             {
211*b1cdbd2cSJim Jagielski                 ::rtl::OString sHead;
212*b1cdbd2cSJim Jagielski                 if ( m_aHandlerHelper.getEncodedHead( sHead ) )
213*b1cdbd2cSJim Jagielski                     impl_writeString_nothrow( sHead );
214*b1cdbd2cSJim Jagielski             }
215*b1cdbd2cSJim Jagielski         }
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski         return m_eFileValidity == eValid;
218*b1cdbd2cSJim Jagielski     }
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
impl_writeString_nothrow(const::rtl::OString & _rEntry)221*b1cdbd2cSJim Jagielski     void FileHandler::impl_writeString_nothrow( const ::rtl::OString& _rEntry )
222*b1cdbd2cSJim Jagielski     {
223*b1cdbd2cSJim Jagielski         OSL_PRECOND( m_pFile.get(), "FileHandler::impl_writeString_nothrow: no file!" );
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski         sal_uInt64 nBytesToWrite( _rEntry.getLength() );
226*b1cdbd2cSJim Jagielski         sal_uInt64 nBytesWritten( 0 );
227*b1cdbd2cSJim Jagielski     #if OSL_DEBUG_LEVEL > 0
228*b1cdbd2cSJim Jagielski         ::osl::FileBase::RC res =
229*b1cdbd2cSJim Jagielski     #endif
230*b1cdbd2cSJim Jagielski         m_pFile->write( _rEntry.getStr(), nBytesToWrite, nBytesWritten );
231*b1cdbd2cSJim Jagielski         OSL_ENSURE( ( res == ::osl::FileBase::E_None ) && ( nBytesWritten == nBytesToWrite ),
232*b1cdbd2cSJim Jagielski             "FileHandler::impl_writeString_nothrow: could not write the log entry!" );
233*b1cdbd2cSJim Jagielski     }
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
impl_doStringsubstitution_nothrow(::rtl::OUString & _inout_rURL)236*b1cdbd2cSJim Jagielski     void FileHandler::impl_doStringsubstitution_nothrow( ::rtl::OUString& _inout_rURL )
237*b1cdbd2cSJim Jagielski     {
238*b1cdbd2cSJim Jagielski         try
239*b1cdbd2cSJim Jagielski         {
240*b1cdbd2cSJim Jagielski             Reference< XStringSubstitution > xStringSubst;
241*b1cdbd2cSJim Jagielski             if ( m_aContext.createComponent( "com.sun.star.util.PathSubstitution", xStringSubst ) )
242*b1cdbd2cSJim Jagielski                 _inout_rURL = xStringSubst->substituteVariables( _inout_rURL, true );
243*b1cdbd2cSJim Jagielski         }
244*b1cdbd2cSJim Jagielski         catch( const Exception& )
245*b1cdbd2cSJim Jagielski         {
246*b1cdbd2cSJim Jagielski             DBG_UNHANDLED_EXCEPTION();
247*b1cdbd2cSJim Jagielski         }
248*b1cdbd2cSJim Jagielski     }
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
disposing()251*b1cdbd2cSJim Jagielski     void SAL_CALL FileHandler::disposing()
252*b1cdbd2cSJim Jagielski     {
253*b1cdbd2cSJim Jagielski         if ( m_eFileValidity == eValid )
254*b1cdbd2cSJim Jagielski         {
255*b1cdbd2cSJim Jagielski             ::rtl::OString sTail;
256*b1cdbd2cSJim Jagielski             if ( m_aHandlerHelper.getEncodedTail( sTail ) )
257*b1cdbd2cSJim Jagielski                 impl_writeString_nothrow( sTail );
258*b1cdbd2cSJim Jagielski         }
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski         m_pFile.reset();
261*b1cdbd2cSJim Jagielski         m_aHandlerHelper.setFormatter( NULL );
262*b1cdbd2cSJim Jagielski     }
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
enterMethod(MethodGuard::Access)265*b1cdbd2cSJim Jagielski     void FileHandler::enterMethod( MethodGuard::Access )
266*b1cdbd2cSJim Jagielski     {
267*b1cdbd2cSJim Jagielski         m_aHandlerHelper.enterMethod();
268*b1cdbd2cSJim Jagielski     }
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
leaveMethod(MethodGuard::Access)271*b1cdbd2cSJim Jagielski     void FileHandler::leaveMethod( MethodGuard::Access )
272*b1cdbd2cSJim Jagielski     {
273*b1cdbd2cSJim Jagielski         m_aMutex.release();
274*b1cdbd2cSJim Jagielski     }
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
getEncoding()277*b1cdbd2cSJim Jagielski     ::rtl::OUString SAL_CALL FileHandler::getEncoding() throw (RuntimeException)
278*b1cdbd2cSJim Jagielski     {
279*b1cdbd2cSJim Jagielski         MethodGuard aGuard( *this );
280*b1cdbd2cSJim Jagielski         ::rtl::OUString sEncoding;
281*b1cdbd2cSJim Jagielski         OSL_VERIFY( m_aHandlerHelper.getEncoding( sEncoding ) );
282*b1cdbd2cSJim Jagielski         return sEncoding;
283*b1cdbd2cSJim Jagielski     }
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
setEncoding(const::rtl::OUString & _rEncoding)286*b1cdbd2cSJim Jagielski     void SAL_CALL FileHandler::setEncoding( const ::rtl::OUString& _rEncoding ) throw (RuntimeException)
287*b1cdbd2cSJim Jagielski     {
288*b1cdbd2cSJim Jagielski         MethodGuard aGuard( *this );
289*b1cdbd2cSJim Jagielski         OSL_VERIFY( m_aHandlerHelper.setEncoding( _rEncoding ) );
290*b1cdbd2cSJim Jagielski     }
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
getFormatter()293*b1cdbd2cSJim Jagielski     Reference< XLogFormatter > SAL_CALL FileHandler::getFormatter() throw (RuntimeException)
294*b1cdbd2cSJim Jagielski     {
295*b1cdbd2cSJim Jagielski         MethodGuard aGuard( *this );
296*b1cdbd2cSJim Jagielski         return m_aHandlerHelper.getFormatter();
297*b1cdbd2cSJim Jagielski     }
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
setFormatter(const Reference<XLogFormatter> & _rxFormatter)300*b1cdbd2cSJim Jagielski     void SAL_CALL FileHandler::setFormatter( const Reference< XLogFormatter >& _rxFormatter ) throw (RuntimeException)
301*b1cdbd2cSJim Jagielski     {
302*b1cdbd2cSJim Jagielski         MethodGuard aGuard( *this );
303*b1cdbd2cSJim Jagielski         m_aHandlerHelper.setFormatter( _rxFormatter );
304*b1cdbd2cSJim Jagielski     }
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
getLevel()307*b1cdbd2cSJim Jagielski     ::sal_Int32 SAL_CALL FileHandler::getLevel() throw (RuntimeException)
308*b1cdbd2cSJim Jagielski     {
309*b1cdbd2cSJim Jagielski         MethodGuard aGuard( *this );
310*b1cdbd2cSJim Jagielski         return m_aHandlerHelper.getLevel();
311*b1cdbd2cSJim Jagielski     }
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
setLevel(::sal_Int32 _nLevel)314*b1cdbd2cSJim Jagielski     void SAL_CALL FileHandler::setLevel( ::sal_Int32 _nLevel ) throw (RuntimeException)
315*b1cdbd2cSJim Jagielski     {
316*b1cdbd2cSJim Jagielski         MethodGuard aGuard( *this );
317*b1cdbd2cSJim Jagielski         m_aHandlerHelper.setLevel( _nLevel );
318*b1cdbd2cSJim Jagielski     }
319*b1cdbd2cSJim Jagielski 
320*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
flush()321*b1cdbd2cSJim Jagielski     void SAL_CALL FileHandler::flush(  ) throw (RuntimeException)
322*b1cdbd2cSJim Jagielski     {
323*b1cdbd2cSJim Jagielski         MethodGuard aGuard( *this );
324*b1cdbd2cSJim Jagielski         if(!m_pFile.get())
325*b1cdbd2cSJim Jagielski         {
326*b1cdbd2cSJim Jagielski             OSL_PRECOND(false, "FileHandler::flush: no file!");
327*b1cdbd2cSJim Jagielski             return;
328*b1cdbd2cSJim Jagielski         }
329*b1cdbd2cSJim Jagielski         #if OSL_DEBUG_LEVEL > 0
330*b1cdbd2cSJim Jagielski             ::osl::FileBase::RC res =
331*b1cdbd2cSJim Jagielski         #endif
332*b1cdbd2cSJim Jagielski                 m_pFile->sync();
333*b1cdbd2cSJim Jagielski         OSL_ENSURE(res == ::osl::FileBase::E_None, "FileHandler::flush: Could not sync logfile to filesystem.");
334*b1cdbd2cSJim Jagielski     }
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
publish(const LogRecord & _rRecord)337*b1cdbd2cSJim Jagielski     ::sal_Bool SAL_CALL FileHandler::publish( const LogRecord& _rRecord ) throw (RuntimeException)
338*b1cdbd2cSJim Jagielski     {
339*b1cdbd2cSJim Jagielski         MethodGuard aGuard( *this );
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski         if ( !impl_prepareFile_nothrow() )
342*b1cdbd2cSJim Jagielski             return sal_False;
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski         ::rtl::OString sEntry;
345*b1cdbd2cSJim Jagielski         if ( !m_aHandlerHelper.formatForPublishing( _rRecord, sEntry ) )
346*b1cdbd2cSJim Jagielski             return sal_False;
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski         impl_writeString_nothrow( sEntry );
349*b1cdbd2cSJim Jagielski         return sal_True;
350*b1cdbd2cSJim Jagielski     }
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
initialize(const Sequence<Any> & _rArguments)353*b1cdbd2cSJim Jagielski     void SAL_CALL FileHandler::initialize( const Sequence< Any >& _rArguments ) throw (Exception, RuntimeException)
354*b1cdbd2cSJim Jagielski     {
355*b1cdbd2cSJim Jagielski         ::osl::MutexGuard aGuard( m_aMutex );
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski         if ( m_aHandlerHelper.getIsInitialized() )
358*b1cdbd2cSJim Jagielski             throw AlreadyInitializedException();
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski         if ( _rArguments.getLength() != 1 )
361*b1cdbd2cSJim Jagielski             throw IllegalArgumentException( ::rtl::OUString(), *this, 1 );
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski         Sequence< NamedValue > aSettings;
364*b1cdbd2cSJim Jagielski         if ( _rArguments[0] >>= m_sFileURL )
365*b1cdbd2cSJim Jagielski         {
366*b1cdbd2cSJim Jagielski             // create( [in] string URL );
367*b1cdbd2cSJim Jagielski             impl_doStringsubstitution_nothrow( m_sFileURL );
368*b1cdbd2cSJim Jagielski         }
369*b1cdbd2cSJim Jagielski         else if ( _rArguments[0] >>= aSettings )
370*b1cdbd2cSJim Jagielski         {
371*b1cdbd2cSJim Jagielski             // createWithSettings( [in] sequence< ::com::sun::star::beans::NamedValue > Settings )
372*b1cdbd2cSJim Jagielski             ::comphelper::NamedValueCollection aTypedSettings( aSettings );
373*b1cdbd2cSJim Jagielski             m_aHandlerHelper.initFromSettings( aTypedSettings );
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski             if ( aTypedSettings.get_ensureType( "FileURL", m_sFileURL ) )
376*b1cdbd2cSJim Jagielski                 impl_doStringsubstitution_nothrow( m_sFileURL );
377*b1cdbd2cSJim Jagielski         }
378*b1cdbd2cSJim Jagielski         else
379*b1cdbd2cSJim Jagielski             throw IllegalArgumentException( ::rtl::OUString(), *this, 1 );
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski         m_aHandlerHelper.setIsInitialized();
382*b1cdbd2cSJim Jagielski     }
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
getImplementationName()385*b1cdbd2cSJim Jagielski     ::rtl::OUString SAL_CALL FileHandler::getImplementationName() throw(RuntimeException)
386*b1cdbd2cSJim Jagielski     {
387*b1cdbd2cSJim Jagielski         return getImplementationName_static();
388*b1cdbd2cSJim Jagielski     }
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
supportsService(const::rtl::OUString & _rServiceName)391*b1cdbd2cSJim Jagielski     ::sal_Bool SAL_CALL FileHandler::supportsService( const ::rtl::OUString& _rServiceName ) throw(RuntimeException)
392*b1cdbd2cSJim Jagielski     {
393*b1cdbd2cSJim Jagielski         const Sequence< ::rtl::OUString > aServiceNames( getSupportedServiceNames() );
394*b1cdbd2cSJim Jagielski         for (   const ::rtl::OUString* pServiceNames = aServiceNames.getConstArray();
395*b1cdbd2cSJim Jagielski                 pServiceNames != aServiceNames.getConstArray() + aServiceNames.getLength();
396*b1cdbd2cSJim Jagielski                 ++pServiceNames
397*b1cdbd2cSJim Jagielski             )
398*b1cdbd2cSJim Jagielski             if ( _rServiceName == *pServiceNames )
399*b1cdbd2cSJim Jagielski                 return sal_True;
400*b1cdbd2cSJim Jagielski         return sal_False;
401*b1cdbd2cSJim Jagielski     }
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
getSupportedServiceNames()404*b1cdbd2cSJim Jagielski     Sequence< ::rtl::OUString > SAL_CALL FileHandler::getSupportedServiceNames() throw(RuntimeException)
405*b1cdbd2cSJim Jagielski     {
406*b1cdbd2cSJim Jagielski         return getSupportedServiceNames_static();
407*b1cdbd2cSJim Jagielski     }
408*b1cdbd2cSJim Jagielski 
409*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
getImplementationName_static()410*b1cdbd2cSJim Jagielski     ::rtl::OUString SAL_CALL FileHandler::getImplementationName_static()
411*b1cdbd2cSJim Jagielski     {
412*b1cdbd2cSJim Jagielski         return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.extensions.FileHandler" ) );
413*b1cdbd2cSJim Jagielski     }
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
getSupportedServiceNames_static()416*b1cdbd2cSJim Jagielski     Sequence< ::rtl::OUString > SAL_CALL FileHandler::getSupportedServiceNames_static()
417*b1cdbd2cSJim Jagielski     {
418*b1cdbd2cSJim Jagielski         Sequence< ::rtl::OUString > aServiceNames(1);
419*b1cdbd2cSJim Jagielski         aServiceNames[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.logging.FileHandler" ) );
420*b1cdbd2cSJim Jagielski         return aServiceNames;
421*b1cdbd2cSJim Jagielski     }
422*b1cdbd2cSJim Jagielski 
423*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
Create(const Reference<XComponentContext> & _rxContext)424*b1cdbd2cSJim Jagielski     Reference< XInterface > FileHandler::Create( const Reference< XComponentContext >& _rxContext )
425*b1cdbd2cSJim Jagielski     {
426*b1cdbd2cSJim Jagielski         return *( new FileHandler( _rxContext ) );
427*b1cdbd2cSJim Jagielski     }
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
createRegistryInfo_FileHandler()430*b1cdbd2cSJim Jagielski     void createRegistryInfo_FileHandler()
431*b1cdbd2cSJim Jagielski     {
432*b1cdbd2cSJim Jagielski         static OAutoRegistration< FileHandler > aAutoRegistration;
433*b1cdbd2cSJim Jagielski     }
434*b1cdbd2cSJim Jagielski 
435*b1cdbd2cSJim Jagielski //........................................................................
436*b1cdbd2cSJim Jagielski } // namespace logging
437*b1cdbd2cSJim Jagielski //........................................................................
438