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