add log4cplus
This commit is contained in:
		
							
								
								
									
										5
									
								
								libs/log4cplus/AUTHORS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								libs/log4cplus/AUTHORS
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | Tad E. Smith         <tcsmith@users.sourceforge.net> | ||||||
|  | Michael CATANZARITI | ||||||
|  | Steighton Haley	     <baldheadedguy@users.sourceforge.net> | ||||||
|  | Eduardo Francos		 <gualo@users.sourceforge.net> | ||||||
|  | Vaclav Haisman		 <wilx@users.sourceforge.net> | ||||||
							
								
								
									
										145
									
								
								libs/log4cplus/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								libs/log4cplus/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | |||||||
|  |  | ||||||
|  | set (log4cplus_version_major 1) | ||||||
|  | set (log4cplus_version_minor 0) | ||||||
|  | set (log4cplus_version_patch 4) | ||||||
|  | set (log4cplus_soversion 4) | ||||||
|  | set (log4cplus_postfix "") | ||||||
|  |  | ||||||
|  | find_package (Threads) | ||||||
|  | message (STATUS "Threads: ${CMAKE_THREAD_LIBS_INIT}") | ||||||
|  |  | ||||||
|  | set (log4cplus_headers | ||||||
|  |   include/log4cplus/appender.h | ||||||
|  |   include/log4cplus/config/macosx.h | ||||||
|  |   include/log4cplus/config/win32.h | ||||||
|  |   include/log4cplus/config.hxx | ||||||
|  |   include/log4cplus/configurator.h | ||||||
|  |   include/log4cplus/consoleappender.h | ||||||
|  |   include/log4cplus/fileappender.h | ||||||
|  |   include/log4cplus/fstreams.h | ||||||
|  |   include/log4cplus/helpers/appenderattachableimpl.h | ||||||
|  |   include/log4cplus/helpers/loglog.h | ||||||
|  |   include/log4cplus/helpers/logloguser.h | ||||||
|  |   include/log4cplus/helpers/pointer.h | ||||||
|  |   include/log4cplus/helpers/property.h | ||||||
|  |   include/log4cplus/helpers/sleep.h | ||||||
|  |   include/log4cplus/helpers/socket.h | ||||||
|  |   include/log4cplus/helpers/socketbuffer.h | ||||||
|  |   include/log4cplus/helpers/stringhelper.h | ||||||
|  |   include/log4cplus/helpers/syncprims.h | ||||||
|  |   include/log4cplus/helpers/thread-config.h | ||||||
|  |   include/log4cplus/helpers/threads.h | ||||||
|  |   include/log4cplus/helpers/timehelper.h | ||||||
|  |   include/log4cplus/hierarchy.h | ||||||
|  |   include/log4cplus/hierarchylocker.h | ||||||
|  |   include/log4cplus/layout.h | ||||||
|  |   include/log4cplus/logger.h | ||||||
|  |   include/log4cplus/loggingmacros.h | ||||||
|  |   include/log4cplus/loglevel.h | ||||||
|  |   include/log4cplus/ndc.h | ||||||
|  |   include/log4cplus/nteventlogappender.h | ||||||
|  |   include/log4cplus/nullappender.h | ||||||
|  |   include/log4cplus/socketappender.h | ||||||
|  |   include/log4cplus/spi/appenderattachable.h | ||||||
|  |   include/log4cplus/spi/factory.h | ||||||
|  |   include/log4cplus/spi/filter.h | ||||||
|  |   include/log4cplus/spi/loggerfactory.h | ||||||
|  |   include/log4cplus/spi/loggerimpl.h | ||||||
|  |   include/log4cplus/spi/loggingevent.h | ||||||
|  |   include/log4cplus/spi/objectregistry.h | ||||||
|  |   include/log4cplus/spi/rootlogger.h | ||||||
|  |   include/log4cplus/streams.h | ||||||
|  |   include/log4cplus/syslogappender.h | ||||||
|  |   include/log4cplus/tstring.h | ||||||
|  |   include/log4cplus/version.h | ||||||
|  |   include/log4cplus/win32debugappender.h | ||||||
|  |   include/log4cplus/win32consoleappender.h) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | set (log4cplus_sources | ||||||
|  |   src/appender.cxx | ||||||
|  |   src/appenderattachableimpl.cxx | ||||||
|  |   src/configurator.cxx | ||||||
|  |   src/consoleappender.cxx | ||||||
|  |   src/factory.cxx | ||||||
|  |   src/fileappender.cxx | ||||||
|  |   src/filter.cxx | ||||||
|  |   src/global-init.cxx | ||||||
|  |   src/hierarchy.cxx | ||||||
|  |   src/hierarchylocker.cxx | ||||||
|  |   src/layout.cxx | ||||||
|  |   src/logger.cxx | ||||||
|  |   src/loggerimpl.cxx | ||||||
|  |   src/loggingevent.cxx | ||||||
|  |   src/loglevel.cxx | ||||||
|  |   src/loglog.cxx | ||||||
|  |   src/logloguser.cxx | ||||||
|  |   src/ndc.cxx | ||||||
|  |   src/nullappender.cxx | ||||||
|  |   src/objectregistry.cxx | ||||||
|  |   src/patternlayout.cxx | ||||||
|  |   src/pointer.cxx | ||||||
|  |   src/property.cxx | ||||||
|  |   src/rootlogger.cxx | ||||||
|  |   src/sleep.cxx | ||||||
|  |   src/socket.cxx | ||||||
|  |   src/socketappender.cxx | ||||||
|  |   src/socketbuffer.cxx | ||||||
|  |   src/stringhelper.cxx | ||||||
|  |   src/syncprims.cxx | ||||||
|  |   src/syslogappender.cxx | ||||||
|  |   src/threads.cxx | ||||||
|  |   src/timehelper.cxx | ||||||
|  |   src/version.cxx) | ||||||
|  |  | ||||||
|  | #message (STATUS "Type: ${UNIX}|${CYGWIN}|${WIN32}") | ||||||
|  |  | ||||||
|  | # Uncomment the following line to get locale aware string conversions. | ||||||
|  | #add_definitions (-DLOG4CPLUS_WORKING_LOCALE) | ||||||
|  | add_definitions(-DLOG4CPLUS_STATIC) | ||||||
|  |  | ||||||
|  | if ("${UNIX}" OR "${CYGWIN}") | ||||||
|  |   set (log4cplus_sources ${log4cplus_sources} | ||||||
|  |     src/socket-unix.cxx) | ||||||
|  |   set (log4cplus_headers ${log4cplus_headers} | ||||||
|  |     include/log4cplus/config/defines.hxx | ||||||
|  |     include/log4cplus/helpers/syncprims-pthreads.h) | ||||||
|  | elseif (WIN32) | ||||||
|  |   set (log4cplus_sources ${log4cplus_sources} | ||||||
|  |     src/socket-win32.cxx | ||||||
|  |     src/win32debugappender.cxx | ||||||
|  |     src/nteventlogappender.cxx | ||||||
|  |     src/win32consoleappender.cxx) | ||||||
|  |   set (log4cplus_headers ${log4cplus_headers} | ||||||
|  |     include/log4cplus/helpers/syncprims-win32.h) | ||||||
|  |  | ||||||
|  |   # Comment out the following lines if you want non-Unicode version. | ||||||
|  |   #add_definitions (-DUNICODE -D_UNICODE -UMBCS -U_MBCS) | ||||||
|  |   set (log4cplus_postfix "${log4cplus_postfix}U") | ||||||
|  |    | ||||||
|  |   #add_definitions (-DLOG4CPLUS_STATIC) | ||||||
|  |   #set (log4cplus_postfix "${log4cplus_postfix}S") | ||||||
|  | endif () | ||||||
|  |  | ||||||
|  | message (STATUS "Headers: ${log4cplus_headers}") | ||||||
|  | message (STATUS "Sources: ${log4cplus_sources}") | ||||||
|  |  | ||||||
|  | include_directories ("include") | ||||||
|  | set (log4cplus_all_sources ${log4cplus_sources} ${log4cplus_headers}) | ||||||
|  |  | ||||||
|  | add_library (log4cplus STATIC ${log4cplus_all_sources}) | ||||||
|  | #add_library (log4cplus SHARED ${log4cplus_all_sources}) | ||||||
|  | target_link_libraries (log4cplus ${CMAKE_THREAD_LIBS_INIT}) | ||||||
|  |  | ||||||
|  | set_target_properties (log4cplus PROPERTIES | ||||||
|  |   VERSION "${log4cplus_version_major}.${log4cplus_version_minor}" | ||||||
|  |   SOVERSION "${log4cplus_soversion}" | ||||||
|  |   COMPILE_FLAGS "-DINSIDE_LOG4CPLUS") | ||||||
|  | if (WIN32) | ||||||
|  |   set_target_properties (log4cplus PROPERTIES | ||||||
|  |     DEBUG_POSTFIX "${log4cplus_postfix}D" | ||||||
|  |     RELEASE_POSTFIX "${log4cplus_postfix}" | ||||||
|  |     MINSIZEREL_POSTFIX "${log4cplus_postfix}" | ||||||
|  |     RELWITHDEBINFO_POSTFIX "${log4cplus_postfix}") | ||||||
|  |   target_link_libraries (log4cplus ws2_32 advapi32) | ||||||
|  | endif () | ||||||
							
								
								
									
										1
									
								
								libs/log4cplus/COPYING
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								libs/log4cplus/COPYING
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | See the LICENSE file. | ||||||
							
								
								
									
										428
									
								
								libs/log4cplus/ChangeLog
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										428
									
								
								libs/log4cplus/ChangeLog
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,428 @@ | |||||||
|  | Version 1.0.4 | ||||||
|  |  | ||||||
|  |   - Fixed bug #3101459 - TTCCLayout time is not in milliseconds since | ||||||
|  |     process start by default. | ||||||
|  |   - Fixed compilation of Non-Windows builds. | ||||||
|  |   - Fixed various compilation and linking issues on SunOS. | ||||||
|  |  | ||||||
|  | Version 1.0.4-RC11 | ||||||
|  |  | ||||||
|  |   - Fixed bug #3083313, deadlock because of double locking when using | ||||||
|  |     ConfigurationWatchDogThread. | ||||||
|  |   - Improved portability to HP-UX and aCC compiler. | ||||||
|  |   - Added %b PatternLayout format specifier; it expands to file | ||||||
|  |     component of file path. | ||||||
|  |   - Fixed bug #3058706, compilation error on AIX in socket-unix.cxx. | ||||||
|  |   - Added %b pattern layout specifier. It expands to file name | ||||||
|  |     component of path name. | ||||||
|  |   - Fixed bug #3034758. Fixed infinite loop in | ||||||
|  |     Hierarchy::updateParents() when logger hierarchy name starts with | ||||||
|  |     a dot. | ||||||
|  |   - Fixed bug #3034748. Fixed infinite loop in | ||||||
|  |     PatternParser::extractOption() on missing '}'. | ||||||
|  |  | ||||||
|  | Version 1.0.4-RC10 | ||||||
|  |  | ||||||
|  |   - Fixed bug #3030133. Make Autoconf/Automake build system to respect | ||||||
|  |     provided --includedir= value. | ||||||
|  |   - Removed %X{N} PatternLayout format specifier for NDC with limited | ||||||
|  |     depth. Replaced it with NDCMaxDepth property. | ||||||
|  |   - Improved compatibility with Windows CE. | ||||||
|  |   - Fixed memory leak when using POSIX threads. | ||||||
|  |   - Fixed leak of mutex used to synchronize gethostbyname() calls. | ||||||
|  |   - Fixed problem with how std::toupper(), std::tolower() and | ||||||
|  |     std::isspace() are used in non-Unicode builds. | ||||||
|  |  | ||||||
|  | Version 1.0.4-RC9 | ||||||
|  |  | ||||||
|  |   - Fixed compilation problem in timehelper.cxx. | ||||||
|  |   - Added %X{N} PatternLayout format specifier for NDC with limited | ||||||
|  |     depth. | ||||||
|  |   - Added facility property to SysLogAppender. | ||||||
|  |  | ||||||
|  | Version 1.0.4-RC8 | ||||||
|  |  | ||||||
|  |   - Always handle %s time format specifier (seconds since epoch) in | ||||||
|  |     log4cplus. Detect and use clock_gettime() when available. | ||||||
|  |   - Fixed compilation on OpenSolaris with Sun C++. | ||||||
|  |   - Fixed compilation on OpenBSD. | ||||||
|  |   - Fixed use of operator delete/delete[] in FileAppender (Patch | ||||||
|  |     #3005234). | ||||||
|  |   - Updated config.guess and config.sub to latest Git repository | ||||||
|  |     versions. | ||||||
|  |   - Added BufferSize property to FileAppender to allow control of the | ||||||
|  |     appender's output buffer. | ||||||
|  |   - Removed -fkeep-inline-functions from GCC flags for non-debugging | ||||||
|  |     build. | ||||||
|  |  | ||||||
|  | Version 1.0.4-RC7 | ||||||
|  |  | ||||||
|  |   - Fixed thread safety issues with gethostbyname() by using | ||||||
|  |     getaddrinfo() instead, where available. | ||||||
|  |   - Fixed bug #2965390 - Minor internal debugging output issue. | ||||||
|  |   - Added --enable-warnings (--disable-warnings) switches to the | ||||||
|  |     configure script. | ||||||
|  |   - Added ReopenDelay property to FileAppender, allowing the appender | ||||||
|  |     to reopen output stream after write failure. (Patch #2971315) | ||||||
|  |  | ||||||
|  | Version 1.0.4-RC6 | ||||||
|  |  | ||||||
|  |   - Fixed bug #2945335 - MinGW/MSYS build problems. For Windows builds | ||||||
|  |     the source now defaults to static library/empty LOG4CPLUS_EXPORT | ||||||
|  |     macro. | ||||||
|  |   - Fixed a security problem in SyslogAppender. | ||||||
|  |   - Fixed bug #2955058 - Looping over properties during variables | ||||||
|  |     expansion. | ||||||
|  |   - Added missing dependency on log4cplus_dll project to filter_test | ||||||
|  |     project. | ||||||
|  |   - Added a constructor with Properties parameter to DenyAllFilter. | ||||||
|  |   - Reworked Layout, Appender and Filter factories registration. | ||||||
|  |  | ||||||
|  | Version 1.0.4-RC5 | ||||||
|  |  | ||||||
|  |   - Implemented feature request #2927416 "Add a native Win32 Console | ||||||
|  |     Appender". | ||||||
|  |   - Loggingserver now exits with value 2 when it cannot open | ||||||
|  |     listening socket. | ||||||
|  |   - Improved Doxygen documentation. | ||||||
|  |   - Added PropertyConfigurator::getProperties() and | ||||||
|  |     PropertyConfigurator::getPropertyFilename() functions. | ||||||
|  |   - Removed LOG4CPLUS_EXPORT on SharedObjectPtr<>. | ||||||
|  |   - Turned on linker optimizations for MSVC8 builds to make resulting | ||||||
|  |     binaries slightly smaller. | ||||||
|  |   - Added --enable-runtime-pseudo-reloc linker option for Cygwin and | ||||||
|  |     Mingw. Enable --enable-auto-import linker flag also for Mingw. | ||||||
|  |  | ||||||
|  | Version 1.0.4-RC4 | ||||||
|  |  | ||||||
|  |   - Fixed bug #2875993 - Implement connector thread for | ||||||
|  |     SocketAppender. | ||||||
|  |   - Improved documentation of Appenders' properties. | ||||||
|  |   - Improved behaviour of DailyRollingFileAppender. | ||||||
|  |   - Added x64 (AMD64) build configuration to MSVC8 project files. | ||||||
|  |   - Reworked MSVC8 project files to use .vsprops files to share | ||||||
|  |     project settings. | ||||||
|  |   - Moved all tests into Tests project folder. | ||||||
|  |   - Improved behaviour of ConfigurationWatchDogThread. | ||||||
|  |   - Fixed bug #2890819 - Handle empty input in towstring_internal() | ||||||
|  |     and tostring_internal(). | ||||||
|  |   - Corrected VERSION and SOVERSION in CMakeLists.txt. | ||||||
|  |   - Fixed thread_test compilation on AIX. | ||||||
|  |   - Added missing syncprims.cxx file in log4cplus_static.vcproj. | ||||||
|  |  | ||||||
|  | Version 1.0.4-RC3 | ||||||
|  |  | ||||||
|  |   IMPORTANT: Majority of log4cplus' source code is now licensed using | ||||||
|  |   the Apache Software License 2.0. The rest is covered by two clause | ||||||
|  |   BSD license. | ||||||
|  |  | ||||||
|  |   - Fixed bug #2747435. Implement handling of log4cplus.configDebug | ||||||
|  |     configuration property. | ||||||
|  |   - Fixed variables shadowing. | ||||||
|  |   - Doxygen documentation improvements and fixes. | ||||||
|  |   - Add %i PatternLayout format. It expands to process ID. | ||||||
|  |   - Fix logging macros compilation for LOG4CPLUS_SINGLE_THREADED case. | ||||||
|  |   - Fix Logger log level configuration and root Logger handling log | ||||||
|  |     level handling. | ||||||
|  |  | ||||||
|  | Version 1.0.4-RC2 | ||||||
|  |  | ||||||
|  |   - Fixed bug #2834811. Accessing index 0 of empty strings. | ||||||
|  |   - Fixed bug #2834808. Memory leak in thread local storage code. | ||||||
|  |   - Removed MSVC6 directory and project files. | ||||||
|  |   - Update to libtool-2.2.6. | ||||||
|  |  | ||||||
|  | Version 1.0.4-RC1 | ||||||
|  |  | ||||||
|  |   - Fixed compilation with Borland C++ Builder compiler. | ||||||
|  |   - Improved CMake build system to also build tests. | ||||||
|  |   - Fixed compilation and improved support for Windows CE. | ||||||
|  |   - Fixed compilation and improved support for Sun Studio 11 compiler. | ||||||
|  |   - Fixed use after free and improved shutdown handling in | ||||||
|  |     ConfigurationWatchDogThread. | ||||||
|  |   - Implement %H (FQDN) and %h (host name) PatternLayout format | ||||||
|  |     specifiers. | ||||||
|  |   - Fixed bug #2829604. Environment variables substitution. | ||||||
|  |  | ||||||
|  | Version 1.0.3 | ||||||
|  |  | ||||||
|  |   - List of bugs fixed or otherwise dealt with: | ||||||
|  |     <https://sourceforge.net/tracker/?func=browse&group_id=40830&atid=429073&artgroup=877523> | ||||||
|  |  | ||||||
|  | Version 1.0.3-RC9 | ||||||
|  |  | ||||||
|  |   - Tweaked Doxygen docs in comments for more recent Doxygen versions. | ||||||
|  |   - Fix bug #2632087. Reworked WinSock initialization to fix deadlock | ||||||
|  |     in WSAStartup() on Windows Vista. | ||||||
|  |   - Fixed excessive errors reported in RollingFileAppender when | ||||||
|  |     renaming non-existing files. | ||||||
|  |   - Fall back to DAILY schedule in DailyRollingFileAppender for | ||||||
|  |     invalid schedule specification. | ||||||
|  |   - Added Debug_Unicode and Release_Unicode targets to MSVC8 test | ||||||
|  |     cases builds. | ||||||
|  |  | ||||||
|  | Version 1.0.3-RC8 | ||||||
|  |  | ||||||
|  |   - Fixed SysLogAppender not being exported out of shared library | ||||||
|  |     because of missing LOG4CPLUS_EXPORT. | ||||||
|  |   - Fix bug #1168433. RollingFileAppender does a rename() to rename | ||||||
|  |     logfile to logfile.1 etc. rename() on Windows will not overwrite | ||||||
|  |     an existing file so only the first rename works. On Windows | ||||||
|  |     (only), try to remove existing file first before calling rename(). | ||||||
|  |   - Fix bug #2573222. License issues. Most of log4cplus is covered by | ||||||
|  |     ASL 1.1. The bits that are not covered by ASL 1.1 are covered by | ||||||
|  |     two clause BSD licence. Texts of both licences are in LICENCE | ||||||
|  |     file. | ||||||
|  |   - Fix bug #2580037. Trim leading white space before comment | ||||||
|  |     character '#' and both leading and trailing white space around | ||||||
|  |     both key and value (e.g. " key = value ") in property files. | ||||||
|  |   - Fix bug #2594345. Loggingserver and SocketAppender message format | ||||||
|  |     mismatch. | ||||||
|  |   - Fixed CMake builds. | ||||||
|  |  | ||||||
|  | Version 1.0.3-RC7 | ||||||
|  |  | ||||||
|  |   - Fix Bug #894464. Really only consider prefixes when searching for | ||||||
|  |     matching properties. | ||||||
|  |   - Fix compilation for combination of non-threaded and UNICODE | ||||||
|  |     settings. | ||||||
|  |  | ||||||
|  | Version 1.0.3-RC6 | ||||||
|  |  | ||||||
|  |   - Fix Bug #852513 - Reconfiguring a logger does not remove old | ||||||
|  |     appenders. | ||||||
|  |   - Changed log4cplus thread helpers to block all signals on POSIX | ||||||
|  |     platforms to enable their handling in a dedicated thread. (See | ||||||
|  |     README, chapter Notes for explanation.) | ||||||
|  |   - Changed thread creation from using CreateThread() to using | ||||||
|  |     _beginthreadex() to avoid leaking C and C++ runtime memory. | ||||||
|  |   - Fixed convertIntegerToString() to for negative numbers. | ||||||
|  |   - Fixed wrong name used in BasicConfigurator for the | ||||||
|  |     ConsoleAppender. | ||||||
|  |  | ||||||
|  | Version 1.0.3-RC5 | ||||||
|  |  | ||||||
|  |   - Add CMakeLists.txt to facilitate compilation of log4cplus on | ||||||
|  |     Windows with different compilers than just the MSVC8. | ||||||
|  |   - Fix compilation of Unicode enabled build without working locale. | ||||||
|  |     (Patch #2429185) | ||||||
|  |  | ||||||
|  | Version 1.0.3-RC4 | ||||||
|  |  | ||||||
|  |   - IMPORTANT: log4cplus shared library version has been bumped to | ||||||
|  |     3. The interfaces have slightly changed and 1.0.3 is not binary | ||||||
|  |     compatible with 1.0.2. | ||||||
|  |  | ||||||
|  |   - Fix more MSVC compilation problems. | ||||||
|  |   - Changed log4cplus_static.vcproj to link with DLL C/C++ run time | ||||||
|  |     (MSVCR80.dll and MSVCP80.dll). | ||||||
|  |   - Implemented environment variables shadowing by properties and | ||||||
|  |     recursive properties expansion. | ||||||
|  |   - Reworked output directories layout of MSVC8 project. Now it | ||||||
|  |     produces directories of the form | ||||||
|  |     "log4cplus_{static,dll}.{Release,Debug}{_Unicode,}" and | ||||||
|  |     "loggingserver.{Release,Debug}{_Unicode,}". The tests directory | ||||||
|  |     projects still only compile using non-Unicode release and debug | ||||||
|  |     version of the library. | ||||||
|  |   - For single-threaded builds, re-use single tostringstream instead | ||||||
|  |     of using a new one for each LOG4CPLUS_DEBUG() etc. macros. | ||||||
|  |   - Merge Win32DebugAppender from trunk. (Patches #834925 and #858128) | ||||||
|  |   - Make configuration of local server for NTEventLogAppender easier | ||||||
|  |     by allowing empty server parameter string. (Feature Request | ||||||
|  |     #875935) | ||||||
|  |  | ||||||
|  | Version 1.0.3-RC3 | ||||||
|  |  | ||||||
|  |   - Fix Bug #2268760 - Trailing garbage in strings produced by | ||||||
|  |     Time::getFormattedTime(). | ||||||
|  |   - Fixed compilation of MSVC builds. | ||||||
|  |  | ||||||
|  | Version 1.0.3-RC2 | ||||||
|  |  | ||||||
|  |   - Fix Bug #2106949 - Compilation problem with Borland's compiler. | ||||||
|  |   - Fix Bug #1717320, #1040902, #1040676 - strftime() complains about | ||||||
|  |     our custom %q and %Q format specifiers with "Invalid format | ||||||
|  |     directive". | ||||||
|  |   - Removed safe_auto_ptr. | ||||||
|  |   - Added --enable-debugging switch to configure script. It disables | ||||||
|  |     optimization and turns on debugging info generation. | ||||||
|  |   - Use locale and its codecvt facet in towstring()/tostring() | ||||||
|  |     implementations when --with-working-locale is defined. | ||||||
|  |   - Added support for GCC's -fvisibility=hidden flag where available | ||||||
|  |     together with __attribute__ ((visibility("default"))). | ||||||
|  |  | ||||||
|  | Version 1.0.3-RC1 | ||||||
|  |   - IMPORTANT: VC6 users, VC6 is unsupported. Its standard C++ library | ||||||
|  |     is too broken. The work around for VC6's std::string has been | ||||||
|  |     removed from log4cplus code; it actually does not fix the problem, | ||||||
|  |     it only makes it a little bit less likely to manifest. VC6 project | ||||||
|  |     files are still distributed with the source but they are broken as | ||||||
|  |     we have no means to update them. We strongly suggest that you | ||||||
|  |     either move away from VC6 to some more modern and standard | ||||||
|  |     conforming compiler (like VC8) or that you use the STLport | ||||||
|  |     standard C++ library implementation instead of VC6's own. | ||||||
|  |  | ||||||
|  |   - Fixed various compilation issues with MSVC8. | ||||||
|  |   - Added MSVC8 project files. | ||||||
|  |   - Fixed compilation with GCC 4.3. | ||||||
|  |   - Fixed autoconf/automake build machinery so that it is possible to | ||||||
|  |     build log4cplus in separate directory. | ||||||
|  |   - Updated used autoconf and automake to version 2.62 and 1.10 | ||||||
|  |     respectively. | ||||||
|  |   - Enabled DLL building on Cygwin. | ||||||
|  |   - Fixed Bug #894623, #1178841 - Various compilation issues on | ||||||
|  |     Cygwin. | ||||||
|  |   - Fixed Bug #2017876 - Destruction synchronization issue. | ||||||
|  |   - Fixed Bug #1831238 - Unintentional sign extension in char -> | ||||||
|  |     wchar_t conversion. | ||||||
|  |   - Fixed Bug #1548998 - config.h is exporting symbols that conflict | ||||||
|  |     with other applications/libraries. | ||||||
|  |   - Fixed Bug #898646 - Ambiguity between ::yield() and | ||||||
|  |     thread::yeild() on Solaris. | ||||||
|  |   - Fixed Bug #954455 - LOG4CPLUS_ macros semicolon problem. | ||||||
|  |  | ||||||
|  | Version 1.0.2 (February 10, 2004) | ||||||
|  |   - Added "ImmediateFlush" configuration option to log4cplus::ConsoleAppender. | ||||||
|  |   - Added do while loops around the logging statements in the macros. | ||||||
|  |   - Fixed Bug #875960 - "log4cplus::ConfigureAndWatchThread crash" | ||||||
|  |   - Fixed Bug #992034 - "rpm[build] -ta log4cplus-1.0.1.tar.gz doesn't work" | ||||||
|  |   - Fixed Bug #875724 - "ConfigureAndWatchThread and mounted file systems" | ||||||
|  |   - Fixed Bug #842280 - "'Append' mode when using FileAppended from cfg file." | ||||||
|  |     All FileAppenders now have the "Append" configuration option.  If this is | ||||||
|  |     "true" any existing files will be opened with ios::append, otherwise they | ||||||
|  |     will be opened with ios::trunc. | ||||||
|  |   - Fixed Bug #805203 - "%q ConversionFormat does not accept modifiers" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Version 1.0.1 (December 18, 2003) | ||||||
|  |   - Fixed Bug #831311 - "loggingserver.cxx clientsock.read()" | ||||||
|  |   - Fixed Bug #851074 - "build problem HPUX 11, gcc 3.3" | ||||||
|  |   - Fixed Bug #805242 - "Crash in log4cplus::helpers::SocketBuffer::appendSize_t" | ||||||
|  |   - Fixed Bug #808119 - "TRACE_METHOD not displaying file name in log" | ||||||
|  |   - Fixed Bug #827804 - "UMR in ConfigurationWatchdogThread" | ||||||
|  |   - Fixed Bug #851116 - "Can not build" | ||||||
|  |   - Added the OFF_LOG_LEVEL and the ALL_LOG_LEVEL LogLevels. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Version 1.0 (September 6 2003) | ||||||
|  |   - Fix Bug #96934.  (fileappender.cxx would not compile in a UNICODE build) | ||||||
|  |   - Fixed compilation warning in MSVC for pointer.h | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Version 0.9.10 (August 27 2003) | ||||||
|  |   - Fixed singled-threaded build compilation issues | ||||||
|  |   - The DailyRollingFileAppender no longer truncates files | ||||||
|  |   - The DailyRollingFileAppender now performs a "rollover" on close().  If the | ||||||
|  |     "rollover file" exists, then it will be renamed according to the pattern | ||||||
|  |     that is used by the RollingFileAppender class.  (Thanks Philip Green for | ||||||
|  |     the suggestion.) | ||||||
|  |   - Some socket-unix.cxx corrections. | ||||||
|  |   - Fixed the *Factory initialization so that it compile with the HP aCC | ||||||
|  |     compiler. | ||||||
|  |   - Corrected the getCurrentThreadName() for MacOS X and DEC. | ||||||
|  |   - "make install" now installs the header files. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Version 0.9.9 (August 9 2003) | ||||||
|  |   - Fixed many MSVC++ compilation errors (6 and 7). | ||||||
|  |   - Updated the MSVC++ projects | ||||||
|  |   - Modified the Time::getFormattedTime() method to increase performance | ||||||
|  |   - Modified Hierarcy::getInstanceImpl() to "deep copy" Logger names. | ||||||
|  |   - Corrected some of the PatternLayout documentation to work better with | ||||||
|  |     doxygen. | ||||||
|  |   - Some Borland C++ Builder 6 fixes. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Version 0.9.8 (August 3 2003) | ||||||
|  |   - Changed the LogLog class so that it is now reference counted. | ||||||
|  |   - Restored the LOG4CPLUS_*_STR logging macros. | ||||||
|  |   - Added support to disable the ERROR and FATAL macros by defining | ||||||
|  |     LOG4CPLUS_DISABLE_* | ||||||
|  |   - API Change:  The LOG4CPLUS_TRACE macro now has behavior similar to all of | ||||||
|  |     the other logging macros.  If the old behavior is desired, then the new | ||||||
|  |     LOG4CPLUS_TRACE_METHOD macro should be used. | ||||||
|  |   - Modified Appender class to support the "Threshold" property. | ||||||
|  |   - "localtime" is now the default time in log4cplus. | ||||||
|  |   - The FileAppender no longer prints out the "header" when it opens a file. | ||||||
|  |   - Added the "immediateFlush" field to the FileAppender class. | ||||||
|  |   - Changed the API of the LogLevelManager class. | ||||||
|  |   - Initial port work done to run on MacOS X. | ||||||
|  |   - Added the HierarchyLocker class | ||||||
|  |   - Added the ConfigureAndWatchThread class for runtime dynamic reconfiguration. | ||||||
|  |   - Added several performance enhancements to the InternalLoggingEvent class. | ||||||
|  |   - Renamed the PatternLayout "Pattern" configuration option to | ||||||
|  |     "ConversionPattern". | ||||||
|  |   - Added 3 new tests: configandwatch_test, customloglevel_test, and | ||||||
|  |     performance_test.  (No MSVC projects created for these tests, yet.) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Version 0.9.7 (June 28 2003) | ||||||
|  |   - Added the log4cplus::DailyRollingFileAppender class. | ||||||
|  |   - Added the log4cplus::helper::Time class.  Now log with millisecond | ||||||
|  |     granularity. (microsecond granularity if the gettimeofday() function is | ||||||
|  |     available.) | ||||||
|  |   - Changed log4cplus::spi::InternalLoggingEvent from a POD to a class and | ||||||
|  |     introduced several performance ehancements to that class.  This class | ||||||
|  |     can now be extended to introduce "customized" logging. | ||||||
|  |   - Fixed Bug #757989 - "TraceLogger should not hold a Logger reference" | ||||||
|  |   - Added TYPE_SOCKLEN_T to configure.in (checking for whether <sys/socket.h> | ||||||
|  |     defines `socklen_t'). | ||||||
|  |   - Added the "operator!=" to log4cplus::helpers::SharedObjectPtr. | ||||||
|  |   - Made changes to make the DEC CXX 6.1 compiler happy. | ||||||
|  |   - Renamed the tolower and toupper methods to avoid a name collision with a | ||||||
|  |     macro with the DEC CXX compiler. | ||||||
|  |   - Removed "-lstdc++" from the list of libraries in all Makefiles. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Version 0.9.6 (June 10 2003) | ||||||
|  |   - Fixed multiple compiler warnings for the MSVC++ 7 compiler | ||||||
|  |   - Modified configure.in so that it can now build on Solaris. | ||||||
|  |   - Modified the configure script so that it can build a single-threaded | ||||||
|  |     library (--enable-threads=no) | ||||||
|  |   - Added "Filtering" to Appenders. | ||||||
|  |   - Fixed Bug #741515 - "LogLog is causing a core on HP". | ||||||
|  |   - Fixed Bug #733944 - "logging in system/local time" | ||||||
|  |   - Fixed Bug #749040 - "Use of gmtime and localtime not thread-safe" | ||||||
|  |   - Fixed Bug #750232 - "Copying of Hierarchy should not be allowed" | ||||||
|  |   - Added an MSVC++ project to build log4cplus as a static library. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Version 0.9.5 (May 19 2003) | ||||||
|  |   - Removed the LOG4CPLUS_*_STR logging macros. | ||||||
|  |   - Added support to disable the TRACE, DEBUG, and INFO macros by defining | ||||||
|  |     LOG4CPLUS_DISABLE_* | ||||||
|  |   - Added a static doConfigure() method to PropertyConfigurator and | ||||||
|  |     BasicConfigurator. | ||||||
|  |   - Fixed problems with the configure script on several platforms. | ||||||
|  |   - Optimized single-threaded mode. | ||||||
|  |   - Fixed some problems with the MSVC++ 7 compiler. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Version 0.9.4 (May-5-2003) | ||||||
|  |   Added SocketAppender class. | ||||||
|  |   Now builds loggingserver to act as a source of logging messages from a | ||||||
|  |   SocketAppender. | ||||||
|  |   Numerous fixes needed for various compilers. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Version 0.9.3 (Apr-19-2003) | ||||||
|  |   Added preliminary UNICODE support. (Little testing.)  Thanks Michael CATANZARITI | ||||||
|  |   Now built as a shared library instead of a static library. | ||||||
|  |   Add support for Microsoft Visual C++ 6.0 back in.  (Multi-threaded DLL) | ||||||
|  |   Added SysLogAppender class. | ||||||
|  |   Added NTEventLogAppender class.  (Thanks Michael CATANZARITI) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Version 0.9.2 (Apr-5-2003) | ||||||
|  |   Major API change:  Changed the name of the Category class to Logger and | ||||||
|  | 	     replaced the Priority class with LogLevel. | ||||||
|  |   Added PropertyConfigurator class. | ||||||
|  |   Added BasicConfigurator class. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Version 0.9.1 (Mar-22-2003) | ||||||
|  |   Added PatternLayout class. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Version 0.9.0 | ||||||
|  |   Initial beta release. | ||||||
							
								
								
									
										365
									
								
								libs/log4cplus/INSTALL
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										365
									
								
								libs/log4cplus/INSTALL
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,365 @@ | |||||||
|  | Installation Instructions | ||||||
|  | ************************* | ||||||
|  |  | ||||||
|  | Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, | ||||||
|  | 2006, 2007, 2008, 2009 Free Software Foundation, Inc. | ||||||
|  |  | ||||||
|  |    Copying and distribution of this file, with or without modification, | ||||||
|  | are permitted in any medium without royalty provided the copyright | ||||||
|  | notice and this notice are preserved.  This file is offered as-is, | ||||||
|  | without warranty of any kind. | ||||||
|  |  | ||||||
|  | Basic Installation | ||||||
|  | ================== | ||||||
|  |  | ||||||
|  |    Briefly, the shell commands `./configure; make; make install' should | ||||||
|  | configure, build, and install this package.  The following | ||||||
|  | more-detailed instructions are generic; see the `README' file for | ||||||
|  | instructions specific to this package.  Some packages provide this | ||||||
|  | `INSTALL' file but do not implement all of the features documented | ||||||
|  | below.  The lack of an optional feature in a given package is not | ||||||
|  | necessarily a bug.  More recommendations for GNU packages can be found | ||||||
|  | in *note Makefile Conventions: (standards)Makefile Conventions. | ||||||
|  |  | ||||||
|  |    The `configure' shell script attempts to guess correct values for | ||||||
|  | various system-dependent variables used during compilation.  It uses | ||||||
|  | those values to create a `Makefile' in each directory of the package. | ||||||
|  | It may also create one or more `.h' files containing system-dependent | ||||||
|  | definitions.  Finally, it creates a shell script `config.status' that | ||||||
|  | you can run in the future to recreate the current configuration, and a | ||||||
|  | file `config.log' containing compiler output (useful mainly for | ||||||
|  | debugging `configure'). | ||||||
|  |  | ||||||
|  |    It can also use an optional file (typically called `config.cache' | ||||||
|  | and enabled with `--cache-file=config.cache' or simply `-C') that saves | ||||||
|  | the results of its tests to speed up reconfiguring.  Caching is | ||||||
|  | disabled by default to prevent problems with accidental use of stale | ||||||
|  | cache files. | ||||||
|  |  | ||||||
|  |    If you need to do unusual things to compile the package, please try | ||||||
|  | to figure out how `configure' could check whether to do them, and mail | ||||||
|  | diffs or instructions to the address given in the `README' so they can | ||||||
|  | be considered for the next release.  If you are using the cache, and at | ||||||
|  | some point `config.cache' contains results you don't want to keep, you | ||||||
|  | may remove or edit it. | ||||||
|  |  | ||||||
|  |    The file `configure.ac' (or `configure.in') is used to create | ||||||
|  | `configure' by a program called `autoconf'.  You need `configure.ac' if | ||||||
|  | you want to change it or regenerate `configure' using a newer version | ||||||
|  | of `autoconf'. | ||||||
|  |  | ||||||
|  |    The simplest way to compile this package is: | ||||||
|  |  | ||||||
|  |   1. `cd' to the directory containing the package's source code and type | ||||||
|  |      `./configure' to configure the package for your system. | ||||||
|  |  | ||||||
|  |      Running `configure' might take a while.  While running, it prints | ||||||
|  |      some messages telling which features it is checking for. | ||||||
|  |  | ||||||
|  |   2. Type `make' to compile the package. | ||||||
|  |  | ||||||
|  |   3. Optionally, type `make check' to run any self-tests that come with | ||||||
|  |      the package, generally using the just-built uninstalled binaries. | ||||||
|  |  | ||||||
|  |   4. Type `make install' to install the programs and any data files and | ||||||
|  |      documentation.  When installing into a prefix owned by root, it is | ||||||
|  |      recommended that the package be configured and built as a regular | ||||||
|  |      user, and only the `make install' phase executed with root | ||||||
|  |      privileges. | ||||||
|  |  | ||||||
|  |   5. Optionally, type `make installcheck' to repeat any self-tests, but | ||||||
|  |      this time using the binaries in their final installed location. | ||||||
|  |      This target does not install anything.  Running this target as a | ||||||
|  |      regular user, particularly if the prior `make install' required | ||||||
|  |      root privileges, verifies that the installation completed | ||||||
|  |      correctly. | ||||||
|  |  | ||||||
|  |   6. You can remove the program binaries and object files from the | ||||||
|  |      source code directory by typing `make clean'.  To also remove the | ||||||
|  |      files that `configure' created (so you can compile the package for | ||||||
|  |      a different kind of computer), type `make distclean'.  There is | ||||||
|  |      also a `make maintainer-clean' target, but that is intended mainly | ||||||
|  |      for the package's developers.  If you use it, you may have to get | ||||||
|  |      all sorts of other programs in order to regenerate files that came | ||||||
|  |      with the distribution. | ||||||
|  |  | ||||||
|  |   7. Often, you can also type `make uninstall' to remove the installed | ||||||
|  |      files again.  In practice, not all packages have tested that | ||||||
|  |      uninstallation works correctly, even though it is required by the | ||||||
|  |      GNU Coding Standards. | ||||||
|  |  | ||||||
|  |   8. Some packages, particularly those that use Automake, provide `make | ||||||
|  |      distcheck', which can by used by developers to test that all other | ||||||
|  |      targets like `make install' and `make uninstall' work correctly. | ||||||
|  |      This target is generally not run by end users. | ||||||
|  |  | ||||||
|  | Compilers and Options | ||||||
|  | ===================== | ||||||
|  |  | ||||||
|  |    Some systems require unusual options for compilation or linking that | ||||||
|  | the `configure' script does not know about.  Run `./configure --help' | ||||||
|  | for details on some of the pertinent environment variables. | ||||||
|  |  | ||||||
|  |    You can give `configure' initial values for configuration parameters | ||||||
|  | by setting variables in the command line or in the environment.  Here | ||||||
|  | is an example: | ||||||
|  |  | ||||||
|  |      ./configure CC=c99 CFLAGS=-g LIBS=-lposix | ||||||
|  |  | ||||||
|  |    *Note Defining Variables::, for more details. | ||||||
|  |  | ||||||
|  | Compiling For Multiple Architectures | ||||||
|  | ==================================== | ||||||
|  |  | ||||||
|  |    You can compile the package for more than one kind of computer at the | ||||||
|  | same time, by placing the object files for each architecture in their | ||||||
|  | own directory.  To do this, you can use GNU `make'.  `cd' to the | ||||||
|  | directory where you want the object files and executables to go and run | ||||||
|  | the `configure' script.  `configure' automatically checks for the | ||||||
|  | source code in the directory that `configure' is in and in `..'.  This | ||||||
|  | is known as a "VPATH" build. | ||||||
|  |  | ||||||
|  |    With a non-GNU `make', it is safer to compile the package for one | ||||||
|  | architecture at a time in the source code directory.  After you have | ||||||
|  | installed the package for one architecture, use `make distclean' before | ||||||
|  | reconfiguring for another architecture. | ||||||
|  |  | ||||||
|  |    On MacOS X 10.5 and later systems, you can create libraries and | ||||||
|  | executables that work on multiple system types--known as "fat" or | ||||||
|  | "universal" binaries--by specifying multiple `-arch' options to the | ||||||
|  | compiler but only a single `-arch' option to the preprocessor.  Like | ||||||
|  | this: | ||||||
|  |  | ||||||
|  |      ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ | ||||||
|  |                  CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ | ||||||
|  |                  CPP="gcc -E" CXXCPP="g++ -E" | ||||||
|  |  | ||||||
|  |    This is not guaranteed to produce working output in all cases, you | ||||||
|  | may have to build one architecture at a time and combine the results | ||||||
|  | using the `lipo' tool if you have problems. | ||||||
|  |  | ||||||
|  | Installation Names | ||||||
|  | ================== | ||||||
|  |  | ||||||
|  |    By default, `make install' installs the package's commands under | ||||||
|  | `/usr/local/bin', include files under `/usr/local/include', etc.  You | ||||||
|  | can specify an installation prefix other than `/usr/local' by giving | ||||||
|  | `configure' the option `--prefix=PREFIX', where PREFIX must be an | ||||||
|  | absolute file name. | ||||||
|  |  | ||||||
|  |    You can specify separate installation prefixes for | ||||||
|  | architecture-specific files and architecture-independent files.  If you | ||||||
|  | pass the option `--exec-prefix=PREFIX' to `configure', the package uses | ||||||
|  | PREFIX as the prefix for installing programs and libraries. | ||||||
|  | Documentation and other data files still use the regular prefix. | ||||||
|  |  | ||||||
|  |    In addition, if you use an unusual directory layout you can give | ||||||
|  | options like `--bindir=DIR' to specify different values for particular | ||||||
|  | kinds of files.  Run `configure --help' for a list of the directories | ||||||
|  | you can set and what kinds of files go in them.  In general, the | ||||||
|  | default for these options is expressed in terms of `${prefix}', so that | ||||||
|  | specifying just `--prefix' will affect all of the other directory | ||||||
|  | specifications that were not explicitly provided. | ||||||
|  |  | ||||||
|  |    The most portable way to affect installation locations is to pass the | ||||||
|  | correct locations to `configure'; however, many packages provide one or | ||||||
|  | both of the following shortcuts of passing variable assignments to the | ||||||
|  | `make install' command line to change installation locations without | ||||||
|  | having to reconfigure or recompile. | ||||||
|  |  | ||||||
|  |    The first method involves providing an override variable for each | ||||||
|  | affected directory.  For example, `make install | ||||||
|  | prefix=/alternate/directory' will choose an alternate location for all | ||||||
|  | directory configuration variables that were expressed in terms of | ||||||
|  | `${prefix}'.  Any directories that were specified during `configure', | ||||||
|  | but not in terms of `${prefix}', must each be overridden at install | ||||||
|  | time for the entire installation to be relocated.  The approach of | ||||||
|  | makefile variable overrides for each directory variable is required by | ||||||
|  | the GNU Coding Standards, and ideally causes no recompilation. | ||||||
|  | However, some platforms have known limitations with the semantics of | ||||||
|  | shared libraries that end up requiring recompilation when using this | ||||||
|  | method, particularly noticeable in packages that use GNU Libtool. | ||||||
|  |  | ||||||
|  |    The second method involves providing the `DESTDIR' variable.  For | ||||||
|  | example, `make install DESTDIR=/alternate/directory' will prepend | ||||||
|  | `/alternate/directory' before all installation names.  The approach of | ||||||
|  | `DESTDIR' overrides is not required by the GNU Coding Standards, and | ||||||
|  | does not work on platforms that have drive letters.  On the other hand, | ||||||
|  | it does better at avoiding recompilation issues, and works well even | ||||||
|  | when some directory options were not specified in terms of `${prefix}' | ||||||
|  | at `configure' time. | ||||||
|  |  | ||||||
|  | Optional Features | ||||||
|  | ================= | ||||||
|  |  | ||||||
|  |    If the package supports it, you can cause programs to be installed | ||||||
|  | with an extra prefix or suffix on their names by giving `configure' the | ||||||
|  | option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. | ||||||
|  |  | ||||||
|  |    Some packages pay attention to `--enable-FEATURE' options to | ||||||
|  | `configure', where FEATURE indicates an optional part of the package. | ||||||
|  | They may also pay attention to `--with-PACKAGE' options, where PACKAGE | ||||||
|  | is something like `gnu-as' or `x' (for the X Window System).  The | ||||||
|  | `README' should mention any `--enable-' and `--with-' options that the | ||||||
|  | package recognizes. | ||||||
|  |  | ||||||
|  |    For packages that use the X Window System, `configure' can usually | ||||||
|  | find the X include and library files automatically, but if it doesn't, | ||||||
|  | you can use the `configure' options `--x-includes=DIR' and | ||||||
|  | `--x-libraries=DIR' to specify their locations. | ||||||
|  |  | ||||||
|  |    Some packages offer the ability to configure how verbose the | ||||||
|  | execution of `make' will be.  For these packages, running `./configure | ||||||
|  | --enable-silent-rules' sets the default to minimal output, which can be | ||||||
|  | overridden with `make V=1'; while running `./configure | ||||||
|  | --disable-silent-rules' sets the default to verbose, which can be | ||||||
|  | overridden with `make V=0'. | ||||||
|  |  | ||||||
|  | Particular systems | ||||||
|  | ================== | ||||||
|  |  | ||||||
|  |    On HP-UX, the default C compiler is not ANSI C compatible.  If GNU | ||||||
|  | CC is not installed, it is recommended to use the following options in | ||||||
|  | order to use an ANSI C compiler: | ||||||
|  |  | ||||||
|  |      ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" | ||||||
|  |  | ||||||
|  | and if that doesn't work, install pre-built binaries of GCC for HP-UX. | ||||||
|  |  | ||||||
|  |    On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot | ||||||
|  | parse its `<wchar.h>' header file.  The option `-nodtk' can be used as | ||||||
|  | a workaround.  If GNU CC is not installed, it is therefore recommended | ||||||
|  | to try | ||||||
|  |  | ||||||
|  |      ./configure CC="cc" | ||||||
|  |  | ||||||
|  | and if that doesn't work, try | ||||||
|  |  | ||||||
|  |      ./configure CC="cc -nodtk" | ||||||
|  |  | ||||||
|  |    On Solaris, don't put `/usr/ucb' early in your `PATH'.  This | ||||||
|  | directory contains several dysfunctional programs; working variants of | ||||||
|  | these programs are available in `/usr/bin'.  So, if you need `/usr/ucb' | ||||||
|  | in your `PATH', put it _after_ `/usr/bin'. | ||||||
|  |  | ||||||
|  |    On Haiku, software installed for all users goes in `/boot/common', | ||||||
|  | not `/usr/local'.  It is recommended to use the following options: | ||||||
|  |  | ||||||
|  |      ./configure --prefix=/boot/common | ||||||
|  |  | ||||||
|  | Specifying the System Type | ||||||
|  | ========================== | ||||||
|  |  | ||||||
|  |    There may be some features `configure' cannot figure out | ||||||
|  | automatically, but needs to determine by the type of machine the package | ||||||
|  | will run on.  Usually, assuming the package is built to be run on the | ||||||
|  | _same_ architectures, `configure' can figure that out, but if it prints | ||||||
|  | a message saying it cannot guess the machine type, give it the | ||||||
|  | `--build=TYPE' option.  TYPE can either be a short name for the system | ||||||
|  | type, such as `sun4', or a canonical name which has the form: | ||||||
|  |  | ||||||
|  |      CPU-COMPANY-SYSTEM | ||||||
|  |  | ||||||
|  | where SYSTEM can have one of these forms: | ||||||
|  |  | ||||||
|  |      OS | ||||||
|  |      KERNEL-OS | ||||||
|  |  | ||||||
|  |    See the file `config.sub' for the possible values of each field.  If | ||||||
|  | `config.sub' isn't included in this package, then this package doesn't | ||||||
|  | need to know the machine type. | ||||||
|  |  | ||||||
|  |    If you are _building_ compiler tools for cross-compiling, you should | ||||||
|  | use the option `--target=TYPE' to select the type of system they will | ||||||
|  | produce code for. | ||||||
|  |  | ||||||
|  |    If you want to _use_ a cross compiler, that generates code for a | ||||||
|  | platform different from the build platform, you should specify the | ||||||
|  | "host" platform (i.e., that on which the generated programs will | ||||||
|  | eventually be run) with `--host=TYPE'. | ||||||
|  |  | ||||||
|  | Sharing Defaults | ||||||
|  | ================ | ||||||
|  |  | ||||||
|  |    If you want to set default values for `configure' scripts to share, | ||||||
|  | you can create a site shell script called `config.site' that gives | ||||||
|  | default values for variables like `CC', `cache_file', and `prefix'. | ||||||
|  | `configure' looks for `PREFIX/share/config.site' if it exists, then | ||||||
|  | `PREFIX/etc/config.site' if it exists.  Or, you can set the | ||||||
|  | `CONFIG_SITE' environment variable to the location of the site script. | ||||||
|  | A warning: not all `configure' scripts look for a site script. | ||||||
|  |  | ||||||
|  | Defining Variables | ||||||
|  | ================== | ||||||
|  |  | ||||||
|  |    Variables not defined in a site shell script can be set in the | ||||||
|  | environment passed to `configure'.  However, some packages may run | ||||||
|  | configure again during the build, and the customized values of these | ||||||
|  | variables may be lost.  In order to avoid this problem, you should set | ||||||
|  | them in the `configure' command line, using `VAR=value'.  For example: | ||||||
|  |  | ||||||
|  |      ./configure CC=/usr/local2/bin/gcc | ||||||
|  |  | ||||||
|  | causes the specified `gcc' to be used as the C compiler (unless it is | ||||||
|  | overridden in the site shell script). | ||||||
|  |  | ||||||
|  | Unfortunately, this technique does not work for `CONFIG_SHELL' due to | ||||||
|  | an Autoconf bug.  Until the bug is fixed you can use this workaround: | ||||||
|  |  | ||||||
|  |      CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash | ||||||
|  |  | ||||||
|  | `configure' Invocation | ||||||
|  | ====================== | ||||||
|  |  | ||||||
|  |    `configure' recognizes the following options to control how it | ||||||
|  | operates. | ||||||
|  |  | ||||||
|  | `--help' | ||||||
|  | `-h' | ||||||
|  |      Print a summary of all of the options to `configure', and exit. | ||||||
|  |  | ||||||
|  | `--help=short' | ||||||
|  | `--help=recursive' | ||||||
|  |      Print a summary of the options unique to this package's | ||||||
|  |      `configure', and exit.  The `short' variant lists options used | ||||||
|  |      only in the top level, while the `recursive' variant lists options | ||||||
|  |      also present in any nested packages. | ||||||
|  |  | ||||||
|  | `--version' | ||||||
|  | `-V' | ||||||
|  |      Print the version of Autoconf used to generate the `configure' | ||||||
|  |      script, and exit. | ||||||
|  |  | ||||||
|  | `--cache-file=FILE' | ||||||
|  |      Enable the cache: use and save the results of the tests in FILE, | ||||||
|  |      traditionally `config.cache'.  FILE defaults to `/dev/null' to | ||||||
|  |      disable caching. | ||||||
|  |  | ||||||
|  | `--config-cache' | ||||||
|  | `-C' | ||||||
|  |      Alias for `--cache-file=config.cache'. | ||||||
|  |  | ||||||
|  | `--quiet' | ||||||
|  | `--silent' | ||||||
|  | `-q' | ||||||
|  |      Do not print messages saying which checks are being made.  To | ||||||
|  |      suppress all normal output, redirect it to `/dev/null' (any error | ||||||
|  |      messages will still be shown). | ||||||
|  |  | ||||||
|  | `--srcdir=DIR' | ||||||
|  |      Look for the package's source code in directory DIR.  Usually | ||||||
|  |      `configure' can determine that directory automatically. | ||||||
|  |  | ||||||
|  | `--prefix=DIR' | ||||||
|  |      Use DIR as the installation prefix.  *note Installation Names:: | ||||||
|  |      for more details, including other options available for fine-tuning | ||||||
|  |      the installation locations. | ||||||
|  |  | ||||||
|  | `--no-create' | ||||||
|  | `-n' | ||||||
|  |      Run the configure checks, but stop before creating any output | ||||||
|  |      files. | ||||||
|  |  | ||||||
|  | `configure' also accepts some other, not widely useful, options.  Run | ||||||
|  | `configure --help' for more details. | ||||||
|  |  | ||||||
							
								
								
									
										452
									
								
								libs/log4cplus/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										452
									
								
								libs/log4cplus/LICENSE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,452 @@ | |||||||
|  | Contents | ||||||
|  | ======== | ||||||
|  |  | ||||||
|  | 1. Log4j license | ||||||
|  | 2. Log4cplus license | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 1. Log4j license | ||||||
|  | ================ | ||||||
|  |  | ||||||
|  |                                  Apache License | ||||||
|  |                            Version 2.0, January 2004 | ||||||
|  |                         http://www.apache.org/licenses/ | ||||||
|  |  | ||||||
|  |    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||||
|  |  | ||||||
|  |    1. Definitions. | ||||||
|  |  | ||||||
|  |       "License" shall mean the terms and conditions for use, reproduction, | ||||||
|  |       and distribution as defined by Sections 1 through 9 of this document. | ||||||
|  |  | ||||||
|  |       "Licensor" shall mean the copyright owner or entity authorized by | ||||||
|  |       the copyright owner that is granting the License. | ||||||
|  |  | ||||||
|  |       "Legal Entity" shall mean the union of the acting entity and all | ||||||
|  |       other entities that control, are controlled by, or are under common | ||||||
|  |       control with that entity. For the purposes of this definition, | ||||||
|  |       "control" means (i) the power, direct or indirect, to cause the | ||||||
|  |       direction or management of such entity, whether by contract or | ||||||
|  |       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||||
|  |       outstanding shares, or (iii) beneficial ownership of such entity. | ||||||
|  |  | ||||||
|  |       "You" (or "Your") shall mean an individual or Legal Entity | ||||||
|  |       exercising permissions granted by this License. | ||||||
|  |  | ||||||
|  |       "Source" form shall mean the preferred form for making modifications, | ||||||
|  |       including but not limited to software source code, documentation | ||||||
|  |       source, and configuration files. | ||||||
|  |  | ||||||
|  |       "Object" form shall mean any form resulting from mechanical | ||||||
|  |       transformation or translation of a Source form, including but | ||||||
|  |       not limited to compiled object code, generated documentation, | ||||||
|  |       and conversions to other media types. | ||||||
|  |  | ||||||
|  |       "Work" shall mean the work of authorship, whether in Source or | ||||||
|  |       Object form, made available under the License, as indicated by a | ||||||
|  |       copyright notice that is included in or attached to the work | ||||||
|  |       (an example is provided in the Appendix below). | ||||||
|  |  | ||||||
|  |       "Derivative Works" shall mean any work, whether in Source or Object | ||||||
|  |       form, that is based on (or derived from) the Work and for which the | ||||||
|  |       editorial revisions, annotations, elaborations, or other modifications | ||||||
|  |       represent, as a whole, an original work of authorship. For the purposes | ||||||
|  |       of this License, Derivative Works shall not include works that remain | ||||||
|  |       separable from, or merely link (or bind by name) to the interfaces of, | ||||||
|  |       the Work and Derivative Works thereof. | ||||||
|  |  | ||||||
|  |       "Contribution" shall mean any work of authorship, including | ||||||
|  |       the original version of the Work and any modifications or additions | ||||||
|  |       to that Work or Derivative Works thereof, that is intentionally | ||||||
|  |       submitted to Licensor for inclusion in the Work by the copyright owner | ||||||
|  |       or by an individual or Legal Entity authorized to submit on behalf of | ||||||
|  |       the copyright owner. For the purposes of this definition, "submitted" | ||||||
|  |       means any form of electronic, verbal, or written communication sent | ||||||
|  |       to the Licensor or its representatives, including but not limited to | ||||||
|  |       communication on electronic mailing lists, source code control systems, | ||||||
|  |       and issue tracking systems that are managed by, or on behalf of, the | ||||||
|  |       Licensor for the purpose of discussing and improving the Work, but | ||||||
|  |       excluding communication that is conspicuously marked or otherwise | ||||||
|  |       designated in writing by the copyright owner as "Not a Contribution." | ||||||
|  |  | ||||||
|  |       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||||
|  |       on behalf of whom a Contribution has been received by Licensor and | ||||||
|  |       subsequently incorporated within the Work. | ||||||
|  |  | ||||||
|  |    2. Grant of Copyright License. Subject to the terms and conditions of | ||||||
|  |       this License, each Contributor hereby grants to You a perpetual, | ||||||
|  |       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||||
|  |       copyright license to reproduce, prepare Derivative Works of, | ||||||
|  |       publicly display, publicly perform, sublicense, and distribute the | ||||||
|  |       Work and such Derivative Works in Source or Object form. | ||||||
|  |  | ||||||
|  |    3. Grant of Patent License. Subject to the terms and conditions of | ||||||
|  |       this License, each Contributor hereby grants to You a perpetual, | ||||||
|  |       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||||
|  |       (except as stated in this section) patent license to make, have made, | ||||||
|  |       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||||
|  |       where such license applies only to those patent claims licensable | ||||||
|  |       by such Contributor that are necessarily infringed by their | ||||||
|  |       Contribution(s) alone or by combination of their Contribution(s) | ||||||
|  |       with the Work to which such Contribution(s) was submitted. If You | ||||||
|  |       institute patent litigation against any entity (including a | ||||||
|  |       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||||
|  |       or a Contribution incorporated within the Work constitutes direct | ||||||
|  |       or contributory patent infringement, then any patent licenses | ||||||
|  |       granted to You under this License for that Work shall terminate | ||||||
|  |       as of the date such litigation is filed. | ||||||
|  |  | ||||||
|  |    4. Redistribution. You may reproduce and distribute copies of the | ||||||
|  |       Work or Derivative Works thereof in any medium, with or without | ||||||
|  |       modifications, and in Source or Object form, provided that You | ||||||
|  |       meet the following conditions: | ||||||
|  |  | ||||||
|  |       (a) You must give any other recipients of the Work or | ||||||
|  |           Derivative Works a copy of this License; and | ||||||
|  |  | ||||||
|  |       (b) You must cause any modified files to carry prominent notices | ||||||
|  |           stating that You changed the files; and | ||||||
|  |  | ||||||
|  |       (c) You must retain, in the Source form of any Derivative Works | ||||||
|  |           that You distribute, all copyright, patent, trademark, and | ||||||
|  |           attribution notices from the Source form of the Work, | ||||||
|  |           excluding those notices that do not pertain to any part of | ||||||
|  |           the Derivative Works; and | ||||||
|  |  | ||||||
|  |       (d) If the Work includes a "NOTICE" text file as part of its | ||||||
|  |           distribution, then any Derivative Works that You distribute must | ||||||
|  |           include a readable copy of the attribution notices contained | ||||||
|  |           within such NOTICE file, excluding those notices that do not | ||||||
|  |           pertain to any part of the Derivative Works, in at least one | ||||||
|  |           of the following places: within a NOTICE text file distributed | ||||||
|  |           as part of the Derivative Works; within the Source form or | ||||||
|  |           documentation, if provided along with the Derivative Works; or, | ||||||
|  |           within a display generated by the Derivative Works, if and | ||||||
|  |           wherever such third-party notices normally appear. The contents | ||||||
|  |           of the NOTICE file are for informational purposes only and | ||||||
|  |           do not modify the License. You may add Your own attribution | ||||||
|  |           notices within Derivative Works that You distribute, alongside | ||||||
|  |           or as an addendum to the NOTICE text from the Work, provided | ||||||
|  |           that such additional attribution notices cannot be construed | ||||||
|  |           as modifying the License. | ||||||
|  |  | ||||||
|  |       You may add Your own copyright statement to Your modifications and | ||||||
|  |       may provide additional or different license terms and conditions | ||||||
|  |       for use, reproduction, or distribution of Your modifications, or | ||||||
|  |       for any such Derivative Works as a whole, provided Your use, | ||||||
|  |       reproduction, and distribution of the Work otherwise complies with | ||||||
|  |       the conditions stated in this License. | ||||||
|  |  | ||||||
|  |    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||||
|  |       any Contribution intentionally submitted for inclusion in the Work | ||||||
|  |       by You to the Licensor shall be under the terms and conditions of | ||||||
|  |       this License, without any additional terms or conditions. | ||||||
|  |       Notwithstanding the above, nothing herein shall supersede or modify | ||||||
|  |       the terms of any separate license agreement you may have executed | ||||||
|  |       with Licensor regarding such Contributions. | ||||||
|  |  | ||||||
|  |    6. Trademarks. This License does not grant permission to use the trade | ||||||
|  |       names, trademarks, service marks, or product names of the Licensor, | ||||||
|  |       except as required for reasonable and customary use in describing the | ||||||
|  |       origin of the Work and reproducing the content of the NOTICE file. | ||||||
|  |  | ||||||
|  |    7. Disclaimer of Warranty. Unless required by applicable law or | ||||||
|  |       agreed to in writing, Licensor provides the Work (and each | ||||||
|  |       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||||
|  |       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||||
|  |       implied, including, without limitation, any warranties or conditions | ||||||
|  |       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||||
|  |       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||||
|  |       appropriateness of using or redistributing the Work and assume any | ||||||
|  |       risks associated with Your exercise of permissions under this License. | ||||||
|  |  | ||||||
|  |    8. Limitation of Liability. In no event and under no legal theory, | ||||||
|  |       whether in tort (including negligence), contract, or otherwise, | ||||||
|  |       unless required by applicable law (such as deliberate and grossly | ||||||
|  |       negligent acts) or agreed to in writing, shall any Contributor be | ||||||
|  |       liable to You for damages, including any direct, indirect, special, | ||||||
|  |       incidental, or consequential damages of any character arising as a | ||||||
|  |       result of this License or out of the use or inability to use the | ||||||
|  |       Work (including but not limited to damages for loss of goodwill, | ||||||
|  |       work stoppage, computer failure or malfunction, or any and all | ||||||
|  |       other commercial damages or losses), even if such Contributor | ||||||
|  |       has been advised of the possibility of such damages. | ||||||
|  |  | ||||||
|  |    9. Accepting Warranty or Additional Liability. While redistributing | ||||||
|  |       the Work or Derivative Works thereof, You may choose to offer, | ||||||
|  |       and charge a fee for, acceptance of support, warranty, indemnity, | ||||||
|  |       or other liability obligations and/or rights consistent with this | ||||||
|  |       License. However, in accepting such obligations, You may act only | ||||||
|  |       on Your own behalf and on Your sole responsibility, not on behalf | ||||||
|  |       of any other Contributor, and only if You agree to indemnify, | ||||||
|  |       defend, and hold each Contributor harmless for any liability | ||||||
|  |       incurred by, or claims asserted against, such Contributor by reason | ||||||
|  |       of your accepting any such warranty or additional liability. | ||||||
|  |  | ||||||
|  |    END OF TERMS AND CONDITIONS | ||||||
|  |  | ||||||
|  |    APPENDIX: How to apply the Apache License to your work. | ||||||
|  |  | ||||||
|  |       To apply the Apache License to your work, attach the following | ||||||
|  |       boilerplate notice, with the fields enclosed by brackets "[]" | ||||||
|  |       replaced with your own identifying information. (Don't include | ||||||
|  |       the brackets!)  The text should be enclosed in the appropriate | ||||||
|  |       comment syntax for the file format. We also recommend that a | ||||||
|  |       file or class name and description of purpose be included on the | ||||||
|  |       same "printed page" as the copyright notice for easier | ||||||
|  |       identification within third-party archives. | ||||||
|  |  | ||||||
|  |    Copyright 1999-2005 The Apache Software Foundation | ||||||
|  |  | ||||||
|  |    Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |    you may not use this file except in compliance with the License. | ||||||
|  |    You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |        http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  |    Unless required by applicable law or agreed to in writing, software | ||||||
|  |    distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |    See the License for the specific language governing permissions and | ||||||
|  |    limitations under the License. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 2. Log4cplus license | ||||||
|  | ==================== | ||||||
|  |  | ||||||
|  | Each file of log4cplus source is licensed using either two clause BSD license | ||||||
|  | or Apache license 2.0. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 2.1 Two clause BSD license | ||||||
|  | ========================== | ||||||
|  |  | ||||||
|  |       Copyright (C) 1999-2009 Contributors to log4cplus project.  | ||||||
|  |       All rights reserved. | ||||||
|  |     | ||||||
|  |    Redistribution and use in source and binary forms, with or without modifica- | ||||||
|  |    tion, are permitted provided that the following conditions are met: | ||||||
|  |     | ||||||
|  |    1. Redistributions of  source code must  retain the above copyright  notice, | ||||||
|  |       this list of conditions and the following disclaimer. | ||||||
|  |     | ||||||
|  |    2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  |       this list of conditions and the following disclaimer in the documentation | ||||||
|  |       and/or other materials provided with the distribution. | ||||||
|  |     | ||||||
|  |    THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, | ||||||
|  |    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | ||||||
|  |    FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE | ||||||
|  |    APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT, | ||||||
|  |    INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU- | ||||||
|  |    DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS | ||||||
|  |    OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON | ||||||
|  |    ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT | ||||||
|  |    (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF | ||||||
|  |    THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 2.2 Apache 2.0 license | ||||||
|  | ====================== | ||||||
|  |  | ||||||
|  |                                  Apache License | ||||||
|  |                            Version 2.0, January 2004 | ||||||
|  |                         http://www.apache.org/licenses/ | ||||||
|  |  | ||||||
|  |    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||||
|  |  | ||||||
|  |    1. Definitions. | ||||||
|  |  | ||||||
|  |       "License" shall mean the terms and conditions for use, reproduction, | ||||||
|  |       and distribution as defined by Sections 1 through 9 of this document. | ||||||
|  |  | ||||||
|  |       "Licensor" shall mean the copyright owner or entity authorized by | ||||||
|  |       the copyright owner that is granting the License. | ||||||
|  |  | ||||||
|  |       "Legal Entity" shall mean the union of the acting entity and all | ||||||
|  |       other entities that control, are controlled by, or are under common | ||||||
|  |       control with that entity. For the purposes of this definition, | ||||||
|  |       "control" means (i) the power, direct or indirect, to cause the | ||||||
|  |       direction or management of such entity, whether by contract or | ||||||
|  |       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||||
|  |       outstanding shares, or (iii) beneficial ownership of such entity. | ||||||
|  |  | ||||||
|  |       "You" (or "Your") shall mean an individual or Legal Entity | ||||||
|  |       exercising permissions granted by this License. | ||||||
|  |  | ||||||
|  |       "Source" form shall mean the preferred form for making modifications, | ||||||
|  |       including but not limited to software source code, documentation | ||||||
|  |       source, and configuration files. | ||||||
|  |  | ||||||
|  |       "Object" form shall mean any form resulting from mechanical | ||||||
|  |       transformation or translation of a Source form, including but | ||||||
|  |       not limited to compiled object code, generated documentation, | ||||||
|  |       and conversions to other media types. | ||||||
|  |  | ||||||
|  |       "Work" shall mean the work of authorship, whether in Source or | ||||||
|  |       Object form, made available under the License, as indicated by a | ||||||
|  |       copyright notice that is included in or attached to the work | ||||||
|  |       (an example is provided in the Appendix below). | ||||||
|  |  | ||||||
|  |       "Derivative Works" shall mean any work, whether in Source or Object | ||||||
|  |       form, that is based on (or derived from) the Work and for which the | ||||||
|  |       editorial revisions, annotations, elaborations, or other modifications | ||||||
|  |       represent, as a whole, an original work of authorship. For the purposes | ||||||
|  |       of this License, Derivative Works shall not include works that remain | ||||||
|  |       separable from, or merely link (or bind by name) to the interfaces of, | ||||||
|  |       the Work and Derivative Works thereof. | ||||||
|  |  | ||||||
|  |       "Contribution" shall mean any work of authorship, including | ||||||
|  |       the original version of the Work and any modifications or additions | ||||||
|  |       to that Work or Derivative Works thereof, that is intentionally | ||||||
|  |       submitted to Licensor for inclusion in the Work by the copyright owner | ||||||
|  |       or by an individual or Legal Entity authorized to submit on behalf of | ||||||
|  |       the copyright owner. For the purposes of this definition, "submitted" | ||||||
|  |       means any form of electronic, verbal, or written communication sent | ||||||
|  |       to the Licensor or its representatives, including but not limited to | ||||||
|  |       communication on electronic mailing lists, source code control systems, | ||||||
|  |       and issue tracking systems that are managed by, or on behalf of, the | ||||||
|  |       Licensor for the purpose of discussing and improving the Work, but | ||||||
|  |       excluding communication that is conspicuously marked or otherwise | ||||||
|  |       designated in writing by the copyright owner as "Not a Contribution." | ||||||
|  |  | ||||||
|  |       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||||
|  |       on behalf of whom a Contribution has been received by Licensor and | ||||||
|  |       subsequently incorporated within the Work. | ||||||
|  |  | ||||||
|  |    2. Grant of Copyright License. Subject to the terms and conditions of | ||||||
|  |       this License, each Contributor hereby grants to You a perpetual, | ||||||
|  |       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||||
|  |       copyright license to reproduce, prepare Derivative Works of, | ||||||
|  |       publicly display, publicly perform, sublicense, and distribute the | ||||||
|  |       Work and such Derivative Works in Source or Object form. | ||||||
|  |  | ||||||
|  |    3. Grant of Patent License. Subject to the terms and conditions of | ||||||
|  |       this License, each Contributor hereby grants to You a perpetual, | ||||||
|  |       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||||
|  |       (except as stated in this section) patent license to make, have made, | ||||||
|  |       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||||
|  |       where such license applies only to those patent claims licensable | ||||||
|  |       by such Contributor that are necessarily infringed by their | ||||||
|  |       Contribution(s) alone or by combination of their Contribution(s) | ||||||
|  |       with the Work to which such Contribution(s) was submitted. If You | ||||||
|  |       institute patent litigation against any entity (including a | ||||||
|  |       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||||
|  |       or a Contribution incorporated within the Work constitutes direct | ||||||
|  |       or contributory patent infringement, then any patent licenses | ||||||
|  |       granted to You under this License for that Work shall terminate | ||||||
|  |       as of the date such litigation is filed. | ||||||
|  |  | ||||||
|  |    4. Redistribution. You may reproduce and distribute copies of the | ||||||
|  |       Work or Derivative Works thereof in any medium, with or without | ||||||
|  |       modifications, and in Source or Object form, provided that You | ||||||
|  |       meet the following conditions: | ||||||
|  |  | ||||||
|  |       (a) You must give any other recipients of the Work or | ||||||
|  |           Derivative Works a copy of this License; and | ||||||
|  |  | ||||||
|  |       (b) You must cause any modified files to carry prominent notices | ||||||
|  |           stating that You changed the files; and | ||||||
|  |  | ||||||
|  |       (c) You must retain, in the Source form of any Derivative Works | ||||||
|  |           that You distribute, all copyright, patent, trademark, and | ||||||
|  |           attribution notices from the Source form of the Work, | ||||||
|  |           excluding those notices that do not pertain to any part of | ||||||
|  |           the Derivative Works; and | ||||||
|  |  | ||||||
|  |       (d) If the Work includes a "NOTICE" text file as part of its | ||||||
|  |           distribution, then any Derivative Works that You distribute must | ||||||
|  |           include a readable copy of the attribution notices contained | ||||||
|  |           within such NOTICE file, excluding those notices that do not | ||||||
|  |           pertain to any part of the Derivative Works, in at least one | ||||||
|  |           of the following places: within a NOTICE text file distributed | ||||||
|  |           as part of the Derivative Works; within the Source form or | ||||||
|  |           documentation, if provided along with the Derivative Works; or, | ||||||
|  |           within a display generated by the Derivative Works, if and | ||||||
|  |           wherever such third-party notices normally appear. The contents | ||||||
|  |           of the NOTICE file are for informational purposes only and | ||||||
|  |           do not modify the License. You may add Your own attribution | ||||||
|  |           notices within Derivative Works that You distribute, alongside | ||||||
|  |           or as an addendum to the NOTICE text from the Work, provided | ||||||
|  |           that such additional attribution notices cannot be construed | ||||||
|  |           as modifying the License. | ||||||
|  |  | ||||||
|  |       You may add Your own copyright statement to Your modifications and | ||||||
|  |       may provide additional or different license terms and conditions | ||||||
|  |       for use, reproduction, or distribution of Your modifications, or | ||||||
|  |       for any such Derivative Works as a whole, provided Your use, | ||||||
|  |       reproduction, and distribution of the Work otherwise complies with | ||||||
|  |       the conditions stated in this License. | ||||||
|  |  | ||||||
|  |    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||||
|  |       any Contribution intentionally submitted for inclusion in the Work | ||||||
|  |       by You to the Licensor shall be under the terms and conditions of | ||||||
|  |       this License, without any additional terms or conditions. | ||||||
|  |       Notwithstanding the above, nothing herein shall supersede or modify | ||||||
|  |       the terms of any separate license agreement you may have executed | ||||||
|  |       with Licensor regarding such Contributions. | ||||||
|  |  | ||||||
|  |    6. Trademarks. This License does not grant permission to use the trade | ||||||
|  |       names, trademarks, service marks, or product names of the Licensor, | ||||||
|  |       except as required for reasonable and customary use in describing the | ||||||
|  |       origin of the Work and reproducing the content of the NOTICE file. | ||||||
|  |  | ||||||
|  |    7. Disclaimer of Warranty. Unless required by applicable law or | ||||||
|  |       agreed to in writing, Licensor provides the Work (and each | ||||||
|  |       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||||
|  |       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||||
|  |       implied, including, without limitation, any warranties or conditions | ||||||
|  |       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||||
|  |       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||||
|  |       appropriateness of using or redistributing the Work and assume any | ||||||
|  |       risks associated with Your exercise of permissions under this License. | ||||||
|  |  | ||||||
|  |    8. Limitation of Liability. In no event and under no legal theory, | ||||||
|  |       whether in tort (including negligence), contract, or otherwise, | ||||||
|  |       unless required by applicable law (such as deliberate and grossly | ||||||
|  |       negligent acts) or agreed to in writing, shall any Contributor be | ||||||
|  |       liable to You for damages, including any direct, indirect, special, | ||||||
|  |       incidental, or consequential damages of any character arising as a | ||||||
|  |       result of this License or out of the use or inability to use the | ||||||
|  |       Work (including but not limited to damages for loss of goodwill, | ||||||
|  |       work stoppage, computer failure or malfunction, or any and all | ||||||
|  |       other commercial damages or losses), even if such Contributor | ||||||
|  |       has been advised of the possibility of such damages. | ||||||
|  |  | ||||||
|  |    9. Accepting Warranty or Additional Liability. While redistributing | ||||||
|  |       the Work or Derivative Works thereof, You may choose to offer, | ||||||
|  |       and charge a fee for, acceptance of support, warranty, indemnity, | ||||||
|  |       or other liability obligations and/or rights consistent with this | ||||||
|  |       License. However, in accepting such obligations, You may act only | ||||||
|  |       on Your own behalf and on Your sole responsibility, not on behalf | ||||||
|  |       of any other Contributor, and only if You agree to indemnify, | ||||||
|  |       defend, and hold each Contributor harmless for any liability | ||||||
|  |       incurred by, or claims asserted against, such Contributor by reason | ||||||
|  |       of your accepting any such warranty or additional liability. | ||||||
|  |  | ||||||
|  |    END OF TERMS AND CONDITIONS | ||||||
|  |  | ||||||
|  |    APPENDIX: How to apply the Apache License to your work. | ||||||
|  |  | ||||||
|  |       To apply the Apache License to your work, attach the following | ||||||
|  |       boilerplate notice, with the fields enclosed by brackets "[]" | ||||||
|  |       replaced with your own identifying information. (Don't include | ||||||
|  |       the brackets!)  The text should be enclosed in the appropriate | ||||||
|  |       comment syntax for the file format. We also recommend that a | ||||||
|  |       file or class name and description of purpose be included on the | ||||||
|  |       same "printed page" as the copyright notice for easier | ||||||
|  |       identification within third-party archives. | ||||||
|  |  | ||||||
|  |    Copyright 1999-2009 Contributors to log4cplus project | ||||||
|  |  | ||||||
|  |    Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |    you may not use this file except in compliance with the License. | ||||||
|  |    You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |        http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  |    Unless required by applicable law or agreed to in writing, software | ||||||
|  |    distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |    See the License for the specific language governing permissions and | ||||||
|  |    limitations under the License. | ||||||
							
								
								
									
										1
									
								
								libs/log4cplus/NEWS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								libs/log4cplus/NEWS
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | See http://log4cplus.sourceforge.net/ for the latest news. | ||||||
							
								
								
									
										105
									
								
								libs/log4cplus/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								libs/log4cplus/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | |||||||
|  | Short Description | ||||||
|  | ================= | ||||||
|  |  | ||||||
|  | log4cplus is a simple to use C++ logging API providing thread-safe, | ||||||
|  | flexible, and arbitrarily granular control over log management and | ||||||
|  | configuration.  It is modeled after the Java log4j API. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Latest Project Information | ||||||
|  | ========================== | ||||||
|  |  | ||||||
|  | The latest up-to-date information for this project can be found at | ||||||
|  | http://log4cplus.sourceforge.net.  Please submit bugs, patches, | ||||||
|  | feature requests, etc. there. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Current Status | ||||||
|  | ============== | ||||||
|  |  | ||||||
|  | This library has now reached "Production" status. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Tested on the following platforms | ||||||
|  | ================================= | ||||||
|  |  | ||||||
|  | - Linux/AMD64 with GCC 4.1.2 and 4.3.2 | ||||||
|  | - FreeBSD/i386 and AMD64 with GCC 3.4.6, 4.2.1 and 4.3.3 | ||||||
|  | - Windows XP with MS Visual C++ 8.0, 9.0 and 10.0 | ||||||
|  | - OpenSolaris 5.11 with Sun C++ 5.10 SunOS_i386 128229-02 2009/09/21, | ||||||
|  |   with -library=stlport4 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Notes | ||||||
|  | ===== | ||||||
|  |  | ||||||
|  | Cygwin/MinGW | ||||||
|  | ------------ | ||||||
|  |  | ||||||
|  | Some version of GCC (3.4.x and probably some of 4.x series too) on | ||||||
|  | Windows (both Mingw and Cygwin) produces lots of warnings of the form | ||||||
|  | "warning: inline function 'void foo()' is declared as dllimport: | ||||||
|  | attribute ignored."  This can be worked around by adding | ||||||
|  | -Wno-attributes option to GCC command.  Unfortunatelly, not all | ||||||
|  | affected version of GCC have this option. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Threads and signals | ||||||
|  | ------------------- | ||||||
|  |  | ||||||
|  | log4cplus is not safe to be used from async signals' handlers.  This | ||||||
|  | is a property of most threaded programmes in general.  If you are | ||||||
|  | going to use log4cplus in threaded application and if you want to use | ||||||
|  | log4cplus from signal handlers then your only option is to block | ||||||
|  | signals in all threads but one that will handle all signals.  On POSIX | ||||||
|  | platforms, this is possible using the sigwait() call.  log4cplus | ||||||
|  | enables this approach by blocking all signals in any threads created | ||||||
|  | through its threads helpers. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | AIX | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | There appears to be a reentracy problem with AIX 5.3 and xlC 8 which | ||||||
|  | can result into a deadlock condition in some curcumstances. It is | ||||||
|  | unknown whether the problem manifests with other versions of either | ||||||
|  | the OS or the compiler, too. The problem was initially reported in a | ||||||
|  | bug report #3056687 ([1]). | ||||||
|  |  | ||||||
|  | The core of the problem is that IBM's/xlC's standard C++ IOStreams | ||||||
|  | implementation uses global non recursive lock to protect some of its | ||||||
|  | state. The application in the bug report was trying to do logging | ||||||
|  | using log4cplus from inside overflow() member function of a class | ||||||
|  | derived from std::streambuf class. log4cplus itself uses | ||||||
|  | std::ostringstream. This resulted into an attempt to recursivly lock | ||||||
|  | the global non recursive lock and a deadlock. | ||||||
|  |  | ||||||
|  | [1] <https://sourceforge.net/tracker/?func=detail&aid=3056687&group_id=40830&atid=429073> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Unsupported compilers | ||||||
|  | --------------------- | ||||||
|  |  | ||||||
|  | log4cplus does not support too old and broken C++ compilers: | ||||||
|  |  | ||||||
|  | - Visual C++ prior to 7.1 | ||||||
|  | - GCC prior to 3.2 | ||||||
|  | - All Borland/CodeGear/Embarcadero C++ compilers | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Unsupported platforms | ||||||
|  | --------------------- | ||||||
|  |  | ||||||
|  | log4cplus requires some minimal set of C and/or C++ library | ||||||
|  | functions. Some systems/platforms fail to provide these functions and | ||||||
|  | thus log4cplus cannot be supported there: | ||||||
|  |  | ||||||
|  | - Windows CE - missing implementations of <time.h> functions | ||||||
|  |  | ||||||
|  |  | ||||||
|  | License | ||||||
|  | ======= | ||||||
|  |  | ||||||
|  | This library is licensed under the Apache Public License 2.0 and two | ||||||
|  | clause BSD license.  Please read the included LICENSE file for | ||||||
|  | details. | ||||||
							
								
								
									
										212
									
								
								libs/log4cplus/include/log4cplus/appender.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										212
									
								
								libs/log4cplus/include/log4cplus/appender.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,212 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    appender.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_APPENDER_HEADER_ | ||||||
|  | #define _LOG4CPLUS_APPENDER_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/layout.h> | ||||||
|  | #include <log4cplus/loglevel.h> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  | #include <log4cplus/helpers/logloguser.h> | ||||||
|  | #include <log4cplus/helpers/pointer.h> | ||||||
|  | #include <log4cplus/helpers/property.h> | ||||||
|  | #include <log4cplus/spi/filter.h> | ||||||
|  |  | ||||||
|  | #include <memory> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * This class is used to "handle" errors encountered in an {@link | ||||||
|  |      * log4cplus::Appender}. | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT ErrorHandler { | ||||||
|  |     public: | ||||||
|  |         virtual ~ErrorHandler(); | ||||||
|  |         virtual void error(const log4cplus::tstring& err) = 0; | ||||||
|  |         virtual void reset() = 0; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     class LOG4CPLUS_EXPORT OnlyOnceErrorHandler : public ErrorHandler, | ||||||
|  |                                                   protected log4cplus::helpers::LogLogUser | ||||||
|  |     { | ||||||
|  |     public: | ||||||
|  |       // Ctor | ||||||
|  |         OnlyOnceErrorHandler() : firstTime(true){} | ||||||
|  |  | ||||||
|  |         virtual void error(const log4cplus::tstring& err); | ||||||
|  |         virtual void reset(); | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |         bool firstTime; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Extend this class for implementing your own strategies for printing log | ||||||
|  |      * statements. | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT Appender | ||||||
|  |         : public virtual log4cplus::helpers::SharedObject | ||||||
|  |         , protected log4cplus::helpers::LogLogUser | ||||||
|  |  | ||||||
|  |     { | ||||||
|  |     public: | ||||||
|  |       // Ctor | ||||||
|  |         Appender(); | ||||||
|  |         Appender(const log4cplus::helpers::Properties properties); | ||||||
|  |  | ||||||
|  |       // Dtor | ||||||
|  |         virtual ~Appender(); | ||||||
|  |  | ||||||
|  |         void destructorImpl(); | ||||||
|  |  | ||||||
|  |       // Methods | ||||||
|  |         /** | ||||||
|  |          * Release any resources allocated within the appender such as file | ||||||
|  |          * handles, network connections, etc. | ||||||
|  |          *  | ||||||
|  |          * It is a programming error to append to a closed appender. | ||||||
|  |          */ | ||||||
|  |         virtual void close() = 0; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This method performs threshold checks and invokes filters before | ||||||
|  |          * delegating actual logging to the subclasses specific {@link | ||||||
|  |          * #append} method. | ||||||
|  |          */ | ||||||
|  |         void doAppend(const log4cplus::spi::InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Get the name of this appender. The name uniquely identifies the | ||||||
|  |          * appender. | ||||||
|  |          */ | ||||||
|  |         virtual log4cplus::tstring getName(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Set the name of this appender. The name is used by other | ||||||
|  |          * components to identify this appender. | ||||||
|  |          */ | ||||||
|  |         virtual void setName(const log4cplus::tstring& name); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Set the {@link ErrorHandler} for this Appender. | ||||||
|  |          */ | ||||||
|  |         virtual void setErrorHandler(std::auto_ptr<ErrorHandler> eh); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Return the currently set {@link ErrorHandler} for this | ||||||
|  |          * Appender. | ||||||
|  |          */ | ||||||
|  |         virtual ErrorHandler* getErrorHandler(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Set the layout for this appender. Note that some appenders have | ||||||
|  |          * their own (fixed) layouts or do not use one. For example, the | ||||||
|  |          * SocketAppender ignores the layout set here. | ||||||
|  |          */ | ||||||
|  |         virtual void setLayout(std::auto_ptr<Layout> layout); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Returns the layout of this appender. The value may be NULL. | ||||||
|  |          *  | ||||||
|  |          * This class owns the returned pointer. | ||||||
|  |          */ | ||||||
|  |         virtual Layout* getLayout(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Set the filter chain on this Appender. | ||||||
|  |          */ | ||||||
|  |         void setFilter(log4cplus::spi::FilterPtr f) { filter = f; } | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Get the filter chain on this Appender. | ||||||
|  |          */ | ||||||
|  |         log4cplus::spi::FilterPtr getFilter() const { return filter; } | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Returns this appenders threshold LogLevel. See the {@link | ||||||
|  |          * #setThreshold} method for the meaning of this option. | ||||||
|  |          */ | ||||||
|  |         LogLevel getThreshold() const { return threshold; } | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Set the threshold LogLevel. All log events with lower LogLevel | ||||||
|  |          * than the threshold LogLevel are ignored by the appender. | ||||||
|  |          *  | ||||||
|  |          * In configuration files this option is specified by setting the | ||||||
|  |          * value of the <b>Threshold</b> option to a LogLevel | ||||||
|  |          * string, such as "DEBUG", "INFO" and so on. | ||||||
|  |          */ | ||||||
|  |         void setThreshold(LogLevel th) { threshold = th; } | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Check whether the message LogLevel is below the appender's | ||||||
|  |          * threshold. If there is no threshold set, then the return value is | ||||||
|  |          * always <code>true</code>. | ||||||
|  |          */ | ||||||
|  |         bool isAsSevereAsThreshold(LogLevel ll) const { | ||||||
|  |             return ((ll != NOT_SET_LOG_LEVEL) && (ll >= threshold)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     protected: | ||||||
|  |       // Methods | ||||||
|  |         /** | ||||||
|  |          * Subclasses of <code>Appender</code> should implement this | ||||||
|  |          * method to perform actual logging. | ||||||
|  |          * @see doAppend method. | ||||||
|  |          */ | ||||||
|  |         virtual void append(const log4cplus::spi::InternalLoggingEvent& event) = 0; | ||||||
|  |  | ||||||
|  |       // Data | ||||||
|  |         /** The layout variable does not need to be set if the appender | ||||||
|  |          *  implementation has its own layout. */ | ||||||
|  |         std::auto_ptr<Layout> layout; | ||||||
|  |  | ||||||
|  |         /** Appenders are named. */ | ||||||
|  |         log4cplus::tstring name; | ||||||
|  |  | ||||||
|  |         /** There is no LogLevel threshold filtering by default.  */ | ||||||
|  |         LogLevel threshold; | ||||||
|  |  | ||||||
|  |         /** The first filter in the filter chain. Set to <code>null</code> | ||||||
|  |          *  initially. */ | ||||||
|  |         log4cplus::spi::FilterPtr filter; | ||||||
|  |  | ||||||
|  |         /** It is assumed and enforced that errorHandler is never null. */ | ||||||
|  |         std::auto_ptr<ErrorHandler> errorHandler; | ||||||
|  |  | ||||||
|  |         /** Is this appender closed? */ | ||||||
|  |         bool closed; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     /** This is a pointer to an Appender. */ | ||||||
|  |     typedef helpers::SharedObjectPtr<Appender> SharedAppenderPtr; | ||||||
|  |  | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_APPENDER_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										230
									
								
								libs/log4cplus/include/log4cplus/config.h.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										230
									
								
								libs/log4cplus/include/log4cplus/config.h.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,230 @@ | |||||||
|  | /* include/log4cplus/config.h.in.  Generated from configure.in by autoheader.  */ | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_CONFIG_H | ||||||
|  |  | ||||||
|  | #define LOG4CPLUS_CONFIG_H | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `clock_gettime' function. */ | ||||||
|  | #undef HAVE_CLOCK_GETTIME | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the <dlfcn.h> header file. */ | ||||||
|  | #undef HAVE_DLFCN_H | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `ftime' function. */ | ||||||
|  | #undef HAVE_FTIME | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef HAVE_GETADDRINFO | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef HAVE_GETHOSTBYNAME_R | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `getpid' function. */ | ||||||
|  | #undef HAVE_GETPID | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `gettimeofday' function. */ | ||||||
|  | #undef HAVE_GETTIMEOFDAY | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `gmtime_r' function. */ | ||||||
|  | #undef HAVE_GMTIME_R | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `htonl' function. */ | ||||||
|  | #undef HAVE_HTONL | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `htons' function. */ | ||||||
|  | #undef HAVE_HTONS | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the <inttypes.h> header file. */ | ||||||
|  | #undef HAVE_INTTYPES_H | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `advapi32' library (-ladvapi32). */ | ||||||
|  | #undef HAVE_LIBADVAPI32 | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `kernel32' library (-lkernel32). */ | ||||||
|  | #undef HAVE_LIBKERNEL32 | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `ws2_32' library (-lws2_32). */ | ||||||
|  | #undef HAVE_LIBWS2_32 | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `localtime_r' function. */ | ||||||
|  | #undef HAVE_LOCALTIME_R | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `lstat' function. */ | ||||||
|  | #undef HAVE_LSTAT | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the <memory.h> header file. */ | ||||||
|  | #undef HAVE_MEMORY_H | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `ntohl' function. */ | ||||||
|  | #undef HAVE_NTOHL | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `ntohs' function. */ | ||||||
|  | #undef HAVE_NTOHS | ||||||
|  |  | ||||||
|  | /* Define if you have POSIX threads libraries and header files. */ | ||||||
|  | #undef HAVE_PTHREAD | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `stat' function. */ | ||||||
|  | #undef HAVE_STAT | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the <stdint.h> header file. */ | ||||||
|  | #undef HAVE_STDINT_H | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the <stdlib.h> header file. */ | ||||||
|  | #undef HAVE_STDLIB_H | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the <strings.h> header file. */ | ||||||
|  | #undef HAVE_STRINGS_H | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the <string.h> header file. */ | ||||||
|  | #undef HAVE_STRING_H | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the <sys/stat.h> header file. */ | ||||||
|  | #undef HAVE_SYS_STAT_H | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the <sys/types.h> header file. */ | ||||||
|  | #undef HAVE_SYS_TYPES_H | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the <unistd.h> header file. */ | ||||||
|  | #undef HAVE_UNISTD_H | ||||||
|  |  | ||||||
|  | /* Defined for --enable-debugging builds. */ | ||||||
|  | #undef LOG4CPLUS_DEBUGGING | ||||||
|  |  | ||||||
|  | /* Defined if the compiler understands __declspec(dllimport) or | ||||||
|  |    __attribute__((visibility("default"))) construct. */ | ||||||
|  | #undef LOG4CPLUS_DECLSPEC_EXPORT | ||||||
|  |  | ||||||
|  | /* Defined if the compiler understands __declspec(dllexport) or construct. */ | ||||||
|  | #undef LOG4CPLUS_DECLSPEC_IMPORT | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_CLOCK_GETTIME | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_ENAMETOOLONG | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_ERRNO_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_FTIME | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_GETADDRINFO | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_GETHOSTBYNAME_R | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_GETPID | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_GETTIMEOFDAY | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_GMTIME_R | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_HTONL | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_HTONS | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_LOCALTIME_R | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_LSTAT | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_NETDB_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_NETINET_IN_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_NTOHL | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_NTOHS | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_STAT | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_STDARG_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_STDIO_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_SYSLOG_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_SYS_SOCKET_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_SYS_STAT_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_SYS_TIMEB_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_SYS_TIME_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_SYS_TYPES_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_TIME_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_UNISTD_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_WCHAR_H | ||||||
|  |  | ||||||
|  | /* Define if this is a single-threaded library. */ | ||||||
|  | #undef LOG4CPLUS_SINGLE_THREADED | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_USE_PTHREADS | ||||||
|  |  | ||||||
|  | /* Define for compilers/standard libraries that support more than just the "C" | ||||||
|  |    locale. */ | ||||||
|  | #undef LOG4CPLUS_WORKING_LOCALE | ||||||
|  |  | ||||||
|  | /* Define to the sub-directory in which libtool stores uninstalled libraries. | ||||||
|  |    */ | ||||||
|  | #undef LT_OBJDIR | ||||||
|  |  | ||||||
|  | /* Define to the address where bug reports for this package should be sent. */ | ||||||
|  | #undef PACKAGE_BUGREPORT | ||||||
|  |  | ||||||
|  | /* Define to the full name of this package. */ | ||||||
|  | #undef PACKAGE_NAME | ||||||
|  |  | ||||||
|  | /* Define to the full name and version of this package. */ | ||||||
|  | #undef PACKAGE_STRING | ||||||
|  |  | ||||||
|  | /* Define to the one symbol short name of this package. */ | ||||||
|  | #undef PACKAGE_TARNAME | ||||||
|  |  | ||||||
|  | /* Define to the home page for this package. */ | ||||||
|  | #undef PACKAGE_URL | ||||||
|  |  | ||||||
|  | /* Define to the version of this package. */ | ||||||
|  | #undef PACKAGE_VERSION | ||||||
|  |  | ||||||
|  | /* Define to necessary symbol if this constant uses a non-standard name on | ||||||
|  |    your system. */ | ||||||
|  | #undef PTHREAD_CREATE_JOINABLE | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the ANSI C header files. */ | ||||||
|  | #undef STDC_HEADERS | ||||||
|  |  | ||||||
|  | /* Define to int if undefined. */ | ||||||
|  | #undef socklen_t | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_CONFIG_H | ||||||
							
								
								
									
										50
									
								
								libs/log4cplus/include/log4cplus/config.hxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								libs/log4cplus/include/log4cplus/config.hxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | |||||||
|  | //   Copyright (C) 2009, Vaclav Haisman. All rights reserved. | ||||||
|  | //    | ||||||
|  | //   Redistribution and use in source and binary forms, with or without modifica- | ||||||
|  | //   tion, are permitted provided that the following conditions are met: | ||||||
|  | //    | ||||||
|  | //   1. Redistributions of  source code must  retain the above copyright  notice, | ||||||
|  | //      this list of conditions and the following disclaimer. | ||||||
|  | //    | ||||||
|  | //   2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  | //      this list of conditions and the following disclaimer in the documentation | ||||||
|  | //      and/or other materials provided with the distribution. | ||||||
|  | //    | ||||||
|  | //   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, | ||||||
|  | //   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | ||||||
|  | //   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE | ||||||
|  | //   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT, | ||||||
|  | //   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU- | ||||||
|  | //   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS | ||||||
|  | //   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON | ||||||
|  | //   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT | ||||||
|  | //   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF | ||||||
|  | //   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_CONFIG_HXX | ||||||
|  | #define LOG4CPLUS_CONFIG_HXX | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if defined (_WIN32) | ||||||
|  | #  include <log4cplus/config/win32.h> | ||||||
|  | #elif (defined(__MWERKS__) && defined(__MACOS__)) | ||||||
|  | #  include <log4cplus/config/macosx.h> | ||||||
|  | #else | ||||||
|  | #  include <log4cplus/config/defines.hxx> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if !defined(_WIN32) | ||||||
|  | #  if !defined(LOG4CPLUS_SINGLE_THREADED) | ||||||
|  | #    define LOG4CPLUS_USE_PTHREADS | ||||||
|  | #  endif | ||||||
|  | #  if defined (INSIDE_LOG4CPLUS) | ||||||
|  | #    define LOG4CPLUS_EXPORT LOG4CPLUS_DECLSPEC_EXPORT | ||||||
|  | #  else | ||||||
|  | #    define LOG4CPLUS_EXPORT LOG4CPLUS_DECLSPEC_IMPORT | ||||||
|  | #  endif // defined (INSIDE_LOG4CPLUS) | ||||||
|  | #endif // !_WIN32 | ||||||
|  |  | ||||||
|  | #include <log4cplus/helpers/thread-config.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_CONFIG_HXX | ||||||
							
								
								
									
										113
									
								
								libs/log4cplus/include/log4cplus/config/defines.hxx.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								libs/log4cplus/include/log4cplus/config/defines.hxx.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | |||||||
|  | #ifndef LOG4CPLUS_CONFIG_DEFINES_HXX | ||||||
|  | #define LOG4CPLUS_CONFIG_DEFINES_HXX | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_SYSLOG_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_NETINET_IN_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_SYS_TYPES_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_SYS_SOCKET_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_SYS_STAT_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_SYS_TIMEB_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_SYS_TIME_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_TIME_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_NETDB_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_UNISTD_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_ERRNO_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_STDARG_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_STDIO_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_WCHAR_H | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_FTIME | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_GETADDRINFO | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_GETHOSTBYNAME_R | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_GETPID | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_GETTIMEOFDAY | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_GMTIME_R | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_HTONL | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_HTONS | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_LOCALTIME_R | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_LSTAT | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_NTOHL | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_NTOHS | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_HAVE_STAT | ||||||
|  |  | ||||||
|  | /* Define if this is a single-threaded library. */ | ||||||
|  | #undef LOG4CPLUS_SINGLE_THREADED | ||||||
|  |  | ||||||
|  | /* */ | ||||||
|  | #undef LOG4CPLUS_USE_PTHREADS | ||||||
|  |  | ||||||
|  | /* Define for compilers/standard libraries that support more than just the "C" | ||||||
|  |    locale. */ | ||||||
|  | #undef LOG4CPLUS_WORKING_LOCALE | ||||||
|  |  | ||||||
|  | /* Define to int if undefined. */ | ||||||
|  | #undef socklen_t | ||||||
|  |  | ||||||
|  | /* Defined for --enable-debugging builds. */ | ||||||
|  | #undef LOG4CPLUS_DEBUGGING | ||||||
|  |  | ||||||
|  | /* Defined if the compiler understands __declspec(export) or __attribute__((export)) construct. */ | ||||||
|  | #undef LOG4CPLUS_DECLSPEC_EXPORT | ||||||
|  |  | ||||||
|  | /* Defined if the compiler understands __declspec(import) or __attribute__((import)) construct. */ | ||||||
|  | #undef LOG4CPLUS_DECLSPEC_IMPORT | ||||||
|  |  | ||||||
|  | /* Defined if the host OS provides ENAMETOOLONG errno value. */ | ||||||
|  | #undef LOG4CPLUS_HAVE_ENAMETOOLONG | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `clock_gettime' function. */ | ||||||
|  | #undef LOG4CPLUS_HAVE_CLOCK_GETTIME | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_CONFIG_DEFINES_HXX | ||||||
							
								
								
									
										25
									
								
								libs/log4cplus/include/log4cplus/config/macosx.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								libs/log4cplus/include/log4cplus/config/macosx.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    config-macosx.h | ||||||
|  | // Created: 7/2003 | ||||||
|  | // Author:  Christopher R. Bailey | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright (C) Tad E. Smith  All rights reserved. | ||||||
|  | // | ||||||
|  | // This software is published under the terms of the Apache Software | ||||||
|  | // License version 1.1, a copy of which has been included with this | ||||||
|  | // distribution in the LICENSE.APL file. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_CONFIG_MACOSX_HEADER_ | ||||||
|  | #define LOG4CPLUS_CONFIG_MACOSX_HEADER_ | ||||||
|  |  | ||||||
|  | #if (defined(__APPLE__) || (defined(__MWERKS__) && defined(__MACOS__))) | ||||||
|  |  | ||||||
|  | #define LOG4CPLUS_HAVE_GETTIMEOFDAY 1 | ||||||
|  | #define socklen_t int | ||||||
|  |  | ||||||
|  | #endif // MACOSX | ||||||
|  | #endif // LOG4CPLUS_CONFIG_MACOSX_HEADER_ | ||||||
							
								
								
									
										96
									
								
								libs/log4cplus/include/log4cplus/config/win32.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								libs/log4cplus/include/log4cplus/config/win32.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    config-win32.h | ||||||
|  | // Created: 4/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_CONFIG_WIN32_HEADER_ | ||||||
|  | #define LOG4CPLUS_CONFIG_WIN32_HEADER_ | ||||||
|  |  | ||||||
|  | #ifdef _WIN32 | ||||||
|  | #include <windows.h> | ||||||
|  |  | ||||||
|  | #if ! defined (_WIN32_WCE) | ||||||
|  | /* Define if you have the ftime function.  */ | ||||||
|  | #define LOG4CPLUS_HAVE_FTIME 1 | ||||||
|  | #define LOG4CPLUS_HAVE_ERRNO_H | ||||||
|  | #define LOG4CPLUS_HAVE_SYS_STAT_H | ||||||
|  | #endif | ||||||
|  | #define LOG4CPLUS_HAVE_TIME_H | ||||||
|  | #define LOG4CPLUS_HAVE_STDLIB_H | ||||||
|  |  | ||||||
|  | #if defined (_WIN32_WCE) | ||||||
|  | #  define LOG4CPLUS_DLLMAIN_HINSTANCE HANDLE | ||||||
|  | #  undef LOG4CPLUS_HAVE_NT_EVENT_LOG | ||||||
|  | #else | ||||||
|  | #  define LOG4CPLUS_DLLMAIN_HINSTANCE HINSTANCE | ||||||
|  | #  define LOG4CPLUS_HAVE_NT_EVENT_LOG | ||||||
|  | #  define LOG4CPLUS_HAVE_WIN32_CONSOLE | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | // Enable Win32DebugAppender | ||||||
|  | #define LOG4CPLUS_HAVE_OUTPUTDEBUGSTRING | ||||||
|  |  | ||||||
|  | // log4cplus_EXPORTS is used by the CMake build system.  DLL_EXPORT is | ||||||
|  | // used by the autotools build system. | ||||||
|  | #if (defined (log4cplus_EXPORTS) || defined (DLL_EXPORT)) \ | ||||||
|  |     && ! defined (LOG4CPLUS_STATIC) | ||||||
|  | #  undef LOG4CPLUS_BUILD_DLL | ||||||
|  | #  define LOG4CPLUS_BUILD_DLL | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if ! defined (LOG4CPLUS_BUILD_DLL) | ||||||
|  | #  undef LOG4CPLUS_STATIC | ||||||
|  | #  define LOG4CPLUS_STATIC | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined (LOG4CPLUS_STATIC) && defined (LOG4CPLUS_BUILD_DLL) | ||||||
|  | #  error LOG4CPLUS_STATIC and LOG4CPLUS_BUILD_DLL cannot be defined both. | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined (LOG4CPLUS_BUILD_DLL) | ||||||
|  | #  if defined (INSIDE_LOG4CPLUS) | ||||||
|  | #    define LOG4CPLUS_EXPORT __declspec(dllexport) | ||||||
|  | #  else | ||||||
|  | #    define LOG4CPLUS_EXPORT __declspec(dllimport) | ||||||
|  | #  endif | ||||||
|  | #else | ||||||
|  | #  define LOG4CPLUS_EXPORT | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_SINGLE_THREADED | ||||||
|  | #  define LOG4CPLUS_USE_WIN32_THREADS | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(_MSC_VER) | ||||||
|  |   // Warning about: identifier was truncated to '255' characters in the debug information | ||||||
|  | #  pragma warning( disable : 4786 ) | ||||||
|  |   // Warning about: <type1> needs to have dll-interface to be used by clients of class <type2> | ||||||
|  | #  pragma warning( disable : 4251 ) | ||||||
|  |  | ||||||
|  | #  if _MSC_VER >= 1400 && ! defined (_WIN32_WCE) | ||||||
|  | #    define LOG4CPLUS_WORKING_LOCALE | ||||||
|  | #  endif | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // _WIN32 | ||||||
|  | #endif // LOG4CPLUS_CONFIG_WIN32_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										340
									
								
								libs/log4cplus/include/log4cplus/configurator.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										340
									
								
								libs/log4cplus/include/log4cplus/configurator.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,340 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    configurator.h | ||||||
|  | // Created: 3/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _CONFIGURATOR_HEADER_ | ||||||
|  | #define _CONFIGURATOR_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/appender.h> | ||||||
|  | #include <log4cplus/hierarchy.h> | ||||||
|  | #include <log4cplus/logger.h> | ||||||
|  | #include <log4cplus/helpers/logloguser.h> | ||||||
|  | #include <log4cplus/helpers/pointer.h> | ||||||
|  | #include <log4cplus/helpers/property.h> | ||||||
|  |  | ||||||
|  | #include <map> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus | ||||||
|  | { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Provides configuration from an external file.  See configure() for | ||||||
|  |      * the expected format. | ||||||
|  |      *  | ||||||
|  |      * <em>All option values admit variable substitution.</em> For | ||||||
|  |      * example, if <code>userhome</code> environment property is set to | ||||||
|  |      * <code>/home/xyz</code> and the File option is set to the string | ||||||
|  |      * <code>${userhome}/test.log</code>, then File option will be | ||||||
|  |      * interpreted as the string <code>/home/xyz/test.log</code>. | ||||||
|  |      *  | ||||||
|  |      * The syntax of variable substitution is similar to that of UNIX | ||||||
|  |      * shells. The string between an opening <b>"${"</b> and | ||||||
|  |      * closing <b>"}"</b> is interpreted as a key. Its value is | ||||||
|  |      * searched in the environment properties.  The corresponding value replaces | ||||||
|  |      * the ${variableName} sequence. | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT PropertyConfigurator | ||||||
|  |         : protected log4cplus::helpers::LogLogUser | ||||||
|  |     { | ||||||
|  |     public: | ||||||
|  |         enum PCFlags | ||||||
|  |         { | ||||||
|  |             fRecursiveExpansion = 0x0001, | ||||||
|  |             fShadowEnvironment  = 0x0002, | ||||||
|  |             fAllowEmptyVars     = 0x0004 | ||||||
|  |         }; | ||||||
|  |          | ||||||
|  |         // ctor and dtor | ||||||
|  |         PropertyConfigurator(const log4cplus::tstring& propertyFile, | ||||||
|  |             Hierarchy& h = Logger::getDefaultHierarchy(), unsigned flags = 0); | ||||||
|  |         PropertyConfigurator(const log4cplus::helpers::Properties& props, | ||||||
|  |             Hierarchy& h = Logger::getDefaultHierarchy(), unsigned flags = 0); | ||||||
|  |         PropertyConfigurator(log4cplus::tistream& propertyStream, | ||||||
|  |             Hierarchy& h = Logger::getDefaultHierarchy(), unsigned flags = 0); | ||||||
|  |         virtual ~PropertyConfigurator(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This method eliminates the need to create a temporary | ||||||
|  |          * <code>PropertyConfigurator</code> to configure log4cplus. | ||||||
|  |          * It is equivalent to the following:<br> | ||||||
|  |          * <code> | ||||||
|  |          * PropertyConfigurator config("filename"); | ||||||
|  |          * config.configure(); | ||||||
|  |          * </code> | ||||||
|  |          */ | ||||||
|  |         static void doConfigure(const log4cplus::tstring& configFilename, | ||||||
|  |             Hierarchy& h = Logger::getDefaultHierarchy(), unsigned flags = 0); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Read configuration from a file. <b>The existing configuration is | ||||||
|  |          * not cleared nor reset.</b> If you require a different behavior, | ||||||
|  |          * then call {@link Hierarchy::resetConfiguration | ||||||
|  |          * resetConfiguration} method before calling | ||||||
|  |          * <code>doConfigure</code>. | ||||||
|  |          * | ||||||
|  |          * The configuration file consists of statements in the format | ||||||
|  |          * <code>key=value</code>. The syntax of different configuration | ||||||
|  |          * elements are discussed below. | ||||||
|  |          * | ||||||
|  |          * <h3>Appender configuration</h3> | ||||||
|  |          * | ||||||
|  |          * Appender configuration syntax is: | ||||||
|  |          * <pre> | ||||||
|  |          * # For appender named <i>appenderName</i>, set its class. | ||||||
|  |          * # Note: The appender name can contain dots. | ||||||
|  |          * log4cplus.appender.appenderName=fully.qualified.name.of.appender.class | ||||||
|  |          * | ||||||
|  |          * # Set appender specific options. | ||||||
|  |          * log4cplus.appender.appenderName.option1=value1 | ||||||
|  |          * ... | ||||||
|  |          * log4cplus.appender.appenderName.optionN=valueN | ||||||
|  |          * </pre> | ||||||
|  |          * | ||||||
|  |          * For each named appender you can configure its {@link Layout}. The | ||||||
|  |          * syntax for configuring an appender's layout is: | ||||||
|  |          * <pre> | ||||||
|  |          * log4cplus.appender.appenderName.layout=fully.qualified.name.of.layout.class | ||||||
|  |          * log4cplus.appender.appenderName.layout.option1=value1 | ||||||
|  |          * .... | ||||||
|  |          * log4cplus.appender.appenderName.layout.optionN=valueN | ||||||
|  |          * </pre> | ||||||
|  |          * | ||||||
|  |          * <h3>Configuring loggers</h3> | ||||||
|  |          * | ||||||
|  |          * The syntax for configuring the root logger is: | ||||||
|  |          * <pre> | ||||||
|  |          * log4cplus.rootLogger=[LogLevel], appenderName, appenderName, ... | ||||||
|  |          * </pre> | ||||||
|  |          * | ||||||
|  |          * This syntax means that an optional <em>LogLevel value</em> can | ||||||
|  |          * be supplied followed by appender names separated by commas. | ||||||
|  |          * | ||||||
|  |          * The LogLevel value can consist of the string values FATAL, | ||||||
|  |          * ERROR, WARN, INFO, DEBUG or a <em>custom LogLevel</em> value. | ||||||
|  |          * | ||||||
|  |          * If a LogLevel value is specified, then the root LogLevel is set | ||||||
|  |          * to the corresponding LogLevel.  If no LogLevel value is specified, | ||||||
|  |          * then the root LogLevel remains untouched. | ||||||
|  |          * | ||||||
|  |          * The root logger can be assigned multiple appenders. | ||||||
|  |          * | ||||||
|  |          * Each <i>appenderName</i> (separated by commas) will be added to | ||||||
|  |          * the root logger. The named appender is defined using the | ||||||
|  |          * appender syntax defined above. | ||||||
|  |          * | ||||||
|  |          * For non-root loggers the syntax is almost the same: | ||||||
|  |          * <pre> | ||||||
|  |          * log4cplus.logger.logger_name=[LogLevel|INHERITED], appenderName, appenderName, ... | ||||||
|  |          * </pre> | ||||||
|  |          * | ||||||
|  |          * The meaning of the optional LogLevel value is discussed above | ||||||
|  |          * in relation to the root logger. In addition however, the value | ||||||
|  |          * INHERITED can be specified meaning that the named logger should | ||||||
|  |          * inherit its LogLevel from the logger hierarchy. | ||||||
|  |          * | ||||||
|  |          * By default loggers inherit their LogLevel from the | ||||||
|  |          * hierarchy.  However, if you set the LogLevel of a logger and | ||||||
|  |          * later decide that that logger should inherit its LogLevel, then | ||||||
|  |          * you should specify INHERITED as the value for the LogLevel value. | ||||||
|  |          * | ||||||
|  |          * Similar to the root logger syntax, each <i>appenderName</i> | ||||||
|  |          * (separated by commas) will be attached to the named logger. | ||||||
|  |          * | ||||||
|  |          * See the <a href="../../../../manual.html#additivity">appender | ||||||
|  |          * additivity rule</a> in the user manual for the meaning of the | ||||||
|  |          * <code>additivity</code> flag. | ||||||
|  |          * | ||||||
|  |          * The user can override any of the {@link | ||||||
|  |          * Hierarchy#disable} family of methods by setting the a key | ||||||
|  |          * "log4cplus.disableOverride" to <code>true</code> or any value other | ||||||
|  |          * than false. As in <pre>log4cplus.disableOverride=true </pre> | ||||||
|  |          * | ||||||
|  |          * <h3>Example</h3> | ||||||
|  |          * | ||||||
|  |          * An example configuration is given below. | ||||||
|  |          * | ||||||
|  |          * <pre> | ||||||
|  |          * | ||||||
|  |          * # Set options for appender named "A1". | ||||||
|  |          * # Appender "A1" will be a SyslogAppender | ||||||
|  |          * log4cplus.appender.A1=log4cplus::SyslogAppender | ||||||
|  |          * | ||||||
|  |          * # The syslog daemon resides on www.abc.net | ||||||
|  |          * log4cplus.appender.A1.SyslogHost=www.abc.net | ||||||
|  |          * | ||||||
|  |          * # A1's layout is a PatternLayout, using the conversion pattern | ||||||
|  |          * # <b>%r %-5p %c{2} %M.%L %x - %m\n</b>. Thus, the log output will | ||||||
|  |          * # include # the relative time since the start of the application in | ||||||
|  |          * # milliseconds, followed by the LogLevel of the log request, | ||||||
|  |          * # followed by the two rightmost components of the logger name, | ||||||
|  |          * # followed by the callers method name, followed by the line number, | ||||||
|  |          * # the nested disgnostic context and finally the message itself. | ||||||
|  |          * # Refer to the documentation of {@link PatternLayout} for further information | ||||||
|  |          * # on the syntax of the ConversionPattern key. | ||||||
|  |          * log4cplus.appender.A1.layout=log4cplus::PatternLayout | ||||||
|  |          * log4cplus.appender.A1.layout.ConversionPattern=%-4r %-5p %c{2} %M.%L %x - %m\n | ||||||
|  |          * | ||||||
|  |          * # Set options for appender named "A2" | ||||||
|  |          * # A2 should be a RollingFileAppender, with maximum file size of 10 MB | ||||||
|  |          * # using at most one backup file. A2's layout is TTCC, using the | ||||||
|  |          * # ISO8061 date format with context printing enabled. | ||||||
|  |          * log4cplus.appender.A2=log4cplus::RollingFileAppender | ||||||
|  |          * log4cplus.appender.A2.MaxFileSize=10MB | ||||||
|  |          * log4cplus.appender.A2.MaxBackupIndex=1 | ||||||
|  |          * log4cplus.appender.A2.layout=log4cplus::TTCCLayout | ||||||
|  |          * log4cplus.appender.A2.layout.ContextPrinting=enabled | ||||||
|  |          * log4cplus.appender.A2.layout.DateFormat=ISO8601 | ||||||
|  |          * | ||||||
|  |          * # Root logger set to DEBUG using the A2 appender defined above. | ||||||
|  |          * log4cplus.rootLogger=DEBUG, A2 | ||||||
|  |          * | ||||||
|  |          * # Logger definitions: | ||||||
|  |          * # The SECURITY logger inherits is LogLevel from root. However, it's output | ||||||
|  |          * # will go to A1 appender defined above. It's additivity is non-cumulative. | ||||||
|  |          * log4cplus.logger.SECURITY=INHERIT, A1 | ||||||
|  |          * log4cplus.additivity.SECURITY=false | ||||||
|  |          * | ||||||
|  |          * # Only warnings or above will be logged for the logger "SECURITY.access". | ||||||
|  |          * # Output will go to A1. | ||||||
|  |          * log4cplus.logger.SECURITY.access=WARN | ||||||
|  |          * | ||||||
|  |          * | ||||||
|  |          * # The logger "class.of.the.day" inherits its LogLevel from the | ||||||
|  |          * # logger hierarchy.  Output will go to the appender's of the root | ||||||
|  |          * # logger, A2 in this case. | ||||||
|  |          * log4cplus.logger.class.of.the.day=INHERIT | ||||||
|  |          * </pre> | ||||||
|  |          * | ||||||
|  |          * Refer to the <b>setOption</b> method in each Appender and | ||||||
|  |          * Layout for class specific options. | ||||||
|  |          * | ||||||
|  |          * Use the <code>#</code> character at the beginning of a line | ||||||
|  |          * for comments. | ||||||
|  |          */ | ||||||
|  |         virtual void configure(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * \return The return value is reference to Properties | ||||||
|  |          * container of properties with the <code>"log4cplus."</code> | ||||||
|  |          * prefix removed and references to other properties and/or | ||||||
|  |          * environment variables expanded. | ||||||
|  |          */ | ||||||
|  |         log4cplus::helpers::Properties const & getProperties () const; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * \return The return value is a reference to log4cplus::tstring | ||||||
|  |          * containing filename of properties source file. It will be | ||||||
|  |          * string "UNAVAILABLE" if the PropertyConfigurator instance has been | ||||||
|  |          * constructed using one of the other constructors that do not take | ||||||
|  |          * filename as parameter. | ||||||
|  |          */ | ||||||
|  |         log4cplus::tstring const & getPropertyFilename () const; | ||||||
|  |  | ||||||
|  |     protected: | ||||||
|  |       // Methods | ||||||
|  |         void init();  // called by the ctor | ||||||
|  |         void reconfigure(); | ||||||
|  |         void replaceEnvironVariables(); | ||||||
|  |         void configureLoggers(); | ||||||
|  |         void configureLogger(log4cplus::Logger logger, const log4cplus::tstring& config); | ||||||
|  |         void configureAppenders(); | ||||||
|  |         void configureAdditivity(); | ||||||
|  |          | ||||||
|  |         virtual Logger getLogger(const log4cplus::tstring& name); | ||||||
|  |         virtual void addAppender(Logger &logger, log4cplus::SharedAppenderPtr& appender); | ||||||
|  |  | ||||||
|  |       // Types | ||||||
|  |         typedef std::map<log4cplus::tstring, log4cplus::SharedAppenderPtr> AppenderMap; | ||||||
|  |  | ||||||
|  |       // Data | ||||||
|  |         Hierarchy& h; | ||||||
|  |         log4cplus::tstring propertyFilename; | ||||||
|  |         log4cplus::helpers::Properties properties;  | ||||||
|  |         AppenderMap appenders; | ||||||
|  |         unsigned flags; | ||||||
|  |          | ||||||
|  |     private: | ||||||
|  |       // Disable copy | ||||||
|  |         PropertyConfigurator(const PropertyConfigurator&); | ||||||
|  |         PropertyConfigurator& operator=(PropertyConfigurator&); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Use this class to quickly configure the package. For file based | ||||||
|  |      * configuration see PropertyConfigurator. BasicConfigurator | ||||||
|  |      * automatically attaches ConsoleAppender to | ||||||
|  |      * <code>rootLogger</code>, with output going to standard output, | ||||||
|  |      * using DEBUG LogLevel value. | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT BasicConfigurator : public PropertyConfigurator { | ||||||
|  |     public: | ||||||
|  |       // ctor and dtor | ||||||
|  |         BasicConfigurator(Hierarchy& h = Logger::getDefaultHierarchy()); | ||||||
|  |         virtual ~BasicConfigurator(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This method eliminates the need to create a temporary | ||||||
|  |          * <code>BasicConfigurator</code> object to configure log4cplus. | ||||||
|  |          * It is equivalent to the following:<br> | ||||||
|  |          * <code><pre> | ||||||
|  |          * BasicConfigurator config; | ||||||
|  |          * config.configure(); | ||||||
|  |          * </pre></code> | ||||||
|  |          */ | ||||||
|  |         static void doConfigure(Hierarchy& h = Logger::getDefaultHierarchy()); | ||||||
|  |          | ||||||
|  |     private: | ||||||
|  |       // Disable copy | ||||||
|  |         BasicConfigurator(const BasicConfigurator&); | ||||||
|  |         BasicConfigurator& operator=(BasicConfigurator&); | ||||||
|  |     }; | ||||||
|  |     | ||||||
|  |  | ||||||
|  | #if !defined(LOG4CPLUS_SINGLE_THREADED) | ||||||
|  |     // Forward Declarations | ||||||
|  |     class ConfigurationWatchDogThread; | ||||||
|  |      | ||||||
|  |      | ||||||
|  |     class LOG4CPLUS_EXPORT ConfigureAndWatchThread { | ||||||
|  |     public: | ||||||
|  |       // ctor and dtor | ||||||
|  |         ConfigureAndWatchThread(const log4cplus::tstring& propertyFile, | ||||||
|  |                                 unsigned int millis = 60 * 1000); | ||||||
|  |         virtual ~ConfigureAndWatchThread(); | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |       // Disallow copying of instances of this class | ||||||
|  |        ConfigureAndWatchThread(const ConfigureAndWatchThread&); | ||||||
|  |        ConfigureAndWatchThread& operator=(const ConfigureAndWatchThread&); | ||||||
|  |         | ||||||
|  |       // Data | ||||||
|  |        ConfigurationWatchDogThread * watchDogThread; | ||||||
|  |     }; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // _CONFIGURATOR_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										74
									
								
								libs/log4cplus/include/log4cplus/consoleappender.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								libs/log4cplus/include/log4cplus/consoleappender.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    consoleappender.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_CONSOLE_APPENDER_HEADER_ | ||||||
|  | #define _LOG4CPLUS_CONSOLE_APPENDER_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/appender.h> | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     /** | ||||||
|  |      * ConsoleAppender appends log events to <code>std::cout</code> or | ||||||
|  |      * <code>std::cerr</code> using a layout specified by the | ||||||
|  |      * user. The default target is <code>std::cout</code>. | ||||||
|  |      * | ||||||
|  |      * <h3>Properties</h3> | ||||||
|  |      * <dl> | ||||||
|  |      * <dt><tt>logToStdErr</tt></dt> | ||||||
|  |      * <dd>When it is set true, the output stream will be | ||||||
|  |      * <code>std::cerr</code> instead of <code>std::cout</code>.</dd> | ||||||
|  |      * | ||||||
|  |      * <dt><tt>ImmediateFlush</tt></dt> | ||||||
|  |      * <dd>When it is set true, output stream will be flushed after | ||||||
|  |      * each appended event.</dd> | ||||||
|  |      *  | ||||||
|  |      * </dl> | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT ConsoleAppender : public Appender { | ||||||
|  |     public: | ||||||
|  |       // Ctors | ||||||
|  |         ConsoleAppender(bool logToStdErr = false, bool immediateFlush = false); | ||||||
|  |         ConsoleAppender(const log4cplus::helpers::Properties properties); | ||||||
|  |  | ||||||
|  |       // Dtor | ||||||
|  |         ~ConsoleAppender(); | ||||||
|  |  | ||||||
|  |       // Methods | ||||||
|  |         virtual void close(); | ||||||
|  |  | ||||||
|  |     protected: | ||||||
|  |         virtual void append(const spi::InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |       // Data | ||||||
|  |         bool logToStdErr; | ||||||
|  |         /** | ||||||
|  |          * Immediate flush means that the underlying output stream | ||||||
|  |          * will be flushed at the end of each append operation. | ||||||
|  |          */ | ||||||
|  |         bool immediateFlush; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_CONSOLE_APPENDER_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										237
									
								
								libs/log4cplus/include/log4cplus/fileappender.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										237
									
								
								libs/log4cplus/include/log4cplus/fileappender.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,237 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    fileappender.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_FILE_APPENDER_HEADER_ | ||||||
|  | #define _LOG4CPLUS_FILE_APPENDER_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/appender.h> | ||||||
|  | #include <log4cplus/fstreams.h> | ||||||
|  | #include <log4cplus/helpers/property.h> | ||||||
|  | #include <log4cplus/helpers/timehelper.h> | ||||||
|  |  | ||||||
|  | #if defined(__DECCXX) | ||||||
|  | #   define LOG4CPLUS_OPEN_MODE_TYPE LOG4CPLUS_FSTREAM_NAMESPACE::ios::open_mode | ||||||
|  | #else | ||||||
|  | #   define LOG4CPLUS_OPEN_MODE_TYPE LOG4CPLUS_FSTREAM_NAMESPACE::ios::openmode | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Appends log events to a file. | ||||||
|  |      *  | ||||||
|  |      * <h3>Properties</h3> | ||||||
|  |      * <dl> | ||||||
|  |      * <dt><tt>File</tt></dt> | ||||||
|  |      * <dd>This property specifies output file name.</dd> | ||||||
|  |      *  | ||||||
|  |      * <dt><tt>ImmediateFlush</tt></dt> | ||||||
|  |      * <dd>When it is set true, output stream will be flushed after | ||||||
|  |      * each appended event.</dd> | ||||||
|  |      * | ||||||
|  |      * <dt><tt>Append</tt></dt> | ||||||
|  |      * <dd>When it is set true, output file will be appended to | ||||||
|  |      * instead of being truncated at opening.</dd> | ||||||
|  |      * | ||||||
|  |      * <dt><tt>ReopenDelay</tt></dt> | ||||||
|  |      * <dd>This property sets a delay after which the appender will | ||||||
|  |      * try to reopen log file again, after last logging failure. The | ||||||
|  |      * default value is 1 second. Setting the delay to 0 makes the | ||||||
|  |      * appender not to try reopening the stream. | ||||||
|  |      * </dd> | ||||||
|  |      * | ||||||
|  |      * <dt><tt>BufferSize</tt></dt> | ||||||
|  |      * <dd>Non-zero value of this property sets up buffering of output | ||||||
|  |      * stream using a buffer of given size. | ||||||
|  |      * </dd> | ||||||
|  |      * </dl> | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT FileAppender : public Appender { | ||||||
|  |     public: | ||||||
|  |       // Ctors | ||||||
|  |         FileAppender(const log4cplus::tstring& filename,  | ||||||
|  |                      LOG4CPLUS_OPEN_MODE_TYPE mode = LOG4CPLUS_FSTREAM_NAMESPACE::ios::trunc, | ||||||
|  |                      bool immediateFlush = true); | ||||||
|  |         FileAppender(const log4cplus::helpers::Properties& properties, | ||||||
|  |                      LOG4CPLUS_OPEN_MODE_TYPE mode = LOG4CPLUS_FSTREAM_NAMESPACE::ios::trunc); | ||||||
|  |  | ||||||
|  |       // Dtor | ||||||
|  |         virtual ~FileAppender(); | ||||||
|  |  | ||||||
|  |       // Methods | ||||||
|  |         virtual void close(); | ||||||
|  |  | ||||||
|  |     protected: | ||||||
|  |         virtual void append(const spi::InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |         void open(LOG4CPLUS_OPEN_MODE_TYPE mode); | ||||||
|  |         bool reopen(); | ||||||
|  |  | ||||||
|  |       // Data | ||||||
|  |         /** | ||||||
|  |          * Immediate flush means that the underlying writer or output stream | ||||||
|  |          * will be flushed at the end of each append operation. Immediate | ||||||
|  |          * flush is slower but ensures that each append request is actually | ||||||
|  |          * written. If <code>immediateFlush</code> is set to | ||||||
|  |          * <code>false</code>, then there is a good chance that the last few | ||||||
|  |          * logs events are not actually written to persistent media if and | ||||||
|  |          * when the application crashes. | ||||||
|  |          *   | ||||||
|  |          * The <code>immediateFlush</code> variable is set to | ||||||
|  |          * <code>true</code> by default. | ||||||
|  |          */ | ||||||
|  |         bool immediateFlush; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * When any append operation fails, <code>reopenDelay</code> says  | ||||||
|  |          * for how many seconds the next attempt to re-open the log file and  | ||||||
|  |          * resume logging will be delayed. If <code>reopenDelay</code> is zero,  | ||||||
|  |          * each failed append operation will cause log file to be re-opened.  | ||||||
|  |          * By default, <code>reopenDelay</code> is 1 second. | ||||||
|  |          */ | ||||||
|  |         int reopenDelay; | ||||||
|  |  | ||||||
|  |         unsigned long bufferSize; | ||||||
|  |         log4cplus::tchar * buffer; | ||||||
|  |  | ||||||
|  |         log4cplus::tofstream out; | ||||||
|  |         log4cplus::tstring filename; | ||||||
|  |  | ||||||
|  |         log4cplus::helpers::Time reopen_time; | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |         void init(const log4cplus::tstring& filename, | ||||||
|  |                   LOG4CPLUS_OPEN_MODE_TYPE mode); | ||||||
|  |  | ||||||
|  |       // Disallow copying of instances of this class | ||||||
|  |         FileAppender(const FileAppender&); | ||||||
|  |         FileAppender& operator=(const FileAppender&); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * RollingFileAppender extends FileAppender to backup the log | ||||||
|  |      * files when they reach a certain size. | ||||||
|  |      * | ||||||
|  |      * <h3>Properties</h3> | ||||||
|  |      * <p>Properties additional to {@link FileAppender}'s properties: | ||||||
|  |      * | ||||||
|  |      * <dl> | ||||||
|  |      * <dt><tt>MaxFileSize</tt></dt> | ||||||
|  |      * <dd>This property specifies maximal size of output file. The | ||||||
|  |      * value is in bytes. It is possible to use <tt>MB</tt> and | ||||||
|  |      * <tt>KB</tt> suffixes to specify the value in megabytes or | ||||||
|  |      * kilobytes instead.</dd> | ||||||
|  |      * | ||||||
|  |      * <dt><tt>MaxBackupIndex</tt></dt> | ||||||
|  |      * <dd>This property limits the number of backup output | ||||||
|  |      * files; e.g. how many <tt>log.1</tt>, <tt>log.2</tt> etc. files | ||||||
|  |      * will be kept.</dd> | ||||||
|  |      * </dl> | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT RollingFileAppender : public FileAppender { | ||||||
|  |     public: | ||||||
|  |       // Ctors | ||||||
|  |         RollingFileAppender(const log4cplus::tstring& filename, | ||||||
|  |                             long maxFileSize = 10*1024*1024, // 10 MB | ||||||
|  |                             int maxBackupIndex = 1, | ||||||
|  |                             bool immediateFlush = true); | ||||||
|  |         RollingFileAppender(const log4cplus::helpers::Properties& properties); | ||||||
|  |  | ||||||
|  |       // Dtor | ||||||
|  |         virtual ~RollingFileAppender(); | ||||||
|  |  | ||||||
|  |     protected: | ||||||
|  |         virtual void append(const spi::InternalLoggingEvent& event); | ||||||
|  |         void rollover(); | ||||||
|  |  | ||||||
|  |       // Data | ||||||
|  |         long maxFileSize; | ||||||
|  |         int maxBackupIndex; | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |         void init(long maxFileSize, int maxBackupIndex); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     enum DailyRollingFileSchedule { MONTHLY, WEEKLY, DAILY, | ||||||
|  |                                     TWICE_DAILY, HOURLY, MINUTELY}; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * DailyRollingFileAppender extends {@link FileAppender} so that the | ||||||
|  |      * underlying file is rolled over at a user chosen frequency. | ||||||
|  |      * | ||||||
|  |      * <h3>Properties</h3> | ||||||
|  |      * <p>Properties additional to {@link FileAppender}'s properties: | ||||||
|  |      * | ||||||
|  |      * <dl> | ||||||
|  |      * <dt><tt>Schedule</tt></dt> | ||||||
|  |      * <dd>This property specifies rollover schedule. The possible | ||||||
|  |      * values are <tt>MONTHLY</tt>, <tt>WEEKLY</tt>, <tt>DAILY</tt>, | ||||||
|  |      * <tt>TWICE_DAILY</tt>, <tt>HOURLY</tt> and | ||||||
|  |      * <tt>MINUTELY</tt>.</dd> | ||||||
|  |      * | ||||||
|  |      * <dt><tt>MaxBackupIndex</tt></dt> | ||||||
|  |      * <dd>This property limits how many backup files are kept per | ||||||
|  |      * single logging period; e.g. how many <tt>log.2009-11-07.1</tt>, | ||||||
|  |      * <tt>log.2009-11-07.2</tt> etc. files are kept.</dd> | ||||||
|  |      * | ||||||
|  |      * </dl> | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT DailyRollingFileAppender : public FileAppender { | ||||||
|  |     public: | ||||||
|  |       // Ctors | ||||||
|  |         DailyRollingFileAppender(const log4cplus::tstring& filename, | ||||||
|  |                                  DailyRollingFileSchedule schedule = DAILY, | ||||||
|  |                                  bool immediateFlush = true, | ||||||
|  |                                  int maxBackupIndex = 10); | ||||||
|  |         DailyRollingFileAppender(const log4cplus::helpers::Properties& properties); | ||||||
|  |  | ||||||
|  |       // Dtor | ||||||
|  |         virtual ~DailyRollingFileAppender(); | ||||||
|  |          | ||||||
|  |       // Methods | ||||||
|  |         virtual void close(); | ||||||
|  |  | ||||||
|  |     protected: | ||||||
|  |         virtual void append(const spi::InternalLoggingEvent& event); | ||||||
|  |         void rollover(); | ||||||
|  |         log4cplus::helpers::Time calculateNextRolloverTime(const log4cplus::helpers::Time& t) const; | ||||||
|  |         log4cplus::tstring getFilename(const log4cplus::helpers::Time& t) const; | ||||||
|  |  | ||||||
|  |       // Data | ||||||
|  |         DailyRollingFileSchedule schedule; | ||||||
|  |         log4cplus::tstring scheduledFilename; | ||||||
|  |         log4cplus::helpers::Time nextRolloverTime; | ||||||
|  |         int maxBackupIndex; | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |         void init(DailyRollingFileSchedule schedule); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_FILE_APPENDER_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										50
									
								
								libs/log4cplus/include/log4cplus/fstreams.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								libs/log4cplus/include/log4cplus/fstreams.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    fstreams.h | ||||||
|  | // Created: 4/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_FSTREAMS_HEADER_ | ||||||
|  | #define LOG4CPLUS_FSTREAMS_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  |  | ||||||
|  | #include <fstream> | ||||||
|  |  | ||||||
|  | #if defined(__DECCXX) && !defined(__USE_STD_IOSTREAM) | ||||||
|  | #  define LOG4CPLUS_FSTREAM_NAMESPACE | ||||||
|  | #else | ||||||
|  | #  define LOG4CPLUS_FSTREAM_NAMESPACE std | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifdef UNICODE | ||||||
|  |     namespace log4cplus { | ||||||
|  |         typedef LOG4CPLUS_FSTREAM_NAMESPACE::wofstream tofstream; | ||||||
|  |         typedef LOG4CPLUS_FSTREAM_NAMESPACE::wifstream tifstream; | ||||||
|  |     } | ||||||
|  | #else | ||||||
|  |     namespace log4cplus { | ||||||
|  |         typedef LOG4CPLUS_FSTREAM_NAMESPACE::ofstream tofstream; | ||||||
|  |         typedef LOG4CPLUS_FSTREAM_NAMESPACE::ifstream tifstream; | ||||||
|  |     } | ||||||
|  | #endif // UNICODE | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_FSTREAMS_HEADER_ | ||||||
|  |  | ||||||
| @@ -0,0 +1,112 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    appenderattachableimpl.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_HELPERS_APPENDER_ATTACHABLE_IMPL_HEADER_ | ||||||
|  | #define _LOG4CPLUS_HELPERS_APPENDER_ATTACHABLE_IMPL_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/layout.h> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  | #include <log4cplus/helpers/logloguser.h> | ||||||
|  | #include <log4cplus/helpers/pointer.h> | ||||||
|  | #include <log4cplus/helpers/threads.h> | ||||||
|  | #include <log4cplus/spi/appenderattachable.h> | ||||||
|  |  | ||||||
|  | #include <memory> | ||||||
|  | #include <vector> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     namespace helpers { | ||||||
|  |   | ||||||
|  |         /** | ||||||
|  |          * This Interface is for attaching Appenders to objects. | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT AppenderAttachableImpl  | ||||||
|  |                                    : public log4cplus::spi::AppenderAttachable, | ||||||
|  |                                      protected log4cplus::helpers::LogLogUser | ||||||
|  |         { | ||||||
|  |         public: | ||||||
|  |           // Data | ||||||
|  |             LOG4CPLUS_MUTEX_PTR_DECLARE appender_list_mutex; | ||||||
|  |  | ||||||
|  |           // Ctors | ||||||
|  |             AppenderAttachableImpl(); | ||||||
|  |  | ||||||
|  |           // Dtor | ||||||
|  |             virtual ~AppenderAttachableImpl(); | ||||||
|  |  | ||||||
|  |           // Methods | ||||||
|  |             /** | ||||||
|  |              * Add an appender.  If the appender is already in the list in | ||||||
|  |              * won't be added again. | ||||||
|  |              */ | ||||||
|  |             virtual void addAppender(SharedAppenderPtr newAppender); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Get all previously added appenders as an vectory. | ||||||
|  |              */ | ||||||
|  |             virtual SharedAppenderPtrList getAllAppenders(); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Look for an attached appender named as <code>name</code>. | ||||||
|  |              * | ||||||
|  |              * Return the appender with that name if in the list. Return null | ||||||
|  |              * otherwise.   | ||||||
|  |              */ | ||||||
|  |             virtual SharedAppenderPtr getAppender(const log4cplus::tstring& name); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Remove all previously added appenders. | ||||||
|  |              */ | ||||||
|  |             virtual void removeAllAppenders(); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Remove the appender passed as parameter from the list of appenders. | ||||||
|  |              */ | ||||||
|  |             virtual void removeAppender(SharedAppenderPtr appender); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Remove the appender with the name passed as parameter from the | ||||||
|  |              * list of appenders.   | ||||||
|  |              */ | ||||||
|  |             virtual void removeAppender(const log4cplus::tstring& name); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Call the <code>doAppend</code> method on all attached appenders.   | ||||||
|  |              */ | ||||||
|  |             int appendLoopOnAppenders(const spi::InternalLoggingEvent& event) const; | ||||||
|  |  | ||||||
|  |         protected: | ||||||
|  |           // Types | ||||||
|  |             typedef std::vector<SharedAppenderPtr> ListType; | ||||||
|  |  | ||||||
|  |           // Data | ||||||
|  |             /** Array of appenders. */ | ||||||
|  |             ListType appenderList; | ||||||
|  |         };  // end class AppenderAttachableImpl | ||||||
|  |  | ||||||
|  |     } // end namespace helpers | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_HELPERS_APPENDER_ATTACHABLE_IMPL_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										113
									
								
								libs/log4cplus/include/log4cplus/helpers/loglog.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								libs/log4cplus/include/log4cplus/helpers/loglog.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    loglog.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_HELPERS_LOGLOG | ||||||
|  | #define _LOG4CPLUS_HELPERS_LOGLOG | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  | #include <log4cplus/helpers/pointer.h> | ||||||
|  | #include <log4cplus/helpers/threads.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     namespace helpers { | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This class used to output log statements from within the log4cplus package. | ||||||
|  |          * | ||||||
|  |          * Log4cplus components cannot make log4cplus logging calls. However, it is | ||||||
|  |          * sometimes useful for the user to learn about what log4cplus is | ||||||
|  |          * doing. You can enable log4cplus internal logging by defining the | ||||||
|  |          * <b>log4cplus.configDebug</b> variable. | ||||||
|  |          * | ||||||
|  |          * All log4cplus internal debug calls go to <code>cout</code> | ||||||
|  |          * where as internal error messages are sent to | ||||||
|  |          * <code>cerr</code>. All internal messages are prepended with | ||||||
|  |          * the string "log4clus: ". | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT LogLog | ||||||
|  |             : public virtual log4cplus::helpers::SharedObject  | ||||||
|  |         { | ||||||
|  |         public: | ||||||
|  |           // Static methods | ||||||
|  |             /** | ||||||
|  |              * Returns a reference to the <code>LogLog</code> singleton. | ||||||
|  |              */ | ||||||
|  |             static log4cplus::helpers::SharedObjectPtr<LogLog> getLogLog(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Allows to enable/disable log4cplus internal logging. | ||||||
|  |              */ | ||||||
|  |             void setInternalDebugging(bool enabled); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * In quite mode no LogLog generates strictly no output, not even | ||||||
|  |              * for errors.  | ||||||
|  |              * | ||||||
|  |              * @param quietMode A true for not | ||||||
|  |              */ | ||||||
|  |             void setQuietMode(bool quietMode); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * This method is used to output log4cplus internal debug | ||||||
|  |              * statements. Output goes to <code>std::cout</code>. | ||||||
|  |              */ | ||||||
|  |             void debug(const log4cplus::tstring& msg); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * This method is used to output log4cplus internal error | ||||||
|  |              * statements. There is no way to disable error statements. | ||||||
|  |              * Output goes to <code>std::cerr</code>. | ||||||
|  |              */ | ||||||
|  |             void error(const log4cplus::tstring& msg); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * This method is used to output log4cplus internal warning | ||||||
|  |              * statements. There is no way to disable warning statements. | ||||||
|  |              * Output goes to <code>std::cerr</code>. | ||||||
|  |              */ | ||||||
|  |             void warn(const log4cplus::tstring& msg); | ||||||
|  |  | ||||||
|  |           // Dtor | ||||||
|  |             virtual ~LogLog(); | ||||||
|  |  | ||||||
|  |           // Data | ||||||
|  |             LOG4CPLUS_MUTEX_PTR_DECLARE mutex; | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |           // Data | ||||||
|  |             bool debugEnabled; | ||||||
|  |             bool quietMode; | ||||||
|  |  | ||||||
|  |           // Ctors | ||||||
|  |             LogLog(); | ||||||
|  |             LogLog(const LogLog&); | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |     } // end namespace helpers | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_HELPERS_LOGLOG | ||||||
|  |  | ||||||
							
								
								
									
										62
									
								
								libs/log4cplus/include/log4cplus/helpers/logloguser.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								libs/log4cplus/include/log4cplus/helpers/logloguser.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    logloguser.h | ||||||
|  | // Created: 6/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_HELPERS_LOGLOG_USER | ||||||
|  | #define _LOG4CPLUS_HELPERS_LOGLOG_USER | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     namespace helpers { | ||||||
|  |         // forward declarations | ||||||
|  |         class LogLog; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This class used to simplify the use of the LogLog class.  Any class | ||||||
|  |          * that uses the LogLog class should extend this class and retrieve | ||||||
|  |          * their reference to LogLog using the method provided. | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT LogLogUser { | ||||||
|  |         public: | ||||||
|  |           // ctor and dtor | ||||||
|  |             LogLogUser(); | ||||||
|  |             LogLogUser(const LogLogUser&); | ||||||
|  |             virtual ~LogLogUser(); | ||||||
|  |  | ||||||
|  |           // public methods | ||||||
|  |             LogLog& getLogLog() const; | ||||||
|  |              | ||||||
|  |           // operators | ||||||
|  |             LogLogUser& operator=(const LogLogUser& rhs); | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |           // Data | ||||||
|  |             void* loglogRef; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |     } // end namespace helpers | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_HELPERS_LOGLOG_USER | ||||||
|  |  | ||||||
							
								
								
									
										160
									
								
								libs/log4cplus/include/log4cplus/helpers/pointer.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								libs/log4cplus/include/log4cplus/helpers/pointer.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,160 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    pointer.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Note: Some of this code uses ideas from "More Effective C++" by Scott | ||||||
|  | // Myers, Addison Wesley Longmain, Inc., (c) 1996, Chapter 29, pp. 183-213 | ||||||
|  | // | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_HELPERS_POINTERS_HEADER_ | ||||||
|  | #define _LOG4CPLUS_HELPERS_POINTERS_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <memory> | ||||||
|  | #include <stdexcept> | ||||||
|  | #include <string> | ||||||
|  | #include <algorithm> | ||||||
|  | #include <cassert> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     namespace helpers { | ||||||
|  |  | ||||||
|  |         /****************************************************************************** | ||||||
|  |          *                       Class SharedObject (from pp. 204-205)                * | ||||||
|  |          ******************************************************************************/ | ||||||
|  |  | ||||||
|  |         class LOG4CPLUS_EXPORT SharedObject | ||||||
|  |         { | ||||||
|  |         public: | ||||||
|  |             void addReference() const; | ||||||
|  |             void removeReference() const; | ||||||
|  |  | ||||||
|  |         protected: | ||||||
|  |           // Ctor | ||||||
|  |             SharedObject() | ||||||
|  |                 : access_mutex(LOG4CPLUS_MUTEX_CREATE) | ||||||
|  |                 , count(0) | ||||||
|  |             { } | ||||||
|  |  | ||||||
|  |             SharedObject(const SharedObject&) | ||||||
|  |                 : access_mutex(LOG4CPLUS_MUTEX_CREATE) | ||||||
|  |                 , count(0) | ||||||
|  |             { } | ||||||
|  |  | ||||||
|  |           // Dtor | ||||||
|  |             virtual ~SharedObject(); | ||||||
|  |  | ||||||
|  |           // Operators | ||||||
|  |             SharedObject& operator=(const SharedObject&) { return *this; } | ||||||
|  |  | ||||||
|  |         public: | ||||||
|  |             LOG4CPLUS_MUTEX_PTR_DECLARE access_mutex; | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |             mutable int count; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /****************************************************************************** | ||||||
|  |          *           Template Class SharedObjectPtr (from pp. 203, 206)               * | ||||||
|  |          ******************************************************************************/ | ||||||
|  |         template<class T> | ||||||
|  |         class SharedObjectPtr | ||||||
|  |         { | ||||||
|  |         public: | ||||||
|  |             // Ctor | ||||||
|  |             explicit | ||||||
|  |             SharedObjectPtr(T* realPtr = 0) | ||||||
|  |                 : pointee(realPtr) | ||||||
|  |             { | ||||||
|  |                 addref (); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             SharedObjectPtr(const SharedObjectPtr& rhs) | ||||||
|  |                 : pointee(rhs.pointee) | ||||||
|  |             { | ||||||
|  |                 addref (); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // Dtor | ||||||
|  |             ~SharedObjectPtr() | ||||||
|  |             { | ||||||
|  |                 if (pointee) | ||||||
|  |                     pointee->removeReference(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // Operators | ||||||
|  |             bool operator==(const SharedObjectPtr& rhs) const { return (pointee == rhs.pointee); } | ||||||
|  |             bool operator!=(const SharedObjectPtr& rhs) const { return (pointee != rhs.pointee); } | ||||||
|  |             bool operator==(const T* rhs) const { return (pointee == rhs); } | ||||||
|  |             bool operator!=(const T* rhs) const { return (pointee != rhs); } | ||||||
|  |             T* operator->() const {assert (pointee); return pointee; } | ||||||
|  |             T& operator*() const {assert (pointee); return *pointee; } | ||||||
|  |  | ||||||
|  |             SharedObjectPtr& operator=(const SharedObjectPtr& rhs) | ||||||
|  |             { | ||||||
|  |                 return this->operator = (rhs.pointee); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             SharedObjectPtr& operator=(T* rhs) | ||||||
|  |             { | ||||||
|  |                 SharedObjectPtr<T> (rhs).swap (*this); | ||||||
|  |                 return *this; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |           // Methods | ||||||
|  |             T* get() const { return pointee; } | ||||||
|  |  | ||||||
|  |             void swap (SharedObjectPtr & other) throw () | ||||||
|  |             { | ||||||
|  |                 std::swap (pointee, other.pointee); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             typedef T * (SharedObjectPtr:: * unspec_bool_type) () const; | ||||||
|  |             operator unspec_bool_type () const | ||||||
|  |             { | ||||||
|  |                 return pointee ? &SharedObjectPtr::get : 0; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             bool operator ! () const | ||||||
|  |             { | ||||||
|  |                 return ! pointee; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |           // Methods | ||||||
|  |             void addref() const | ||||||
|  |             { | ||||||
|  |                 if (pointee) | ||||||
|  |                     pointee->addReference(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |           // Data | ||||||
|  |             T* pointee; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |     } // end namespace helpers | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_HELPERS_POINTERS_HEADER_ | ||||||
							
								
								
									
										123
									
								
								libs/log4cplus/include/log4cplus/helpers/property.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								libs/log4cplus/include/log4cplus/helpers/property.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,123 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    property.h | ||||||
|  | // Created: 2/2002 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2002-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_HELPERS_PROPERTY_HEADER_ | ||||||
|  | #define LOG4CPLUS_HELPERS_PROPERTY_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/streams.h> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  | #include <map> | ||||||
|  | #include <vector> | ||||||
|  |  | ||||||
|  | #if (defined(__MWERKS__) && defined(__MACOS__)) | ||||||
|  | using std::size_t; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     namespace helpers { | ||||||
|  |  | ||||||
|  |         class LOG4CPLUS_EXPORT Properties { | ||||||
|  |         public: | ||||||
|  |             Properties(); | ||||||
|  |             explicit Properties(log4cplus::tistream& input); | ||||||
|  |             explicit Properties(const log4cplus::tstring& inputFile); | ||||||
|  |             virtual ~Properties(); | ||||||
|  |  | ||||||
|  |           // constants | ||||||
|  |             static const tchar PROPERTIES_COMMENT_CHAR; | ||||||
|  |  | ||||||
|  |           // methods | ||||||
|  |             /** | ||||||
|  |              * Tests to see if <code>key</code> can be found in this map. | ||||||
|  |              */ | ||||||
|  |             bool exists(const log4cplus::tstring& key) const { | ||||||
|  |                 return data.find(key) != data.end(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Returns the number of entries in this map. | ||||||
|  |              */ | ||||||
|  |             size_t size() const { | ||||||
|  |                 return data.size(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Searches for the property with the specified key in this property | ||||||
|  |              * list. If the key is not found in this property list, the default | ||||||
|  |              * property list, and its defaults, recursively, are then checked.  | ||||||
|  |              * The method returns <code>null</code> if the property is not found. | ||||||
|  |              */ | ||||||
|  |             log4cplus::tstring getProperty(const log4cplus::tstring& key) const; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Searches for the property with the specified key in this property | ||||||
|  |              * list. If the key is not found in this property list, the default | ||||||
|  |              * property list, and its defaults, recursively, are then checked.  | ||||||
|  |              * The method returns the default value argument if the property is  | ||||||
|  |              * not found. | ||||||
|  |              */ | ||||||
|  |             log4cplus::tstring getProperty(const log4cplus::tstring& key, | ||||||
|  |                                            const log4cplus::tstring& defaultVal) const; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Returns all the keys in this property list. | ||||||
|  |              */ | ||||||
|  |             std::vector<log4cplus::tstring> propertyNames() const; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Inserts <code>value</code> into this map indexed by <code>key</code>. | ||||||
|  |              */ | ||||||
|  |             void setProperty(const log4cplus::tstring& key, const log4cplus::tstring& value); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Removed the property index by <code>key</code> from this map. | ||||||
|  |              */ | ||||||
|  |             bool removeProperty(const log4cplus::tstring& key); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Returns a subset of the "properties" whose keys start with | ||||||
|  |              * "prefix".  The returned "properties" have "prefix" trimmed from | ||||||
|  |              * their keys. | ||||||
|  |              */ | ||||||
|  |             Properties getPropertySubset(const log4cplus::tstring& prefix) const; | ||||||
|  |  | ||||||
|  |         protected: | ||||||
|  |           // Types | ||||||
|  | //            LOG4CPLUS_EXPIMP_TEMPLATE template class LOG4CPLUS_EXPORT std::map<log4cplus::tstring, log4cplus::tstring>; | ||||||
|  |             typedef std::map<log4cplus::tstring, log4cplus::tstring> StringMap; | ||||||
|  |  | ||||||
|  |           // Methods | ||||||
|  |             void init(log4cplus::tistream& input); | ||||||
|  |  | ||||||
|  |           // Data | ||||||
|  |             StringMap data; | ||||||
|  |         }; | ||||||
|  |     } // end namespace helpers | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_HELPERS_PROPERTY_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										38
									
								
								libs/log4cplus/include/log4cplus/helpers/sleep.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								libs/log4cplus/include/log4cplus/helpers/sleep.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    sleep.h | ||||||
|  | // Created: 5/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_HELPERS_SLEEP_HEADER_ | ||||||
|  | #define _LOG4CPLUS_HELPERS_SLEEP_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     namespace helpers { | ||||||
|  |         LOG4CPLUS_EXPORT void sleep(unsigned long secs,  | ||||||
|  |                                     unsigned long nanosecs = 0); | ||||||
|  |         LOG4CPLUS_EXPORT void sleepmillis(unsigned long millis); | ||||||
|  |     } // end namespace helpers | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_HELPERS_SLEEP_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										128
									
								
								libs/log4cplus/include/log4cplus/helpers/socket.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								libs/log4cplus/include/log4cplus/helpers/socket.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,128 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    socket.h | ||||||
|  | // Created: 4/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_HELPERS_SOCKET_HEADER_ | ||||||
|  | #define LOG4CPLUS_HELPERS_SOCKET_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  | #include <log4cplus/helpers/socketbuffer.h> | ||||||
|  | #if defined(_WIN32) | ||||||
|  | #include <winsock.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     namespace helpers { | ||||||
|  |  | ||||||
|  |         enum SocketState { ok, | ||||||
|  |                            not_opened, | ||||||
|  |                            bad_address, | ||||||
|  |                            connection_failed, | ||||||
|  |                            broken_pipe,  | ||||||
|  |                            invalid_access_mode, | ||||||
|  |                            message_truncated | ||||||
|  |                          }; | ||||||
|  |  | ||||||
|  | #if !defined(_WIN32) | ||||||
|  |         typedef int SOCKET_TYPE; | ||||||
|  | #define INVALID_SOCKET -1 | ||||||
|  | #else | ||||||
|  |         typedef SOCKET SOCKET_TYPE; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |         class LOG4CPLUS_EXPORT AbstractSocket { | ||||||
|  |         public: | ||||||
|  |           // ctor and dtor | ||||||
|  |             AbstractSocket(); | ||||||
|  |             AbstractSocket(SOCKET_TYPE sock, SocketState state, int err); | ||||||
|  |             AbstractSocket(const AbstractSocket&); | ||||||
|  |             virtual ~AbstractSocket() = 0; | ||||||
|  |  | ||||||
|  |           // methods | ||||||
|  |             /// Close socket | ||||||
|  |             virtual void close(); | ||||||
|  |             virtual bool isOpen() const; | ||||||
|  |  | ||||||
|  |             AbstractSocket& operator=(const AbstractSocket& rhs); | ||||||
|  |  | ||||||
|  |         protected: | ||||||
|  |           // Methods | ||||||
|  |             virtual void copy(const AbstractSocket& rhs); | ||||||
|  |  | ||||||
|  |           // Data | ||||||
|  |             SOCKET_TYPE sock; | ||||||
|  |             SocketState state; | ||||||
|  |             int err; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This class implements client sockets (also called just "sockets"). | ||||||
|  |          * A socket is an endpoint for communication between two machines. | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT Socket : public AbstractSocket { | ||||||
|  |         public: | ||||||
|  |           // ctor and dtor | ||||||
|  |             Socket(); | ||||||
|  |             Socket(SOCKET_TYPE sock, SocketState state, int err); | ||||||
|  |             Socket(const tstring& address, int port); | ||||||
|  |             virtual ~Socket(); | ||||||
|  |  | ||||||
|  |           // methods | ||||||
|  |             virtual bool read(SocketBuffer& buffer); | ||||||
|  |             virtual bool write(const SocketBuffer& buffer); | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This class implements server sockets. A server socket waits for | ||||||
|  |          * requests to come in over the network. It performs some operation | ||||||
|  |          * based on that request, and then possibly returns a result to the | ||||||
|  |          * requester. | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT ServerSocket : public AbstractSocket { | ||||||
|  |         public: | ||||||
|  |           // ctor and dtor | ||||||
|  |             ServerSocket(int port); | ||||||
|  |             virtual ~ServerSocket(); | ||||||
|  |  | ||||||
|  |             Socket accept(); | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         LOG4CPLUS_EXPORT SOCKET_TYPE openSocket(unsigned short port, SocketState& state); | ||||||
|  |         LOG4CPLUS_EXPORT SOCKET_TYPE connectSocket(const log4cplus::tstring& hostn, | ||||||
|  |                                                    unsigned short port, SocketState& state); | ||||||
|  |         LOG4CPLUS_EXPORT SOCKET_TYPE acceptSocket(SOCKET_TYPE sock, SocketState& state); | ||||||
|  |         LOG4CPLUS_EXPORT int closeSocket(SOCKET_TYPE sock); | ||||||
|  |  | ||||||
|  |         LOG4CPLUS_EXPORT long read(SOCKET_TYPE sock, SocketBuffer& buffer); | ||||||
|  |         LOG4CPLUS_EXPORT long write(SOCKET_TYPE sock, const SocketBuffer& buffer); | ||||||
|  |  | ||||||
|  |         LOG4CPLUS_EXPORT tstring getHostname (bool fqdn); | ||||||
|  |  | ||||||
|  |     } // end namespace helpers | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_HELPERS_SOCKET_HEADER_ | ||||||
							
								
								
									
										79
									
								
								libs/log4cplus/include/log4cplus/helpers/socketbuffer.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								libs/log4cplus/include/log4cplus/helpers/socketbuffer.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    socketbuffer.h | ||||||
|  | // Created: 5/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_HELPERS_SOCKET_BUFFER_HEADER_ | ||||||
|  | #define LOG4CPLUS_HELPERS_SOCKET_BUFFER_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  | #include <log4cplus/helpers/logloguser.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     namespace helpers { | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT SocketBuffer : protected log4cplus::helpers::LogLogUser | ||||||
|  |         { | ||||||
|  |         public: | ||||||
|  |             SocketBuffer(size_t max); | ||||||
|  |             SocketBuffer(const SocketBuffer& rhs); | ||||||
|  |             ~SocketBuffer(); | ||||||
|  |  | ||||||
|  |             SocketBuffer& operator=(const SocketBuffer& rhs); | ||||||
|  |  | ||||||
|  |             char *getBuffer() const { return buffer; } | ||||||
|  |             size_t getMaxSize() const { return maxsize; } | ||||||
|  |             size_t getSize() const { return size; } | ||||||
|  |             void setSize(size_t s) { size = s; } | ||||||
|  |             size_t getPos() const { return pos; } | ||||||
|  |  | ||||||
|  |             unsigned char readByte(); | ||||||
|  |             unsigned short readShort(); | ||||||
|  |             unsigned int readInt(); | ||||||
|  |             tstring readString(unsigned char sizeOfChar); | ||||||
|  |  | ||||||
|  |             void appendByte(unsigned char val); | ||||||
|  |             void appendShort(unsigned short val); | ||||||
|  |             void appendInt(unsigned int val); | ||||||
|  |             void appendSize_t(size_t val); | ||||||
|  |             void appendString(const tstring& str); | ||||||
|  |             void appendBuffer(const SocketBuffer& buffer); | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |           // Methods | ||||||
|  |             void copy(const SocketBuffer& rhs); | ||||||
|  |  | ||||||
|  |           // Data | ||||||
|  |             size_t maxsize; | ||||||
|  |             size_t size; | ||||||
|  |             size_t pos; | ||||||
|  |             char *buffer; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |     } // end namespace helpers | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_HELPERS_SOCKET_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										239
									
								
								libs/log4cplus/include/log4cplus/helpers/stringhelper.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										239
									
								
								libs/log4cplus/include/log4cplus/helpers/stringhelper.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,239 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    stringhelper.h | ||||||
|  | // Created: 3/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_HELPERS_STRINGHELPER_HEADER_ | ||||||
|  | #define LOG4CPLUS_HELPERS_STRINGHELPER_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  |  | ||||||
|  | #include <algorithm> | ||||||
|  | #include <limits> | ||||||
|  | #include <iterator> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     namespace helpers { | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Returns <code>s</code> in upper case. | ||||||
|  |          */ | ||||||
|  |         LOG4CPLUS_EXPORT log4cplus::tstring toUpper(const log4cplus::tstring& s); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Returns <code>s</code> in lower case. | ||||||
|  |          */ | ||||||
|  |         LOG4CPLUS_EXPORT log4cplus::tstring toLower(const log4cplus::tstring& s); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Tokenize <code>s</code> using <code>c</code> as the delimiter and | ||||||
|  |          * put the resulting tokens in <code>_result</code>.  If | ||||||
|  |          * <code>collapseTokens</code> is false, multiple adjacent delimiters | ||||||
|  |          * will result in zero length tokens. | ||||||
|  |          * | ||||||
|  |          * <b>Example:</b> | ||||||
|  |          * <pre> | ||||||
|  |          *   string s = // Set string with '.' as delimiters | ||||||
|  |          *   list<log4cplus::tstring> tokens; | ||||||
|  |          *   tokenize(s, '.', back_insert_iterator<list<string> >(tokens)); | ||||||
|  |          * </pre> | ||||||
|  |          */ | ||||||
|  |         template <class StringType, class OutputIter> | ||||||
|  |         inline | ||||||
|  |         void | ||||||
|  |         tokenize(const StringType& s, typename StringType::value_type c, | ||||||
|  |             OutputIter result, bool collapseTokens = true) | ||||||
|  |         { | ||||||
|  |             typedef typename StringType::size_type size_type; | ||||||
|  |             size_type const slen = s.length(); | ||||||
|  |             size_type first = 0; | ||||||
|  |             size_type i = 0; | ||||||
|  |             for (i=0; i < slen; ++i) | ||||||
|  |             { | ||||||
|  |                 if (s[i] == c) | ||||||
|  |                 { | ||||||
|  |                     *result = StringType (s, first, i - first); | ||||||
|  |                     ++result; | ||||||
|  |                     if (collapseTokens) | ||||||
|  |                         while (i+1 < slen && s[i+1] == c) | ||||||
|  |                             ++i; | ||||||
|  |                     first = i + 1; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             if (first != i) | ||||||
|  |                 *result = StringType (s, first, i - first); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         template <typename intType, bool isSigned> | ||||||
|  |         struct ConvertIntegerToStringHelper; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         template <typename intType> | ||||||
|  |         struct ConvertIntegerToStringHelper<intType, true> | ||||||
|  |         { | ||||||
|  |             static inline | ||||||
|  |             void | ||||||
|  |             step1 (tchar * & it, intType & value) | ||||||
|  |             { | ||||||
|  |                 // The sign of the result of the modulo operator is | ||||||
|  |                 // implementation defined. That's why we work with | ||||||
|  |                 // positive counterpart instead. Also, in twos | ||||||
|  |                 // complement arithmetic the smallest negative number | ||||||
|  |                 // does not have positive counterpart; the range is | ||||||
|  |                 // asymetric. That's why we handle the case of value | ||||||
|  |                 // == min() specially here. | ||||||
|  |                 if (value == (std::numeric_limits<intType>::min) ()) | ||||||
|  |                 { | ||||||
|  |                     intType const r = value / 10; | ||||||
|  |                     intType const a = (-r) * 10; | ||||||
|  |                     intType const mod = -(a + value); | ||||||
|  |                     value = -r; | ||||||
|  |  | ||||||
|  |                     *(it - 1) = LOG4CPLUS_TEXT('0') + static_cast<tchar>(mod); | ||||||
|  |                     --it; | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                     value = -value; | ||||||
|  |             } | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         template <typename intType> | ||||||
|  |         struct ConvertIntegerToStringHelper<intType, false> | ||||||
|  |         { | ||||||
|  |             static inline | ||||||
|  |             void | ||||||
|  |             step1 (tchar * &, intType &) | ||||||
|  |             { | ||||||
|  |                 // This will never be called for unsigned types. | ||||||
|  |             } | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         template<class intType> | ||||||
|  |         inline | ||||||
|  |         void | ||||||
|  |         convertIntegerToString (tstring & str, intType value) | ||||||
|  |         { | ||||||
|  |             typedef std::numeric_limits<intType> intTypeLimits; | ||||||
|  |             typedef ConvertIntegerToStringHelper<intType, | ||||||
|  |                 intTypeLimits::is_signed> HelperType; | ||||||
|  |  | ||||||
|  |             const size_t buffer_size | ||||||
|  |                 = intTypeLimits::digits10 + 2; | ||||||
|  |             tchar buffer[buffer_size]; | ||||||
|  |             tchar * it = &buffer[buffer_size]; | ||||||
|  |             tchar const * const buf_end = it; | ||||||
|  |  | ||||||
|  |             if (value == 0) | ||||||
|  |             { | ||||||
|  |                 --it; | ||||||
|  |                 *it = LOG4CPLUS_TEXT('0'); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             bool const negative = value < 0; | ||||||
|  |             if (negative) | ||||||
|  |                 HelperType::step1 (it, value); | ||||||
|  |  | ||||||
|  |             for (; value != 0; --it) | ||||||
|  |             { | ||||||
|  |                 intType mod = value % 10; | ||||||
|  |                 value = value / 10; | ||||||
|  |                 *(it - 1) = LOG4CPLUS_TEXT('0') + static_cast<tchar>(mod); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (negative) | ||||||
|  |             { | ||||||
|  |                 --it; | ||||||
|  |                 *it = LOG4CPLUS_TEXT('-'); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             str.assign (static_cast<tchar const *>(it), buf_end); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         template<class intType> | ||||||
|  |         inline | ||||||
|  |         tstring | ||||||
|  |         convertIntegerToString (intType value) | ||||||
|  |         { | ||||||
|  |             tstring result; | ||||||
|  |             convertIntegerToString (result, value); | ||||||
|  |             return result; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This iterator can be used in place of the back_insert_iterator | ||||||
|  |          * for compilers that don't have a std::basic_string class that | ||||||
|  |          * has the <code>push_back</code> method. | ||||||
|  |          */ | ||||||
|  |         template <class Container> | ||||||
|  |         class string_append_iterator | ||||||
|  |             : public std::iterator<std::output_iterator_tag, void, void, void, | ||||||
|  |                 void> | ||||||
|  |         { | ||||||
|  |         public: | ||||||
|  |             typedef Container container_type; | ||||||
|  |  | ||||||
|  |             explicit string_append_iterator(container_type & c) | ||||||
|  |                 : container(&c) | ||||||
|  |             { } | ||||||
|  |  | ||||||
|  |             string_append_iterator<container_type> & | ||||||
|  |             operator = (const typename container_type::value_type& value) | ||||||
|  |             { | ||||||
|  |                 *container += value; | ||||||
|  |                 return *this; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             string_append_iterator<container_type> & | ||||||
|  |             operator * () | ||||||
|  |             { | ||||||
|  |                 return *this; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             string_append_iterator<container_type> & | ||||||
|  |             operator ++ () | ||||||
|  |             { | ||||||
|  |                 return *this; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             string_append_iterator<container_type> | ||||||
|  |             operator ++ (int) | ||||||
|  |             { | ||||||
|  |                 return *this; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |         protected: | ||||||
|  |             container_type * container; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |     } // namespace helpers | ||||||
|  |  | ||||||
|  | } // namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_HELPERS_STRINGHELPER_HEADER_ | ||||||
							
								
								
									
										307
									
								
								libs/log4cplus/include/log4cplus/helpers/syncprims-pthreads.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										307
									
								
								libs/log4cplus/include/log4cplus/helpers/syncprims-pthreads.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,307 @@ | |||||||
|  | //   Copyright (C) 2009-2010, Vaclav Haisman. All rights reserved. | ||||||
|  | //    | ||||||
|  | //   Redistribution and use in source and binary forms, with or without modifica- | ||||||
|  | //   tion, are permitted provided that the following conditions are met: | ||||||
|  | //    | ||||||
|  | //   1. Redistributions of  source code must  retain the above copyright  notice, | ||||||
|  | //      this list of conditions and the following disclaimer. | ||||||
|  | //    | ||||||
|  | //   2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  | //      this list of conditions and the following disclaimer in the documentation | ||||||
|  | //      and/or other materials provided with the distribution. | ||||||
|  | //    | ||||||
|  | //   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, | ||||||
|  | //   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | ||||||
|  | //   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE | ||||||
|  | //   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT, | ||||||
|  | //   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU- | ||||||
|  | //   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS | ||||||
|  | //   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON | ||||||
|  | //   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT | ||||||
|  | //   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF | ||||||
|  | //   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
|  | //! @file | ||||||
|  | //! This file contains implementations of synchronization | ||||||
|  | //! primitives using the POSIX threads. It does not contain any | ||||||
|  | //! include guards because it is only a fragment to be included by | ||||||
|  | //! syncprims.h. | ||||||
|  |  | ||||||
|  | #include <limits> | ||||||
|  | #include <algorithm> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { namespace thread { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define LOG4CPLUS_THROW_RTE(msg) \ | ||||||
|  |     do { detail::syncprims_throw_exception (msg, __FILE__, __LINE__); } while (0) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // | ||||||
|  |  | ||||||
|  | struct PthreadMutexAttr | ||||||
|  | { | ||||||
|  |     PthreadMutexAttr () | ||||||
|  |     { | ||||||
|  |         int ret = pthread_mutexattr_init (&attr); | ||||||
|  |         if (ret != 0) | ||||||
|  |             LOG4CPLUS_THROW_RTE ("PthreadMutexAttr::PthreadMutexAttr"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     ~PthreadMutexAttr () | ||||||
|  |     try | ||||||
|  |     { | ||||||
|  |         int ret = pthread_mutexattr_destroy (&attr); | ||||||
|  |         if (ret != 0) | ||||||
|  |             LOG4CPLUS_THROW_RTE ("PthreadMutexAttr::~PthreadMutexAttr"); | ||||||
|  |     } | ||||||
|  |     catch (...) | ||||||
|  |     { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     void | ||||||
|  |     set_type (Mutex::Type t) | ||||||
|  |     { | ||||||
|  |         int mutex_type; | ||||||
|  |         switch (t) | ||||||
|  |         { | ||||||
|  |         case Mutex::RECURSIVE: | ||||||
|  |             mutex_type = PTHREAD_MUTEX_RECURSIVE; | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         default: | ||||||
|  |             mutex_type = PTHREAD_MUTEX_DEFAULT; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         int ret = pthread_mutexattr_settype (&attr, mutex_type); | ||||||
|  |         if (ret != 0) | ||||||
|  |             LOG4CPLUS_THROW_RTE ("PthreadMutexAttr::set_type"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     pthread_mutexattr_t attr; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | Mutex::Mutex (Mutex::Type t) | ||||||
|  | { | ||||||
|  |     PthreadMutexAttr attr; | ||||||
|  |     attr.set_type (t); | ||||||
|  |  | ||||||
|  |     int ret = pthread_mutex_init (&mtx, &attr.attr); | ||||||
|  |     if (ret != 0) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("Mutex::Mutex"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | Mutex::~Mutex () | ||||||
|  | { | ||||||
|  |     int ret = pthread_mutex_destroy (&mtx); | ||||||
|  |     if (ret != 0) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("Mutex::~Mutex"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | Mutex::lock () const | ||||||
|  | { | ||||||
|  |     int ret = pthread_mutex_lock (&mtx); | ||||||
|  |     if (ret != 0) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("Mutex::lock"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | Mutex::unlock () const | ||||||
|  | { | ||||||
|  |     int ret = pthread_mutex_unlock (&mtx); | ||||||
|  |     if (ret != 0) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("Mutex::unlock"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | Semaphore::Semaphore (unsigned max, unsigned initial) | ||||||
|  | { | ||||||
|  |     unsigned const sem_value_max = | ||||||
|  | #if defined (SEM_VALUE_MAX) | ||||||
|  |         SEM_VALUE_MAX | ||||||
|  | #else | ||||||
|  |         std::numeric_limits<int>::max () | ||||||
|  | #endif | ||||||
|  |         ; | ||||||
|  |  | ||||||
|  |     unsigned const limited_max = (std::min) (max, sem_value_max); | ||||||
|  |     unsigned const limited_initial = (std::min) (initial, limited_max); | ||||||
|  |     int ret = sem_init (&sem, 0, limited_initial); | ||||||
|  |     if (ret != 0) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("Semaphore::Semaphore"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | Semaphore::~Semaphore () | ||||||
|  | try | ||||||
|  | { | ||||||
|  |     int ret = sem_destroy (&sem); | ||||||
|  |     if (ret != 0) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("Semaphore::~Semaphore"); | ||||||
|  | } | ||||||
|  | catch (...) | ||||||
|  | { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | Semaphore::unlock () const | ||||||
|  | { | ||||||
|  |     int ret = sem_post (&sem); | ||||||
|  |     if (ret != 0) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("Semaphore::unlock"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | Semaphore::lock () const | ||||||
|  | { | ||||||
|  |     int ret = sem_wait (&sem); | ||||||
|  |     if (ret != 0) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("Semaphore::lock"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | ManualResetEvent::ManualResetEvent (bool sig) | ||||||
|  |     : mtx (Mutex::DEFAULT) | ||||||
|  |     , sigcount (0) | ||||||
|  |     , signaled (sig) | ||||||
|  | { | ||||||
|  |     int ret = pthread_cond_init (&cv, 0); | ||||||
|  |     if (ret != 0) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("ManualResetEvent::ManualResetEvent"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | ManualResetEvent::~ManualResetEvent () | ||||||
|  | try | ||||||
|  | { | ||||||
|  |     int ret = pthread_cond_destroy (&cv); | ||||||
|  |     if (ret != 0) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("ManualResetEvent::~ManualResetEvent"); | ||||||
|  | } | ||||||
|  | catch (...) | ||||||
|  | { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | ManualResetEvent::signal () const | ||||||
|  | { | ||||||
|  |     MutexGuard mguard (mtx); | ||||||
|  |  | ||||||
|  |     signaled = true; | ||||||
|  |     sigcount += 1; | ||||||
|  |     int ret = pthread_cond_broadcast (&cv); | ||||||
|  |     if (ret != 0) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("ManualResetEVent::signal"); | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | ManualResetEvent::wait () const | ||||||
|  | { | ||||||
|  |     MutexGuard mguard (mtx); | ||||||
|  |  | ||||||
|  |     if (! signaled) | ||||||
|  |     { | ||||||
|  |         unsigned prev_count = sigcount; | ||||||
|  |         do | ||||||
|  |         { | ||||||
|  |             int ret = pthread_cond_wait (&cv, &mtx.mtx); | ||||||
|  |             if (ret != 0) | ||||||
|  |             { | ||||||
|  |                 mguard.unlock (); | ||||||
|  |                 mguard.detach (); | ||||||
|  |                 LOG4CPLUS_THROW_RTE ("ManualResetEvent::wait"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         while (prev_count == sigcount); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | bool | ||||||
|  | ManualResetEvent::timed_wait (unsigned long msec) const | ||||||
|  | { | ||||||
|  |     MutexGuard mguard (mtx); | ||||||
|  |  | ||||||
|  |     if (! signaled) | ||||||
|  |     {        | ||||||
|  |         helpers::Time const wakeup_time (helpers::Time::gettimeofday () | ||||||
|  |             + helpers::Time (msec / 1000, (msec % 1000) * 1000)); | ||||||
|  |         struct timespec const ts = {wakeup_time.sec (), | ||||||
|  |             wakeup_time.usec () * 1000}; | ||||||
|  |         unsigned prev_count = sigcount; | ||||||
|  |         do | ||||||
|  |         { | ||||||
|  |             int ret = pthread_cond_timedwait (&cv, &mtx.mtx, &ts); | ||||||
|  |             switch (ret) | ||||||
|  |             { | ||||||
|  |             case 0: | ||||||
|  |                 break; | ||||||
|  |  | ||||||
|  |             case ETIMEDOUT: | ||||||
|  |                 return false; | ||||||
|  |  | ||||||
|  |             default: | ||||||
|  |                 mguard.unlock (); | ||||||
|  |                 mguard.detach (); | ||||||
|  |                 LOG4CPLUS_THROW_RTE ("ManualResetEvent::timed_wait"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         while (prev_count == sigcount); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | ManualResetEvent::reset () const | ||||||
|  | { | ||||||
|  |     MutexGuard mguard (mtx); | ||||||
|  |  | ||||||
|  |     signaled = false; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #undef LOG4CPLUS_THROW_RTE | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } } // namespace log4cplus { namespace thread { | ||||||
							
								
								
									
										195
									
								
								libs/log4cplus/include/log4cplus/helpers/syncprims-win32.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								libs/log4cplus/include/log4cplus/helpers/syncprims-win32.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,195 @@ | |||||||
|  | //   Copyright (C) 2009, Vaclav Haisman. All rights reserved. | ||||||
|  | //    | ||||||
|  | //   Redistribution and use in source and binary forms, with or without modifica- | ||||||
|  | //   tion, are permitted provided that the following conditions are met: | ||||||
|  | //    | ||||||
|  | //   1. Redistributions of  source code must  retain the above copyright  notice, | ||||||
|  | //      this list of conditions and the following disclaimer. | ||||||
|  | //    | ||||||
|  | //   2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  | //      this list of conditions and the following disclaimer in the documentation | ||||||
|  | //      and/or other materials provided with the distribution. | ||||||
|  | //    | ||||||
|  | //   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, | ||||||
|  | //   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | ||||||
|  | //   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE | ||||||
|  | //   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT, | ||||||
|  | //   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU- | ||||||
|  | //   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS | ||||||
|  | //   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON | ||||||
|  | //   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT | ||||||
|  | //   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF | ||||||
|  | //   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
|  | //! @file | ||||||
|  | //! This file contains implementations of synchronization | ||||||
|  | //! primitives using the Win32 API. It does not contain any include | ||||||
|  | //! guards because it is only a fragment to be included by | ||||||
|  | //! syncprims.h. | ||||||
|  |  | ||||||
|  | namespace log4cplus { namespace thread { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define LOG4CPLUS_THROW_RTE(msg) \ | ||||||
|  |     do { detail::syncprims_throw_exception (msg, __FILE__, __LINE__); } while (0) | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | Mutex::Mutex (Mutex::Type) | ||||||
|  | { | ||||||
|  |     InitializeCriticalSection (&cs); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | Mutex::~Mutex () | ||||||
|  | { | ||||||
|  |     DeleteCriticalSection (&cs); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | Mutex::lock () const | ||||||
|  | { | ||||||
|  |     EnterCriticalSection (&cs); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | Mutex::unlock () const | ||||||
|  | { | ||||||
|  |     LeaveCriticalSection (&cs); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | Semaphore::Semaphore (unsigned max, unsigned initial) | ||||||
|  | { | ||||||
|  |     sem = CreateSemaphore (0, initial, max, 0); | ||||||
|  |     if (! sem) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("Semaphore::Semaphore"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | Semaphore::~Semaphore () | ||||||
|  | { | ||||||
|  |     try | ||||||
|  |     { | ||||||
|  |         if (! CloseHandle (sem)) | ||||||
|  |             LOG4CPLUS_THROW_RTE ("Semaphore::~Semaphore"); | ||||||
|  |     } | ||||||
|  |     catch (...) | ||||||
|  |     { } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | Semaphore::unlock () const | ||||||
|  | { | ||||||
|  |     DWORD ret = ReleaseSemaphore (sem, 1, 0); | ||||||
|  |     if (! ret) | ||||||
|  |          LOG4CPLUS_THROW_RTE ("Semaphore::unlock"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | Semaphore::lock () const | ||||||
|  | { | ||||||
|  |     DWORD ret = WaitForSingleObject (sem, INFINITE); | ||||||
|  |     if (ret != WAIT_OBJECT_0) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("Semaphore::lock"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | ManualResetEvent::ManualResetEvent (bool sig) | ||||||
|  | { | ||||||
|  |     ev = CreateEvent (0, true, sig, 0); | ||||||
|  |     if (! ev) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("ManualResetEvent::ManualResetEvent"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | ManualResetEvent::~ManualResetEvent () | ||||||
|  | { | ||||||
|  |     try | ||||||
|  |     { | ||||||
|  |         if (! CloseHandle (ev)) | ||||||
|  |             LOG4CPLUS_THROW_RTE ("ManualResetEvent::~ManualResetEvent"); | ||||||
|  |     } | ||||||
|  |     catch (...) | ||||||
|  |     { } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | ManualResetEvent::signal () const | ||||||
|  | { | ||||||
|  |     if (! SetEvent (ev)) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("ManualResetEVent::signal"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | ManualResetEvent::wait () const | ||||||
|  | { | ||||||
|  |     DWORD ret = WaitForSingleObject (ev, INFINITE); | ||||||
|  |     if (ret != WAIT_OBJECT_0) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("ManualResetEvent::wait"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | bool | ||||||
|  | ManualResetEvent::timed_wait (unsigned long msec) const | ||||||
|  | { | ||||||
|  |     DWORD ret = WaitForSingleObject (ev, static_cast<DWORD>(msec)); | ||||||
|  |     switch(ret) | ||||||
|  |     { | ||||||
|  |     case WAIT_OBJECT_0: | ||||||
|  |         return true; | ||||||
|  |  | ||||||
|  |     case WAIT_TIMEOUT: | ||||||
|  |         return false; | ||||||
|  |  | ||||||
|  |     default: | ||||||
|  |         LOG4CPLUS_THROW_RTE ("ManualResetEvent::timed_wait"); | ||||||
|  |         // Silence warnings about not returning any value from function | ||||||
|  |         // returning bool. | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | ManualResetEvent::reset () const | ||||||
|  | { | ||||||
|  |     if (! ResetEvent (ev)) | ||||||
|  |         LOG4CPLUS_THROW_RTE ("ManualResetEvent::reset"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #undef LOG4CPLUS_THROW_RTE | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } } // namespace log4cplus { namespace thread { | ||||||
							
								
								
									
										237
									
								
								libs/log4cplus/include/log4cplus/helpers/syncprims.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										237
									
								
								libs/log4cplus/include/log4cplus/helpers/syncprims.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,237 @@ | |||||||
|  | //   Copyright (C) 2009, Vaclav Haisman. All rights reserved. | ||||||
|  | //    | ||||||
|  | //   Redistribution and use in source and binary forms, with or without modifica- | ||||||
|  | //   tion, are permitted provided that the following conditions are met: | ||||||
|  | //    | ||||||
|  | //   1. Redistributions of  source code must  retain the above copyright  notice, | ||||||
|  | //      this list of conditions and the following disclaimer. | ||||||
|  | //    | ||||||
|  | //   2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  | //      this list of conditions and the following disclaimer in the documentation | ||||||
|  | //      and/or other materials provided with the distribution. | ||||||
|  | //    | ||||||
|  | //   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, | ||||||
|  | //   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | ||||||
|  | //   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE | ||||||
|  | //   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT, | ||||||
|  | //   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU- | ||||||
|  | //   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS | ||||||
|  | //   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON | ||||||
|  | //   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT | ||||||
|  | //   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF | ||||||
|  | //   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_THREAD_SYNCPRIMS_H | ||||||
|  | #define LOG4CPLUS_THREAD_SYNCPRIMS_H | ||||||
|  |  | ||||||
|  | #include <stdexcept> | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #if defined (LOG4CPLUS_USE_PTHREADS) | ||||||
|  | #  include <errno.h> | ||||||
|  | #  include <pthread.h> | ||||||
|  | #  include <semaphore.h> | ||||||
|  | #  include <log4cplus/helpers/timehelper.h> | ||||||
|  |  | ||||||
|  | #elif defined (LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  | #  undef WIN32_LEAN_AND_MEAN | ||||||
|  | #  define WIN32_LEAN_AND_MEAN | ||||||
|  | #  include <windows.h> | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { namespace thread { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace detail | ||||||
|  | { | ||||||
|  |  | ||||||
|  | LOG4CPLUS_EXPORT void syncprims_throw_exception (char const * const msg, | ||||||
|  |     char const * const file, int line); | ||||||
|  |  | ||||||
|  | } // namespace detail | ||||||
|  |  | ||||||
|  |  | ||||||
|  | template <typename SP> | ||||||
|  | class SyncGuard | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     SyncGuard (SP const &); | ||||||
|  |     ~SyncGuard (); | ||||||
|  |  | ||||||
|  |     void lock (); | ||||||
|  |     void unlock (); | ||||||
|  |     void attach (SP const &); | ||||||
|  |     void detach (); | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     SP const * sp; | ||||||
|  |  | ||||||
|  |     SyncGuard (SyncGuard const &); | ||||||
|  |     SyncGuard & operator = (SyncGuard const &); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ManualResetEvent; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Mutex | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     enum Type | ||||||
|  |     { | ||||||
|  |         DEFAULT, | ||||||
|  |         RECURSIVE | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     explicit Mutex (Type = RECURSIVE); | ||||||
|  |     ~Mutex (); | ||||||
|  |  | ||||||
|  |     void lock () const; | ||||||
|  |     void unlock () const; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  | #if defined (LOG4CPLUS_USE_PTHREADS) | ||||||
|  |     mutable pthread_mutex_t mtx; | ||||||
|  |     friend class ManualResetEvent; | ||||||
|  | #elif defined (LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  |     mutable CRITICAL_SECTION cs; | ||||||
|  | #endif | ||||||
|  |      | ||||||
|  |     Mutex (Mutex const &); | ||||||
|  |     Mutex & operator = (Mutex &); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | typedef SyncGuard<Mutex> MutexGuard; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Semaphore | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     Semaphore (unsigned max, unsigned initial); | ||||||
|  |     ~Semaphore (); | ||||||
|  |  | ||||||
|  |     void lock () const; | ||||||
|  |     void unlock () const; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  | #if defined (LOG4CPLUS_USE_PTHREADS) | ||||||
|  |     mutable sem_t sem; | ||||||
|  | #elif defined (LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  |     HANDLE sem; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     Semaphore (Semaphore const &); | ||||||
|  |     Semaphore & operator = (Semaphore const &); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | typedef SyncGuard<Semaphore> SemaphoreGuard; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ManualResetEvent | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     ManualResetEvent (bool = false); | ||||||
|  |     ~ManualResetEvent (); | ||||||
|  |  | ||||||
|  |     void signal () const; | ||||||
|  |     void wait () const; | ||||||
|  |     bool timed_wait (unsigned long msec) const; | ||||||
|  |     void reset () const; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  | #if defined (LOG4CPLUS_USE_PTHREADS) | ||||||
|  |     mutable pthread_cond_t cv; | ||||||
|  |     mutable Mutex mtx; | ||||||
|  |     mutable volatile unsigned sigcount; | ||||||
|  |     mutable volatile bool signaled; | ||||||
|  | #elif defined (LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  |     HANDLE ev; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     ManualResetEvent (ManualResetEvent const &); | ||||||
|  |     ManualResetEvent & operator = (ManualResetEvent const &); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } } // namespace log4cplus { namespace thread { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Include the appropriate implementations of the classes declared | ||||||
|  | // above. | ||||||
|  |  | ||||||
|  | #if defined (LOG4CPLUS_USE_PTHREADS) | ||||||
|  | #  include <log4cplus/helpers/syncprims-pthreads.h> | ||||||
|  | #elif defined (LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  | #  include <log4cplus/helpers/syncprims-win32.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { namespace thread { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // | ||||||
|  |  | ||||||
|  | template <typename SP> | ||||||
|  | inline | ||||||
|  | SyncGuard<SP>::SyncGuard (SP const & m) | ||||||
|  |     : sp (&m) | ||||||
|  | { | ||||||
|  |     sp->lock (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | template <typename SP> | ||||||
|  | inline | ||||||
|  | SyncGuard<SP>::~SyncGuard () | ||||||
|  | { | ||||||
|  |     if (sp) | ||||||
|  |         sp->unlock (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | template <typename SP> | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | SyncGuard<SP>::lock () | ||||||
|  | { | ||||||
|  |     sp->lock (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | template <typename SP> | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | SyncGuard<SP>::unlock () | ||||||
|  | { | ||||||
|  |     sp->unlock (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | template <typename SP> | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | SyncGuard<SP>::attach (SP const & m) | ||||||
|  | { | ||||||
|  |     sp = &m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | template <typename SP> | ||||||
|  | inline | ||||||
|  | void | ||||||
|  | SyncGuard<SP>::detach () | ||||||
|  | { | ||||||
|  |     sp = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } } // namespace log4cplus { namespace thread { | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_THREAD_SYNCPRIMS_H | ||||||
							
								
								
									
										143
									
								
								libs/log4cplus/include/log4cplus/helpers/thread-config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								libs/log4cplus/include/log4cplus/helpers/thread-config.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,143 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    thread-config.h | ||||||
|  | // Created: 4/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_HELPERS_THREAD_CONFIG_HEADER_ | ||||||
|  | #define LOG4CPLUS_HELPERS_THREAD_CONFIG_HEADER_ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifdef LOG4CPLUS_USE_PTHREADS | ||||||
|  | #   include <pthread.h> | ||||||
|  | #   include <semaphore.h> | ||||||
|  | #   define LOG4CPLUS_MUTEX_PTR_DECLARE pthread_mutex_t* | ||||||
|  | #   define LOG4CPLUS_MUTEX_CREATE ::log4cplus::thread::createNewMutex() | ||||||
|  | #   define LOG4CPLUS_MUTEX_LOCK(mutex) pthread_mutex_lock(mutex) | ||||||
|  | #   define LOG4CPLUS_MUTEX_UNLOCK(mutex) pthread_mutex_unlock(mutex) | ||||||
|  | #   define LOG4CPLUS_MUTEX_FREE(mutex) ::log4cplus::thread::deleteMutex(mutex) | ||||||
|  | #   define LOG4CPLUS_THREAD_HANDLE_TYPE  pthread_t | ||||||
|  | #   define LOG4CPLUS_THREAD_KEY_TYPE pthread_t | ||||||
|  | #   define LOG4CPLUS_GET_CURRENT_THREAD_NAME \ | ||||||
|  |     ::log4cplus::thread::getCurrentThreadName() | ||||||
|  | #   define LOG4CPLUS_GET_CURRENT_THREAD pthread_self() | ||||||
|  | #   define LOG4CPLUS_THREAD_LOCAL_TYPE pthread_key_t* | ||||||
|  | #   define LOG4CPLUS_THREAD_LOCAL_INIT(cleanup) \ | ||||||
|  |     ::log4cplus::thread::createPthreadKey(cleanup) | ||||||
|  | #   define LOG4CPLUS_GET_THREAD_LOCAL_VALUE(key) pthread_getspecific(*(key)) | ||||||
|  | #   define LOG4CPLUS_SET_THREAD_LOCAL_VALUE(key, value) \ | ||||||
|  |     pthread_setspecific(*(key), value) | ||||||
|  | #   define LOG4CPLUS_THREAD_LOCAL_CLEANUP(key) \ | ||||||
|  |     do { pthread_key_t * pthkey (key); pthread_key_delete(*pthkey); \ | ||||||
|  |     delete pthkey; } while(0) | ||||||
|  | namespace log4cplus { | ||||||
|  |     namespace thread { | ||||||
|  |         LOG4CPLUS_EXPORT LOG4CPLUS_MUTEX_PTR_DECLARE createNewMutex(); | ||||||
|  |         LOG4CPLUS_EXPORT void deleteMutex(LOG4CPLUS_MUTEX_PTR_DECLARE); | ||||||
|  |         LOG4CPLUS_EXPORT LOG4CPLUS_THREAD_LOCAL_TYPE createPthreadKey(void (*) (void *)); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #elif defined(LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  | #   undef WIN32_LEAN_AND_MEAN | ||||||
|  | #   define WIN32_LEAN_AND_MEAN | ||||||
|  | #   include <windows.h> | ||||||
|  |  | ||||||
|  | #   define LOG4CPLUS_MUTEX_PTR_DECLARE CRITICAL_SECTION* | ||||||
|  | #   define LOG4CPLUS_MUTEX_CREATE ::log4cplus::thread::createNewMutex() | ||||||
|  | #   define LOG4CPLUS_MUTEX_LOCK(mutex)  EnterCriticalSection(mutex) | ||||||
|  | #   define LOG4CPLUS_MUTEX_UNLOCK(mutex)  LeaveCriticalSection(mutex) | ||||||
|  | #   define LOG4CPLUS_MUTEX_FREE(mutex) ::log4cplus::thread::deleteMutex(mutex) | ||||||
|  |  | ||||||
|  | #   define LOG4CPLUS_THREAD_HANDLE_TYPE  HANDLE | ||||||
|  | #   define LOG4CPLUS_THREAD_KEY_TYPE  DWORD | ||||||
|  | #   define LOG4CPLUS_GET_CURRENT_THREAD  GetCurrentThreadId() | ||||||
|  | #   define LOG4CPLUS_GET_CURRENT_THREAD_NAME \ | ||||||
|  |     ::log4cplus::thread::getCurrentThreadName() | ||||||
|  | #   define LOG4CPLUS_THREAD_LOCAL_TYPE DWORD | ||||||
|  | #   define LOG4CPLUS_THREAD_LOCAL_INIT(cleanup) TlsAlloc() | ||||||
|  | #   define LOG4CPLUS_GET_THREAD_LOCAL_VALUE(key) TlsGetValue(key) | ||||||
|  | #   define LOG4CPLUS_SET_THREAD_LOCAL_VALUE(key, value) \ | ||||||
|  |     TlsSetValue(key, static_cast<LPVOID>(value)) | ||||||
|  | #   define LOG4CPLUS_THREAD_LOCAL_CLEANUP(key) TlsFree(key) | ||||||
|  | #   if defined (_MSC_VER) | ||||||
|  | #     undef LOG4CPLUS_HAVE_TLS_SUPPORT | ||||||
|  | #     undef LOG4CPLUS_THREAD_LOCAL_VAR | ||||||
|  | // Comment out the following two lines if you do intend to use log4cplus.dll | ||||||
|  | // for loading using LoadLibrary(). The __declspec(thread) functionality is not | ||||||
|  | // compatible with such DLL use. For more information why is this necessary see | ||||||
|  | // <http://msdn.microsoft.com/en-us/library/2s9wt68x(vs.80).aspx>. | ||||||
|  | #     define LOG4CPLUS_HAVE_TLS_SUPPORT 1 | ||||||
|  | #     define LOG4CPLUS_THREAD_LOCAL_VAR __declspec(thread) | ||||||
|  | #   endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { namespace thread { | ||||||
|  |  | ||||||
|  | LOG4CPLUS_EXPORT LOG4CPLUS_MUTEX_PTR_DECLARE createNewMutex(); | ||||||
|  | LOG4CPLUS_EXPORT void deleteMutex(LOG4CPLUS_MUTEX_PTR_DECLARE); | ||||||
|  |      | ||||||
|  | } } // namespace log4cplus { namespace thread { | ||||||
|  |  | ||||||
|  | #elif defined(LOG4CPLUS_SINGLE_THREADED) | ||||||
|  | #   define LOG4CPLUS_MUTEX_PTR_DECLARE int* | ||||||
|  | #   define LOG4CPLUS_MUTEX_CREATE NULL | ||||||
|  | #   define LOG4CPLUS_MUTEX_LOCK(mutex) | ||||||
|  | #   define LOG4CPLUS_MUTEX_UNLOCK(mutex) | ||||||
|  | #   define LOG4CPLUS_MUTEX_FREE(mutex) | ||||||
|  | #   define LOG4CPLUS_THREAD_HANDLE_TYPE  void * | ||||||
|  | #   define LOG4CPLUS_THREAD_KEY_TYPE int | ||||||
|  | #   define LOG4CPLUS_GET_CURRENT_THREAD 1 | ||||||
|  | #   define LOG4CPLUS_GET_CURRENT_THREAD_NAME \ | ||||||
|  |     LOG4CPLUS_C_STR_TO_TSTRING("single") | ||||||
|  | #   define LOG4CPLUS_THREAD_LOCAL_TYPE void* | ||||||
|  | #   define LOG4CPLUS_THREAD_LOCAL_INIT(cleanup) NULL | ||||||
|  | #   define LOG4CPLUS_GET_THREAD_LOCAL_VALUE(key) (key) | ||||||
|  | #   define LOG4CPLUS_SET_THREAD_LOCAL_VALUE(key, value) \ | ||||||
|  |     do { (key) = (value); } while (0) | ||||||
|  | #   define LOG4CPLUS_THREAD_LOCAL_CLEANUP(key) do { (key) = NULL; } while (0) | ||||||
|  | #   undef LOG4CPLUS_HAVE_TLS_SUPPORT | ||||||
|  | #   undef LOG4CPLUS_THREAD_LOCAL_VAR | ||||||
|  |  | ||||||
|  | #else | ||||||
|  | #   error "You Must define a Threading model" | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @def LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX(mutex) | ||||||
|  |  * Begin a block synchronized on a mutex. | ||||||
|  |  * | ||||||
|  |  * @see LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX | ||||||
|  |  * | ||||||
|  |  * @def LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX | ||||||
|  |  * End a block synchronized on a mutex. | ||||||
|  |  * | ||||||
|  |  * @see LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX | ||||||
|  |  */ | ||||||
|  | #ifndef LOG4CPLUS_SINGLE_THREADED | ||||||
|  | #  define LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX(mutex) \ | ||||||
|  |              do { ::log4cplus::thread::Guard _sync_guard_object(mutex); | ||||||
|  | #else | ||||||
|  | #  define LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX(mutex) do { (void)(mutex); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX } while (0) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_HELPERS_THREAD_CONFIG_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										133
									
								
								libs/log4cplus/include/log4cplus/helpers/threads.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								libs/log4cplus/include/log4cplus/helpers/threads.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,133 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    threads.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_THREADS_HEADER_ | ||||||
|  | #define _LOG4CPLUS_THREADS_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  | #include <log4cplus/helpers/pointer.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { namespace thread { | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * This is used to lock a mutex.  The dtor unlocks the mutex. | ||||||
|  |  */ | ||||||
|  | class Guard | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     /** "locks" <code>mutex</code>. */ | ||||||
|  |     Guard(LOG4CPLUS_MUTEX_PTR_DECLARE mutex) | ||||||
|  |         : _mutex (mutex) | ||||||
|  |     { | ||||||
|  |         LOG4CPLUS_MUTEX_LOCK( _mutex ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** "unlocks" <code>mutex</code>. */ | ||||||
|  |     ~Guard() | ||||||
|  |     { | ||||||
|  |         LOG4CPLUS_MUTEX_UNLOCK( _mutex ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     LOG4CPLUS_MUTEX_PTR_DECLARE _mutex; | ||||||
|  |  | ||||||
|  |     // disable copy | ||||||
|  |     Guard(const Guard&); | ||||||
|  |     Guard& operator=(const Guard&); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_SINGLE_THREADED | ||||||
|  |  | ||||||
|  | LOG4CPLUS_EXPORT void blockAllSignals(); | ||||||
|  | LOG4CPLUS_EXPORT void yield(); | ||||||
|  | LOG4CPLUS_EXPORT tstring getCurrentThreadName(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | struct ThreadStart; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * There are many cross-platform C++ Threading libraries.  The goal of | ||||||
|  |  * this class is not to replace (or match in functionality) those | ||||||
|  |  * libraries.  The goal of this class is to provide a simple Threading | ||||||
|  |  * class with basic functionality. | ||||||
|  |  */ | ||||||
|  | class LOG4CPLUS_EXPORT AbstractThread | ||||||
|  |     : public virtual log4cplus::helpers::SharedObject | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     AbstractThread(); | ||||||
|  |     bool isRunning() const { return (flags & fRUNNING) != 0; } | ||||||
|  |     LOG4CPLUS_THREAD_KEY_TYPE getThreadId() const; | ||||||
|  |     LOG4CPLUS_THREAD_HANDLE_TYPE getThreadHandle () const; | ||||||
|  |     virtual void start(); | ||||||
|  |     void join (); | ||||||
|  |  | ||||||
|  | protected: | ||||||
|  |     // Force objects to be constructed on the heap | ||||||
|  |     virtual ~AbstractThread(); | ||||||
|  |     virtual void run() = 0; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     enum Flags | ||||||
|  |     { | ||||||
|  |         fRUNNING  = 0x01, | ||||||
|  |         fJOINED   = 0x02 | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     unsigned flags; | ||||||
|  |  | ||||||
|  |     // Friends. | ||||||
|  |     friend struct ThreadStart; | ||||||
|  |  | ||||||
|  | #  ifdef LOG4CPLUS_USE_PTHREADS | ||||||
|  |     pthread_t handle; | ||||||
|  |  | ||||||
|  | #  elif defined(LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  |     HANDLE handle; | ||||||
|  | #    if defined (_WIN32_WCE) | ||||||
|  |     DWORD thread_id; | ||||||
|  | #    else | ||||||
|  |     unsigned thread_id; | ||||||
|  | #    endif | ||||||
|  |  | ||||||
|  | #  endif | ||||||
|  |  | ||||||
|  |     // Disallow copying of instances of this class. | ||||||
|  |     AbstractThread(const AbstractThread&); | ||||||
|  |     AbstractThread& operator=(const AbstractThread&); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | typedef helpers::SharedObjectPtr<AbstractThread> AbstractThreadPtr; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_SINGLE_THREADED | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } } // namespace log4cplus { namespace thread { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_THREADS_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										179
									
								
								libs/log4cplus/include/log4cplus/helpers/timehelper.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								libs/log4cplus/include/log4cplus/helpers/timehelper.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,179 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    timehelper.h | ||||||
|  | // Created: 6/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_HELPERS_TIME_HELPER_HEADER_ | ||||||
|  | #define _LOG4CPLUS_HELPERS_TIME_HELPER_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  |  | ||||||
|  | #if defined (LOG4CPLUS_HAVE_TIME_H) | ||||||
|  | //#include <time.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if ! defined (_WIN32_WCE) | ||||||
|  | //#include <ctime> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |  | ||||||
|  | namespace helpers { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if defined (_WIN32_WCE) | ||||||
|  | using ::time_t; | ||||||
|  | using ::tm; | ||||||
|  |  | ||||||
|  | #else | ||||||
|  | //using std::time_t; | ||||||
|  | //using std::tm; | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * This class represents a Epoch time with microsecond accuracy. | ||||||
|  |  */ | ||||||
|  | class LOG4CPLUS_EXPORT Time { | ||||||
|  | public: | ||||||
|  |     Time(); | ||||||
|  |     Time(time_t tv_sec, long tv_usec); | ||||||
|  |     explicit Time(time_t time); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Returns the current time using the <code>gettimeofday()</code> | ||||||
|  |      * method if it is available on the current platform.  (Not on  | ||||||
|  |      * WIN32.) | ||||||
|  |      */ | ||||||
|  |     static Time gettimeofday(); | ||||||
|  |  | ||||||
|  |   // Methods | ||||||
|  |     /** | ||||||
|  |      * Returns <i>seconds</i> value. | ||||||
|  |      */ | ||||||
|  |     time_t sec() const { return tv_sec; } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Returns <i>microseconds</i> value. | ||||||
|  |      */ | ||||||
|  |     long usec() const { return tv_usec; } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Sets the <i>seconds</i> value. | ||||||
|  |      */ | ||||||
|  |     void sec(time_t s) { tv_sec = s; } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Sets the <i>microseconds</i> value. | ||||||
|  |      */ | ||||||
|  |     void usec(long us) { tv_usec = us; } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Sets this Time using the <code>mktime</code> function. | ||||||
|  |      */ | ||||||
|  |     time_t setTime(tm* t); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Returns this Time as a <code>time_t</code> value. | ||||||
|  |      */ | ||||||
|  |     time_t getTime() const; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Populates <code>tm</code> using the <code>gmtime()</code> | ||||||
|  |      * function. | ||||||
|  |      */ | ||||||
|  |     void gmtime(tm* t) const; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Populates <code>tm</code> using the <code>localtime()</code> | ||||||
|  |      * function. | ||||||
|  |      */ | ||||||
|  |     void localtime(tm* t) const; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Returns a string with a "formatted time" specified by | ||||||
|  |      * <code>fmt</code>.  It used the <code>strftime()</code> | ||||||
|  |      * function to do this.   | ||||||
|  |      *  | ||||||
|  |      * Look at your platform's <code>strftime()</code> documentation | ||||||
|  |      * for the formatting options available. | ||||||
|  |      *  | ||||||
|  |      * The following additional options are provided:<br> | ||||||
|  |      * <code>%q</code> - 3 character field that provides milliseconds | ||||||
|  |      * <code>%Q</code> - 7 character field that provides fractional  | ||||||
|  |      * milliseconds. | ||||||
|  |      */ | ||||||
|  |     log4cplus::tstring getFormattedTime(const log4cplus::tstring& fmt, | ||||||
|  |                                         bool use_gmtime = false) const; | ||||||
|  |  | ||||||
|  |   // Operators | ||||||
|  |     Time& operator+=(const Time& rhs); | ||||||
|  |     Time& operator-=(const Time& rhs); | ||||||
|  |     Time& operator/=(long rhs); | ||||||
|  |     Time& operator*=(long rhs); | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     void build_q_value (log4cplus::tstring & q_str) const; | ||||||
|  |     void build_uc_q_value (log4cplus::tstring & uc_q_str) const; | ||||||
|  |  | ||||||
|  |   // Data | ||||||
|  |     time_t tv_sec;  /* seconds */ | ||||||
|  |     long tv_usec;  /* microseconds */ | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LOG4CPLUS_EXPORT const log4cplus::helpers::Time operator+ | ||||||
|  |                                    (const log4cplus::helpers::Time& lhs, | ||||||
|  |                                     const log4cplus::helpers::Time& rhs); | ||||||
|  | LOG4CPLUS_EXPORT const log4cplus::helpers::Time operator- | ||||||
|  |                                    (const log4cplus::helpers::Time& lhs, | ||||||
|  |                                     const log4cplus::helpers::Time& rhs); | ||||||
|  | LOG4CPLUS_EXPORT const log4cplus::helpers::Time operator/ | ||||||
|  |                                    (const log4cplus::helpers::Time& lhs, | ||||||
|  |                                     long rhs); | ||||||
|  | LOG4CPLUS_EXPORT const log4cplus::helpers::Time operator* | ||||||
|  |                                    (const log4cplus::helpers::Time& lhs, | ||||||
|  |                                     long rhs); | ||||||
|  |  | ||||||
|  | LOG4CPLUS_EXPORT bool operator<(const log4cplus::helpers::Time& lhs, | ||||||
|  |                                 const log4cplus::helpers::Time& rhs); | ||||||
|  | LOG4CPLUS_EXPORT bool operator<=(const log4cplus::helpers::Time& lhs, | ||||||
|  |                                  const log4cplus::helpers::Time& rhs); | ||||||
|  |  | ||||||
|  | LOG4CPLUS_EXPORT bool operator>(const log4cplus::helpers::Time& lhs, | ||||||
|  |                                 const log4cplus::helpers::Time& rhs); | ||||||
|  | LOG4CPLUS_EXPORT bool operator>=(const log4cplus::helpers::Time& lhs, | ||||||
|  |                                  const log4cplus::helpers::Time& rhs); | ||||||
|  |  | ||||||
|  | LOG4CPLUS_EXPORT bool operator==(const log4cplus::helpers::Time& lhs, | ||||||
|  |                                  const log4cplus::helpers::Time& rhs); | ||||||
|  | LOG4CPLUS_EXPORT bool operator!=(const log4cplus::helpers::Time& lhs, | ||||||
|  |                                  const log4cplus::helpers::Time& rhs); | ||||||
|  |  | ||||||
|  | } // namespace helpers | ||||||
|  |  | ||||||
|  | } // namespace log4cplus | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_HELPERS_TIME_HELPER_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										316
									
								
								libs/log4cplus/include/log4cplus/hierarchy.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										316
									
								
								libs/log4cplus/include/log4cplus/hierarchy.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,316 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    hierarchy.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_HIERARCHY_HEADER_ | ||||||
|  | #define _LOG4CPLUS_HIERARCHY_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/logger.h> | ||||||
|  | #include <log4cplus/helpers/logloguser.h> | ||||||
|  | #include <log4cplus/helpers/pointer.h> | ||||||
|  | #include <log4cplus/helpers/threads.h> | ||||||
|  | #include <map> | ||||||
|  | #include <memory> | ||||||
|  | #include <vector> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     // Forward Declarations | ||||||
|  |     class HierarchyLocker; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * This class is specialized in retrieving loggers by name and | ||||||
|  |      * also maintaining the logger hierarchy. | ||||||
|  |      * | ||||||
|  |      * <em>The casual user should not have to deal with this class | ||||||
|  |      * directly.</em>  However, if you are in an environment where | ||||||
|  |      * multiple applications run in the same process, then read on. | ||||||
|  |      * | ||||||
|  |      * The structure of the logger hierarchy is maintained by the | ||||||
|  |      * {@link #getInstance} method. The hierarchy is such that children | ||||||
|  |      * link to their parent but parents do not have any pointers to their | ||||||
|  |      * children. Moreover, loggers can be instantiated in any order, in | ||||||
|  |      * particular descendant before ancestor. | ||||||
|  |      * | ||||||
|  |      * In case a descendant is created before a particular ancestor, | ||||||
|  |      * then it creates a provision node for the ancestor and adds itself | ||||||
|  |      * to the provision node. Other descendants of the same ancestor add | ||||||
|  |      * themselves to the previously created provision node. | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT Hierarchy : protected log4cplus::helpers::LogLogUser { | ||||||
|  |     public: | ||||||
|  |         // DISABLE_OFF should be set to a value lower than all possible | ||||||
|  |         // priorities. | ||||||
|  |         static const LogLevel DISABLE_OFF; | ||||||
|  |         static const LogLevel DISABLE_OVERRIDE; | ||||||
|  |  | ||||||
|  |       // Ctors | ||||||
|  |         /** | ||||||
|  |          * Create a new Logger hierarchy. | ||||||
|  |          */ | ||||||
|  |         Hierarchy(); | ||||||
|  |  | ||||||
|  |       // Dtor | ||||||
|  |         virtual ~Hierarchy(); | ||||||
|  |  | ||||||
|  |       // Methods | ||||||
|  |         /** | ||||||
|  |          * This call will clear all logger definitions from the internal | ||||||
|  |          * hashtable. Invoking this method will irrevocably mess up the | ||||||
|  |          * logger hierarchy. | ||||||
|  |          *                      | ||||||
|  |          * You should <em>really</em> know what you are doing before | ||||||
|  |          * invoking this method. | ||||||
|  |          */ | ||||||
|  |         virtual void clear(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Returns <code>true </code>if the named logger exists  | ||||||
|  |          * (in the default hierarchy). | ||||||
|  |          *                 | ||||||
|  |          * @param name The name of the logger to search for. | ||||||
|  |          */ | ||||||
|  |         virtual bool exists(const log4cplus::tstring& name); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Similar to {@link #disable(LogLevel)} except that the LogLevel | ||||||
|  |          * argument is given as a log4cplus::tstring.   | ||||||
|  |          */ | ||||||
|  |         virtual void disable(const log4cplus::tstring& loglevelStr); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Disable all logging requests of LogLevel <em>equal to or | ||||||
|  |          * below</em> the ll parameter <code>p</code>, for | ||||||
|  |          * <em>all</em> loggers in this hierarchy. Logging requests of | ||||||
|  |          * higher LogLevel then <code>p</code> remain unaffected. | ||||||
|  |          * | ||||||
|  |          * Nevertheless, if the {@link | ||||||
|  |          * BasicConfigurator#DISABLE_OVERRIDE_KEY} system property is set to | ||||||
|  |          * "true" or any value other than "false", then logging requests are | ||||||
|  |          * evaluated as usual, i.e. according to the <a | ||||||
|  |          * href="../../../../manual.html#selectionRule">Basic Selection Rule</a>. | ||||||
|  |          * | ||||||
|  |          * The "disable" family of methods are there for speed. They | ||||||
|  |          * allow printing methods such as debug, info, etc. to return | ||||||
|  |          * immediately after an integer comparison without walking the | ||||||
|  |          * logger hierarchy. In most modern computers an integer | ||||||
|  |          * comparison is measured in nanoseconds where as a logger walk is | ||||||
|  |          * measured in units of microseconds. | ||||||
|  |          */ | ||||||
|  |         virtual void disable(LogLevel ll); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Disable all logging requests regardless of logger and LogLevel. | ||||||
|  |          * This method is equivalent to calling {@link #disable} with the | ||||||
|  |          * argument FATAL_LOG_LEVEL, the highest possible LogLevel. | ||||||
|  |          */ | ||||||
|  |         virtual void disableAll(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Disable all Debug logging requests regardless of logger. | ||||||
|  |          * This method is equivalent to calling {@link #disable} with the | ||||||
|  |          * argument DEBUG_LOG_LEVEL. | ||||||
|  |          */ | ||||||
|  |         virtual void disableDebug(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Disable all Info logging requests regardless of logger. | ||||||
|  |          * This method is equivalent to calling {@link #disable} with the | ||||||
|  |          * argument INFO_LOG_LEVEL. | ||||||
|  |          */ | ||||||
|  |         virtual void disableInfo(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Undoes the effect of calling any of {@link #disable}, {@link | ||||||
|  |          * #disableAll}, {@link #disableDebug} and {@link #disableInfo} | ||||||
|  |          * methods. More precisely, invoking this method sets the Logger | ||||||
|  |          * class internal variable called <code>disable</code> to its | ||||||
|  |          * default "off" value. | ||||||
|  |          */ | ||||||
|  |         virtual void enableAll(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Return a new logger instance named as the first parameter using | ||||||
|  |          * the default factory.  | ||||||
|  |          *                 | ||||||
|  |          * If a logger of that name already exists, then it will be | ||||||
|  |          * returned.  Otherwise, a new logger will be instantiated and | ||||||
|  |          * then linked with its existing ancestors as well as children. | ||||||
|  |          *                                     | ||||||
|  |          * @param name The name of the logger to retrieve. | ||||||
|  |          */ | ||||||
|  |         virtual Logger getInstance(const log4cplus::tstring& name); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Return a new logger instance named as the first parameter using | ||||||
|  |          * <code>factory</code>. | ||||||
|  |          *                 | ||||||
|  |          * If a logger of that name already exists, then it will be | ||||||
|  |          * returned.  Otherwise, a new logger will be instantiated by the | ||||||
|  |          * <code>factory</code> parameter and linked with its existing | ||||||
|  |          * ancestors as well as children. | ||||||
|  |          *                                          | ||||||
|  |          * @param name The name of the logger to retrieve. | ||||||
|  |          * @param factory The factory that will make the new logger instance. | ||||||
|  |          */ | ||||||
|  |         virtual Logger getInstance(const log4cplus::tstring& name, spi::LoggerFactory& factory); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Returns all the currently defined loggers in this hierarchy. | ||||||
|  |          * | ||||||
|  |          * The root logger is <em>not</em> included in the returned list.  | ||||||
|  |          */ | ||||||
|  |         virtual LoggerList getCurrentLoggers(); | ||||||
|  |  | ||||||
|  |         /**  | ||||||
|  |          * Is the LogLevel specified by <code>level</code> enabled?  | ||||||
|  |          */ | ||||||
|  |         virtual bool isDisabled(int level); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Get the root of this hierarchy. | ||||||
|  |          */ | ||||||
|  |         virtual Logger getRoot() const; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Reset all values contained in this hierarchy instance to their | ||||||
|  |          * default.  This removes all appenders from all loggers, sets | ||||||
|  |          * the LogLevel of all non-root loggers to <code>NOT_SET_LOG_LEVEL</code>, | ||||||
|  |          * sets their additivity flag to <code>true</code> and sets the LogLevel | ||||||
|  |          * of the root logger to DEBUG_LOG_LEVEL.  Moreover, message disabling | ||||||
|  |          * is set its default "off" value. | ||||||
|  |          * | ||||||
|  |          * Existing loggers are not removed. They are just reset. | ||||||
|  |          * | ||||||
|  |          * This method should be used sparingly and with care as it will | ||||||
|  |          * block all logging until it is completed.</p> | ||||||
|  |          */ | ||||||
|  |         virtual void resetConfiguration();  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Set the default LoggerFactory instance. | ||||||
|  |          */ | ||||||
|  |         virtual void setLoggerFactory(std::auto_ptr<spi::LoggerFactory> factory); | ||||||
|  |          | ||||||
|  |         /** | ||||||
|  |          * Returns the default LoggerFactory instance. | ||||||
|  |          */ | ||||||
|  |         virtual spi::LoggerFactory* getLoggerFactory() { return defaultFactory.get(); } | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Shutting down a hierarchy will <em>safely</em> close and remove | ||||||
|  |          * all appenders in all loggers including the root logger. | ||||||
|  |          *                 | ||||||
|  |          * Some appenders such as SocketAppender need to be closed before the | ||||||
|  |          * application exits. Otherwise, pending logging events might be | ||||||
|  |          * lost. | ||||||
|  |          * | ||||||
|  |          * The <code>shutdown</code> method is careful to close nested | ||||||
|  |          * appenders before closing regular appenders. This is allows | ||||||
|  |          * configurations where a regular appender is attached to a logger | ||||||
|  |          * and again to a nested appender. | ||||||
|  |          */ | ||||||
|  |         virtual void shutdown(); | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |       // Types | ||||||
|  |         typedef std::vector<Logger> ProvisionNode; | ||||||
|  |         typedef std::map<log4cplus::tstring, ProvisionNode> ProvisionNodeMap; | ||||||
|  |         typedef std::map<log4cplus::tstring, Logger> LoggerMap; | ||||||
|  |  | ||||||
|  |       // Methods | ||||||
|  |         /** | ||||||
|  |          * This is the implementation of the <code>getInstance()</code> method. | ||||||
|  |          * NOTE: This method does not lock the <code>hashtable_mutex</code>. | ||||||
|  |          */ | ||||||
|  |         virtual Logger getInstanceImpl(const log4cplus::tstring& name,  | ||||||
|  |                                        spi::LoggerFactory& factory); | ||||||
|  |          | ||||||
|  |         /** | ||||||
|  |          * This is the implementation of the <code>getCurrentLoggers()</code>. | ||||||
|  |          * NOTE: This method does not lock the <code>hashtable_mutex</code>. | ||||||
|  |          */ | ||||||
|  |         virtual void initializeLoggerList(LoggerList& list) const; | ||||||
|  |          | ||||||
|  |         /** | ||||||
|  |          * This method loops through all the *potential* parents of | ||||||
|  |          * logger'. There 3 possible cases: | ||||||
|  |          * | ||||||
|  |          * 1) No entry for the potential parent of 'logger' exists | ||||||
|  |          * | ||||||
|  |          *    We create a ProvisionNode for this potential parent and insert | ||||||
|  |          *    'logger' in that provision node. | ||||||
|  |          * | ||||||
|  |          * 2) There is an entry of type Logger for the potential parent. | ||||||
|  |          * | ||||||
|  |          *    The entry is 'logger's nearest existing parent. We update logger's | ||||||
|  |          *    parent field with this entry. We also break from the loop | ||||||
|  |          *    because updating our parent's parent is our parent's | ||||||
|  |          *    responsibility. | ||||||
|  |          * | ||||||
|  |          * 3) There entry is of type ProvisionNode for this potential parent. | ||||||
|  |          * | ||||||
|  |          *    We add 'logger' to the list of children for this potential parent. | ||||||
|  |          */ | ||||||
|  |         void updateParents(Logger logger); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * We update the links for all the children that placed themselves | ||||||
|  |          * in the provision node 'pn'. The second argument 'logger' is a | ||||||
|  |          * reference for the newly created Logger, parent of all the | ||||||
|  |          * children in 'pn' | ||||||
|  |          * | ||||||
|  |          * We loop on all the children 'c' in 'pn': | ||||||
|  |          * | ||||||
|  |          *    If the child 'c' has been already linked to a child of | ||||||
|  |          *    'logger' then there is no need to update 'c'. | ||||||
|  |          * | ||||||
|  |          *   Otherwise, we set logger's parent field to c's parent and set | ||||||
|  |          *   c's parent field to logger. | ||||||
|  |          */ | ||||||
|  |         void updateChildren(ProvisionNode& pn, Logger logger); | ||||||
|  |  | ||||||
|  |     // Data | ||||||
|  |        LOG4CPLUS_MUTEX_PTR_DECLARE hashtable_mutex; | ||||||
|  |        std::auto_ptr<spi::LoggerFactory> defaultFactory; | ||||||
|  |        ProvisionNodeMap provisionNodes; | ||||||
|  |        LoggerMap loggerPtrs; | ||||||
|  |        Logger root; | ||||||
|  |  | ||||||
|  |        int disableValue; | ||||||
|  |  | ||||||
|  |        bool emittedNoAppenderWarning; | ||||||
|  |        bool emittedNoResourceBundleWarning; | ||||||
|  |  | ||||||
|  |      // Disallow copying of instances of this class | ||||||
|  |        Hierarchy(const Hierarchy&); | ||||||
|  |        Hierarchy& operator=(const Hierarchy&); | ||||||
|  |  | ||||||
|  |     // Friends | ||||||
|  |        friend class log4cplus::spi::LoggerImpl; | ||||||
|  |        friend class log4cplus::HierarchyLocker; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_HIERARCHY_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										67
									
								
								libs/log4cplus/include/log4cplus/hierarchylocker.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								libs/log4cplus/include/log4cplus/hierarchylocker.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    hierarchylocker.h | ||||||
|  | // Created: 8/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_HIERARCHY_LOCKER_HEADER_ | ||||||
|  | #define _LOG4CPLUS_HIERARCHY_LOCKER_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/hierarchy.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * This is used to lock a Hierarchy.  The dtor unlocks the Hierarchy. | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT HierarchyLocker { | ||||||
|  |     public: | ||||||
|  |       // ctor & dtor | ||||||
|  |         HierarchyLocker(Hierarchy& h); | ||||||
|  |         ~HierarchyLocker(); | ||||||
|  |          | ||||||
|  |         /** | ||||||
|  |          * Calls the <code>resetConfiguration()</code> method on the locked Hierarchy. | ||||||
|  |          */ | ||||||
|  |         void resetConfiguration();  | ||||||
|  |          | ||||||
|  |         /** | ||||||
|  |          * Calls the <code>getInstance()</code> method on the locked Hierarchy. | ||||||
|  |          */ | ||||||
|  |         Logger getInstance(const log4cplus::tstring& name); | ||||||
|  |          | ||||||
|  |         /** | ||||||
|  |          * Calls the <code>getInstance()</code> method on the locked Hierarchy. | ||||||
|  |          */ | ||||||
|  |         Logger getInstance(const log4cplus::tstring& name, spi::LoggerFactory& factory); | ||||||
|  |          | ||||||
|  |         void addAppender(Logger &logger, log4cplus::SharedAppenderPtr& appender); | ||||||
|  |          | ||||||
|  |     private: | ||||||
|  |       // Data | ||||||
|  |         Hierarchy& h; | ||||||
|  |         log4cplus::thread::Guard hierarchyLocker; | ||||||
|  |         LoggerList loggerList; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_HIERARCHY_LOCKER_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										532
									
								
								libs/log4cplus/include/log4cplus/layout.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										532
									
								
								libs/log4cplus/include/log4cplus/layout.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,532 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    Layout.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_LAYOUT_HEADER_ | ||||||
|  | #define _LOG4CPLUS_LAYOUT_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/loglevel.h> | ||||||
|  | #include <log4cplus/streams.h> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  | #include <log4cplus/helpers/logloguser.h> | ||||||
|  | #include <log4cplus/helpers/property.h> | ||||||
|  | #include <log4cplus/helpers/timehelper.h> | ||||||
|  | #include <log4cplus/spi/loggingevent.h> | ||||||
|  |  | ||||||
|  | #include <vector> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |  | ||||||
|  |     // Forward Declarations | ||||||
|  |     namespace pattern { | ||||||
|  |         class PatternConverter; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * This class is used to layout strings sent to an {@link | ||||||
|  |      * log4cplus::Appender}. | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT Layout : protected :: log4cplus::helpers::LogLogUser { | ||||||
|  |     public: | ||||||
|  |         Layout() : llmCache(getLogLevelManager()) {} | ||||||
|  |         Layout(const log4cplus::helpers::Properties&)  | ||||||
|  |           : llmCache(getLogLevelManager())  {} | ||||||
|  |         virtual ~Layout() {} | ||||||
|  |  | ||||||
|  |         virtual void formatAndAppend(log4cplus::tostream& output,  | ||||||
|  |                                      const log4cplus::spi::InternalLoggingEvent& event) = 0; | ||||||
|  |     protected: | ||||||
|  |         LogLevelManager& llmCache; | ||||||
|  |          | ||||||
|  |     private: | ||||||
|  |       // Disable copy | ||||||
|  |         Layout(const Layout&); | ||||||
|  |         Layout& operator=(Layout&); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * SimpleLayout consists of the LogLevel of the log statement, | ||||||
|  |      * followed by " - " and then the log message itself. For example, | ||||||
|  |      * | ||||||
|  |      * <pre> | ||||||
|  |      *         DEBUG - Hello world | ||||||
|  |      * </pre> | ||||||
|  |      * | ||||||
|  |      * {@link PatternLayout} offers a much more powerful alternative. | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT SimpleLayout : public Layout { | ||||||
|  |     public: | ||||||
|  |         SimpleLayout() {} | ||||||
|  |         SimpleLayout(const log4cplus::helpers::Properties& properties) : Layout(properties) {} | ||||||
|  |  | ||||||
|  |         virtual void formatAndAppend(log4cplus::tostream& output,  | ||||||
|  |                                      const log4cplus::spi::InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |     private:  | ||||||
|  |       // Disallow copying of instances of this class | ||||||
|  |         SimpleLayout(const SimpleLayout&); | ||||||
|  |         SimpleLayout& operator=(const SimpleLayout&); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * TTCC layout format consists of time, thread, Logger and nested | ||||||
|  |      * diagnostic context information, hence the name. | ||||||
|  |      *  | ||||||
|  |      * The time format depends on the <code>DateFormat</code> used.  Use the | ||||||
|  |      * <code>Use_gmtime</code> to specify whether messages should be logged using | ||||||
|  |      * <code>localtime</code> or <code>gmtime</code>. | ||||||
|  |      *  | ||||||
|  |      * Here is an example TTCCLayout output: | ||||||
|  |      *  | ||||||
|  |      * <pre> | ||||||
|  |      * 176 [main] INFO  org.apache.log4j.examples.Sort - Populating an array of 2 elements in reverse order. | ||||||
|  |      * 225 [main] INFO  org.apache.log4j.examples.SortAlgo - Entered the sort method. | ||||||
|  |      * 262 [main] DEBUG org.apache.log4j.examples.SortAlgo.OUTER i=1 - Outer loop. | ||||||
|  |      * 276 [main] DEBUG org.apache.log4j.examples.SortAlgo.SWAP i=1 j=0 - Swapping intArray[0] = 1 and intArray[1] = 0 | ||||||
|  |      * 290 [main] DEBUG org.apache.log4j.examples.SortAlgo.OUTER i=0 - Outer loop. | ||||||
|  |      * 304 [main] INFO  org.apache.log4j.examples.SortAlgo.DUMP - Dump of interger array: | ||||||
|  |      * 317 [main] INFO  org.apache.log4j.examples.SortAlgo.DUMP - Element [0] = 0 | ||||||
|  |      * 331 [main] INFO  org.apache.log4j.examples.SortAlgo.DUMP - Element [1] = 1 | ||||||
|  |      * 343 [main] INFO  org.apache.log4j.examples.Sort - The next log statement should be an error message. | ||||||
|  |      * 346 [main] ERROR org.apache.log4j.examples.SortAlgo.DUMP - Tried to dump an uninitialized array. | ||||||
|  |      * 467 [main] INFO  org.apache.log4j.examples.Sort - Exiting main method. | ||||||
|  |      * </pre> | ||||||
|  |      *  | ||||||
|  |      *  The first field is the number of milliseconds elapsed since the | ||||||
|  |      *  start of the program. The second field is the thread outputting the | ||||||
|  |      *  log statement. The third field is the LogLevel, the fourth field is | ||||||
|  |      *  the logger to which the statement belongs. | ||||||
|  |      *  | ||||||
|  |      *  The fifth field (just before the '-') is the nested diagnostic | ||||||
|  |      *  context.  Note the nested diagnostic context may be empty as in the | ||||||
|  |      *  first two statements. The text after the '-' is the message of the | ||||||
|  |      *  statement. | ||||||
|  |      *  | ||||||
|  |      *  PatternLayout offers a much more flexible alternative. | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT TTCCLayout : public Layout { | ||||||
|  |     public: | ||||||
|  |       // Ctor and dtor | ||||||
|  |         TTCCLayout(bool use_gmtime = false); | ||||||
|  |         TTCCLayout(const log4cplus::helpers::Properties& properties); | ||||||
|  |         virtual ~TTCCLayout(); | ||||||
|  |  | ||||||
|  |         virtual void formatAndAppend(log4cplus::tostream& output,  | ||||||
|  |                                      const log4cplus::spi::InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |     protected: | ||||||
|  |        log4cplus::tstring dateFormat; | ||||||
|  |        bool use_gmtime; | ||||||
|  |       | ||||||
|  |     private:  | ||||||
|  |       // Disallow copying of instances of this class | ||||||
|  |         TTCCLayout(const TTCCLayout&); | ||||||
|  |         TTCCLayout& operator=(const TTCCLayout&); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * A flexible layout configurable with pattern string. | ||||||
|  |      *  | ||||||
|  |      * The goal of this class is to format a InternalLoggingEvent and return  | ||||||
|  |      * the results as a string. The results depend on the <em>conversion  | ||||||
|  |      * pattern</em>. | ||||||
|  |      *  | ||||||
|  |      * The conversion pattern is closely related to the conversion | ||||||
|  |      * pattern of the printf function in C. A conversion pattern is | ||||||
|  |      * composed of literal text and format control expressions called | ||||||
|  |      * <em>conversion specifiers</em>. | ||||||
|  |      *   | ||||||
|  |      * <i>You are free to insert any literal text within the conversion | ||||||
|  |      * pattern.</i> | ||||||
|  |      *  | ||||||
|  |      * Each conversion specifier starts with a percent sign (%%) and is | ||||||
|  |      * followed by optional <em>format modifiers</em> and a <em>conversion | ||||||
|  |      * character</em>. The conversion character specifies the type of | ||||||
|  |      * data, e.g. Logger, LogLevel, date, thread name. The format | ||||||
|  |      * modifiers control such things as field width, padding, left and | ||||||
|  |      * right justification. The following is a simple example. | ||||||
|  |      *  | ||||||
|  |      * Let the conversion pattern be <b>"%-5p [%t]: %m%n"</b> and assume | ||||||
|  |      * that the log4cplus environment was set to use a PatternLayout. Then the | ||||||
|  |      * statements | ||||||
|  |      * <code><pre> | ||||||
|  |      * Logger root = Logger.getRoot(); | ||||||
|  |      * LOG4CPLUS_DEBUG(root, "Message 1"); | ||||||
|  |      * LOG4CPLUS_WARN(root, "Message 2"); | ||||||
|  |      * </pre></code> | ||||||
|  |      * would yield the output | ||||||
|  |      * <tt><pre> | ||||||
|  |      * DEBUG [main]: Message 1 | ||||||
|  |      * WARN  [main]: Message 2   | ||||||
|  |      * </pre></tt> | ||||||
|  |      *  | ||||||
|  |      * Note that there is no explicit separator between text and | ||||||
|  |      * conversion specifiers. The pattern parser knows when it has reached | ||||||
|  |      * the end of a conversion specifier when it reads a conversion | ||||||
|  |      * character. In the example above the conversion specifier | ||||||
|  |      * <b>"%-5p"</b> means the LogLevel of the logging event should be left | ||||||
|  |      * justified to a width of five characters. | ||||||
|  |      *  | ||||||
|  |      * The recognized conversion characters are | ||||||
|  |      *  | ||||||
|  |      *  | ||||||
|  |      * <table border="1" CELLPADDING="8"> | ||||||
|  |      * <tr> | ||||||
|  |      * <td>Conversion Character</td> | ||||||
|  |      * <td>Effect</td> | ||||||
|  |      * </tr> | ||||||
|  |      * | ||||||
|  |      * <tr> | ||||||
|  |      *   <td align=center><b>b</b></td> | ||||||
|  |      * | ||||||
|  |      *   <td>Used to output file name component of path name. | ||||||
|  |      *   E.g. <tt>main.cxx</tt> from path <tt>../../main.cxx</tt>.</td> | ||||||
|  |      * </tr> | ||||||
|  |      * | ||||||
|  |      * <tr> | ||||||
|  |      *   <td align=center><b>c</b></td> | ||||||
|  |      *  | ||||||
|  |      *   <td>Used to output the logger of the logging event. The | ||||||
|  |      *   logger conversion specifier can be optionally followed by | ||||||
|  |      *   <em>precision specifier</em>, that is a decimal constant in | ||||||
|  |      *   brackets. | ||||||
|  |      *  | ||||||
|  |      *   If a precision specifier is given, then only the corresponding | ||||||
|  |      *   number of right most components of the logger name will be | ||||||
|  |      *   printed. By default the logger name is printed in full. | ||||||
|  |      *  | ||||||
|  |      *   For example, for the logger name "a.b.c" the pattern | ||||||
|  |      *   <b>%c{2}</b> will output "b.c". | ||||||
|  |      *  | ||||||
|  |      * </td> | ||||||
|  |      * </tr> | ||||||
|  |      *  | ||||||
|  |      * <tr>  | ||||||
|  |      *   <td align=center><b>d</b></td>  | ||||||
|  |      * | ||||||
|  |      *   <td>Used to output the date of the logging event in <b>UTC</b>.  | ||||||
|  |      * | ||||||
|  |      *   The date conversion specifier may be followed by a <em>date format | ||||||
|  |      *   specifier</em> enclosed between braces. For example, <b>%%d{%%H:%%M:%%s}</b> | ||||||
|  |      *   or <b>%%d{%%d %%b %%Y %%H:%%M:%%s}</b>.  If no date format  | ||||||
|  |      *   specifier is given then <b>%%d{%%d %%m %%Y %%H:%%M:%%s}</b> | ||||||
|  |      *   is assumed. | ||||||
|  |      * | ||||||
|  |      *   The Following format options are possible: | ||||||
|  |      *   <ul> | ||||||
|  |      *   <li>%%a -- Abbreviated weekday name</li> | ||||||
|  |      *   <li>%%A -- Full weekday name</li> | ||||||
|  |      *   <li>%%b -- Abbreviated month name</li> | ||||||
|  |      *   <li>%%B -- Full month name</li> | ||||||
|  |      *   <li>%%c -- Standard date and time string</li> | ||||||
|  |      *   <li>%%d -- Day of month as a decimal(1-31)</li> | ||||||
|  |      *   <li>%%H -- Hour(0-23)</li> | ||||||
|  |      *   <li>%%I -- Hour(1-12)</li> | ||||||
|  |      *   <li>%%j -- Day of year as a decimal(1-366)</li> | ||||||
|  |      *   <li>%%m -- Month as decimal(1-12)</li> | ||||||
|  |      *   <li>%%M -- Minute as decimal(0-59)</li> | ||||||
|  |      *   <li>%%p -- Locale's equivalent of AM or PM</li> | ||||||
|  |      *   <li>%%q -- milliseconds as decimal(0-999) -- <b>Log4CPLUS specific</b> | ||||||
|  |      *   <li>%%Q -- fractional milliseconds as decimal(0-999.999) -- <b>Log4CPLUS specific</b> | ||||||
|  |      *   <li>%%S -- Second as decimal(0-59)</li> | ||||||
|  |      *   <li>%%U -- Week of year, Sunday being first day(0-53)</li> | ||||||
|  |      *   <li>%%w -- Weekday as a decimal(0-6, Sunday being 0)</li> | ||||||
|  |      *   <li>%%W -- Week of year, Monday being first day(0-53)</li> | ||||||
|  |      *   <li>%%x -- Standard date string</li> | ||||||
|  |      *   <li>%%X -- Standard time string</li> | ||||||
|  |      *   <li>%%y -- Year in decimal without century(0-99)</li> | ||||||
|  |      *   <li>%%Y -- Year including century as decimal</li> | ||||||
|  |      *   <li>%%Z -- Time zone name</li> | ||||||
|  |      *   <li>%% -- The percent sign</li> | ||||||
|  |      *   </ul> | ||||||
|  |      * | ||||||
|  |      *   Lookup the documentation for the <code>strftime()</code> function | ||||||
|  |      *   found in the <code><ctime></code> header for more information. | ||||||
|  |      * </td> | ||||||
|  |      * </tr> | ||||||
|  |      *  | ||||||
|  |      * <tr>  | ||||||
|  |      *   <td align=center><b>D</b></td>  | ||||||
|  |      * | ||||||
|  |      *   <td>Used to output the date of the logging event in <b>local</b> time. | ||||||
|  |      * | ||||||
|  |      *   All of the above information applies. | ||||||
|  |      * </td> | ||||||
|  |      * </tr> | ||||||
|  |      *  | ||||||
|  |      * <tr> | ||||||
|  |      *   <td align=center><b>F</b></td> | ||||||
|  |      *  | ||||||
|  |      *   <td>Used to output the file name where the logging request was | ||||||
|  |      *   issued. | ||||||
|  |      *  | ||||||
|  |      *   <b>NOTE</b> Unlike log4j, there is no performance penalty for | ||||||
|  |      *   calling this method. | ||||||
|  |      *  | ||||||
|  |      * </tr> | ||||||
|  |      *  | ||||||
|  |      * <tr>  | ||||||
|  |      *   <td align=center><b>h</b></td>  | ||||||
|  |      * | ||||||
|  |      *   <td>Used to output the hostname of this system (as returned | ||||||
|  |      *   by gethostname(2)). | ||||||
|  |      * | ||||||
|  |      *   <b>NOTE</b> The hostname is only retrieved once at | ||||||
|  |      *   initialization. | ||||||
|  |      * | ||||||
|  |      * </td> | ||||||
|  |      * </tr> | ||||||
|  |      *  | ||||||
|  |      * <tr>  | ||||||
|  |      *   <td align=center><b>H</b></td>  | ||||||
|  |      * | ||||||
|  |      *   <td>Used to output the fully-qualified domain name of this | ||||||
|  |      *   system (as returned by gethostbyname(2) for the hostname | ||||||
|  |      *   returned by gethostname(2)). | ||||||
|  |      * | ||||||
|  |      *   <b>NOTE</b> The hostname is only retrieved once at | ||||||
|  |      *   initialization. | ||||||
|  |      * | ||||||
|  |      * </td> | ||||||
|  |      * </tr> | ||||||
|  |      *  | ||||||
|  |      * <tr> | ||||||
|  |      * <td align=center><b>l</b></td> | ||||||
|  |      *  | ||||||
|  |      *   <td>Equivalent to using "%F:%L" | ||||||
|  |      *  | ||||||
|  |      *   <b>NOTE:</b> Unlike log4j, there is no performance penalty for | ||||||
|  |      *   calling this method. | ||||||
|  |      *  | ||||||
|  |      * </td> | ||||||
|  |      * </tr> | ||||||
|  |      *  | ||||||
|  |      * <tr> | ||||||
|  |      *   <td align=center><b>L</b></td> | ||||||
|  |      *  | ||||||
|  |      *   <td>Used to output the line number from where the logging request | ||||||
|  |      *   was issued. | ||||||
|  |      *  | ||||||
|  |      *   <b>NOTE:</b> Unlike log4j, there is no performance penalty for | ||||||
|  |      *   calling this method. | ||||||
|  |      *  | ||||||
|  |      * </tr> | ||||||
|  |      *  | ||||||
|  |      *   | ||||||
|  |      * <tr> | ||||||
|  |      *   <td align=center><b>m</b></td> | ||||||
|  |      *   <td>Used to output the application supplied message associated with  | ||||||
|  |      *   the logging event.</td>    | ||||||
|  |      * </tr> | ||||||
|  |      *  | ||||||
|  |      * <tr> | ||||||
|  |      *   <td align=center><b>n</b></td> | ||||||
|  |      *    | ||||||
|  |      *   <td>Outputs the platform dependent line separator character or | ||||||
|  |      *   characters.  | ||||||
|  |      * </tr> | ||||||
|  |      *  | ||||||
|  |      * <tr> | ||||||
|  |      *   <td align=center><b>p</b></td> | ||||||
|  |      *   <td>Used to output the LogLevel of the logging event.</td> | ||||||
|  |      * </tr> | ||||||
|  |      *  | ||||||
|  |      * <tr> | ||||||
|  |      *   <td align=center><b>t</b></td> | ||||||
|  |      *  | ||||||
|  |      *   <td>Used to output the name of the thread that generated the | ||||||
|  |      *   logging event.</td> | ||||||
|  |      * </tr> | ||||||
|  |      * | ||||||
|  |      * <tr> | ||||||
|  |      *   <td align=center><b>i</b></td> | ||||||
|  |      * | ||||||
|  |      *   <td>Used to output the process ID of the process that generated the | ||||||
|  |      *   logging event.</td> | ||||||
|  |      * </tr> | ||||||
|  |      * | ||||||
|  |      * <tr> | ||||||
|  |      *   <td align=center><b>x</b></td> | ||||||
|  |      *  | ||||||
|  |      *   <td>Used to output the NDC (nested diagnostic context) associated | ||||||
|  |      *   with the thread that generated the logging event. | ||||||
|  |      *   </td>      | ||||||
|  |      * </tr> | ||||||
|  |      * | ||||||
|  |      * <tr> | ||||||
|  |      *   <td align=center><b>"%%"</b></td> | ||||||
|  |      *   <td>The sequence "%%" outputs a single percent sign. | ||||||
|  |      *   </td>      | ||||||
|  |      * </tr> | ||||||
|  |      *   | ||||||
|  |      * </table> | ||||||
|  |      *  | ||||||
|  |      * By default the relevant information is output as is. However, | ||||||
|  |      * with the aid of format modifiers it is possible to change the | ||||||
|  |      * minimum field width, the maximum field width and justification. | ||||||
|  |      *  | ||||||
|  |      * The optional format modifier is placed between the percent sign | ||||||
|  |      * and the conversion character. | ||||||
|  |      *  | ||||||
|  |      * The first optional format modifier is the <em>left justification | ||||||
|  |      * flag</em> which is just the minus (-) character. Then comes the | ||||||
|  |      * optional <em>minimum field width</em> modifier. This is a decimal | ||||||
|  |      * constant that represents the minimum number of characters to | ||||||
|  |      * output. If the data item requires fewer characters, it is padded on | ||||||
|  |      * either the left or the right until the minimum width is | ||||||
|  |      * reached. The default is to pad on the left (right justify) but you | ||||||
|  |      * can specify right padding with the left justification flag. The | ||||||
|  |      * padding character is space. If the data item is larger than the | ||||||
|  |      * minimum field width, the field is expanded to accommodate the | ||||||
|  |      * data. The value is never truncated. | ||||||
|  |      *  | ||||||
|  |      * This behavior can be changed using the <em>maximum field | ||||||
|  |      * width</em> modifier which is designated by a period followed by a | ||||||
|  |      * decimal constant. If the data item is longer than the maximum | ||||||
|  |      * field, then the extra characters are removed from the | ||||||
|  |      * <em>beginning</em> of the data item and not from the end. For | ||||||
|  |      * example, it the maximum field width is eight and the data item is | ||||||
|  |      * ten characters long, then the first two characters of the data item | ||||||
|  |      * are dropped. This behavior deviates from the printf function in C | ||||||
|  |      * where truncation is done from the end. | ||||||
|  |      *  | ||||||
|  |      * Below are various format modifier examples for the logger | ||||||
|  |      * conversion specifier. | ||||||
|  |      *  | ||||||
|  |      *  | ||||||
|  |      * <TABLE BORDER=1 CELLPADDING=8> | ||||||
|  |      * <tr> | ||||||
|  |      * <td>Format modifier</td> | ||||||
|  |      * <td>left justify</td> | ||||||
|  |      * <td>minimum width</td> | ||||||
|  |      * <td>maximum width</td> | ||||||
|  |      * <td>comment</td> | ||||||
|  |      * </tr> | ||||||
|  |      * | ||||||
|  |      * <tr> | ||||||
|  |      * <td align=center>%20c</td> | ||||||
|  |      * <td align=center>false</td> | ||||||
|  |      * <td align=center>20</td> | ||||||
|  |      * <td align=center>none</td> | ||||||
|  |      *  | ||||||
|  |      * <td>Left pad with spaces if the logger name is less than 20 | ||||||
|  |      * characters long. | ||||||
|  |      * </tr> | ||||||
|  |      *  | ||||||
|  |      * <tr> <td align=center>%-20c</td> <td align=center>true</td> <td | ||||||
|  |      * align=center>20</td> <td align=center>none</td> <td>Right pad with | ||||||
|  |      * spaces if the logger name is less than 20 characters long. | ||||||
|  |      * </tr> | ||||||
|  |      *  | ||||||
|  |      * <tr> | ||||||
|  |      * <td align=center>%.30c</td> | ||||||
|  |      * <td align=center>NA</td> | ||||||
|  |      * <td align=center>none</td> | ||||||
|  |      * <td align=center>30</td> | ||||||
|  |      *  | ||||||
|  |      * <td>Truncate from the beginning if the logger name is longer than 30 | ||||||
|  |      * characters. | ||||||
|  |      * </tr> | ||||||
|  |      *  | ||||||
|  |      * <tr> | ||||||
|  |      * <td align=center>%20.30c</td> | ||||||
|  |      * <td align=center>false</td> | ||||||
|  |      * <td align=center>20</td> | ||||||
|  |      * <td align=center>30</td> | ||||||
|  |      *  | ||||||
|  |      * <td>Left pad with spaces if the logger name is shorter than 20 | ||||||
|  |      * characters. However, if logger name is longer than 30 characters, | ||||||
|  |      * then truncate from the beginning.    | ||||||
|  |      * </tr> | ||||||
|  |      *  | ||||||
|  |      * <tr> | ||||||
|  |      * <td align=center>%-20.30c</td> | ||||||
|  |      * <td align=center>true</td> | ||||||
|  |      * <td align=center>20</td> | ||||||
|  |      * <td align=center>30</td> | ||||||
|  |      *   | ||||||
|  |      * <td>Right pad with spaces if the logger name is shorter than 20 | ||||||
|  |      * characters. However, if logger name is longer than 30 characters, | ||||||
|  |      * then truncate from the beginning.    | ||||||
|  |      * </tr> | ||||||
|  |      *  | ||||||
|  |      * </table> | ||||||
|  |      *  | ||||||
|  |      * Below are some examples of conversion patterns. | ||||||
|  |      *  | ||||||
|  |      * <dl> | ||||||
|  |      *  | ||||||
|  |      * <dt><b>"%r [%t] %-5p %c %x - %m%n"</b>  | ||||||
|  |      * <dd>This is essentially the TTCC layout. | ||||||
|  |      *  | ||||||
|  |      * <dt><b>"%-6r [%15.15t] %-5p %30.30c %x - %m%n"</b> | ||||||
|  |      *  | ||||||
|  |      * <dd>Similar to the TTCC layout except that the relative time is | ||||||
|  |      * right padded if less than 6 digits, thread name is right padded if | ||||||
|  |      * less than 15 characters and truncated if longer and the logger | ||||||
|  |      * name is left padded if shorter than 30 characters and truncated if | ||||||
|  |      * longer. | ||||||
|  |      *   | ||||||
|  |      * </dl> | ||||||
|  |      *  | ||||||
|  |      * The above text is largely inspired from Peter A. Darnell and | ||||||
|  |      * Philip E. Margolis' highly recommended book "C -- a Software | ||||||
|  |      * Engineering Approach", ISBN 0-387-97389-3. | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT PatternLayout : public Layout { | ||||||
|  |     public: | ||||||
|  |       // Ctors and dtor | ||||||
|  |         PatternLayout(const log4cplus::tstring& pattern); | ||||||
|  |         PatternLayout(const log4cplus::helpers::Properties& properties); | ||||||
|  |         virtual ~PatternLayout(); | ||||||
|  |  | ||||||
|  |         virtual void formatAndAppend(log4cplus::tostream& output,  | ||||||
|  |                                      const log4cplus::spi::InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |     protected: | ||||||
|  |         void init(const log4cplus::tstring& pattern, unsigned ndcMaxDepth = 0); | ||||||
|  |  | ||||||
|  |       // Data | ||||||
|  |         log4cplus::tstring pattern; | ||||||
|  |         std::vector<pattern::PatternConverter*> parsedPattern; | ||||||
|  |  | ||||||
|  |     private:  | ||||||
|  |       // Disallow copying of instances of this class | ||||||
|  |         PatternLayout(const PatternLayout&); | ||||||
|  |         PatternLayout& operator=(const PatternLayout&); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_LAYOUT_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										344
									
								
								libs/log4cplus/include/log4cplus/logger.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										344
									
								
								libs/log4cplus/include/log4cplus/logger.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,344 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    logger.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file  | ||||||
|  |  * This header defines the Logger class and the logging macros. */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_LOGGERHEADER_ | ||||||
|  | #define _LOG4CPLUS_LOGGERHEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/loglevel.h> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  | #include <log4cplus/spi/appenderattachable.h> | ||||||
|  | #include <log4cplus/spi/loggerfactory.h> | ||||||
|  |  | ||||||
|  | #include <vector> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus | ||||||
|  | { | ||||||
|  |     // Forward declarations | ||||||
|  |  | ||||||
|  |     class Appender; | ||||||
|  |     class Hierarchy; | ||||||
|  |     class HierarchyLocker; | ||||||
|  |     class DefaultLoggerFactory; | ||||||
|  |  | ||||||
|  |     namespace spi | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         class LoggerImpl; | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** \typedef std::vector<Logger> LoggerList | ||||||
|  |      * This is a list of {@link Logger Loggers}. */ | ||||||
|  |     typedef std::vector<Logger> LoggerList; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * This is the central class in the log4cplus package. One of the | ||||||
|  |      * distintive features of log4cplus are hierarchical loggers and their | ||||||
|  |      * evaluation. | ||||||
|  |      *  | ||||||
|  |      * See the <a href="../../../../manual.html">user manual</a> for an | ||||||
|  |      * introduction on this class. | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT Logger | ||||||
|  |         : public log4cplus::spi::AppenderAttachable | ||||||
|  |     { | ||||||
|  |     public: | ||||||
|  |       // Static Methods | ||||||
|  |         /** | ||||||
|  |          * Returns <code>true </code>if the named logger exists  | ||||||
|  |          * (in the default hierarchy). | ||||||
|  |          *                 | ||||||
|  |          * @param name The name of the logger to search for. | ||||||
|  |          */ | ||||||
|  |         static bool exists(const log4cplus::tstring& name); | ||||||
|  |  | ||||||
|  |         /* | ||||||
|  |          * Returns all the currently defined loggers in the default | ||||||
|  |          * hierarchy. | ||||||
|  |          *  | ||||||
|  |          * The root logger is <em>not</em> included in the returned | ||||||
|  |          * list.       | ||||||
|  |         */ | ||||||
|  |         static LoggerList getCurrentLoggers(); | ||||||
|  |       | ||||||
|  |         /** | ||||||
|  |          * Return the default Hierarchy instance. | ||||||
|  |          */ | ||||||
|  |         static Hierarchy& getDefaultHierarchy(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Retrieve a logger with name <code>name</code>.  If the named  | ||||||
|  |          * logger already exists, then the existing instance will be returned.  | ||||||
|  |          * Otherwise, a new instance is created.  | ||||||
|  |          *  | ||||||
|  |          * By default, loggers do not have a set LogLevel but inherit | ||||||
|  |          * it from the hierarchy. This is one of the central features of | ||||||
|  |          * log4cplus. | ||||||
|  |          *  | ||||||
|  |          * @param name The name of the logger to retrieve.   | ||||||
|  |          */ | ||||||
|  |         static Logger getInstance(const log4cplus::tstring& name); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Like getInstance() except that the type of logger | ||||||
|  |          * instantiated depends on the type returned by the {@link | ||||||
|  |          * spi::LoggerFactory#makeNewLoggerInstance} method of the | ||||||
|  |          * <code>factory</code> parameter. | ||||||
|  |          *                           | ||||||
|  |          * This method is intended to be used by sub-classes. | ||||||
|  |          *                                    | ||||||
|  |          * @param name The name of the logger to retrieve. | ||||||
|  |          * @param factory A {@link spi::LoggerFactory} implementation that will | ||||||
|  |          * actually create a new Instance. | ||||||
|  |          */ | ||||||
|  |         static Logger getInstance(const log4cplus::tstring& name, spi::LoggerFactory& factory); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Return the root of the default logger hierrachy. | ||||||
|  |          *  | ||||||
|  |          * The root logger is always instantiated and available. It's | ||||||
|  |          * name is "root". | ||||||
|  |          *  | ||||||
|  |          * Nevertheless, calling {@link #getInstance | ||||||
|  |          * Logger.getInstance("root")} does not retrieve the root logger  | ||||||
|  |          * but a logger just under root named "root". | ||||||
|  |          */ | ||||||
|  |         static Logger getRoot(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Calling this method will <em>safely</em> close and remove all | ||||||
|  |          * appenders in all the loggers including root contained in the | ||||||
|  |          * default hierachy. | ||||||
|  |          *                      | ||||||
|  |          * Some appenders such as SocketAppender need to be closed before the | ||||||
|  |          * application exits. Otherwise, pending logging events might be | ||||||
|  |          * lost. | ||||||
|  |          *  | ||||||
|  |          * The <code>shutdown</code> method is careful to close nested | ||||||
|  |          * appenders before closing regular appenders. This is allows | ||||||
|  |          * configurations where a regular appender is attached to a logger | ||||||
|  |          * and again to a nested appender.   | ||||||
|  |          */ | ||||||
|  |         static void shutdown(); | ||||||
|  |  | ||||||
|  |       // Non-Static Methods | ||||||
|  |         /** | ||||||
|  |          * If <code>assertionVal</code> parameter is <code>false</code>, then | ||||||
|  |          * logs <code>msg</code> with FATAL_LOG_LEVEL log level. | ||||||
|  |          * | ||||||
|  |          * @param assertionVal Truth value of assertion condition. | ||||||
|  |          * @param msg The message to print if <code>assertion</code> is | ||||||
|  |          * false. | ||||||
|  |          */ | ||||||
|  |         void assertion(bool assertionVal, const log4cplus::tstring& msg) const; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Close all attached appenders implementing the AppenderAttachable | ||||||
|  |          * interface.   | ||||||
|  |          */ | ||||||
|  |         void closeNestedAppenders() const; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Check whether this logger is enabled for a given | ||||||
|  |          * LogLevel passed as parameter. | ||||||
|  |          * | ||||||
|  |          * @return boolean True if this logger is enabled for <code>ll</code>. | ||||||
|  |          */ | ||||||
|  |         bool isEnabledFor(LogLevel ll) const; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This generic form is intended to be used by wrappers.  | ||||||
|  |          */ | ||||||
|  |         void log(LogLevel ll, const log4cplus::tstring& message, | ||||||
|  |                  const char* file=NULL, int line=-1) const; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This method creates a new logging event and logs the event | ||||||
|  |          * without further checks.   | ||||||
|  |          */ | ||||||
|  |         void forcedLog(LogLevel ll, const log4cplus::tstring& message, | ||||||
|  |                        const char* file=NULL, int line=-1) const; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Call the appenders in the hierrachy starting at | ||||||
|  |          * <code>this</code>.  If no appenders could be found, emit a | ||||||
|  |          * warning. | ||||||
|  |          *  | ||||||
|  |          * This method calls all the appenders inherited from the | ||||||
|  |          * hierarchy circumventing any evaluation of whether to log or not | ||||||
|  |          * to log the particular log request. | ||||||
|  |          * | ||||||
|  |          * @param event the event to log. | ||||||
|  |          */ | ||||||
|  |         void callAppenders(const spi::InternalLoggingEvent& event) const; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Starting from this logger, search the logger hierarchy for a | ||||||
|  |          * "set" LogLevel and return it. Otherwise, return the LogLevel of the | ||||||
|  |          * root logger. | ||||||
|  |          *  | ||||||
|  |          * The Logger class is designed so that this method executes as | ||||||
|  |          * quickly as possible. | ||||||
|  |          */ | ||||||
|  |         LogLevel getChainedLogLevel() const; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Returns the assigned LogLevel, if any, for this Logger.   | ||||||
|  |          *            | ||||||
|  |          * @return LogLevel - the assigned LogLevel, can be <code>NOT_SET_LOG_LEVEL</code>. | ||||||
|  |          */ | ||||||
|  |         LogLevel getLogLevel() const; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Set the LogLevel of this Logger. | ||||||
|  |          */ | ||||||
|  |         void setLogLevel(LogLevel ll); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Return the the {@link Hierarchy} where this <code>Logger</code> instance is | ||||||
|  |          * attached. | ||||||
|  |          */ | ||||||
|  |         Hierarchy& getHierarchy() const; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Return the logger name.   | ||||||
|  |          */ | ||||||
|  |         log4cplus::tstring getName() const; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Get the additivity flag for this Logger instance.   | ||||||
|  |          */ | ||||||
|  |         bool getAdditivity() const; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Set the additivity flag for this Logger instance. | ||||||
|  |          */ | ||||||
|  |         void setAdditivity(bool additive); | ||||||
|  |  | ||||||
|  |       // AppenderAttachable Methods | ||||||
|  |         virtual void addAppender(SharedAppenderPtr newAppender); | ||||||
|  |  | ||||||
|  |         virtual SharedAppenderPtrList getAllAppenders(); | ||||||
|  |  | ||||||
|  |         virtual SharedAppenderPtr getAppender(const log4cplus::tstring& name); | ||||||
|  |  | ||||||
|  |         virtual void removeAllAppenders(); | ||||||
|  |  | ||||||
|  |         virtual void removeAppender(SharedAppenderPtr appender); | ||||||
|  |  | ||||||
|  |         virtual void removeAppender(const log4cplus::tstring& name); | ||||||
|  |  | ||||||
|  |         Logger (); | ||||||
|  |         Logger(const Logger& rhs); | ||||||
|  |         Logger& operator=(const Logger& rhs); | ||||||
|  |         virtual ~Logger(); | ||||||
|  |  | ||||||
|  |         void swap (Logger &); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Used to retrieve the parent of this Logger in the | ||||||
|  |          * Logger tree. | ||||||
|  |          */ | ||||||
|  |         Logger getParent() const; | ||||||
|  |  | ||||||
|  |     protected: | ||||||
|  |       // Data | ||||||
|  |         /** This is a pointer to the implementation class. */ | ||||||
|  |         spi::LoggerImpl * value; | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |       // Ctors | ||||||
|  |         /** | ||||||
|  |          * This constructor created a new <code>Logger</code> instance  | ||||||
|  |          * with a pointer to a Logger implementation. | ||||||
|  |          *  | ||||||
|  |          * You should not create loggers directly. | ||||||
|  |          * | ||||||
|  |          * @param ptr A pointer to the Logger implementation.  This value | ||||||
|  |          *            cannot be NULL.   | ||||||
|  |          */ | ||||||
|  |         Logger(spi::LoggerImpl * ptr); | ||||||
|  |  | ||||||
|  |       // Friends | ||||||
|  |         friend class log4cplus::spi::LoggerImpl; | ||||||
|  |         friend class log4cplus::Hierarchy; | ||||||
|  |         friend class log4cplus::HierarchyLocker; | ||||||
|  |         friend class log4cplus::DefaultLoggerFactory; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * This class is used to create the default implementation of | ||||||
|  |      * the Logger class | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT DefaultLoggerFactory : public spi::LoggerFactory { | ||||||
|  |     public: | ||||||
|  |         Logger makeNewLoggerInstance(const log4cplus::tstring& name, Hierarchy& h); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * This class is used to produce "Trace" logging.  When an instance of | ||||||
|  |      * this class is created, it will log a <code>"ENTER: " + msg</code> | ||||||
|  |      * log message if TRACE_LOG_LEVEL is enabled for <code>logger</code>. | ||||||
|  |      * When an instance of this class is destroyed, it will log a | ||||||
|  |      * <code>"ENTER: " + msg</code> log message if TRACE_LOG_LEVEL is enabled | ||||||
|  |      * for <code>logger</code>. | ||||||
|  |      *  | ||||||
|  |      * @see LOG4CPLUS_TRACE | ||||||
|  |      */ | ||||||
|  |     class TraceLogger | ||||||
|  |     { | ||||||
|  |     public: | ||||||
|  |         TraceLogger(const Logger& l, const log4cplus::tstring& _msg, | ||||||
|  |                     const char* _file=NULL, int _line=-1)  | ||||||
|  |           : logger(l), msg(_msg), file(_file), line(_line) | ||||||
|  |         { if(logger.isEnabledFor(TRACE_LOG_LEVEL)) | ||||||
|  |               logger.forcedLog(TRACE_LOG_LEVEL, LOG4CPLUS_TEXT("ENTER: ") + msg, file, line);  | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         ~TraceLogger() | ||||||
|  |         { if(logger.isEnabledFor(TRACE_LOG_LEVEL)) | ||||||
|  |               logger.forcedLog(TRACE_LOG_LEVEL, LOG4CPLUS_TEXT("EXIT:  ") + msg, file, line);  | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |         Logger logger; | ||||||
|  |         log4cplus::tstring msg; | ||||||
|  |         const char* file; | ||||||
|  |         int line; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #include <log4cplus/loggingmacros.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_LOGGERHEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										191
									
								
								libs/log4cplus/include/log4cplus/loggingmacros.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										191
									
								
								libs/log4cplus/include/log4cplus/loggingmacros.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,191 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    loggingmacros.h | ||||||
|  | // Created: 8/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file  | ||||||
|  |  * This header defines the logging macros. */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_LOGGING_MACROS_HEADER_ | ||||||
|  | #define _LOG4CPLUS_LOGGING_MACROS_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/streams.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if defined(LOG4CPLUS_DISABLE_FATAL) && !defined(LOG4CPLUS_DISABLE_ERROR) | ||||||
|  | #define LOG4CPLUS_DISABLE_ERROR | ||||||
|  | #endif | ||||||
|  | #if defined(LOG4CPLUS_DISABLE_ERROR) && !defined(LOG4CPLUS_DISABLE_WARN) | ||||||
|  | #define LOG4CPLUS_DISABLE_WARN | ||||||
|  | #endif | ||||||
|  | #if defined(LOG4CPLUS_DISABLE_WARN) && !defined(LOG4CPLUS_DISABLE_INFO) | ||||||
|  | #define LOG4CPLUS_DISABLE_INFO | ||||||
|  | #endif | ||||||
|  | #if defined(LOG4CPLUS_DISABLE_INFO) && !defined(LOG4CPLUS_DISABLE_DEBUG) | ||||||
|  | #define LOG4CPLUS_DISABLE_DEBUG | ||||||
|  | #endif | ||||||
|  | #if defined(LOG4CPLUS_DISABLE_DEBUG) && !defined(LOG4CPLUS_DISABLE_TRACE) | ||||||
|  | #define LOG4CPLUS_DISABLE_TRACE | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if defined (LOG4CPLUS_SINGLE_THREADED) | ||||||
|  |  | ||||||
|  | namespace log4cplus | ||||||
|  | { | ||||||
|  |  | ||||||
|  | extern LOG4CPLUS_EXPORT tostringstream _macros_oss; | ||||||
|  |  | ||||||
|  | LOG4CPLUS_EXPORT void _clear_tostringstream (tostringstream &); | ||||||
|  |  | ||||||
|  | } // namespace log4cplus | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define LOG4CPLUS_MACRO_BODY(logger, logEvent, logLevel)                \ | ||||||
|  |     do {                                                                \ | ||||||
|  |         if((logger).isEnabledFor(log4cplus::logLevel##_LOG_LEVEL)) {    \ | ||||||
|  |             log4cplus::_clear_tostringstream (log4cplus::_macros_oss);  \ | ||||||
|  |             log4cplus::_macros_oss << logEvent;                         \ | ||||||
|  |             (logger).forcedLog(log4cplus::logLevel##_LOG_LEVEL,         \ | ||||||
|  |                 log4cplus::_macros_oss.str(), __FILE__, __LINE__);      \ | ||||||
|  |         }                                                               \ | ||||||
|  |     } while (0) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #else // defined (LOG4CPLUS_SINGLE_THREADED) | ||||||
|  |  | ||||||
|  | #define LOG4CPLUS_MACRO_BODY(logger, logEvent, logLevel)                \ | ||||||
|  |     do {                                                                \ | ||||||
|  |         if((logger).isEnabledFor(log4cplus::logLevel##_LOG_LEVEL)) {    \ | ||||||
|  |             log4cplus::tostringstream _log4cplus_buf;                   \ | ||||||
|  |             _log4cplus_buf << logEvent;                                 \ | ||||||
|  |             (logger).forcedLog(log4cplus::logLevel##_LOG_LEVEL,         \ | ||||||
|  |                 _log4cplus_buf.str(), __FILE__, __LINE__);              \ | ||||||
|  |         }                                                               \ | ||||||
|  |     } while (0) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // defined (LOG4CPLUS_SINGLE_THREADED) | ||||||
|  |  | ||||||
|  | #define LOG4CPLUS_MACRO_STR_BODY(logger, logEvent, logLevel)            \ | ||||||
|  |     do {                                                                \ | ||||||
|  |         if((logger).isEnabledFor(log4cplus::logLevel##_LOG_LEVEL)) {    \ | ||||||
|  |             (logger).forcedLog(log4cplus::logLevel##_LOG_LEVEL,         \ | ||||||
|  |                 logEvent, __FILE__, __LINE__);                          \ | ||||||
|  |         }                                                               \ | ||||||
|  |     } while(0) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @def LOG4CPLUS_TRACE(logger, logEvent)  This macro creates a TraceLogger  | ||||||
|  |  * to log a TRACE_LOG_LEVEL message to <code>logger</code> upon entry and | ||||||
|  |  * exiting of a method.   | ||||||
|  |  * <code>logEvent</code> will be streamed into an <code>ostream</code>. | ||||||
|  |  */ | ||||||
|  | #if !defined(LOG4CPLUS_DISABLE_TRACE) | ||||||
|  | #define LOG4CPLUS_TRACE_METHOD(logger, logEvent)                        \ | ||||||
|  |     log4cplus::TraceLogger _log4cplus_trace_logger(logger, logEvent,    \ | ||||||
|  |                                                    __FILE__, __LINE__); | ||||||
|  | #define LOG4CPLUS_TRACE(logger, logEvent)                               \ | ||||||
|  |     LOG4CPLUS_MACRO_BODY (logger, logEvent, TRACE) | ||||||
|  | #define LOG4CPLUS_TRACE_STR(logger, logEvent)                           \ | ||||||
|  |     LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, TRACE) | ||||||
|  | #else | ||||||
|  | #define LOG4CPLUS_TRACE_METHOD(logger, logEvent) do { } while (0) | ||||||
|  | #define LOG4CPLUS_TRACE(logger, logEvent) do { } while (0) | ||||||
|  | #define LOG4CPLUS_TRACE_STR(logger, logEvent) do { } while (0) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @def LOG4CPLUS_DEBUG(logger, logEvent)  This macro is used to log a | ||||||
|  |  * DEBUG_LOG_LEVEL message to <code>logger</code>.   | ||||||
|  |  * <code>logEvent</code> will be streamed into an <code>ostream</code>. | ||||||
|  |  */ | ||||||
|  | #if !defined(LOG4CPLUS_DISABLE_DEBUG) | ||||||
|  | #define LOG4CPLUS_DEBUG(logger, logEvent)                               \ | ||||||
|  |     LOG4CPLUS_MACRO_BODY (logger, logEvent, DEBUG) | ||||||
|  | #define LOG4CPLUS_DEBUG_STR(logger, logEvent)                           \ | ||||||
|  |     LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, DEBUG) | ||||||
|  | #else | ||||||
|  | #define LOG4CPLUS_DEBUG(logger, logEvent) do { } while (0) | ||||||
|  | #define LOG4CPLUS_DEBUG_STR(logger, logEvent) do { } while (0) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @def LOG4CPLUS_INFO(logger, logEvent)  This macro is used to log a | ||||||
|  |  * INFO_LOG_LEVEL message to <code>logger</code>.   | ||||||
|  |  * <code>logEvent</code> will be streamed into an <code>ostream</code>. | ||||||
|  |  */ | ||||||
|  | #if !defined(LOG4CPLUS_DISABLE_INFO) | ||||||
|  | #define LOG4CPLUS_INFO(logger, logEvent)                                \ | ||||||
|  |     LOG4CPLUS_MACRO_BODY (logger, logEvent, INFO) | ||||||
|  | #define LOG4CPLUS_INFO_STR(logger, logEvent)                            \ | ||||||
|  |     LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, INFO) | ||||||
|  | #else | ||||||
|  | #define LOG4CPLUS_INFO(logger, logEvent) do { } while (0) | ||||||
|  | #define LOG4CPLUS_INFO_STR(logger, logEvent) do { } while (0) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @def LOG4CPLUS_WARN(logger, logEvent)  This macro is used to log a | ||||||
|  |  * WARN_LOG_LEVEL message to <code>logger</code>.   | ||||||
|  |  * <code>logEvent</code> will be streamed into an <code>ostream</code>. | ||||||
|  |  */ | ||||||
|  | #if !defined(LOG4CPLUS_DISABLE_WARN) | ||||||
|  | #define LOG4CPLUS_WARN(logger, logEvent)                                \ | ||||||
|  |     LOG4CPLUS_MACRO_BODY (logger, logEvent, WARN) | ||||||
|  | #define LOG4CPLUS_WARN_STR(logger, logEvent)                            \ | ||||||
|  |     LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, WARN) | ||||||
|  | #else | ||||||
|  | #define LOG4CPLUS_WARN(logger, logEvent) do { } while (0) | ||||||
|  | #define LOG4CPLUS_WARN_STR(logger, logEvent) do { } while (0) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @def LOG4CPLUS_ERROR(logger, logEvent)  This macro is used to log a | ||||||
|  |  * ERROR_LOG_LEVEL message to <code>logger</code>.   | ||||||
|  |  * <code>logEvent</code> will be streamed into an <code>ostream</code>. | ||||||
|  |  */ | ||||||
|  | #if !defined(LOG4CPLUS_DISABLE_ERROR) | ||||||
|  | #define LOG4CPLUS_ERROR(logger, logEvent)                               \ | ||||||
|  |     LOG4CPLUS_MACRO_BODY (logger, logEvent, ERROR) | ||||||
|  | #define LOG4CPLUS_ERROR_STR(logger, logEvent)                           \ | ||||||
|  |     LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, ERROR) | ||||||
|  | #else | ||||||
|  | #define LOG4CPLUS_ERROR(logger, logEvent) do { } while (0) | ||||||
|  | #define LOG4CPLUS_ERROR_STR(logger, logEvent) do { } while (0) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @def LOG4CPLUS_FATAL(logger, logEvent)  This macro is used to log a | ||||||
|  |  * FATAL_LOG_LEVEL message to <code>logger</code>.   | ||||||
|  |  * <code>logEvent</code> will be streamed into an <code>ostream</code>. | ||||||
|  |  */ | ||||||
|  | #if !defined(LOG4CPLUS_DISABLE_FATAL) | ||||||
|  | #define LOG4CPLUS_FATAL(logger, logEvent)                               \ | ||||||
|  |     LOG4CPLUS_MACRO_BODY (logger, logEvent, FATAL) | ||||||
|  | #define LOG4CPLUS_FATAL_STR(logger, logEvent)                           \ | ||||||
|  |     LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, FATAL) | ||||||
|  | #else | ||||||
|  | #define LOG4CPLUS_FATAL(logger, logEvent) do { } while (0) | ||||||
|  | #define LOG4CPLUS_FATAL_STR(logger, logEvent) do { } while (0) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif /* _LOG4CPLUS_LOGGING_MACROS_HEADER_ */ | ||||||
|  |  | ||||||
							
								
								
									
										183
									
								
								libs/log4cplus/include/log4cplus/loglevel.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								libs/log4cplus/include/log4cplus/loglevel.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,183 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    loglevel.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file  | ||||||
|  |  * This header defines the LogLevel type. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_LOGLEVEL_HEADER_ | ||||||
|  | #define LOG4CPLUS_LOGLEVEL_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  |  | ||||||
|  | #include <vector> | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |  | ||||||
|  |     /**  | ||||||
|  |      * \typedef int LogLevel | ||||||
|  |      * Defines the minimum set of priorities recognized by the system, | ||||||
|  |      * that is {@link #FATAL_LOG_LEVEL}, {@link #ERROR_LOG_LEVEL}, {@link | ||||||
|  |      * #WARN_LOG_LEVEL}, {@link #INFO_LOG_LEVEL}, {@link #DEBUG_LOG_LEVEL},  | ||||||
|  |      * and {@link #TRACE_LOG_LEVEL}. | ||||||
|  |      */ | ||||||
|  |     typedef int LogLevel; | ||||||
|  |  | ||||||
|  |     /** \var const LogLevel OFF_LOG_LEVEL | ||||||
|  |      * The <code>OFF_LOG_LEVEL</code> LogLevel is used during configuration to | ||||||
|  |      * turn off logging. */ | ||||||
|  |     const LogLevel OFF_LOG_LEVEL     = 60000; | ||||||
|  |  | ||||||
|  |     /** \var const LogLevel FATAL_LOG_LEVEL | ||||||
|  |      * The <code>FATAL_LOG_LEVEL</code> LogLevel designates very severe error | ||||||
|  |      * events that will presumably lead the application to abort.  */ | ||||||
|  |     const LogLevel FATAL_LOG_LEVEL   = 50000; | ||||||
|  |  | ||||||
|  |     /** \var const LogLevel ERROR_LOG_LEVEL | ||||||
|  |      * The <code>ERROR_LOG_LEVEL</code> LogLevel designates error events that | ||||||
|  |      * might still allow the application to continue running. */ | ||||||
|  |     const LogLevel ERROR_LOG_LEVEL   = 40000; | ||||||
|  |  | ||||||
|  |     /** \var const LogLevel WARN_LOG_LEVEL | ||||||
|  |      * The <code>WARN_LOG_LEVEL</code> LogLevel designates potentially harmful  | ||||||
|  |      * situations. */ | ||||||
|  |     const LogLevel WARN_LOG_LEVEL    = 30000; | ||||||
|  |  | ||||||
|  |     /** \var const LogLevel INFO_LOG_LEVEL | ||||||
|  |      * The <code>INFO_LOG_LEVEL</code> LogLevel designates informational  | ||||||
|  |      * messages  that highlight the progress of the application at  | ||||||
|  |      * coarse-grained  level. */ | ||||||
|  |     const LogLevel INFO_LOG_LEVEL    = 20000; | ||||||
|  |  | ||||||
|  |     /** \var const LogLevel DEBUG_LOG_LEVEL | ||||||
|  |      * The <code>DEBUG_LOG_LEVEL</code> LogLevel designates fine-grained | ||||||
|  |      * informational events that are most useful to debug an application. */ | ||||||
|  |     const LogLevel DEBUG_LOG_LEVEL   = 10000; | ||||||
|  |  | ||||||
|  |     /** \var const LogLevel TRACE_LOG_LEVEL | ||||||
|  |      * The <code>TRACE_LOG_LEVEL</code> LogLevel is used to "trace" entry | ||||||
|  |      * and exiting of methods. */ | ||||||
|  |     const LogLevel TRACE_LOG_LEVEL   = 0; | ||||||
|  |      | ||||||
|  |     /** \var const LogLevel ALL_LOG_LEVEL | ||||||
|  |      * The <code>ALL_LOG_LEVEL</code> LogLevel is used during configuration to | ||||||
|  |      * turn on all logging. */ | ||||||
|  |     const LogLevel ALL_LOG_LEVEL     = TRACE_LOG_LEVEL; | ||||||
|  |  | ||||||
|  |     /** \var const LogLevel NOT_SET_LOG_LEVEL | ||||||
|  |      * The <code>NOT_SET_LOG_LEVEL</code> LogLevel is used to indicated that | ||||||
|  |      * no particular LogLevel is desired and that the default should be used. | ||||||
|  |      */ | ||||||
|  |     const LogLevel NOT_SET_LOG_LEVEL = -1; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /**  | ||||||
|  |      * This method type defined the signature of methods that convert LogLevels | ||||||
|  |      * into strings.  | ||||||
|  |      *  | ||||||
|  |      * <b>Note:</b> Must return an empty <code>tstring</code> for unrecognized values. | ||||||
|  |      */ | ||||||
|  |     typedef log4cplus::tstring (*LogLevelToStringMethod)(LogLevel); | ||||||
|  |  | ||||||
|  |     /**  | ||||||
|  |      * This method type defined the signature of methods that convert strings | ||||||
|  |      * into LogLevels.  | ||||||
|  |      *  | ||||||
|  |      * <b>Note:</b> Must return <code>NOT_SET_LOG_LEVEL</code> for unrecognized values. | ||||||
|  |      */ | ||||||
|  |     typedef LogLevel (*StringToLogLevelMethod)(const log4cplus::tstring&); | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * This class is used to "manage" LogLevel definitions.  This class is also | ||||||
|  |      * how "derived" LogLevels are created. Here are the steps to creating a | ||||||
|  |      * "derived" LogLevel: | ||||||
|  |      * <ol> | ||||||
|  |      *   <li>Create a LogLevel constant (greater than 0)</li> | ||||||
|  |      *   <li>Define a string to represent that constant</li> | ||||||
|  |      *   <li>Implement a LogLevelToStringMethod method.</li> | ||||||
|  |      *   <li>Implement a StringToLogLevelMethod method.</li> | ||||||
|  |      *   <li>create a "static initializer" that registers those 2 methods | ||||||
|  |      *       with the LogLevelManager singleton.</li> | ||||||
|  |      * </ol> | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT LogLevelManager { | ||||||
|  |     public: | ||||||
|  |         LogLevelManager(); | ||||||
|  |         ~LogLevelManager(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This method is called by all Layout classes to convert a LogLevel | ||||||
|  |          * into a string. | ||||||
|  |          *  | ||||||
|  |          * Note: It traverses the list of <code>LogLevelToStringMethod</code> | ||||||
|  |          *       to do this, so all "derived" LogLevels are recognized as well. | ||||||
|  |          */ | ||||||
|  |         log4cplus::tstring toString(LogLevel ll) const; | ||||||
|  |          | ||||||
|  |         /** | ||||||
|  |          * This method is called by all classes internally to log4cplus to | ||||||
|  |          * convert a string into a LogLevel. | ||||||
|  |          *  | ||||||
|  |          * Note: It traverses the list of <code>StringToLogLevelMethod</code> | ||||||
|  |          *       to do this, so all "derived" LogLevels are recognized as well. | ||||||
|  |          */ | ||||||
|  |         LogLevel fromString(const log4cplus::tstring& s) const; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * When creating a "derived" LogLevel, a <code>LogLevelToStringMethod</code> | ||||||
|  |          * should be defined and registered with the LogLevelManager by calling | ||||||
|  |          * this method. | ||||||
|  |          *  | ||||||
|  |          * @see pushFromStringMethod | ||||||
|  |          */ | ||||||
|  |         void pushToStringMethod(LogLevelToStringMethod newToString); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * When creating a "derived" LogLevel, a <code>StringToLogLevelMethod</code> | ||||||
|  |          * should be defined and registered with the LogLevelManager by calling | ||||||
|  |          * this method. | ||||||
|  |          *  | ||||||
|  |          * @see pushToStringMethod | ||||||
|  |          */ | ||||||
|  |         void pushFromStringMethod(StringToLogLevelMethod newFromString); | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |       // Data | ||||||
|  |         void* toStringMethods; | ||||||
|  |         void* fromStringMethods; | ||||||
|  |  | ||||||
|  |       // Disable Copy | ||||||
|  |         LogLevelManager(const LogLevelManager&); | ||||||
|  |         LogLevelManager& operator=(const LogLevelManager&); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Returns the singleton LogLevelManager. | ||||||
|  |      */ | ||||||
|  |     LOG4CPLUS_EXPORT LogLevelManager& getLogLevelManager(); | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_LOGLEVEL_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										318
									
								
								libs/log4cplus/include/log4cplus/ndc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										318
									
								
								libs/log4cplus/include/log4cplus/ndc.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,318 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    ndc.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file  | ||||||
|  |  * This header defined the NDC class. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef _LO4CPLUS_NDC_HEADER_ | ||||||
|  | #define _LO4CPLUS_NDC_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  | #include <log4cplus/helpers/logloguser.h> | ||||||
|  |  | ||||||
|  | #include <map> | ||||||
|  | #include <stack> | ||||||
|  |  | ||||||
|  | #if (defined(__MWERKS__) && defined(__MACOS__)) | ||||||
|  | using std::size_t; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     // Forward declarations | ||||||
|  |     class NDC; | ||||||
|  |     struct DiagnosticContext; | ||||||
|  |     typedef std::stack<DiagnosticContext> DiagnosticContextStack; | ||||||
|  |  | ||||||
|  | #if defined (_MSC_VER) || defined (__HP_aCC) | ||||||
|  |     LOG4CPLUS_EXPORT NDC& getNDC(); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * The NDC class implements <i>nested diagnostic contexts</i> as | ||||||
|  |      * defined by Neil Harrison in the article "Patterns for Logging | ||||||
|  |      * Diagnostic Messages" part of the book "<i>Pattern Languages of | ||||||
|  |      * Program Design 3</i>" edited by Martin et al. | ||||||
|  |      * | ||||||
|  |      * A Nested Diagnostic Context, or NDC in short, is an instrument | ||||||
|  |      * to distinguish interleaved log output from different sources. Log | ||||||
|  |      * output is typically interleaved when a server handles multiple | ||||||
|  |      * clients near-simultaneously. | ||||||
|  |      * | ||||||
|  |      * Interleaved log output can still be meaningful if each log entry | ||||||
|  |      * from different contexts had a distinctive stamp. This is where NDCs | ||||||
|  |      * come into play. | ||||||
|  |      * | ||||||
|  |      * <em><b>Note that NDCs are managed on a per thread | ||||||
|  |      * basis</b></em>. NDC operations such as {@link #push}, {@link | ||||||
|  |      * #pop}, {@link #clear}, {@link #getDepth} and {@link #setMaxDepth} | ||||||
|  |      * affect the NDC of the <em>current</em> thread only. NDCs of other | ||||||
|  |      * threads remain unaffected. | ||||||
|  |      * | ||||||
|  |      * For example, a server can build a per client request NDC | ||||||
|  |      * consisting the clients host name and other information contained in | ||||||
|  |      * the the request. <em>Cookies</em> are another source of distinctive | ||||||
|  |      * information. To build an NDC one uses the {@link #push} | ||||||
|  |      * operation. Simply put, | ||||||
|  |      * | ||||||
|  |      * <ul> | ||||||
|  |      *   <li>Contexts can be nested. | ||||||
|  |      * | ||||||
|  |      *   <li>When entering a context, call <code>getNDC().push()</code>. As a | ||||||
|  |      *   side effect, if there is no nested diagnostic context for the | ||||||
|  |      *   current thread, this method will create it. | ||||||
|  |      * | ||||||
|  |      *   <li>When leaving a context, call <code>getNDC().pop()</code>. | ||||||
|  |      * | ||||||
|  |      *   <li><b>When exiting a thread make sure to call {@link #remove | ||||||
|  |      *   NDC.remove()}</b>.   | ||||||
|  |      * </ul> | ||||||
|  |      *                                           | ||||||
|  |      * There is no penalty for forgetting to match each | ||||||
|  |      * <code>push</code> operation with a corresponding <code>pop</code>, | ||||||
|  |      * except the obvious mismatch between the real application context | ||||||
|  |      * and the context set in the NDC.  Use of the {@link NDCContextCreator} | ||||||
|  |      * class can automate this process and make your code exception-safe. | ||||||
|  |      * | ||||||
|  |      * If configured to do so, {@link log4cplus::PatternLayout} and {@link | ||||||
|  |      * log4cplus::TTCCLayout} instances automatically retrieve the nested diagnostic | ||||||
|  |      * context for the current thread without any user intervention. | ||||||
|  |      * Hence, even if a server is serving multiple clients | ||||||
|  |      * simultaneously, the logs emanating from the same code (belonging to | ||||||
|  |      * the same logger) can still be distinguished because each client | ||||||
|  |      * request will have a different NDC tag. | ||||||
|  |      * | ||||||
|  |      * Heavy duty systems should call the {@link #remove} method when | ||||||
|  |      * leaving the run method of a thread. This ensures that the memory | ||||||
|  |      * used by the thread can be freed. | ||||||
|  |      * | ||||||
|  |      * A thread may inherit the nested diagnostic context of another | ||||||
|  |      * (possibly parent) thread using the {@link #inherit inherit} | ||||||
|  |      * method. A thread may obtain a copy of its NDC with the {@link | ||||||
|  |      * #cloneStack cloneStack} method and pass the reference to any other | ||||||
|  |      * thread, in particular to a child. | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT NDC : protected log4cplus::helpers::LogLogUser { | ||||||
|  |     public: | ||||||
|  |         /** | ||||||
|  |          * Clear any nested diagnostic information if any. This method is | ||||||
|  |          * useful in cases where the same thread can be potentially used | ||||||
|  |          * over and over in different unrelated contexts. | ||||||
|  |          * | ||||||
|  |          * This method is equivalent to calling the {@link #setMaxDepth} | ||||||
|  |          * method with a zero <code>maxDepth</code> argument. | ||||||
|  |          */ | ||||||
|  |         void clear(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Clone the diagnostic context for the current thread. | ||||||
|  |          * | ||||||
|  |          * Internally a diagnostic context is represented as a stack.  A | ||||||
|  |          * given thread can supply the stack (i.e. diagnostic context) to a | ||||||
|  |          * child thread so that the child can inherit the parent thread's | ||||||
|  |          * diagnostic context. | ||||||
|  |          * | ||||||
|  |          * The child thread uses the {@link #inherit inherit} method to | ||||||
|  |          * inherit the parent's diagnostic context. | ||||||
|  |          *                                         | ||||||
|  |          * @return Stack A clone of the current thread's  diagnostic context. | ||||||
|  |          */ | ||||||
|  |         DiagnosticContextStack cloneStack(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Inherit the diagnostic context of another thread. | ||||||
|  |          * | ||||||
|  |          * The parent thread can obtain a reference to its diagnostic | ||||||
|  |          * context using the {@link #cloneStack} method.  It should | ||||||
|  |          * communicate this information to its child so that it may inherit | ||||||
|  |          * the parent's diagnostic context. | ||||||
|  |          * | ||||||
|  |          * The parent's diagnostic context is cloned before being | ||||||
|  |          * inherited. In other words, once inherited, the two diagnostic | ||||||
|  |          * contexts can be managed independently. | ||||||
|  |          * | ||||||
|  |          * @param stack The diagnostic context of the parent thread. | ||||||
|  |          */ | ||||||
|  |         void inherit(const DiagnosticContextStack& stack); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Used when printing the diagnostic context. | ||||||
|  |          */ | ||||||
|  |         log4cplus::tstring get(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Get the current nesting depth of this diagnostic context. | ||||||
|  |          * | ||||||
|  |          * @see #setMaxDepth | ||||||
|  |          */ | ||||||
|  |         size_t getDepth(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Clients should call this method before leaving a diagnostic | ||||||
|  |          * context. | ||||||
|  |          * | ||||||
|  |          * The returned value is the value that was pushed last. If no | ||||||
|  |          * context is available, then the empty string "" is | ||||||
|  |          * returned. If each call to push() is paired with a call to | ||||||
|  |          * pop() (even in presence of thrown exceptions), the last | ||||||
|  |          * pop() call frees the memory used by NDC for this | ||||||
|  |          * thread. Otherwise, remove() must be called at the end of | ||||||
|  |          * the thread to free the memory used by NDC for the thread. | ||||||
|  |          * | ||||||
|  |          * @return String The innermost diagnostic context. | ||||||
|  |          * | ||||||
|  |          * @see NDCContextCreator, remove(), push() | ||||||
|  |          */ | ||||||
|  |         log4cplus::tstring pop(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Looks at the last diagnostic context at the top of this NDC | ||||||
|  |          * without removing it. | ||||||
|  |          * | ||||||
|  |          * The returned value is the value that was pushed last. If no | ||||||
|  |          * context is available, then the empty string "" is returned. | ||||||
|  |          *                           | ||||||
|  |          * @return String The innermost diagnostic context. | ||||||
|  |          */ | ||||||
|  |         log4cplus::tstring peek(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Push new diagnostic context information for the current thread. | ||||||
|  |          * | ||||||
|  |          * The contents of the <code>message</code> parameter is | ||||||
|  |          * determined solely by the client. Each call to push() should | ||||||
|  |          * be paired with a call to pop(). | ||||||
|  |          * | ||||||
|  |          * @param message The new diagnostic context information. | ||||||
|  |          * | ||||||
|  |          * @see NDCContextCreator, pop(), remove() | ||||||
|  |          */ | ||||||
|  |         void push(const log4cplus::tstring& message); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Remove the diagnostic context for this thread. | ||||||
|  |          * | ||||||
|  |          * Each thread that created a diagnostic context by calling | ||||||
|  |          * push() should call this method before exiting. Otherwise, | ||||||
|  |          * the memory used by the thread cannot be reclaimed. It is | ||||||
|  |          * possible to omit this call if and only if each push() call | ||||||
|  |          * is always paired with a pop() call (even in presence of | ||||||
|  |          * thrown exceptions). Then the memory used by NDC will be | ||||||
|  |          * returned by the last pop() call and a call to remove() will | ||||||
|  |          * be no-op. | ||||||
|  |          */ | ||||||
|  |         void remove(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Set maximum depth of this diagnostic context. If the current | ||||||
|  |          * depth is smaller or equal to <code>maxDepth</code>, then no | ||||||
|  |          * action is taken. | ||||||
|  |          * | ||||||
|  |          * This method is a convenient alternative to multiple {@link | ||||||
|  |          * #pop} calls. Moreover, it is often the case that at the end of | ||||||
|  |          * complex call sequences, the depth of the NDC is | ||||||
|  |          * unpredictable. The <code>setMaxDepth</code> method circumvents | ||||||
|  |          * this problem. | ||||||
|  |          * | ||||||
|  |          * For example, the combination | ||||||
|  |          * <pre> | ||||||
|  |          *    void foo() { | ||||||
|  |          *       size_t depth = NDC.getDepth(); | ||||||
|  |          * | ||||||
|  |          *       ... complex sequence of calls | ||||||
|  |          * | ||||||
|  |          *       NDC.setMaxDepth(depth); | ||||||
|  |          *    } | ||||||
|  |          * </pre> | ||||||
|  |          * | ||||||
|  |          * ensures that between the entry and exit of foo the depth of the | ||||||
|  |          * diagnostic stack is conserved. | ||||||
|  |          *  | ||||||
|  |          * <b>Note:</b>  Use of the {@link NDCContextCreator} class will solve | ||||||
|  |          * this particular problem. | ||||||
|  |          * | ||||||
|  |          * @see #getDepth | ||||||
|  |          */ | ||||||
|  |         void setMaxDepth(size_t maxDepth); | ||||||
|  |  | ||||||
|  |       // Dtor | ||||||
|  |         ~NDC(); | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |       // Methods | ||||||
|  |         DiagnosticContextStack* getPtr(); | ||||||
|  |  | ||||||
|  |       // Data | ||||||
|  |         LOG4CPLUS_THREAD_LOCAL_TYPE threadLocal; | ||||||
|  |  | ||||||
|  |       // Disallow construction (and copying) except by getNDC() | ||||||
|  |         NDC(); | ||||||
|  |         NDC(const NDC&); | ||||||
|  |         NDC& operator=(const NDC&); | ||||||
|  |  | ||||||
|  |       // Friends | ||||||
|  | #if defined (_MSC_VER) || defined (__HP_aCC) | ||||||
|  |         friend LOG4CPLUS_EXPORT NDC& getNDC(); | ||||||
|  | #else | ||||||
|  |         friend NDC& getNDC(); | ||||||
|  | #endif | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Return a reference to the singleton object. | ||||||
|  |      */ | ||||||
|  |     LOG4CPLUS_EXPORT NDC& getNDC(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * This is the internal object that is stored on the NDC stack. | ||||||
|  |      */ | ||||||
|  |     struct LOG4CPLUS_EXPORT DiagnosticContext { | ||||||
|  |       // Ctors | ||||||
|  |         DiagnosticContext(const log4cplus::tstring& message, DiagnosticContext *parent); | ||||||
|  |         DiagnosticContext(const log4cplus::tstring& message); | ||||||
|  |  | ||||||
|  |       // Data | ||||||
|  |         log4cplus::tstring message; /*!< The message at this context level. */ | ||||||
|  |         log4cplus::tstring fullMessage; /*!< The entire message stack. */ | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * This class ensures that a {@link NDC#push} call is always matched with | ||||||
|  |      * a {@link NDC#pop} call even in the face of exceptions. | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT NDCContextCreator { | ||||||
|  |     public: | ||||||
|  |         /** Pushes <code>msg</code> onto the NDC stack. */ | ||||||
|  |         NDCContextCreator(const log4cplus::tstring& msg); | ||||||
|  |  | ||||||
|  |         /** Pops the NDC stack. */ | ||||||
|  |         ~NDCContextCreator(); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // _LO4CPLUS_NDC_HEADER_ | ||||||
							
								
								
									
										81
									
								
								libs/log4cplus/include/log4cplus/nteventlogappender.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								libs/log4cplus/include/log4cplus/nteventlogappender.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    nteventlogappender.h | ||||||
|  | // Created: 4/2003 | ||||||
|  | // Author:  Michael CATANZARITI | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Michael CATANZARITI | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_NT_EVENT_LOG_APPENDER_HEADER_ | ||||||
|  | #define _LOG4CPLUS_NT_EVENT_LOG_APPENDER_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/appender.h> | ||||||
|  |  | ||||||
|  | #if defined(_WIN32) | ||||||
|  | #  if ! defined (LOG4CPLUS_HAVE_NT_EVENT_LOG) | ||||||
|  | #    error "Your platform does not support NT event log." | ||||||
|  | #  else | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Appends log events to NT EventLog.  | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT NTEventLogAppender : public Appender { | ||||||
|  |     public: | ||||||
|  |       // ctors | ||||||
|  |         NTEventLogAppender(const log4cplus::tstring& server,  | ||||||
|  |                            const log4cplus::tstring& log,  | ||||||
|  |                            const log4cplus::tstring& source); | ||||||
|  |         NTEventLogAppender(const log4cplus::helpers::Properties properties); | ||||||
|  |  | ||||||
|  |       // dtor | ||||||
|  |         virtual ~NTEventLogAppender(); | ||||||
|  |  | ||||||
|  |       // public Methods | ||||||
|  |         virtual void close(); | ||||||
|  |  | ||||||
|  |     protected: | ||||||
|  |         virtual void append(const spi::InternalLoggingEvent& event); | ||||||
|  |         virtual WORD getEventType(const spi::InternalLoggingEvent& event); | ||||||
|  |         virtual WORD getEventCategory(const spi::InternalLoggingEvent& event); | ||||||
|  |         void init(); | ||||||
|  |  | ||||||
|  |         /* | ||||||
|  |          * Add this source with appropriate configuration keys to the registry. | ||||||
|  |          */ | ||||||
|  |         void addRegistryInfo(); | ||||||
|  |  | ||||||
|  |       // Data | ||||||
|  |         log4cplus::tstring server; | ||||||
|  |         log4cplus::tstring log; | ||||||
|  |         log4cplus::tstring source; | ||||||
|  |         HANDLE hEventLog; | ||||||
|  |         SID* pCurrentUserSID; | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |       // Disallow copying of instances of this class | ||||||
|  |         NTEventLogAppender(const NTEventLogAppender&); | ||||||
|  |         NTEventLogAppender& operator=(const NTEventLogAppender&); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_HAVE_NT_EVENT_LOG | ||||||
|  | #endif // _WIN32 | ||||||
|  | #endif //_LOG4CPLUS_NT_EVENT_LOG_APPENDER_HEADER_ | ||||||
							
								
								
									
										60
									
								
								libs/log4cplus/include/log4cplus/nullappender.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								libs/log4cplus/include/log4cplus/nullappender.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    nullappender.h | ||||||
|  | // Created: 6/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_NULL_APPENDER_HEADER_ | ||||||
|  | #define _LOG4CPLUS_NULL_APPENDER_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/appender.h> | ||||||
|  | #include <log4cplus/helpers/property.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Appends log events to a file.  | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT NullAppender : public Appender { | ||||||
|  |     public: | ||||||
|  |       // Ctors | ||||||
|  |         NullAppender(); | ||||||
|  |         NullAppender(const log4cplus::helpers::Properties& properties); | ||||||
|  |  | ||||||
|  |       // Dtor | ||||||
|  |         virtual ~NullAppender(); | ||||||
|  |  | ||||||
|  |       // Methods | ||||||
|  |         virtual void close(); | ||||||
|  |  | ||||||
|  |     protected: | ||||||
|  |         virtual void append(const log4cplus::spi::InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |       // Disallow copying of instances of this class | ||||||
|  |         NullAppender(const NullAppender&); | ||||||
|  |         NullAppender& operator=(const NullAppender&); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_NULL_APPENDER_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										161
									
								
								libs/log4cplus/include/log4cplus/socketappender.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								libs/log4cplus/include/log4cplus/socketappender.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,161 @@ | |||||||
|  | // Module:  LOG4CPLUS | ||||||
|  | // File:    socketappender.h | ||||||
|  | // Created: 5/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_SOCKET_APPENDER_HEADER_ | ||||||
|  | #define _LOG4CPLUS_SOCKET_APPENDER_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/appender.h> | ||||||
|  | #include <log4cplus/helpers/socket.h> | ||||||
|  | #include <log4cplus/helpers/syncprims.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifndef UNICODE | ||||||
|  | #  define LOG4CPLUS_MAX_MESSAGE_SIZE (8*1024) | ||||||
|  | #else | ||||||
|  | #  define LOG4CPLUS_MAX_MESSAGE_SIZE (2*8*1024) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Sends {@link spi::InternalLoggingEvent} objects to a remote a log server. | ||||||
|  |      * | ||||||
|  |      * The SocketAppender has the following properties: | ||||||
|  |      * | ||||||
|  |      * <ul> | ||||||
|  |      * | ||||||
|  |      *   <li>Remote logging is non-intrusive as far as the log event | ||||||
|  |      *   is concerned. In other words, the event will be logged with | ||||||
|  |      *   the same time stamp, NDC, location info as if it were logged | ||||||
|  |      *   locally by the client. | ||||||
|  |      * | ||||||
|  |      *   <li>SocketAppenders do not use a layout. | ||||||
|  |      * | ||||||
|  |      *   <li>Remote logging uses the TCP protocol. Consequently, if | ||||||
|  |      *   the server is reachable, then log events will eventually arrive | ||||||
|  |      *   at the server. | ||||||
|  |      * | ||||||
|  |      *   <li>If the remote server is down, the logging requests are | ||||||
|  |      *   simply dropped. However, if and when the server comes back up, | ||||||
|  |      *   then event transmission is resumed transparently. This | ||||||
|  |      *   transparent reconneciton is performed by a <em>connector</em> | ||||||
|  |      *   thread which periodically attempts to connect to the server. | ||||||
|  |      * | ||||||
|  |      *   <li>Logging events are automatically <em>buffered</em> by the | ||||||
|  |      *   native TCP implementation. This means that if the link to server | ||||||
|  |      *   is slow but still faster than the rate of (log) event production | ||||||
|  |      *   by the client, the client will not be affected by the slow | ||||||
|  |      *   network connection. However, if the network connection is slower | ||||||
|  |      *   then the rate of event production, then the client can only | ||||||
|  |      *   progress at the network rate. In particular, if the network link | ||||||
|  |      *   to the the server is down, the client will be blocked. | ||||||
|  |      *  | ||||||
|  |      *   <li>On the other hand, if the network link is up, but the server | ||||||
|  |      *   is down, the client will not be blocked when making log requests | ||||||
|  |      *   but the log events will be lost due to server unavailability. | ||||||
|  |      * </ul> | ||||||
|  |      * | ||||||
|  |      * <h3>Properties</h3> | ||||||
|  |      * <dl> | ||||||
|  |      * <dt><tt>host</tt></dt> | ||||||
|  |      * <dd>Remote host name to connect and send events to.</dd> | ||||||
|  |      * | ||||||
|  |      * <dt><tt>port</tt></dt> | ||||||
|  |      * <dd>Port on remote host to send events to.</dd> | ||||||
|  |      * | ||||||
|  |      * <dt><tt>ServerName</tt></dt> | ||||||
|  |      * <dd>Host name of event's origin prepended to each event.</dd> | ||||||
|  |      * | ||||||
|  |      * </dl> | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT SocketAppender : public Appender { | ||||||
|  |     public: | ||||||
|  |       // Ctors | ||||||
|  |         SocketAppender(const log4cplus::tstring& host, int port,  | ||||||
|  |                        const log4cplus::tstring& serverName = tstring()); | ||||||
|  |         SocketAppender(const log4cplus::helpers::Properties & properties); | ||||||
|  |  | ||||||
|  |       // Dtor | ||||||
|  |         ~SocketAppender(); | ||||||
|  |  | ||||||
|  |       // Methods | ||||||
|  |         virtual void close(); | ||||||
|  |  | ||||||
|  |     protected: | ||||||
|  |         void openSocket(); | ||||||
|  |         void initConnector (); | ||||||
|  |         virtual void append(const spi::InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |       // Data | ||||||
|  |         log4cplus::helpers::Socket socket; | ||||||
|  |         log4cplus::tstring host; | ||||||
|  |         int port; | ||||||
|  |         log4cplus::tstring serverName; | ||||||
|  |  | ||||||
|  | #if ! defined (LOG4CPLUS_SINGLE_THREADED) | ||||||
|  |         class LOG4CPLUS_EXPORT ConnectorThread; | ||||||
|  |         friend class ConnectorThread; | ||||||
|  |  | ||||||
|  |         class LOG4CPLUS_EXPORT ConnectorThread | ||||||
|  |             : public thread::AbstractThread | ||||||
|  |             , public helpers::LogLogUser | ||||||
|  |         { | ||||||
|  |         public: | ||||||
|  |             ConnectorThread (SocketAppender &); | ||||||
|  |             virtual ~ConnectorThread (); | ||||||
|  |  | ||||||
|  |             virtual void run(); | ||||||
|  |  | ||||||
|  |             void terminate (); | ||||||
|  |             void trigger (); | ||||||
|  |  | ||||||
|  |         protected: | ||||||
|  |             SocketAppender & sa; | ||||||
|  |             thread::ManualResetEvent trigger_ev; | ||||||
|  |             bool exit_flag; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |         volatile bool connected; | ||||||
|  |         helpers::SharedObjectPtr<ConnectorThread> connector; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |       // Disallow copying of instances of this class | ||||||
|  |         SocketAppender(const SocketAppender&); | ||||||
|  |         SocketAppender& operator=(const SocketAppender&); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     namespace helpers { | ||||||
|  |         LOG4CPLUS_EXPORT | ||||||
|  |         SocketBuffer convertToBuffer(const log4cplus::spi::InternalLoggingEvent& event, | ||||||
|  |                                      const log4cplus::tstring& serverName); | ||||||
|  |  | ||||||
|  |         LOG4CPLUS_EXPORT | ||||||
|  |         log4cplus::spi::InternalLoggingEvent readFromBuffer(SocketBuffer& buffer); | ||||||
|  |     } // end namespace helpers | ||||||
|  |  | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_SOCKET_APPENDER_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										84
									
								
								libs/log4cplus/include/log4cplus/spi/appenderattachable.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								libs/log4cplus/include/log4cplus/spi/appenderattachable.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    appenderattachable.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_SPI_APPENDER_ATTACHABLE_HEADER_ | ||||||
|  | #define _LOG4CPLUS_SPI_APPENDER_ATTACHABLE_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/appender.h> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  | #include <log4cplus/helpers/pointer.h> | ||||||
|  | #include <vector> | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     // Forward Declarations | ||||||
|  |     typedef helpers::SharedObjectPtr<Appender> SharedAppenderPtr; | ||||||
|  |     typedef std::vector<log4cplus::SharedAppenderPtr> SharedAppenderPtrList; | ||||||
|  |  | ||||||
|  |     namespace spi { | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This Interface is for attaching Appenders to objects. | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT AppenderAttachable { | ||||||
|  |         public: | ||||||
|  |           // Methods | ||||||
|  |             /** | ||||||
|  |              * Add an appender. | ||||||
|  |              */ | ||||||
|  |             virtual void addAppender(SharedAppenderPtr newAppender) = 0; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Get all previously added appenders as an Enumeration.   | ||||||
|  |              */ | ||||||
|  |             virtual SharedAppenderPtrList getAllAppenders() = 0; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Get an appender by name. | ||||||
|  |              */ | ||||||
|  |             virtual SharedAppenderPtr getAppender(const log4cplus::tstring& name) = 0; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Remove all previously added appenders. | ||||||
|  |              */ | ||||||
|  |             virtual void removeAllAppenders() = 0; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Remove the appender passed as parameter from the list of appenders. | ||||||
|  |              */ | ||||||
|  |             virtual void removeAppender(SharedAppenderPtr appender) = 0; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Remove the appender with the name passed as parameter from the | ||||||
|  |              * list of appenders.   | ||||||
|  |              */ | ||||||
|  |             virtual void removeAppender(const log4cplus::tstring& name) = 0; | ||||||
|  |  | ||||||
|  |           // Dtor | ||||||
|  |             virtual ~AppenderAttachable() = 0; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |     } // end namespace spi | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_SPI_APPENDER_ATTACHABLE_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										185
									
								
								libs/log4cplus/include/log4cplus/spi/factory.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										185
									
								
								libs/log4cplus/include/log4cplus/spi/factory.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,185 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    factory.h | ||||||
|  | // Created: 2/2002 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2002-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_SPI_FACTORY_HEADER_ | ||||||
|  | #define LOG4CPLUS_SPI_FACTORY_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/appender.h> | ||||||
|  | #include <log4cplus/layout.h> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  | #include <log4cplus/helpers/property.h> | ||||||
|  | #include <log4cplus/helpers/threads.h> | ||||||
|  | #include <log4cplus/spi/filter.h> | ||||||
|  | #include <log4cplus/spi/objectregistry.h> | ||||||
|  | #include <map> | ||||||
|  | #include <memory> | ||||||
|  | #include <vector> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     namespace spi { | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This is the base class for all factories. | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT BaseFactory { | ||||||
|  |         public: | ||||||
|  |             virtual ~BaseFactory() = 0; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Returns the typename of the objects this factory creates. | ||||||
|  |              */ | ||||||
|  |             virtual log4cplus::tstring getTypeName() = 0; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This abstract class defines the "Factory" interface to create "Appender" | ||||||
|  |          * objects. | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT AppenderFactory : public BaseFactory { | ||||||
|  |         public: | ||||||
|  |             typedef Appender ProductType; | ||||||
|  |             typedef SharedAppenderPtr ProductPtr; | ||||||
|  |  | ||||||
|  |             AppenderFactory(); | ||||||
|  |             virtual ~AppenderFactory() = 0; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Create an "Appender" object. | ||||||
|  |              */ | ||||||
|  |             virtual SharedAppenderPtr createObject(const log4cplus::helpers::Properties& props) = 0; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This abstract class defines the "Factory" interface to create "Layout" | ||||||
|  |          * objects. | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT LayoutFactory : public BaseFactory { | ||||||
|  |         public: | ||||||
|  |             typedef Layout ProductType; | ||||||
|  |             typedef std::auto_ptr<Layout> ProductPtr; | ||||||
|  |  | ||||||
|  |             LayoutFactory(); | ||||||
|  |             virtual ~LayoutFactory() = 0; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Create a "Layout" object. | ||||||
|  |              */ | ||||||
|  |             virtual std::auto_ptr<Layout> createObject(const log4cplus::helpers::Properties& props) = 0; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This abstract class defines the "Factory" interface to create "Appender" | ||||||
|  |          * objects. | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT FilterFactory : public BaseFactory { | ||||||
|  |         public: | ||||||
|  |             typedef Filter ProductType; | ||||||
|  |             typedef FilterPtr ProductPtr; | ||||||
|  |  | ||||||
|  |             FilterFactory(); | ||||||
|  |             virtual ~FilterFactory() = 0; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Create a "Filter" object. | ||||||
|  |              */ | ||||||
|  |             virtual FilterPtr createObject(const log4cplus::helpers::Properties& props) = 0; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This template class is used as a "Factory Registry".  Objects are | ||||||
|  |          * "entered" into the registry with a "name" using the  | ||||||
|  |          * <code>put()</code> method.  (The registry then owns the object.)   | ||||||
|  |          * These object can then be retrieved using the <code>get()</code>  | ||||||
|  |          * method. | ||||||
|  |          *  | ||||||
|  |          * <b>Note:</b>  This class is Thread-safe. | ||||||
|  |          */ | ||||||
|  |         template<class T> | ||||||
|  |         class LOG4CPLUS_EXPORT FactoryRegistry : ObjectRegistryBase { | ||||||
|  |         public: | ||||||
|  |             typedef T product_type; | ||||||
|  |  | ||||||
|  |             virtual ~FactoryRegistry() { | ||||||
|  |                 clear(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |           // public methods | ||||||
|  |             /** | ||||||
|  |              * Used to enter an object into the registry.  (The registry now | ||||||
|  |              *  owns <code>object</code>.) | ||||||
|  |              */ | ||||||
|  |             bool put(std::auto_ptr<T> object) { | ||||||
|  |                  bool putValResult = putVal(object->getTypeName(), object.get()); | ||||||
|  |                  object.release(); | ||||||
|  |                  return putValResult;  | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Used to retrieve an object from the registry.  (The registry | ||||||
|  |              * owns the returned pointer.) | ||||||
|  |              */ | ||||||
|  |             T* get(const log4cplus::tstring& name) const { | ||||||
|  |                 return static_cast<T*>(getVal(name)); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |         protected: | ||||||
|  |             virtual void deleteObject(void *object) const { | ||||||
|  |                 delete static_cast<T*>(object); | ||||||
|  |             } | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         typedef FactoryRegistry<AppenderFactory> AppenderFactoryRegistry; | ||||||
|  |         typedef FactoryRegistry<LayoutFactory> LayoutFactoryRegistry; | ||||||
|  |         typedef FactoryRegistry<FilterFactory> FilterFactoryRegistry; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Returns the "singleton" <code>AppenderFactoryRegistry</code>. | ||||||
|  |          */ | ||||||
|  |         LOG4CPLUS_EXPORT AppenderFactoryRegistry& getAppenderFactoryRegistry(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Returns the "singleton" <code>LayoutFactoryRegistry</code>. | ||||||
|  |          */ | ||||||
|  |         LOG4CPLUS_EXPORT LayoutFactoryRegistry& getLayoutFactoryRegistry(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Returns the "singleton" <code>FilterFactoryRegistry</code>. | ||||||
|  |          */ | ||||||
|  |         LOG4CPLUS_EXPORT FilterFactoryRegistry& getFilterFactoryRegistry(); | ||||||
|  |  | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_SPI_FACTORY_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										273
									
								
								libs/log4cplus/include/log4cplus/spi/filter.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										273
									
								
								libs/log4cplus/include/log4cplus/spi/filter.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,273 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    filter.h | ||||||
|  | // Created: 5/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 1999-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file  | ||||||
|  |  * This header defines Filter and all of it's subclasses. */ | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_SPI_FILTER_HEADER_ | ||||||
|  | #define LOG4CPLUS_SPI_FILTER_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/helpers/pointer.h> | ||||||
|  | #include <log4cplus/helpers/property.h> | ||||||
|  | #include <log4cplus/spi/loggingevent.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     namespace spi { | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         enum FilterResult { DENY, /**< The log event must be dropped immediately  | ||||||
|  |                                    *  without consulting with the remaining  | ||||||
|  |                                    *  filters, if any, in the chain. */ | ||||||
|  |                             NEUTRAL, /**< This filter is neutral with respect to | ||||||
|  |                                       *  the log event; the remaining filters, if  | ||||||
|  |                                       *  if any, should be consulted for a final  | ||||||
|  |                                       *  decision. */ | ||||||
|  |                             ACCEPT /**< The log event must be logged immediately  | ||||||
|  |                                     *  without consulting with the remaining  | ||||||
|  |                                     *  filters, if any, in the chain. */ | ||||||
|  |                           }; | ||||||
|  |  | ||||||
|  |         // Forward Declarations | ||||||
|  |         class Filter; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This method is used to filter an InternalLoggingEvent. | ||||||
|  |          * | ||||||
|  |          * Note: <code>filter</code> can be NULL. | ||||||
|  |          */ | ||||||
|  |         LOG4CPLUS_EXPORT FilterResult checkFilter(const Filter* filter,  | ||||||
|  |                                                   const InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |         typedef helpers::SharedObjectPtr<Filter> FilterPtr; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Users should extend this class to implement customized logging | ||||||
|  |          * event filtering. Note that the {@link Logger} and {@link | ||||||
|  |          * Appender} classes have built-in filtering rules. It is suggested  | ||||||
|  |          * that you first use and understand the built-in rules before rushing | ||||||
|  |          * to write your own custom filters. | ||||||
|  |          * | ||||||
|  |          * This abstract class assumes and also imposes that filters be | ||||||
|  |          * organized in a linear chain. The {@link #decide | ||||||
|  |          * decide(LoggingEvent)} method of each filter is called sequentially, | ||||||
|  |          * in the order of their addition to the chain. | ||||||
|  |          * | ||||||
|  |          * If the value {@link #DENY} is returned, then the log event is | ||||||
|  |          * dropped immediately without consulting with the remaining | ||||||
|  |          * filters.  | ||||||
|  |          * | ||||||
|  |          * If the value {@link #NEUTRAL} is returned, then the next filter | ||||||
|  |          * in the chain is consulted. If there are no more filters in the | ||||||
|  |          * chain, then the log event is logged. Thus, in the presence of no | ||||||
|  |          * filters, the default behaviour is to log all logging events. | ||||||
|  |          * | ||||||
|  |          * If the value {@link #ACCEPT} is returned, then the log | ||||||
|  |          * event is logged without consulting the remaining filters.  | ||||||
|  |          * | ||||||
|  |          * The philosophy of log4cplus filters is largely inspired from the | ||||||
|  |          * Linux ipchains.  | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT Filter  | ||||||
|  |             : public virtual log4cplus::helpers::SharedObject  | ||||||
|  |         { | ||||||
|  |         public: | ||||||
|  |           // ctor and dtor | ||||||
|  |             Filter(); | ||||||
|  |             virtual ~Filter(); | ||||||
|  |  | ||||||
|  |           // Methods | ||||||
|  |             /** | ||||||
|  |              * Appends <code>filter</code> to the end of this filter chain. | ||||||
|  |              */ | ||||||
|  |             void appendFilter(FilterPtr filter); | ||||||
|  |  | ||||||
|  |             /**      | ||||||
|  |              * If the decision is <code>DENY</code>, then the event will be | ||||||
|  |              * dropped. If the decision is <code>NEUTRAL</code>, then the next | ||||||
|  |              * filter, if any, will be invoked. If the decision is ACCEPT then | ||||||
|  |              * the event will be logged without consulting with other filters in | ||||||
|  |              * the chain. | ||||||
|  |              * | ||||||
|  |              * @param event The LoggingEvent to decide upon. | ||||||
|  |              * @return The decision of the filter.   | ||||||
|  |              */ | ||||||
|  |             virtual FilterResult decide(const InternalLoggingEvent& event) const = 0; | ||||||
|  |  | ||||||
|  |           // Data | ||||||
|  |             /** | ||||||
|  |              * Points to the next filter in the filter chain. | ||||||
|  |              */ | ||||||
|  |             FilterPtr next; | ||||||
|  |         }; | ||||||
|  |    | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This filter drops all logging events. | ||||||
|  |          * | ||||||
|  |          * You can add this filter to the end of a filter chain to | ||||||
|  |          * switch from the default "accept all unless instructed otherwise" | ||||||
|  |          * filtering behaviour to a "deny all unless instructed otherwise" | ||||||
|  |          * behaviour. | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT DenyAllFilter : public Filter { | ||||||
|  |         public: | ||||||
|  |             DenyAllFilter (); | ||||||
|  |             DenyAllFilter (const log4cplus::helpers::Properties&); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Always returns the {@link #DENY} regardless of the  | ||||||
|  |              * {@link InternalLoggingEvent} parameter. | ||||||
|  |              */ | ||||||
|  |             virtual FilterResult decide(const InternalLoggingEvent& event) const; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This is a very simple filter based on LogLevel matching. | ||||||
|  |          * | ||||||
|  |          * The filter admits two options <b>LogLevelToMatch</b> and | ||||||
|  |          * <b>AcceptOnMatch</b>. If there is an exact match between the value | ||||||
|  |          * of the LogLevelToMatch option and the LogLevel of the {@link | ||||||
|  |          * spi::InternalLoggingEvent}, then the {@link #decide} method returns  | ||||||
|  |          * {@link #ACCEPT} in case the <b>AcceptOnMatch</b> option value is set | ||||||
|  |          * to <code>true</code>, if it is <code>false</code> then {@link #DENY} | ||||||
|  |          * is returned. If there is no match, {@link #NEUTRAL} is returned. | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT LogLevelMatchFilter : public Filter { | ||||||
|  |         public: | ||||||
|  |             LogLevelMatchFilter(); | ||||||
|  |             LogLevelMatchFilter(const log4cplus::helpers::Properties& p); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Return the decision of this filter. | ||||||
|  |              * | ||||||
|  |              * Returns {@link #NEUTRAL} if the <b>LogLevelToMatch</b> | ||||||
|  |              * option is not set or if there is no match.  Otherwise, if | ||||||
|  |              * there is a match, then the returned decision is {@link #ACCEPT} | ||||||
|  |              * if the <b>AcceptOnMatch</b> property is set to <code>true</code>.  | ||||||
|  |              * The returned decision is {@link #DENY} if the <b>AcceptOnMatch</b> | ||||||
|  |              * property is set to <code>false</code>. | ||||||
|  |              */ | ||||||
|  |             virtual FilterResult decide(const InternalLoggingEvent& event) const; | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |           // Methods | ||||||
|  |             void init(); | ||||||
|  |  | ||||||
|  |           // Data | ||||||
|  |             /** Do we return ACCEPT when a match occurs. Default is <code>true</code>. */ | ||||||
|  |             bool acceptOnMatch; | ||||||
|  |             LogLevel logLevelToMatch; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This is a very simple filter based on LogLevel matching, which can be | ||||||
|  |          * used to reject messages with LogLevels outside a certain range. | ||||||
|  |          * | ||||||
|  |          * The filter admits three options <b>LogLevelMin</b>, <b>LogLevelMax</b> | ||||||
|  |          * and <b>AcceptOnMatch</b>. | ||||||
|  |          * | ||||||
|  |          * If the LogLevel of the Logging event is not between Min and Max | ||||||
|  |          * (inclusive), then {@link #DENY} is returned. | ||||||
|  |          * | ||||||
|  |          * If the Logging event LogLevel is within the specified range, then if | ||||||
|  |          * <b>AcceptOnMatch</b> is true, {@link #ACCEPT} is returned, and if | ||||||
|  |          * <b>AcceptOnMatch</b> is false, {@link #NEUTRAL} is returned. | ||||||
|  |          * | ||||||
|  |          * If <code>LogLevelMin</code> is not defined, then there is no | ||||||
|  |          * minimum acceptable LogLevel (ie a LogLevel is never rejected for | ||||||
|  |          * being too "low"/unimportant).  If <code>LogLevelMax</code> is not | ||||||
|  |          * defined, then there is no maximum acceptable LogLevel (ie a | ||||||
|  |          * LogLevel is never rejected for beeing too "high"/important). | ||||||
|  |          * | ||||||
|  |          * Refer to the {@link | ||||||
|  |          * Appender#setThreshold setThreshold} method | ||||||
|  |          * available to <code>all</code> appenders for a more convenient way to | ||||||
|  |          * filter out events by LogLevel. | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT LogLevelRangeFilter : public Filter { | ||||||
|  |         public: | ||||||
|  |           // ctors | ||||||
|  |             LogLevelRangeFilter(); | ||||||
|  |             LogLevelRangeFilter(const log4cplus::helpers::Properties& p); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Return the decision of this filter. | ||||||
|  |              */ | ||||||
|  |             virtual FilterResult decide(const InternalLoggingEvent& event) const; | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |           // Methods | ||||||
|  |             void init(); | ||||||
|  |  | ||||||
|  |           // Data | ||||||
|  |             /** Do we return ACCEPT when a match occurs. Default is <code>true</code>. */ | ||||||
|  |             bool acceptOnMatch; | ||||||
|  |             LogLevel logLevelMin; | ||||||
|  |             LogLevel logLevelMax; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This is a very simple filter based on string matching. | ||||||
|  |          * | ||||||
|  |          * The filter admits two options <b>StringToMatch</b> and | ||||||
|  |          * <b>AcceptOnMatch</b>. If there is a match between the value of the | ||||||
|  |          * StringToMatch option and the message of the Logging event, | ||||||
|  |          * then the {@link #decide} method returns {@link #ACCEPT} if | ||||||
|  |          * the <b>AcceptOnMatch</b> option value is true, if it is false then | ||||||
|  |          * {@link #DENY} is returned. If there is no match, {@link #NEUTRAL}  | ||||||
|  |          * is returned. | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT StringMatchFilter : public Filter { | ||||||
|  |         public: | ||||||
|  |           // ctors | ||||||
|  |             StringMatchFilter(); | ||||||
|  |             StringMatchFilter(const log4cplus::helpers::Properties& p); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Returns {@link #NEUTRAL} is there is no string match. | ||||||
|  |              */ | ||||||
|  |             virtual FilterResult decide(const InternalLoggingEvent& event) const; | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |           // Methods | ||||||
|  |             void init(); | ||||||
|  |  | ||||||
|  |           // Data | ||||||
|  |             /** Do we return ACCEPT when a match occurs. Default is <code>true</code>. */ | ||||||
|  |             bool acceptOnMatch; | ||||||
|  |             log4cplus::tstring stringToMatch; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |     } // end namespace spi | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif /* LOG4CPLUS_SPI_FILTER_HEADER_ */ | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										55
									
								
								libs/log4cplus/include/log4cplus/spi/loggerfactory.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								libs/log4cplus/include/log4cplus/spi/loggerfactory.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    loggerfactory.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_SPI_LOGGER_FACTORY_HEADER | ||||||
|  | #define _LOG4CPLUS_SPI_LOGGER_FACTORY_HEADER | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  | #include <log4cplus/helpers/pointer.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     // Forward Declarations | ||||||
|  |     class Logger; | ||||||
|  |     class Hierarchy; | ||||||
|  |  | ||||||
|  |     namespace spi { | ||||||
|  |         /** | ||||||
|  |          * Implement this interface to create new instances of Logger or | ||||||
|  |          * a sub-class of Logger. | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT LoggerFactory { | ||||||
|  |         public: | ||||||
|  |             /** | ||||||
|  |              * Creates a new <code>Logger</code> object. | ||||||
|  |              */ | ||||||
|  |             virtual Logger makeNewLoggerInstance(const log4cplus::tstring& name, | ||||||
|  |                                                  Hierarchy& h) = 0;  | ||||||
|  |             virtual ~LoggerFactory() = 0; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |     } // end namespace spi | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_SPI_LOGGER_FACTORY_HEADER | ||||||
|  |  | ||||||
							
								
								
									
										209
									
								
								libs/log4cplus/include/log4cplus/spi/loggerimpl.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								libs/log4cplus/include/log4cplus/spi/loggerimpl.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,209 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    loggerimpl.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_SPI_LOGGER_HEADER_ | ||||||
|  | #define _LOG4CPLUS_SPI_LOGGER_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  | #include <log4cplus/helpers/appenderattachableimpl.h> | ||||||
|  | #include <log4cplus/helpers/pointer.h> | ||||||
|  | #include <log4cplus/spi/loggerfactory.h> | ||||||
|  | #include <memory> | ||||||
|  | #include <vector> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     class DefaultLoggerFactory; | ||||||
|  |  | ||||||
|  |     namespace spi { | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This is the central class in the log4cplus package. One of the | ||||||
|  |          * distintive features of log4cplus are hierarchical loggers and their | ||||||
|  |          * evaluation. | ||||||
|  |          * | ||||||
|  |          * See the <a href="../../../../manual.html">user manual</a> for an | ||||||
|  |          * introduction on this class.  | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT LoggerImpl | ||||||
|  |             : public virtual log4cplus::helpers::SharedObject, | ||||||
|  |               public log4cplus::helpers::AppenderAttachableImpl | ||||||
|  |         { | ||||||
|  |         public: | ||||||
|  |             typedef helpers::SharedObjectPtr<LoggerImpl> SharedLoggerImplPtr; | ||||||
|  |  | ||||||
|  |           // Methods | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Call the appenders in the hierrachy starting at | ||||||
|  |              * <code>this</code>.  If no appenders could be found, emit a | ||||||
|  |              * warning. | ||||||
|  |              *  | ||||||
|  |              * This method calls all the appenders inherited from the | ||||||
|  |              * hierarchy circumventing any evaluation of whether to log or not | ||||||
|  |              * to log the particular log request. | ||||||
|  |              *                                    | ||||||
|  |              * @param event The event to log.  | ||||||
|  |              */ | ||||||
|  |             virtual void callAppenders(const InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Close all attached appenders implementing the AppenderAttachable | ||||||
|  |              * interface.   | ||||||
|  |              */ | ||||||
|  |             virtual void closeNestedAppenders(); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Check whether this logger is enabled for a given LogLevel passed  | ||||||
|  |              * as parameter. | ||||||
|  |              * | ||||||
|  |              * @return boolean True if this logger is enabled for <code>ll</code>. | ||||||
|  |              */ | ||||||
|  |             virtual bool isEnabledFor(LogLevel ll) const; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * This generic form is intended to be used by wrappers.  | ||||||
|  |              */ | ||||||
|  |             virtual void log(LogLevel ll, const log4cplus::tstring& message, | ||||||
|  |                              const char* file=NULL, int line=-1); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Starting from this logger, search the logger hierarchy for a | ||||||
|  |              * "set" LogLevel and return it. Otherwise, return the LogLevel of the | ||||||
|  |              * root logger. | ||||||
|  |              *                      | ||||||
|  |              * The Logger class is designed so that this method executes as | ||||||
|  |              * quickly as possible. | ||||||
|  |              */ | ||||||
|  |             virtual LogLevel getChainedLogLevel() const; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Returns the assigned LogLevel, if any, for this Logger.   | ||||||
|  |              *            | ||||||
|  |              * @return LogLevel - the assigned LogLevel. | ||||||
|  |              */ | ||||||
|  |             LogLevel getLogLevel() const { return this->ll; } | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Set the LogLevel of this Logger. | ||||||
|  |              */ | ||||||
|  |             void setLogLevel(LogLevel _ll) { this->ll = _ll; } | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Return the the {@link Hierarchy} where this <code>Logger</code> | ||||||
|  |              * instance is attached. | ||||||
|  |              */ | ||||||
|  |             virtual Hierarchy& getHierarchy() const; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Return the logger name.   | ||||||
|  |              */ | ||||||
|  |             log4cplus::tstring getName() const { return name; } | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Get the additivity flag for this Logger instance. | ||||||
|  |              */ | ||||||
|  |             bool getAdditivity() const; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Set the additivity flag for this Logger instance. | ||||||
|  |              */ | ||||||
|  |             void setAdditivity(bool additive); | ||||||
|  |  | ||||||
|  |             virtual ~LoggerImpl(); | ||||||
|  |  | ||||||
|  |         protected: | ||||||
|  |           // Ctors | ||||||
|  |             /** | ||||||
|  |              * This constructor created a new <code>Logger</code> instance and | ||||||
|  |              * sets its name. | ||||||
|  |              * | ||||||
|  |              * It is intended to be used by sub-classes only. You should not | ||||||
|  |              * create loggers directly. | ||||||
|  |              * | ||||||
|  |              * @param name The name of the logger.   | ||||||
|  |              * @param h Hierarchy | ||||||
|  |              */ | ||||||
|  |             LoggerImpl(const log4cplus::tstring& name, Hierarchy& h); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |           // Methods | ||||||
|  |             /** | ||||||
|  |              * This method creates a new logging event and logs the event | ||||||
|  |              * without further checks.   | ||||||
|  |              */ | ||||||
|  |             virtual void forcedLog(LogLevel ll, | ||||||
|  |                                    const log4cplus::tstring& message, | ||||||
|  |                                    const char* file=NULL,  | ||||||
|  |                                    int line=-1); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |           // Data | ||||||
|  |             /** The name of this logger */ | ||||||
|  |             log4cplus::tstring name; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * The assigned LogLevel of this logger. | ||||||
|  |              */ | ||||||
|  |             LogLevel ll; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * The parent of this logger. All loggers have at least one | ||||||
|  |              * ancestor which is the root logger.  | ||||||
|  |              */  | ||||||
|  |             SharedLoggerImplPtr parent; | ||||||
|  |  | ||||||
|  |             /**  | ||||||
|  |              * Additivity is set to true by default, that is children inherit | ||||||
|  |              * the appenders of their ancestors by default. If this variable is | ||||||
|  |              * set to <code>false</code> then the appenders found in the | ||||||
|  |              * ancestors of this logger are not used. However, the children | ||||||
|  |              * of this logger will inherit its appenders, unless the children | ||||||
|  |              * have their additivity flag set to <code>false</code> too. See | ||||||
|  |              * the user manual for more details.  | ||||||
|  |              */ | ||||||
|  |             bool additive; | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |           // Data | ||||||
|  |             /** Loggers need to know what Hierarchy they are in. */ | ||||||
|  |             Hierarchy& hierarchy; | ||||||
|  |  | ||||||
|  |           // Disallow copying of instances of this class | ||||||
|  |             LoggerImpl(const LoggerImpl&); | ||||||
|  |             LoggerImpl& operator=(const LoggerImpl&); | ||||||
|  |  | ||||||
|  |           // Friends | ||||||
|  |             friend class log4cplus::Logger; | ||||||
|  |             friend class log4cplus::DefaultLoggerFactory; | ||||||
|  |             friend class log4cplus::Hierarchy; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |         typedef LoggerImpl::SharedLoggerImplPtr SharedLoggerImplPtr; | ||||||
|  |  | ||||||
|  |     } // end namespace spi | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_SPI_LOGGER_HEADER_ | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										198
									
								
								libs/log4cplus/include/log4cplus/spi/loggingevent.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								libs/log4cplus/include/log4cplus/spi/loggingevent.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,198 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    loggingevent.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_SPI_INTERNAL_LOGGING_EVENT_HEADER_ | ||||||
|  | #define _LOG4CPLUS_SPI_INTERNAL_LOGGING_EVENT_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/loglevel.h> | ||||||
|  | #include <log4cplus/ndc.h> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  | #include <log4cplus/helpers/timehelper.h> | ||||||
|  | #include <log4cplus/helpers/threads.h> | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     namespace spi { | ||||||
|  |         /** | ||||||
|  |          * The internal representation of logging events. When an affirmative | ||||||
|  |          * decision is made to log then a <code>InternalLoggingEvent</code>  | ||||||
|  |          * instance is created. This instance is passed around to the  | ||||||
|  |          * different log4cplus components. | ||||||
|  |          * | ||||||
|  |          * This class is of concern to those wishing to extend log4cplus.  | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT InternalLoggingEvent { | ||||||
|  |         public: | ||||||
|  |           // Ctors | ||||||
|  |              /** | ||||||
|  |               * Instantiate a LoggingEvent from the supplied parameters. | ||||||
|  |               *  | ||||||
|  |               * @param logger   The logger of this event. | ||||||
|  |               * @param ll_      The LogLevel of this event. | ||||||
|  |               * @param message_ The message of this event. | ||||||
|  |               * @param filename Name of file where this event has occurred, | ||||||
|  |               * can be NULL. | ||||||
|  |               * @param line_    Line number in file specified by | ||||||
|  |               *                 the <code>filename</code> parameter. | ||||||
|  |               */ | ||||||
|  |              InternalLoggingEvent(const log4cplus::tstring& logger, | ||||||
|  |                                   LogLevel ll_, | ||||||
|  |                                   const log4cplus::tstring& message_, | ||||||
|  |                                   const char* filename, | ||||||
|  |                                   int line_) | ||||||
|  |               : message(message_), | ||||||
|  |                 loggerName(logger), | ||||||
|  |                 ll(ll_), | ||||||
|  |                 ndc(), | ||||||
|  |                 thread(), | ||||||
|  |                 timestamp(log4cplus::helpers::Time::gettimeofday()), | ||||||
|  |                 file( (  filename | ||||||
|  |                        ? LOG4CPLUS_C_STR_TO_TSTRING(filename)  | ||||||
|  |                        : log4cplus::tstring()) ), | ||||||
|  |                 line(line_), | ||||||
|  |                 threadCached(false), | ||||||
|  |                 ndcCached(false) | ||||||
|  |              { | ||||||
|  |              } | ||||||
|  |  | ||||||
|  |              InternalLoggingEvent(const log4cplus::tstring& logger, | ||||||
|  |                                   LogLevel ll_, | ||||||
|  |                                   const log4cplus::tstring& ndc_, | ||||||
|  |                                   const log4cplus::tstring& message_, | ||||||
|  |                                   const log4cplus::tstring& thread_, | ||||||
|  |                                   log4cplus::helpers::Time time, | ||||||
|  |                                   const log4cplus::tstring& file_, | ||||||
|  |                                   int line_) | ||||||
|  |               : message(message_), | ||||||
|  |                 loggerName(logger), | ||||||
|  |                 ll(ll_), | ||||||
|  |                 ndc(ndc_), | ||||||
|  |                 thread(thread_), | ||||||
|  |                 timestamp(time), | ||||||
|  |                 file(file_), | ||||||
|  |                 line(line_), | ||||||
|  |                 threadCached(true), | ||||||
|  |                 ndcCached(true) | ||||||
|  |              { | ||||||
|  |              } | ||||||
|  |  | ||||||
|  |              InternalLoggingEvent(const log4cplus::spi::InternalLoggingEvent& rhs) | ||||||
|  |               : message(rhs.getMessage()), | ||||||
|  |                 loggerName(rhs.getLoggerName()), | ||||||
|  |                 ll(rhs.getLogLevel()), | ||||||
|  |                 ndc(rhs.getNDC()), | ||||||
|  |                 thread(rhs.getThread()), | ||||||
|  |                 timestamp(rhs.getTimestamp()), | ||||||
|  |                 file(rhs.getFile()), | ||||||
|  |                 line(rhs.getLine()), | ||||||
|  |                 threadCached(true), | ||||||
|  |                 ndcCached(true) | ||||||
|  |              { | ||||||
|  |              } | ||||||
|  |  | ||||||
|  |             virtual ~InternalLoggingEvent(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |           // public virtual methods | ||||||
|  |             /** The application supplied message of logging event. */ | ||||||
|  |             virtual const log4cplus::tstring& getMessage() const; | ||||||
|  |  | ||||||
|  |             /** Returns the 'type' of InternalLoggingEvent.  Derived classes | ||||||
|  |              *  should override this method.  (NOTE: Values <= 1000 are | ||||||
|  |              *  reserved for log4cplus and should not be used.) | ||||||
|  |              */ | ||||||
|  |             virtual unsigned int getType() const; | ||||||
|  |  | ||||||
|  |            /** Returns a copy of this object.  Derived classes | ||||||
|  |              *  should override this method. | ||||||
|  | 	     */ | ||||||
|  |             virtual std::auto_ptr<InternalLoggingEvent> clone() const; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |           // public methods | ||||||
|  |             /** The logger of the logging event. It is set by  | ||||||
|  |              *  the LoggingEvent constructor.  | ||||||
|  | 	     */ | ||||||
|  |             const log4cplus::tstring& getLoggerName() const { return loggerName; } | ||||||
|  |  | ||||||
|  |             /** LogLevel of logging event. */ | ||||||
|  |             LogLevel getLogLevel() const { return ll; } | ||||||
|  |  | ||||||
|  |             /** The nested diagnostic context (NDC) of logging event. */ | ||||||
|  |             const log4cplus::tstring& getNDC() const {  | ||||||
|  |                 if(!ndcCached) { | ||||||
|  |                     ndc = log4cplus::getNDC().get(); | ||||||
|  |                     ndcCached = true; | ||||||
|  |                 } | ||||||
|  |                 return ndc;  | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             /** The name of thread in which this logging event was generated. */ | ||||||
|  |             const log4cplus::tstring& getThread() const { | ||||||
|  |                 if(!threadCached) { | ||||||
|  |                     thread = LOG4CPLUS_GET_CURRENT_THREAD_NAME; | ||||||
|  |                     threadCached = true; | ||||||
|  |                 } | ||||||
|  |                 return thread;  | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             /** The number of milliseconds elapsed from 1/1/1970 until logging event | ||||||
|  |              *  was created. */ | ||||||
|  |             const log4cplus::helpers::Time& getTimestamp() const { return timestamp; } | ||||||
|  |  | ||||||
|  |             /** The is the file where this log statement was written */ | ||||||
|  |             const log4cplus::tstring& getFile() const { return file; } | ||||||
|  |  | ||||||
|  |             /** The is the line where this log statement was written */ | ||||||
|  |             int getLine() const { return line; } | ||||||
|  |   | ||||||
|  |           // public operators | ||||||
|  |             log4cplus::spi::InternalLoggingEvent& | ||||||
|  |             operator=(const log4cplus::spi::InternalLoggingEvent& rhs); | ||||||
|  |  | ||||||
|  |           // static methods | ||||||
|  |             static unsigned int getDefaultType(); | ||||||
|  |  | ||||||
|  |         protected: | ||||||
|  |           // Data | ||||||
|  |             log4cplus::tstring message; | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |             log4cplus::tstring loggerName; | ||||||
|  |             LogLevel ll; | ||||||
|  |             mutable log4cplus::tstring ndc; | ||||||
|  |             mutable log4cplus::tstring thread; | ||||||
|  |             log4cplus::helpers::Time timestamp; | ||||||
|  |             log4cplus::tstring file; | ||||||
|  |             int line; | ||||||
|  |             /** Indicates whether or not the Threadname has been retrieved. */ | ||||||
|  |             mutable bool threadCached; | ||||||
|  |             /** Indicates whether or not the NDC has been retrieved. */ | ||||||
|  |             mutable bool ndcCached; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |     } // end namespace spi | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_SPI_INTERNAL_LOGGING_EVENT_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										96
									
								
								libs/log4cplus/include/log4cplus/spi/objectregistry.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								libs/log4cplus/include/log4cplus/spi/objectregistry.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    objectregistry.h | ||||||
|  | // Created: 3/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_SPI_OBJECT_REGISTRY_HEADER_ | ||||||
|  | #define LOG4CPLUS_SPI_OBJECT_REGISTRY_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  | #include <log4cplus/helpers/threads.h> | ||||||
|  | #include <map> | ||||||
|  | #include <memory> | ||||||
|  | #include <vector> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     namespace spi { | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This is the base class used to implement the functionality required | ||||||
|  |          * by the ObjectRegistry template class. | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT ObjectRegistryBase { | ||||||
|  |         public: | ||||||
|  |           // public methods | ||||||
|  |             /** | ||||||
|  |              * Tests to see whether or not an object is bound in the | ||||||
|  |              * registry as <code>name</code>. | ||||||
|  |              */ | ||||||
|  |             bool exists(const log4cplus::tstring& name) const; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Returns the names of all registered objects. | ||||||
|  |              */ | ||||||
|  |             std::vector<log4cplus::tstring> getAllNames() const; | ||||||
|  |  | ||||||
|  |         protected: | ||||||
|  |           // Ctor and Dtor | ||||||
|  |             ObjectRegistryBase(); | ||||||
|  |             virtual ~ObjectRegistryBase(); | ||||||
|  |  | ||||||
|  |           // protected methods | ||||||
|  |             /** | ||||||
|  |              * Used to enter an object into the registry.  (The registry now | ||||||
|  |              * owns <code>object</code>.) | ||||||
|  |              */ | ||||||
|  |             bool putVal(const log4cplus::tstring& name, void* object); | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Used to retrieve an object from the registry.  (The registry | ||||||
|  |              * owns the returned pointer.) | ||||||
|  |              */ | ||||||
|  |             void* getVal(const log4cplus::tstring& name) const; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Deletes <code>object</code>. | ||||||
|  |              */ | ||||||
|  |             virtual void deleteObject(void *object) const = 0; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Deletes all objects from this registry. | ||||||
|  |              */ | ||||||
|  |             virtual void clear(); | ||||||
|  |  | ||||||
|  |           // Types | ||||||
|  |             typedef std::map<log4cplus::tstring, void*> ObjectMap; | ||||||
|  |  | ||||||
|  |           // Data | ||||||
|  |             LOG4CPLUS_MUTEX_PTR_DECLARE mutex; | ||||||
|  |             ObjectMap data; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_SPI_OBJECT_REGISTRY_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										70
									
								
								libs/log4cplus/include/log4cplus/spi/rootlogger.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								libs/log4cplus/include/log4cplus/spi/rootlogger.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    rootlogger.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_SPI_ROOT_LOGGER_HEADER_ | ||||||
|  | #define _LOG4CPLUS_SPI_ROOT_LOGGER_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/spi/loggerimpl.h> | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     namespace spi { | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * RootLogger sits at the top of the logger hierachy. It is a | ||||||
|  |          * regular logger except that it provides several guarantees. | ||||||
|  |          * | ||||||
|  |          * First, it cannot be assigned a <code>NOT_SET_LOG_LEVEL</code> | ||||||
|  |          * LogLevel. Second, since root logger cannot have a parent, the | ||||||
|  |          * getChainedLogLevel method always returns the value of the | ||||||
|  |          * ll field without walking the hierarchy. | ||||||
|  |          */ | ||||||
|  |         class LOG4CPLUS_EXPORT RootLogger : public LoggerImpl { | ||||||
|  |         public: | ||||||
|  |           // Ctors | ||||||
|  |             /** | ||||||
|  |              * The root logger names itself as "root". However, the root | ||||||
|  |              * logger cannot be retrieved by name.   | ||||||
|  |              */ | ||||||
|  |             RootLogger(Hierarchy& h, LogLevel ll); | ||||||
|  |  | ||||||
|  |           // Methods | ||||||
|  |             /** | ||||||
|  |              * Return the assigned LogLevel value without walking the logger | ||||||
|  |              * hierarchy. | ||||||
|  |              */ | ||||||
|  |             virtual LogLevel getChainedLogLevel() const; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Setting a NOT_SET_LOG_LEVEL value to the LogLevel of the root logger  | ||||||
|  |              * may have catastrophic results. We prevent this here. | ||||||
|  |              */ | ||||||
|  |             void setLogLevel(LogLevel ll); | ||||||
|  |  | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |     } // end namespace spi | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_SPI_ROOT_LOGGER_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										55
									
								
								libs/log4cplus/include/log4cplus/streams.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								libs/log4cplus/include/log4cplus/streams.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    streams.h | ||||||
|  | // Created: 4/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_STREAMS_HEADER_ | ||||||
|  | #define LOG4CPLUS_STREAMS_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/tstring.h> | ||||||
|  |  | ||||||
|  | #include <iostream> | ||||||
|  | #include <sstream> | ||||||
|  | #define LOG4CPLUS_STREAM_NAMESPACE std | ||||||
|  |  | ||||||
|  | #ifdef UNICODE | ||||||
|  |     namespace log4cplus { | ||||||
|  |         typedef LOG4CPLUS_STREAM_NAMESPACE::wostream tostream; | ||||||
|  |         typedef LOG4CPLUS_STREAM_NAMESPACE::wistream tistream; | ||||||
|  |         typedef LOG4CPLUS_STREAM_NAMESPACE::wostringstream tostringstream; | ||||||
|  |         static tostream &tcout = LOG4CPLUS_STREAM_NAMESPACE::wcout; | ||||||
|  |         static tostream &tcerr = LOG4CPLUS_STREAM_NAMESPACE::wcerr; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | LOG4CPLUS_EXPORT log4cplus::tostream& operator <<(log4cplus::tostream&, const char* psz ); | ||||||
|  |  | ||||||
|  | #else | ||||||
|  |     namespace log4cplus { | ||||||
|  |         typedef LOG4CPLUS_STREAM_NAMESPACE::ostream tostream; | ||||||
|  |         typedef LOG4CPLUS_STREAM_NAMESPACE::istream tistream; | ||||||
|  |         static tostream &tcout = LOG4CPLUS_STREAM_NAMESPACE::cout; | ||||||
|  |         static tostream &tcerr = LOG4CPLUS_STREAM_NAMESPACE::cerr; | ||||||
|  |         typedef LOG4CPLUS_STREAM_NAMESPACE::ostringstream tostringstream; | ||||||
|  |     } | ||||||
|  | #endif // UNICODE | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_STREAMS_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										82
									
								
								libs/log4cplus/include/log4cplus/syslogappender.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								libs/log4cplus/include/log4cplus/syslogappender.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    syslogappender.h | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_SYSLOG_APPENDER_HEADER_ | ||||||
|  | #define _LOG4CPLUS_SYSLOG_APPENDER_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  |  | ||||||
|  | #if defined(LOG4CPLUS_HAVE_SYSLOG_H) && !defined(_WIN32) | ||||||
|  | #include <log4cplus/appender.h> | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Appends log events to a file.  | ||||||
|  |      * | ||||||
|  |      * <h3>Properties</h3> | ||||||
|  |      * <dl> | ||||||
|  |      * <dt><tt>ident</tt></dt> | ||||||
|  |      * <dd>First argument to <code>openlog()</code>, a string that | ||||||
|  |      * will be prepended to every message.</dd> | ||||||
|  |      *  | ||||||
|  |      * <dt><tt>facility</tt></dt> | ||||||
|  |      * <dd>Facility is used in combination with syslog level in first | ||||||
|  |      * argument to syslog(). It can be one of the supported facility | ||||||
|  |      * names (case insensitive), e.g. auth, cron, kern, mail, news | ||||||
|  |      * etc.</dd> | ||||||
|  |      * </dl> | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT SysLogAppender : public Appender { | ||||||
|  |     public: | ||||||
|  |       // Ctors | ||||||
|  |         SysLogAppender(const tstring& ident); | ||||||
|  |         SysLogAppender(const log4cplus::helpers::Properties & properties); | ||||||
|  |  | ||||||
|  |       // Dtor | ||||||
|  |         virtual ~SysLogAppender(); | ||||||
|  |  | ||||||
|  |       // Methods | ||||||
|  |         virtual void close(); | ||||||
|  |  | ||||||
|  |     protected: | ||||||
|  |         virtual int getSysLogLevel(const LogLevel& ll) const; | ||||||
|  |         virtual void append(const spi::InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |       // Data | ||||||
|  |         tstring ident; | ||||||
|  |         int facility; | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |       // Disallow copying of instances of this class | ||||||
|  |         SysLogAppender(const SysLogAppender&); | ||||||
|  |         SysLogAppender& operator=(const SysLogAppender&); | ||||||
|  |  | ||||||
|  |         std::string identStr; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // defined(HAVE_SYSLOG_H) | ||||||
|  |  | ||||||
|  | #endif // _LOG4CPLUS_SYSLOG_APPENDER_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										85
									
								
								libs/log4cplus/include/log4cplus/tstring.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								libs/log4cplus/include/log4cplus/tstring.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    tstring.h | ||||||
|  | // Created: 4/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_TSTRING_HEADER_ | ||||||
|  | #define LOG4CPLUS_TSTRING_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <string> | ||||||
|  |  | ||||||
|  | #ifdef UNICODE | ||||||
|  | #  ifdef LOG4CPLUS_WORKING_LOCALE | ||||||
|  | #    include <locale> | ||||||
|  | #  endif // LOG4CPLUS_WORKING_LOCALE | ||||||
|  | #  define LOG4CPLUS_TEXT2(STRING) L##STRING | ||||||
|  | #else | ||||||
|  | #  define LOG4CPLUS_TEXT2(STRING) STRING | ||||||
|  | #endif // UNICODE | ||||||
|  | #define LOG4CPLUS_TEXT(STRING) LOG4CPLUS_TEXT2(STRING) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifdef UNICODE | ||||||
|  | namespace log4cplus { | ||||||
|  |     typedef wchar_t tchar; | ||||||
|  |     typedef std::wstring tstring; | ||||||
|  |  | ||||||
|  |     namespace helpers { | ||||||
|  | #ifdef LOG4CPLUS_WORKING_LOCALE | ||||||
|  |         LOG4CPLUS_EXPORT std::string tostring(const std::wstring&, | ||||||
|  |             std::locale const & = std::locale ()); | ||||||
|  |  | ||||||
|  |         LOG4CPLUS_EXPORT std::string tostring (wchar_t const *, | ||||||
|  |             std::locale const & = std::locale ()); | ||||||
|  |  | ||||||
|  |         LOG4CPLUS_EXPORT std::wstring towstring(const std::string&, | ||||||
|  |             std::locale const & = std::locale ()); | ||||||
|  |  | ||||||
|  |         LOG4CPLUS_EXPORT std::wstring towstring(char const *, | ||||||
|  |             std::locale const & = std::locale ()); | ||||||
|  |  | ||||||
|  | #else // LOG4CPLUS_WORKING_LOCALE | ||||||
|  |         LOG4CPLUS_EXPORT std::string tostring(const std::wstring&); | ||||||
|  |         LOG4CPLUS_EXPORT std::string tostring(wchar_t const *); | ||||||
|  |         LOG4CPLUS_EXPORT std::wstring towstring(const std::string&); | ||||||
|  |         LOG4CPLUS_EXPORT std::wstring towstring(char const *); | ||||||
|  | #endif // LOG4CPLUS_WORKING_LOCALE | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #define LOG4CPLUS_C_STR_TO_TSTRING(STRING) log4cplus::helpers::towstring(STRING) | ||||||
|  | #define LOG4CPLUS_STRING_TO_TSTRING(STRING) log4cplus::helpers::towstring(STRING) | ||||||
|  | #define LOG4CPLUS_TSTRING_TO_STRING(STRING) log4cplus::helpers::tostring(STRING) | ||||||
|  |  | ||||||
|  | #else // UNICODE | ||||||
|  | namespace log4cplus { | ||||||
|  |     typedef char tchar; | ||||||
|  |     typedef std::string tstring; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #define LOG4CPLUS_C_STR_TO_TSTRING(STRING) std::string(STRING) | ||||||
|  | #define LOG4CPLUS_STRING_TO_TSTRING(STRING) STRING | ||||||
|  | #define LOG4CPLUS_TSTRING_TO_STRING(STRING) STRING | ||||||
|  |  | ||||||
|  | #endif // UNICODE | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_TSTRING_HEADER_ | ||||||
							
								
								
									
										49
									
								
								libs/log4cplus/include/log4cplus/version.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								libs/log4cplus/include/log4cplus/version.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | |||||||
|  | //   Copyright (C) 2010, Vaclav Haisman. All rights reserved. | ||||||
|  | //    | ||||||
|  | //   Redistribution and use in source and binary forms, with or without modifica- | ||||||
|  | //   tion, are permitted provided that the following conditions are met: | ||||||
|  | //    | ||||||
|  | //   1. Redistributions of  source code must  retain the above copyright  notice, | ||||||
|  | //      this list of conditions and the following disclaimer. | ||||||
|  | //    | ||||||
|  | //   2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  | //      this list of conditions and the following disclaimer in the documentation | ||||||
|  | //      and/or other materials provided with the distribution. | ||||||
|  | //    | ||||||
|  | //   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, | ||||||
|  | //   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | ||||||
|  | //   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE | ||||||
|  | //   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT, | ||||||
|  | //   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU- | ||||||
|  | //   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS | ||||||
|  | //   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON | ||||||
|  | //   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT | ||||||
|  | //   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF | ||||||
|  | //   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if ! defined (LOG4CPLUS_VERSION_H) | ||||||
|  | #define LOG4CPLUS_VERSION_H | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define LOG4CPLUS_MAKE_VERSION(major, minor, point) \ | ||||||
|  |     (major * 1000 * 1000u + minor * 1000u + point) | ||||||
|  |  | ||||||
|  | #define LOG4CPLUS_MAKE_VERSION_STR(major, minor, point) \ | ||||||
|  |     #major "." #minor "." #point | ||||||
|  |  | ||||||
|  | #define LOG4CPLUS_VERSION LOG4CPLUS_MAKE_VERSION(1, 0, 4) | ||||||
|  | #define LOG4CPLUS_VERSION_STR LOG4CPLUS_MAKE_VERSION_STR(1, 0, 4) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus | ||||||
|  | { | ||||||
|  |  | ||||||
|  | extern LOG4CPLUS_EXPORT unsigned const version; | ||||||
|  | extern LOG4CPLUS_EXPORT char const versionStr[]; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										77
									
								
								libs/log4cplus/include/log4cplus/win32consoleappender.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								libs/log4cplus/include/log4cplus/win32consoleappender.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | |||||||
|  | //   Copyright (C) 2009-2010, Vaclav Haisman. All rights reserved. | ||||||
|  | //    | ||||||
|  | //   Redistribution and use in source and binary forms, with or without modifica- | ||||||
|  | //   tion, are permitted provided that the following conditions are met: | ||||||
|  | //    | ||||||
|  | //   1. Redistributions of  source code must  retain the above copyright  notice, | ||||||
|  | //      this list of conditions and the following disclaimer. | ||||||
|  | //    | ||||||
|  | //   2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  | //      this list of conditions and the following disclaimer in the documentation | ||||||
|  | //      and/or other materials provided with the distribution. | ||||||
|  | //    | ||||||
|  | //   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, | ||||||
|  | //   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | ||||||
|  | //   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE | ||||||
|  | //   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT, | ||||||
|  | //   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU- | ||||||
|  | //   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS | ||||||
|  | //   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON | ||||||
|  | //   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT | ||||||
|  | //   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF | ||||||
|  | //   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_WIN32CONSOLEAPPENDER_H | ||||||
|  | #define LOG4CPLUS_WIN32CONSOLEAPPENDER_H | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #if defined(_WIN32) && defined (LOG4CPLUS_HAVE_WIN32_CONSOLE) | ||||||
|  |  | ||||||
|  | #include <log4cplus/appender.h> | ||||||
|  | #include <log4cplus/helpers/property.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus | ||||||
|  | { | ||||||
|  |  | ||||||
|  |    /** | ||||||
|  |     * Prints events to Win32 console. | ||||||
|  |     * | ||||||
|  |     * <h3>Properties</h3> | ||||||
|  |     * <dl> | ||||||
|  |     * <dt><tt>AllocConsole</tt></dt> | ||||||
|  |     * <dd>This boolean property specifies whether or not this appender | ||||||
|  |     * will try to allocate new console using the | ||||||
|  |     * <code>AllocConsole()</code> Win32 function.</dd> | ||||||
|  |     * | ||||||
|  |     * </dl> | ||||||
|  |     */ | ||||||
|  |     class LOG4CPLUS_EXPORT Win32ConsoleAppender | ||||||
|  |         : public Appender | ||||||
|  |     { | ||||||
|  |     public: | ||||||
|  |         explicit Win32ConsoleAppender (bool allocConsole = true); | ||||||
|  |         Win32ConsoleAppender (helpers::Properties const & properties); | ||||||
|  |         virtual ~Win32ConsoleAppender (); | ||||||
|  |  | ||||||
|  |         virtual void close (); | ||||||
|  |  | ||||||
|  |     protected: | ||||||
|  |         virtual void append (spi::InternalLoggingEvent const &); | ||||||
|  |  | ||||||
|  |         void write_handle (HANDLE, tchar const *, size_t); | ||||||
|  |         void write_console (HANDLE, tchar const *, size_t); | ||||||
|  |  | ||||||
|  |         bool alloc_console; | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |         Win32ConsoleAppender (Win32ConsoleAppender const &); | ||||||
|  |         Win32ConsoleAppender & operator = (Win32ConsoleAppender const &); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  | } // namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_WIN32CONSOLEAPPENDER_H | ||||||
							
								
								
									
										65
									
								
								libs/log4cplus/include/log4cplus/win32debugappender.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								libs/log4cplus/include/log4cplus/win32debugappender.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    win32debugappender.h | ||||||
|  | // Created: 12/2003 | ||||||
|  | // Author:  Eduardo Francos, Odalio SARL | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2010 Odalio SARL | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | /** @file */ | ||||||
|  |  | ||||||
|  | #ifndef _LOG4CPLUS_WIN32DEBUG_APPENDER_HEADER_ | ||||||
|  | #define _LOG4CPLUS_WIN32DEBUG_APPENDER_HEADER_ | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #if defined (LOG4CPLUS_HAVE_WIN32_CONSOLE) | ||||||
|  |  | ||||||
|  | #include <log4cplus/appender.h> | ||||||
|  | #include <log4cplus/helpers/property.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Prints log events using OutputDebugString().  | ||||||
|  |      */ | ||||||
|  |     class LOG4CPLUS_EXPORT Win32DebugAppender | ||||||
|  |         : public Appender | ||||||
|  |     { | ||||||
|  |     public: | ||||||
|  |       // Ctors | ||||||
|  |         Win32DebugAppender(); | ||||||
|  |         Win32DebugAppender(const log4cplus::helpers::Properties& properties); | ||||||
|  |  | ||||||
|  |       // Dtor | ||||||
|  |         virtual ~Win32DebugAppender(); | ||||||
|  |  | ||||||
|  |       // Methods | ||||||
|  |         virtual void close(); | ||||||
|  |  | ||||||
|  |     protected: | ||||||
|  |         virtual void append(const log4cplus::spi::InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |       // Disallow copying of instances of this class | ||||||
|  |         Win32DebugAppender(const Win32DebugAppender&); | ||||||
|  |         Win32DebugAppender& operator=(const Win32DebugAppender&); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  | } // end namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_HAVE_WIN32_CONSOLE | ||||||
|  | #endif // _LOG4CPLUS_WIN32DEBUG_APPENDER_HEADER_ | ||||||
|  |  | ||||||
							
								
								
									
										266
									
								
								libs/log4cplus/src/appender.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										266
									
								
								libs/log4cplus/src/appender.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,266 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    appender.cxx | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/appender.h> | ||||||
|  | #include <log4cplus/layout.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/helpers/pointer.h> | ||||||
|  | #include <log4cplus/helpers/stringhelper.h> | ||||||
|  | #include <log4cplus/spi/factory.h> | ||||||
|  | #include <log4cplus/spi/loggingevent.h> | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  | using namespace log4cplus::spi; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::ErrorHandler dtor | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | ErrorHandler::~ErrorHandler() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::OnlyOnceErrorHandler public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | OnlyOnceErrorHandler::error(const log4cplus::tstring& err) | ||||||
|  | { | ||||||
|  |     if(firstTime) { | ||||||
|  |         getLogLog().error(err); | ||||||
|  |         firstTime = false; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | OnlyOnceErrorHandler::reset() | ||||||
|  | { | ||||||
|  |     firstTime = true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::Appender ctors | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | Appender::Appender() | ||||||
|  |  : layout(new SimpleLayout()), | ||||||
|  |    name( LOG4CPLUS_TEXT("") ), | ||||||
|  |    threshold(NOT_SET_LOG_LEVEL), | ||||||
|  |    errorHandler(new OnlyOnceErrorHandler()), | ||||||
|  |    closed(false) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Appender::Appender(const log4cplus::helpers::Properties properties) | ||||||
|  |  : layout(new SimpleLayout()), | ||||||
|  |    name( LOG4CPLUS_TEXT("") ), | ||||||
|  |    threshold(NOT_SET_LOG_LEVEL), | ||||||
|  |    errorHandler(new OnlyOnceErrorHandler()), | ||||||
|  |    closed(false) | ||||||
|  | { | ||||||
|  |     if(properties.exists( LOG4CPLUS_TEXT("layout") )) { | ||||||
|  |         log4cplus::tstring factoryName = properties.getProperty( LOG4CPLUS_TEXT("layout") ); | ||||||
|  |         LayoutFactory* factory = getLayoutFactoryRegistry().get(factoryName); | ||||||
|  |         if(factory == 0) { | ||||||
|  |             getLogLog().error(  LOG4CPLUS_TEXT("Cannot find LayoutFactory: \"") | ||||||
|  |                               + factoryName | ||||||
|  |                               + LOG4CPLUS_TEXT("\"") ); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         Properties layoutProperties = | ||||||
|  |                 properties.getPropertySubset( LOG4CPLUS_TEXT("layout.") ); | ||||||
|  |         try { | ||||||
|  |             std::auto_ptr<Layout> newLayout(factory->createObject(layoutProperties)); | ||||||
|  |             if(newLayout.get() == 0) { | ||||||
|  |                 getLogLog().error(  LOG4CPLUS_TEXT("Failed to create appender: ") | ||||||
|  |                                   + factoryName); | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|  |                 layout = newLayout; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         catch(std::exception& e) { | ||||||
|  |             getLogLog().error(  LOG4CPLUS_TEXT("Error while creating Layout: ") | ||||||
|  |                               + LOG4CPLUS_C_STR_TO_TSTRING(e.what())); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Support for appender.Threshold in properties configuration file | ||||||
|  |     if(properties.exists(LOG4CPLUS_TEXT("Threshold"))) { | ||||||
|  |         tstring tmp = properties.getProperty(LOG4CPLUS_TEXT("Threshold")); | ||||||
|  |         tmp = log4cplus::helpers::toUpper(tmp); | ||||||
|  |         threshold = log4cplus::getLogLevelManager().fromString(tmp); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Configure the filters | ||||||
|  |     Properties filterProps = properties.getPropertySubset( LOG4CPLUS_TEXT("filters.") ); | ||||||
|  |     int filterCount = 0; | ||||||
|  |     FilterPtr filterChain; | ||||||
|  |     tstring filterName, factoryName; | ||||||
|  |     while( filterProps.exists(filterName = convertIntegerToString(++filterCount)) ) { | ||||||
|  |         factoryName = filterProps.getProperty(filterName); | ||||||
|  |         FilterFactory* factory = getFilterFactoryRegistry().get(factoryName); | ||||||
|  |  | ||||||
|  |         if(factory == 0) { | ||||||
|  |             tstring err = LOG4CPLUS_TEXT("Appender::ctor()- Cannot find FilterFactory: "); | ||||||
|  |             getLogLog().error(err + factoryName); | ||||||
|  |             continue; | ||||||
|  |         } | ||||||
|  |         FilterPtr tmp_filter = factory->createObject | ||||||
|  |                       (filterProps.getPropertySubset(filterName + LOG4CPLUS_TEXT("."))); | ||||||
|  |         if(tmp_filter.get() == 0) { | ||||||
|  |             tstring err = LOG4CPLUS_TEXT("Appender::ctor()- Failed to create filter: "); | ||||||
|  |             getLogLog().error(err + filterName); | ||||||
|  |         } | ||||||
|  |         if(filterChain.get() == 0) { | ||||||
|  |             filterChain = tmp_filter; | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             filterChain->appendFilter(tmp_filter); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     setFilter(filterChain); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Appender::~Appender() | ||||||
|  | { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::Appender public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Appender::destructorImpl() | ||||||
|  | { | ||||||
|  |     getLogLog().debug(  LOG4CPLUS_TEXT("Destroying appender named [") | ||||||
|  |                       + name | ||||||
|  |                       + LOG4CPLUS_TEXT("].")); | ||||||
|  |  | ||||||
|  |     // An appender might be closed then destroyed. There is no | ||||||
|  |     // point in closing twice. | ||||||
|  |     if(closed) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     close(); | ||||||
|  |     closed = true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Appender::doAppend(const log4cplus::spi::InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( access_mutex ) | ||||||
|  |         if(closed) { | ||||||
|  |             getLogLog().error(  LOG4CPLUS_TEXT("Attempted to append to closed appender named [") | ||||||
|  |                               + name | ||||||
|  |                               + LOG4CPLUS_TEXT("].")); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if(!isAsSevereAsThreshold(event.getLogLevel())) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if(checkFilter(filter.get(), event) == DENY) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         append(event); | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::tstring | ||||||
|  | Appender::getName() | ||||||
|  | { | ||||||
|  |     return name; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Appender::setName(const log4cplus::tstring& name_) | ||||||
|  | { | ||||||
|  |     this->name = name_; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ErrorHandler* | ||||||
|  | Appender::getErrorHandler() | ||||||
|  | { | ||||||
|  |     return errorHandler.get(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Appender::setErrorHandler(std::auto_ptr<ErrorHandler> eh) | ||||||
|  | { | ||||||
|  |     if(eh.get() == NULL) { | ||||||
|  |         // We do not throw exception here since the cause is probably a | ||||||
|  |         // bad config file. | ||||||
|  |         getLogLog().warn(LOG4CPLUS_TEXT("You have tried to set a null error-handler.")); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( access_mutex ) | ||||||
|  |         this->errorHandler = eh; | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Appender::setLayout(std::auto_ptr<Layout> lo) | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( access_mutex ) | ||||||
|  |         this->layout = lo; | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Layout* | ||||||
|  | Appender::getLayout() | ||||||
|  | { | ||||||
|  |     return layout.get(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										177
									
								
								libs/log4cplus/src/appenderattachableimpl.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								libs/log4cplus/src/appenderattachableimpl.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    appenderattachableimpl.cxx | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #include <log4cplus/appender.h> | ||||||
|  | #include <log4cplus/helpers/appenderattachableimpl.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/spi/loggingevent.h> | ||||||
|  |  | ||||||
|  | #include <algorithm> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus | ||||||
|  | { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace spi | ||||||
|  | { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | AppenderAttachable::~AppenderAttachable() | ||||||
|  | { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace spi | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace helpers | ||||||
|  | { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::helpers::AppenderAttachableImpl ctor and dtor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | AppenderAttachableImpl::AppenderAttachableImpl() | ||||||
|  |  : appender_list_mutex(LOG4CPLUS_MUTEX_CREATE) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | AppenderAttachableImpl::~AppenderAttachableImpl() | ||||||
|  | { | ||||||
|  |    LOG4CPLUS_MUTEX_FREE( appender_list_mutex ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::helpers::AppenderAttachableImpl public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | AppenderAttachableImpl::addAppender(SharedAppenderPtr newAppender) | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( appender_list_mutex ) | ||||||
|  |         if(newAppender == NULL) { | ||||||
|  |             getLogLog().warn( LOG4CPLUS_TEXT("Tried to add NULL appender") ); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         ListType::iterator it =  | ||||||
|  |             std::find(appenderList.begin(), appenderList.end(), newAppender); | ||||||
|  |         if(it == appenderList.end()) { | ||||||
|  |             appenderList.push_back(newAppender); | ||||||
|  |         } | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | AppenderAttachableImpl::ListType | ||||||
|  | AppenderAttachableImpl::getAllAppenders() | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( appender_list_mutex ) | ||||||
|  |         return appenderList; | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | SharedAppenderPtr  | ||||||
|  | AppenderAttachableImpl::getAppender(const log4cplus::tstring& name) | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( appender_list_mutex ) | ||||||
|  |         for(ListType::iterator it=appenderList.begin();  | ||||||
|  |             it!=appenderList.end();  | ||||||
|  |             ++it) | ||||||
|  |         { | ||||||
|  |             if((*it)->getName() == name) { | ||||||
|  |                 return *it; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return SharedAppenderPtr(NULL); | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | AppenderAttachableImpl::removeAllAppenders() | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( appender_list_mutex ) | ||||||
|  |         appenderList.erase(appenderList.begin(), appenderList.end()); | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | AppenderAttachableImpl::removeAppender(SharedAppenderPtr appender) | ||||||
|  | { | ||||||
|  |     if(appender == NULL) { | ||||||
|  |         getLogLog().warn( LOG4CPLUS_TEXT("Tried to remove NULL appender") ); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( appender_list_mutex ) | ||||||
|  |         ListType::iterator it = | ||||||
|  |             std::find(appenderList.begin(), appenderList.end(), appender); | ||||||
|  |         if(it != appenderList.end()) { | ||||||
|  |             appenderList.erase(it); | ||||||
|  |         } | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | AppenderAttachableImpl::removeAppender(const log4cplus::tstring& name) | ||||||
|  | { | ||||||
|  |     removeAppender(getAppender(name)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int  | ||||||
|  | AppenderAttachableImpl::appendLoopOnAppenders(const spi::InternalLoggingEvent& event) const | ||||||
|  | { | ||||||
|  |     int count = 0; | ||||||
|  |  | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( appender_list_mutex ) | ||||||
|  |         for(ListType::const_iterator it=appenderList.begin(); | ||||||
|  |             it!=appenderList.end(); | ||||||
|  |             ++it) | ||||||
|  |         { | ||||||
|  |             ++count; | ||||||
|  |             (*it)->doAppend(event); | ||||||
|  |         } | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  |  | ||||||
|  |     return count; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace helpers | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace log4cplus | ||||||
							
								
								
									
										778
									
								
								libs/log4cplus/src/configurator.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										778
									
								
								libs/log4cplus/src/configurator.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,778 @@ | |||||||
|  | // Module:  LOG4CPLUS | ||||||
|  | // File:    configurator.cxx | ||||||
|  | // Created: 3/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/configurator.h> | ||||||
|  | #include <log4cplus/hierarchylocker.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/helpers/sleep.h> | ||||||
|  | #include <log4cplus/helpers/stringhelper.h> | ||||||
|  | #include <log4cplus/helpers/property.h> | ||||||
|  | #include <log4cplus/helpers/syncprims.h> | ||||||
|  | #include <log4cplus/helpers/timehelper.h> | ||||||
|  | #include <log4cplus/spi/factory.h> | ||||||
|  | #include <log4cplus/spi/loggerimpl.h> | ||||||
|  |  | ||||||
|  | #ifdef LOG4CPLUS_HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef LOG4CPLUS_HAVE_SYS_STAT_H | ||||||
|  | #include <sys/stat.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef LOG4CPLUS_HAVE_STDLIB_H | ||||||
|  | #include <stdlib.h> | ||||||
|  | #endif | ||||||
|  | #if defined (WIN32) | ||||||
|  | #include <tchar.h> | ||||||
|  | #endif | ||||||
|  | #if defined (_WIN32_WCE) | ||||||
|  | #include <windows.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <algorithm> | ||||||
|  | #include <vector> | ||||||
|  | #include <cstdlib> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus | ||||||
|  | { | ||||||
|  |  | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  | using namespace log4cplus::spi; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void initializeLog4cplus(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace | ||||||
|  | { | ||||||
|  |     static tchar const DELIM_START[] = LOG4CPLUS_TEXT("${"); | ||||||
|  |     static tchar const DELIM_STOP[] = LOG4CPLUS_TEXT("}"); | ||||||
|  |     static size_t const DELIM_START_LEN = 2; | ||||||
|  |     static size_t const DELIM_STOP_LEN = 1; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     static | ||||||
|  |     void | ||||||
|  |     get_env_var (tstring & value, tstring const & name) | ||||||
|  |     { | ||||||
|  | #if defined (_WIN32_WCE) | ||||||
|  |         // Nothing to do here. Windows CE does not have environment variables. | ||||||
|  |  | ||||||
|  | #elif defined (WIN32) && defined (UNICODE) | ||||||
|  |         tchar const * val = _wgetenv (name.c_str ()); | ||||||
|  |         if (val) | ||||||
|  |             value = val; | ||||||
|  |  | ||||||
|  | #else | ||||||
|  |         char const * val | ||||||
|  |             = std::getenv (LOG4CPLUS_TSTRING_TO_STRING (name).c_str ()); | ||||||
|  |         if (val) | ||||||
|  |             value = LOG4CPLUS_STRING_TO_TSTRING (val); | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     struct file_info | ||||||
|  |     { | ||||||
|  |         Time mtime; | ||||||
|  |         bool is_link; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     static | ||||||
|  |     int | ||||||
|  |     get_file_info (file_info * fi, tstring const & name) | ||||||
|  |     { | ||||||
|  | #if defined (_WIN32_WCE) | ||||||
|  |         WIN32_FILE_ATTRIBUTE_DATA fad; | ||||||
|  |         BOOL ret = GetFileAttributesEx (name.c_str (), GetFileExInfoStandard, &fad); | ||||||
|  |         if (! ret) | ||||||
|  |             return -1; | ||||||
|  |  | ||||||
|  |         SYSTEMTIME systime; | ||||||
|  |         ret = FileTimeToSystemTime (&fad.ftLastWriteTime, &systime); | ||||||
|  |         if (! ret) | ||||||
|  |             return -1; | ||||||
|  |  | ||||||
|  |         helpers::tm tm; | ||||||
|  |         tm.tm_isdst = 0; | ||||||
|  |         tm.tm_yday = 0; | ||||||
|  |         tm.tm_wday = systime.wDayOfWeek; | ||||||
|  |         tm.tm_year = systime.wYear - 1900; | ||||||
|  |         tm.tm_mon = systime.wMonth - 1; | ||||||
|  |         tm.tm_mday = systime.wDay; | ||||||
|  |         tm.tm_hour = systime.wHour; | ||||||
|  |         tm.tm_min = systime.wMinute; | ||||||
|  |         tm.tm_sec = systime.wSecond; | ||||||
|  |  | ||||||
|  |         fi->mtime.setTime (&tm); | ||||||
|  |         fi->is_link = false; | ||||||
|  |  | ||||||
|  | #elif defined (_WIN32) | ||||||
|  |         struct _stat fileStatus; | ||||||
|  |         if (_tstat (name.c_str (), &fileStatus) == -1) | ||||||
|  |             return -1; | ||||||
|  |          | ||||||
|  |         fi->mtime = Time (fileStatus.st_mtime); | ||||||
|  |         fi->is_link = false; | ||||||
|  |  | ||||||
|  | #else | ||||||
|  |         struct stat fileStatus; | ||||||
|  |         if (stat (LOG4CPLUS_TSTRING_TO_STRING (name).c_str (), | ||||||
|  |                 &fileStatus) == -1) | ||||||
|  |             return -1; | ||||||
|  |         fi->mtime = Time (fileStatus.st_mtime); | ||||||
|  |         fi->is_link = S_ISLNK (fileStatus.st_mode); | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Perform variable substitution in string <code>val</code> from | ||||||
|  |      * environment variables. | ||||||
|  |      * | ||||||
|  |      * <p>The variable substitution delimeters are <b>${</b> and <b>}</b>. | ||||||
|  |      * | ||||||
|  |      * <p>For example, if the System properties contains "key=value", then | ||||||
|  |      * the call | ||||||
|  |      * <pre> | ||||||
|  |      * string s; | ||||||
|  |      * substEnvironVars(s, "Value of key is ${key}."); | ||||||
|  |      * </pre> | ||||||
|  |      * | ||||||
|  |      * will set the variable <code>s</code> to "Value of key is value.". | ||||||
|  |      * | ||||||
|  |      * <p>If no value could be found for the specified key, then | ||||||
|  |      * substitution defaults to the empty string. | ||||||
|  |      * | ||||||
|  |      * <p>For example, if there is no environment variable "inexistentKey", | ||||||
|  |      * then the call | ||||||
|  |      * | ||||||
|  |      * <pre> | ||||||
|  |      * string s; | ||||||
|  |      * substEnvironVars(s, "Value of inexistentKey is [${inexistentKey}]"); | ||||||
|  |      * </pre> | ||||||
|  |      * will set <code>s</code> to "Value of inexistentKey is []" | ||||||
|  |      * | ||||||
|  |      * @param val The string on which variable substitution is performed. | ||||||
|  |      * @param dest The result. | ||||||
|  |      */ | ||||||
|  |     static | ||||||
|  |     bool | ||||||
|  |     substVars (tstring & dest, const tstring & val, Properties const & props, | ||||||
|  |         helpers::LogLog& loglog, unsigned flags) | ||||||
|  |     { | ||||||
|  |         tstring::size_type i = 0; | ||||||
|  |         tstring::size_type var_start, var_end; | ||||||
|  |         tstring pattern (val); | ||||||
|  |         tstring key; | ||||||
|  |         tstring replacement; | ||||||
|  |         bool changed = false; | ||||||
|  |         bool const empty_vars | ||||||
|  |             = !! (flags & PropertyConfigurator::fAllowEmptyVars); | ||||||
|  |         bool const shadow_env | ||||||
|  |             = !! (flags & PropertyConfigurator::fShadowEnvironment); | ||||||
|  |         bool const rec_exp | ||||||
|  |             = !! (flags & PropertyConfigurator::fRecursiveExpansion); | ||||||
|  |  | ||||||
|  |         while (true) | ||||||
|  |         { | ||||||
|  |             // Find opening paren of variable substitution. | ||||||
|  |             var_start = pattern.find(DELIM_START, i); | ||||||
|  |             if (var_start == tstring::npos) | ||||||
|  |             { | ||||||
|  |                 dest = pattern; | ||||||
|  |                 return changed; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // Find closing paren of variable substitution. | ||||||
|  |             var_end = pattern.find(DELIM_STOP, var_start); | ||||||
|  |             if (var_end == tstring::npos) | ||||||
|  |             { | ||||||
|  |                 tostringstream buffer; | ||||||
|  |                 buffer << '"' << pattern | ||||||
|  |                        << "\" has no closing brace. " | ||||||
|  |                        << "Opening brace at position " << var_start << "."; | ||||||
|  |                 loglog.error(buffer.str()); | ||||||
|  |                 dest = val; | ||||||
|  |                 return false; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             key.assign (pattern, var_start + DELIM_START_LEN, | ||||||
|  |                 var_end - (var_start + DELIM_START_LEN)); | ||||||
|  |             replacement.clear (); | ||||||
|  |             if (shadow_env) | ||||||
|  |                 replacement = props.getProperty (key); | ||||||
|  |             if (! shadow_env || (! empty_vars && replacement.empty ())) | ||||||
|  |                 get_env_var (replacement, key); | ||||||
|  |              | ||||||
|  |             if (empty_vars || ! replacement.empty ()) | ||||||
|  |             { | ||||||
|  |                 // Substitute the variable with its value in place. | ||||||
|  |                 pattern.replace (var_start, var_end - var_start + DELIM_STOP_LEN, | ||||||
|  |                     replacement); | ||||||
|  |                 changed = true; | ||||||
|  |                 if (rec_exp) | ||||||
|  |                     // Retry expansion on the same spot. | ||||||
|  |                     continue; | ||||||
|  |                 else | ||||||
|  |                     // Move beyond the just substitued part. | ||||||
|  |                     i = var_start + replacement.size (); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |                 // Nothing has been subtituted, just move beyond the | ||||||
|  |                 // unexpanded variable. | ||||||
|  |                 i = var_end + DELIM_STOP_LEN; | ||||||
|  |         } // end while loop | ||||||
|  |  | ||||||
|  |     } // end substVars() | ||||||
|  |  | ||||||
|  | } // namespace | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // PropertyConfigurator ctor and dtor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | PropertyConfigurator::PropertyConfigurator(const tstring& propertyFile, | ||||||
|  |     Hierarchy& h_, unsigned flags_) | ||||||
|  |     : h(h_) | ||||||
|  |     , propertyFilename(propertyFile) | ||||||
|  |     , properties(propertyFile) | ||||||
|  |     , flags (flags_) | ||||||
|  | { | ||||||
|  |     init(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | PropertyConfigurator::PropertyConfigurator(const helpers::Properties& props, | ||||||
|  |     Hierarchy& h_, unsigned flags_) | ||||||
|  |     : h(h_) | ||||||
|  |     , propertyFilename( LOG4CPLUS_TEXT("UNAVAILABLE") ) | ||||||
|  |     , properties( props ) | ||||||
|  |     , flags (flags_) | ||||||
|  | { | ||||||
|  |     init(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | PropertyConfigurator::PropertyConfigurator(tistream& propertyStream, | ||||||
|  |     Hierarchy& h_, unsigned flags_) | ||||||
|  |     : h(h_) | ||||||
|  |     , propertyFilename( LOG4CPLUS_TEXT("UNAVAILABLE") ) | ||||||
|  |     , properties(propertyStream) | ||||||
|  |     , flags (flags_) | ||||||
|  | { | ||||||
|  |     init(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | PropertyConfigurator::init() | ||||||
|  | { | ||||||
|  |     replaceEnvironVariables(); | ||||||
|  |     properties = properties.getPropertySubset( LOG4CPLUS_TEXT("log4cplus.") ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | PropertyConfigurator::~PropertyConfigurator() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // PropertyConfigurator static methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | PropertyConfigurator::doConfigure(const tstring& file, Hierarchy& h, | ||||||
|  |     unsigned flags) | ||||||
|  | { | ||||||
|  |     PropertyConfigurator tmp(file, h, flags); | ||||||
|  |     tmp.configure(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // PropertyConfigurator public methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | PropertyConfigurator::configure() | ||||||
|  | { | ||||||
|  |     // Configure log4cplus internals. | ||||||
|  |     log4cplus::tstring val = properties.getProperty ( | ||||||
|  |         LOG4CPLUS_TEXT ("configDebug"), LOG4CPLUS_TEXT ("false")); | ||||||
|  |     getLogLog ().setInternalDebugging ( | ||||||
|  |         helpers::toLower (val) == LOG4CPLUS_TEXT ("true")); | ||||||
|  |  | ||||||
|  |     initializeLog4cplus(); | ||||||
|  |     configureAppenders(); | ||||||
|  |     configureLoggers(); | ||||||
|  |     configureAdditivity(); | ||||||
|  |  | ||||||
|  |     // Erase the appenders so that we are not artificially keeping them "alive". | ||||||
|  |     appenders.clear (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | helpers::Properties const & | ||||||
|  | PropertyConfigurator::getProperties () const | ||||||
|  | { | ||||||
|  |     return properties; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::tstring const & | ||||||
|  | PropertyConfigurator::getPropertyFilename () const | ||||||
|  | { | ||||||
|  |     return propertyFilename; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // PropertyConfigurator protected methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | PropertyConfigurator::reconfigure() | ||||||
|  | { | ||||||
|  |     properties = Properties(propertyFilename); | ||||||
|  |     init(); | ||||||
|  |     configure(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | PropertyConfigurator::replaceEnvironVariables() | ||||||
|  | { | ||||||
|  |     tstring val, subKey, subVal; | ||||||
|  |     std::vector<tstring> keys; | ||||||
|  |     bool const rec_exp | ||||||
|  |         = !! (flags & PropertyConfigurator::fRecursiveExpansion); | ||||||
|  |     bool changed; | ||||||
|  |  | ||||||
|  |     do  | ||||||
|  |     { | ||||||
|  |         changed = false; | ||||||
|  |         properties.propertyNames().swap (keys); | ||||||
|  |         for (std::vector<tstring>::const_iterator it = keys.begin(); | ||||||
|  |             it != keys.end(); ++it) | ||||||
|  |         { | ||||||
|  |             tstring const & key = *it; | ||||||
|  |             val = properties.getProperty(key); | ||||||
|  |  | ||||||
|  |             subKey.clear (); | ||||||
|  |             if (substVars(subKey, key, properties, getLogLog(), flags)) | ||||||
|  |             { | ||||||
|  |                 properties.removeProperty(key); | ||||||
|  |                 properties.setProperty(subKey, val); | ||||||
|  |                 changed = true; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             subVal.clear (); | ||||||
|  |             if (substVars(subVal, val, properties, getLogLog(), flags)) | ||||||
|  |             { | ||||||
|  |                 properties.setProperty(subKey, subVal); | ||||||
|  |                 changed = true; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     while (changed && rec_exp); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | PropertyConfigurator::configureLoggers() | ||||||
|  | { | ||||||
|  |     if(properties.exists( LOG4CPLUS_TEXT("rootLogger") )) | ||||||
|  |     { | ||||||
|  |         Logger root = h.getRoot(); | ||||||
|  |         configureLogger(root, | ||||||
|  |                         properties.getProperty(LOG4CPLUS_TEXT("rootLogger"))); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     Properties loggerProperties | ||||||
|  |         = properties.getPropertySubset(LOG4CPLUS_TEXT("logger.")); | ||||||
|  |     std::vector<tstring> loggers = loggerProperties.propertyNames(); | ||||||
|  |     for(std::vector<tstring>::iterator it=loggers.begin(); it!=loggers.end(); | ||||||
|  |         ++it) | ||||||
|  |     { | ||||||
|  |         Logger log = getLogger(*it); | ||||||
|  |         configureLogger(log, loggerProperties.getProperty(*it)); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | PropertyConfigurator::configureLogger(Logger logger, const tstring& config) | ||||||
|  | { | ||||||
|  |     // Remove all spaces from config | ||||||
|  |     tstring configString; | ||||||
|  |     remove_copy_if(config.begin(), config.end(), | ||||||
|  |         string_append_iterator<tstring>(configString), | ||||||
|  |         std::bind1st(std::equal_to<tchar>(), LOG4CPLUS_TEXT(' '))); | ||||||
|  |  | ||||||
|  |     // "Tokenize" configString | ||||||
|  |     std::vector<tstring> tokens; | ||||||
|  |     tokenize(configString, ',', std::back_inserter(tokens)); | ||||||
|  |  | ||||||
|  |     if(tokens.empty()) { | ||||||
|  |         getLogLog().error( | ||||||
|  |             LOG4CPLUS_TEXT("PropertyConfigurator::configureLogger()") | ||||||
|  |             LOG4CPLUS_TEXT("- Invalid config string(Logger = ") | ||||||
|  |             + logger.getName() | ||||||
|  |             + LOG4CPLUS_TEXT("): \"") | ||||||
|  |             + config | ||||||
|  |             + LOG4CPLUS_TEXT("\"")); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Set the loglevel | ||||||
|  |     tstring loglevel = tokens[0]; | ||||||
|  |     if (loglevel != LOG4CPLUS_TEXT("INHERITED")) | ||||||
|  |         logger.setLogLevel( getLogLevelManager().fromString(loglevel) ); | ||||||
|  |     else | ||||||
|  |         logger.setLogLevel (NOT_SET_LOG_LEVEL); | ||||||
|  |  | ||||||
|  |     // Remove all existing appenders first so that we do not duplicate output. | ||||||
|  |     logger.removeAllAppenders (); | ||||||
|  |  | ||||||
|  |     // Set the Appenders | ||||||
|  |     for(std::vector<tstring>::size_type j=1; j<tokens.size(); ++j) | ||||||
|  |     { | ||||||
|  |         AppenderMap::iterator appenderIt = appenders.find(tokens[j]); | ||||||
|  |         if (appenderIt == appenders.end()) | ||||||
|  |         { | ||||||
|  |             getLogLog().error( | ||||||
|  |                 LOG4CPLUS_TEXT("PropertyConfigurator::configureLogger()") | ||||||
|  |                 LOG4CPLUS_TEXT("- Invalid appender: ") | ||||||
|  |                 + tokens[j]); | ||||||
|  |             continue; | ||||||
|  |         } | ||||||
|  |         addAppender(logger, appenderIt->second); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | PropertyConfigurator::configureAppenders() | ||||||
|  | { | ||||||
|  |     Properties appenderProperties = | ||||||
|  |         properties.getPropertySubset(LOG4CPLUS_TEXT("appender.")); | ||||||
|  |     std::vector<tstring> appendersProps = appenderProperties.propertyNames(); | ||||||
|  |     tstring factoryName; | ||||||
|  |     for(std::vector<tstring>::iterator it=appendersProps.begin(); | ||||||
|  |         it != appendersProps.end(); ++it) | ||||||
|  |     { | ||||||
|  |         if( it->find( LOG4CPLUS_TEXT('.') ) == tstring::npos ) | ||||||
|  |         { | ||||||
|  |             factoryName = appenderProperties.getProperty(*it); | ||||||
|  |             AppenderFactory* factory  | ||||||
|  |                 = getAppenderFactoryRegistry().get(factoryName); | ||||||
|  |             if (factory == 0) | ||||||
|  |             { | ||||||
|  |                 tstring err = | ||||||
|  |                     LOG4CPLUS_TEXT("PropertyConfigurator::configureAppenders()") | ||||||
|  |                     LOG4CPLUS_TEXT("- Cannot find AppenderFactory: "); | ||||||
|  |                 getLogLog().error(err + factoryName); | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             Properties my_properties | ||||||
|  |                 = appenderProperties.getPropertySubset((*it)  | ||||||
|  |                     + LOG4CPLUS_TEXT(".")); | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 SharedAppenderPtr appender = factory->createObject(my_properties); | ||||||
|  |                 if (appender.get() == 0) | ||||||
|  |                 { | ||||||
|  |                     tstring err = | ||||||
|  |                         LOG4CPLUS_TEXT("PropertyConfigurator::") | ||||||
|  |                         LOG4CPLUS_TEXT("configureAppenders()") | ||||||
|  |                         LOG4CPLUS_TEXT("- Failed to create appender: "); | ||||||
|  |                     getLogLog().error(err + *it); | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     appender->setName(*it); | ||||||
|  |                     appenders[*it] = appender; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             catch(std::exception& e) | ||||||
|  |             { | ||||||
|  |                 tstring err = | ||||||
|  |                     LOG4CPLUS_TEXT("PropertyConfigurator::") | ||||||
|  |                     LOG4CPLUS_TEXT("configureAppenders()") | ||||||
|  |                     LOG4CPLUS_TEXT("- Error while creating Appender: "); | ||||||
|  |                 getLogLog().error(err + LOG4CPLUS_C_STR_TO_TSTRING(e.what())); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } // end for loop | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | PropertyConfigurator::configureAdditivity() | ||||||
|  | { | ||||||
|  |     Properties additivityProperties = | ||||||
|  |         properties.getPropertySubset(LOG4CPLUS_TEXT("additivity.")); | ||||||
|  |     std::vector<tstring> additivitysProps = additivityProperties.propertyNames(); | ||||||
|  |  | ||||||
|  |     tstring actualValue; | ||||||
|  |     tstring value; | ||||||
|  |  | ||||||
|  |     for(std::vector<tstring>::const_iterator it = additivitysProps.begin(); | ||||||
|  |         it != additivitysProps.end(); ++it) | ||||||
|  |     { | ||||||
|  |         Logger logger = getLogger(*it); | ||||||
|  |         actualValue = additivityProperties.getProperty(*it); | ||||||
|  |         value = toLower(actualValue); | ||||||
|  |  | ||||||
|  |         if(value == LOG4CPLUS_TEXT("true")) | ||||||
|  |             logger.setAdditivity(true); | ||||||
|  |         else if(value == LOG4CPLUS_TEXT("false")) | ||||||
|  |             logger.setAdditivity(false); | ||||||
|  |         else | ||||||
|  |             getLogLog().warn(  LOG4CPLUS_TEXT("Invalid Additivity value: \"") | ||||||
|  |                              + actualValue | ||||||
|  |                              + LOG4CPLUS_TEXT("\"")); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Logger | ||||||
|  | PropertyConfigurator::getLogger(const tstring& name) | ||||||
|  | { | ||||||
|  |     return h.getInstance(name); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | PropertyConfigurator::addAppender(Logger &logger, SharedAppenderPtr& appender) | ||||||
|  | { | ||||||
|  |     logger.addAppender(appender); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // BasicConfigurator ctor and dtor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | BasicConfigurator::BasicConfigurator(Hierarchy& h_) | ||||||
|  |     : PropertyConfigurator( LOG4CPLUS_TEXT(""), h_ ) | ||||||
|  | { | ||||||
|  |     properties.setProperty(LOG4CPLUS_TEXT("rootLogger"), | ||||||
|  |                            LOG4CPLUS_TEXT("DEBUG, STDOUT")); | ||||||
|  |     properties.setProperty(LOG4CPLUS_TEXT("appender.STDOUT"), | ||||||
|  |                            LOG4CPLUS_TEXT("log4cplus::ConsoleAppender")); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | BasicConfigurator::~BasicConfigurator() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // BasicConfigurator static methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | BasicConfigurator::doConfigure(Hierarchy& h) | ||||||
|  | { | ||||||
|  |     BasicConfigurator tmp(h); | ||||||
|  |     tmp.configure(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if !defined(LOG4CPLUS_SINGLE_THREADED) | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // ConfigurationWatchDogThread implementation | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | class ConfigurationWatchDogThread  | ||||||
|  |     : public thread::AbstractThread, | ||||||
|  |       public PropertyConfigurator | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     ConfigurationWatchDogThread(const tstring& file, unsigned int millis) | ||||||
|  |         : PropertyConfigurator(file) | ||||||
|  |         , waitMillis(waitMillis < 1000 ? 1000 : millis) | ||||||
|  |         , shouldTerminate(false) | ||||||
|  |         , lock(NULL) | ||||||
|  |     { } | ||||||
|  |  | ||||||
|  |     virtual ~ConfigurationWatchDogThread () | ||||||
|  |     { } | ||||||
|  |      | ||||||
|  |     void terminate () | ||||||
|  |     { | ||||||
|  |         shouldTerminate.signal (); | ||||||
|  |         join (); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | protected: | ||||||
|  |     virtual void run(); | ||||||
|  |     virtual Logger getLogger(const tstring& name); | ||||||
|  |     virtual void addAppender(Logger &logger, SharedAppenderPtr& appender); | ||||||
|  |      | ||||||
|  |     bool checkForFileModification(Time & mtime); | ||||||
|  |     void updateLastModTime(Time const & mtime); | ||||||
|  |      | ||||||
|  | private: | ||||||
|  |     unsigned int const waitMillis; | ||||||
|  |     thread::ManualResetEvent shouldTerminate; | ||||||
|  |     Time lastModTime; | ||||||
|  |     HierarchyLocker* lock; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | ConfigurationWatchDogThread::run() | ||||||
|  | { | ||||||
|  |     Time mtime; | ||||||
|  |  | ||||||
|  |     // Initialize last modification time. | ||||||
|  |     checkForFileModification (mtime); | ||||||
|  |     updateLastModTime (mtime); | ||||||
|  |  | ||||||
|  |     while (! shouldTerminate.timed_wait (waitMillis)) | ||||||
|  |     { | ||||||
|  |         bool modified = checkForFileModification(mtime); | ||||||
|  |         if(modified) { | ||||||
|  |             // Lock the Hierarchy | ||||||
|  |             HierarchyLocker theLock(h); | ||||||
|  |             lock = &theLock; | ||||||
|  |  | ||||||
|  |             // reconfigure the Hierarchy | ||||||
|  |             theLock.resetConfiguration(); | ||||||
|  |             reconfigure(); | ||||||
|  |             updateLastModTime(mtime); | ||||||
|  |  | ||||||
|  |             // release the lock | ||||||
|  |             lock = NULL; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Logger | ||||||
|  | ConfigurationWatchDogThread::getLogger(const tstring& name) | ||||||
|  | { | ||||||
|  |     if(lock) | ||||||
|  |         return lock->getInstance(name); | ||||||
|  |     else | ||||||
|  |         return PropertyConfigurator::getLogger(name); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | ConfigurationWatchDogThread::addAppender(Logger& logger, | ||||||
|  |                                          SharedAppenderPtr& appender) | ||||||
|  | { | ||||||
|  |     if(lock) | ||||||
|  |         lock->addAppender(logger, appender); | ||||||
|  |     else | ||||||
|  |         PropertyConfigurator::addAppender(logger, appender); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | ConfigurationWatchDogThread::checkForFileModification(Time & mtime) | ||||||
|  | { | ||||||
|  |     file_info fi; | ||||||
|  |  | ||||||
|  |     if (get_file_info (&fi, propertyFilename.c_str ()) != 0) | ||||||
|  |         return false; | ||||||
|  |  | ||||||
|  |     mtime = fi.mtime; | ||||||
|  |     bool modified = mtime != lastModTime; | ||||||
|  |  | ||||||
|  | #if defined(LOG4CPLUS_HAVE_LSTAT) | ||||||
|  |     if (!modified && fi.is_link) | ||||||
|  |     { | ||||||
|  |         struct stat fileStatus; | ||||||
|  |         if (lstat(LOG4CPLUS_TSTRING_TO_STRING(propertyFilename).c_str(), | ||||||
|  |                 &fileStatus) == -1) | ||||||
|  |             return false; | ||||||
|  |  | ||||||
|  |         mtime = Time (fileStatus.st_mtime); | ||||||
|  |         modified = mtime != lastModTime; | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     return modified; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | ConfigurationWatchDogThread::updateLastModTime(Time const & mtime) | ||||||
|  | { | ||||||
|  |     lastModTime = mtime; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // PropertyConfiguratorWatchDog ctor and dtor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | ConfigureAndWatchThread::ConfigureAndWatchThread(const tstring& file, | ||||||
|  |     unsigned int millis) | ||||||
|  |     : watchDogThread(0) | ||||||
|  | { | ||||||
|  |     watchDogThread = new ConfigurationWatchDogThread(file, millis); | ||||||
|  |     watchDogThread->addReference (); | ||||||
|  |     watchDogThread->configure(); | ||||||
|  |     watchDogThread->start(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ConfigureAndWatchThread::~ConfigureAndWatchThread() | ||||||
|  | { | ||||||
|  |     if (watchDogThread) | ||||||
|  |     { | ||||||
|  |         watchDogThread->terminate(); | ||||||
|  |         watchDogThread->removeReference (); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace log4cplus | ||||||
							
								
								
									
										101
									
								
								libs/log4cplus/src/consoleappender.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								libs/log4cplus/src/consoleappender.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    consoleappender.cxx | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/layout.h> | ||||||
|  | #include <log4cplus/consoleappender.h> | ||||||
|  | #include <log4cplus/streams.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/helpers/stringhelper.h> | ||||||
|  | #include <log4cplus/spi/loggingevent.h> | ||||||
|  |  | ||||||
|  | using namespace std; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::ConsoleAppender ctors and dtor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::ConsoleAppender::ConsoleAppender(bool logToStdErr_, bool immediateFlush_) | ||||||
|  | : logToStdErr(logToStdErr_), | ||||||
|  |   immediateFlush(immediateFlush_) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::ConsoleAppender::ConsoleAppender(const log4cplus::helpers::Properties properties) | ||||||
|  | : Appender(properties), | ||||||
|  |   logToStdErr(false), | ||||||
|  |   immediateFlush(false) | ||||||
|  | { | ||||||
|  |     tstring val = toLower(properties.getProperty(LOG4CPLUS_TEXT("logToStdErr"))); | ||||||
|  |     if(val == LOG4CPLUS_TEXT("true")) { | ||||||
|  |         logToStdErr = true; | ||||||
|  |     } | ||||||
|  |     if(properties.exists( LOG4CPLUS_TEXT("ImmediateFlush") )) { | ||||||
|  |         tstring tmp = properties.getProperty( LOG4CPLUS_TEXT("ImmediateFlush") ); | ||||||
|  |         immediateFlush = (toLower(tmp) == LOG4CPLUS_TEXT("true")); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::ConsoleAppender::~ConsoleAppender() | ||||||
|  | { | ||||||
|  |     destructorImpl(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::ConsoleAppender public methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | log4cplus::ConsoleAppender::close() | ||||||
|  | { | ||||||
|  |     getLogLog().debug(LOG4CPLUS_TEXT("Entering ConsoleAppender::close()..")); | ||||||
|  |     closed = true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::ConsoleAppender protected methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | // Normally, append() methods do not need to be locked since they are | ||||||
|  | // called by doAppend() which performs the locking.  However, this locks | ||||||
|  | // on the LogLog instance, so we don't have multiple threads writing to | ||||||
|  | // tcout and tcerr | ||||||
|  | void | ||||||
|  | log4cplus::ConsoleAppender::append(const spi::InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( getLogLog().mutex ) | ||||||
|  |         log4cplus::tostream& output = (logToStdErr ? tcerr : tcout); | ||||||
|  |         layout->formatAndAppend(output, event); | ||||||
|  |         if(immediateFlush) { | ||||||
|  |             output.flush(); | ||||||
|  |         } | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										220
									
								
								libs/log4cplus/src/factory.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										220
									
								
								libs/log4cplus/src/factory.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,220 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    factory.cxx | ||||||
|  | // Created: 2/2002 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2002-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/spi/factory.h> | ||||||
|  | #include <log4cplus/spi/loggerfactory.h> | ||||||
|  | #include <log4cplus/consoleappender.h> | ||||||
|  | #include <log4cplus/fileappender.h> | ||||||
|  | #include <log4cplus/nullappender.h> | ||||||
|  | #include <log4cplus/socketappender.h> | ||||||
|  | #include <log4cplus/syslogappender.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/helpers/threads.h> | ||||||
|  |  | ||||||
|  | #if defined (_WIN32) | ||||||
|  | #  if defined (LOG4CPLUS_HAVE_NT_EVENT_LOG) | ||||||
|  | #    include <log4cplus/nteventlogappender.h> | ||||||
|  | #  endif | ||||||
|  | #  if defined (LOG4CPLUS_HAVE_WIN32_CONSOLE) | ||||||
|  | #    include <log4cplus/win32consoleappender.h> | ||||||
|  | #  endif | ||||||
|  | #  include <log4cplus/Win32DebugAppender.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  | using namespace log4cplus::spi; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // LOCAL file class definitions | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |      | ||||||
|  | namespace spi { | ||||||
|  |  | ||||||
|  |     BaseFactory::~BaseFactory() | ||||||
|  |     { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     AppenderFactory::AppenderFactory() | ||||||
|  |     { } | ||||||
|  |  | ||||||
|  |     AppenderFactory::~AppenderFactory() | ||||||
|  |     { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     LayoutFactory::LayoutFactory() | ||||||
|  |     { } | ||||||
|  |  | ||||||
|  |     LayoutFactory::~LayoutFactory() | ||||||
|  |     { } | ||||||
|  |  | ||||||
|  |      | ||||||
|  |     FilterFactory::FilterFactory() | ||||||
|  |     { } | ||||||
|  |  | ||||||
|  |     FilterFactory::~FilterFactory() | ||||||
|  |     { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     LoggerFactory::~LoggerFactory() | ||||||
|  |     { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace spi | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace | ||||||
|  | { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | template <typename ProductFactoryBase> | ||||||
|  | class LocalFactoryBase | ||||||
|  |     : public ProductFactoryBase | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     LocalFactoryBase (tchar const * n) | ||||||
|  |         : name (n) | ||||||
|  |     { } | ||||||
|  |  | ||||||
|  |     virtual log4cplus::tstring getTypeName() | ||||||
|  |     { | ||||||
|  |         return name; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     log4cplus::tstring name; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | template <typename LocalProduct, typename ProductFactoryBase> | ||||||
|  | class FactoryTempl | ||||||
|  |     : public LocalFactoryBase<ProductFactoryBase> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     typedef typename ProductFactoryBase::ProductPtr ProductPtr; | ||||||
|  |  | ||||||
|  |     FactoryTempl (tchar const * n) | ||||||
|  |         : LocalFactoryBase<ProductFactoryBase> (n) | ||||||
|  |     { } | ||||||
|  |  | ||||||
|  |     virtual ProductPtr createObject (Properties const & props) | ||||||
|  |     { | ||||||
|  |         return ProductPtr (new LocalProduct (props)); | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define REG_PRODUCT(reg, productprefix, productname, productns, productfact) \ | ||||||
|  | reg.put (                                                               \ | ||||||
|  |     std::auto_ptr<productfact> (                                        \ | ||||||
|  |         new FactoryTempl<productns productname, productfact> (          \ | ||||||
|  |             LOG4CPLUS_TEXT(productprefix)                               \ | ||||||
|  |             LOG4CPLUS_TEXT(#productname)))) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define REG_APPENDER(reg, appendername)                             \ | ||||||
|  | REG_PRODUCT (reg, "log4cplus::", appendername, log4cplus::, AppenderFactory)  | ||||||
|  |  | ||||||
|  | #define REG_LAYOUT(reg, layoutname)                                 \ | ||||||
|  | REG_PRODUCT (reg, "log4cplus::", layoutname, log4cplus::, LayoutFactory) | ||||||
|  |  | ||||||
|  | #define REG_FILTER(reg, filtername)                                 \ | ||||||
|  | REG_PRODUCT (reg, "log4cplus::spi::", filtername, spi::, FilterFactory) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void initializeFactoryRegistry() | ||||||
|  | { | ||||||
|  |     AppenderFactoryRegistry& reg = getAppenderFactoryRegistry(); | ||||||
|  |     REG_APPENDER (reg, ConsoleAppender); | ||||||
|  |     REG_APPENDER (reg, NullAppender); | ||||||
|  |     REG_APPENDER (reg, FileAppender); | ||||||
|  |     REG_APPENDER (reg, RollingFileAppender); | ||||||
|  |     REG_APPENDER (reg, DailyRollingFileAppender); | ||||||
|  |     REG_APPENDER (reg, SocketAppender); | ||||||
|  | #if defined(_WIN32) | ||||||
|  | #  if defined(LOG4CPLUS_HAVE_NT_EVENT_LOG) | ||||||
|  |     REG_APPENDER (reg, NTEventLogAppender); | ||||||
|  | #  endif | ||||||
|  | #  if defined(LOG4CPLUS_HAVE_WIN32_CONSOLE) | ||||||
|  |     REG_APPENDER (reg, Win32ConsoleAppender); | ||||||
|  | #  endif | ||||||
|  |     REG_APPENDER (reg, Win32DebugAppender); | ||||||
|  | #elif defined(LOG4CPLUS_HAVE_SYSLOG_H) | ||||||
|  |     REG_APPENDER (reg, SysLogAppender); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     LayoutFactoryRegistry& reg2 = getLayoutFactoryRegistry(); | ||||||
|  |     REG_LAYOUT (reg2, SimpleLayout); | ||||||
|  |     REG_LAYOUT (reg2, TTCCLayout); | ||||||
|  |     REG_LAYOUT (reg2, PatternLayout); | ||||||
|  |  | ||||||
|  |     FilterFactoryRegistry& reg3 = getFilterFactoryRegistry(); | ||||||
|  |     REG_FILTER (reg3, DenyAllFilter); | ||||||
|  |     REG_FILTER (reg3, LogLevelMatchFilter); | ||||||
|  |     REG_FILTER (reg3, LogLevelRangeFilter); | ||||||
|  |     REG_FILTER (reg3, StringMatchFilter); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | namespace spi | ||||||
|  | { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | AppenderFactoryRegistry& | ||||||
|  | getAppenderFactoryRegistry() | ||||||
|  | { | ||||||
|  |     static AppenderFactoryRegistry singleton; | ||||||
|  |     return singleton; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LayoutFactoryRegistry& | ||||||
|  | getLayoutFactoryRegistry() | ||||||
|  | { | ||||||
|  |     static LayoutFactoryRegistry singleton; | ||||||
|  |     return singleton; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | FilterFactoryRegistry& | ||||||
|  | getFilterFactoryRegistry() | ||||||
|  | { | ||||||
|  |     static FilterFactoryRegistry singleton; | ||||||
|  |     return singleton; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace spi | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace log4cplus | ||||||
							
								
								
									
										798
									
								
								libs/log4cplus/src/fileappender.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										798
									
								
								libs/log4cplus/src/fileappender.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,798 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    fileappender.cxx | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/fileappender.h> | ||||||
|  | #include <log4cplus/layout.h> | ||||||
|  | #include <log4cplus/streams.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/helpers/stringhelper.h> | ||||||
|  | #include <log4cplus/helpers/timehelper.h> | ||||||
|  | #include <log4cplus/spi/loggingevent.h> | ||||||
|  | #include <algorithm> | ||||||
|  | #include <cstdio> | ||||||
|  | #if defined (__BORLANDC__) | ||||||
|  | // For _wrename() and _wremove() on Windows. | ||||||
|  | #  include <stdio.h> | ||||||
|  | #endif | ||||||
|  | #if ! defined (_WIN32_WCE) | ||||||
|  | #include <cerrno> | ||||||
|  | #endif | ||||||
|  | #include <cstdlib> | ||||||
|  |  | ||||||
|  | #if defined (_WIN32_WCE) | ||||||
|  | #undef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #include <windows.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus | ||||||
|  | { | ||||||
|  |  | ||||||
|  | using helpers::Properties; | ||||||
|  | using helpers::Time; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | const long MINIMUM_ROLLING_LOG_SIZE = 200*1024L; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // File LOCAL definitions | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | namespace | ||||||
|  | { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if defined (_WIN32_WCE) | ||||||
|  | long const LOG4CPLUS_FILE_NOT_FOUND = ERROR_FILE_NOT_FOUND; | ||||||
|  | #else | ||||||
|  | long const LOG4CPLUS_FILE_NOT_FOUND = ENOENT; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static  | ||||||
|  | long | ||||||
|  | file_rename (tstring const & src, tstring const & target) | ||||||
|  | { | ||||||
|  | #if defined (_WIN32_WCE) | ||||||
|  |     if (MoveFile (src.c_str (), target.c_str ())) | ||||||
|  |         return 0; | ||||||
|  |     else | ||||||
|  |         return GetLastError (); | ||||||
|  |  | ||||||
|  | #elif defined (UNICODE) && defined (WIN32) | ||||||
|  |     if (_wrename (src.c_str (), target.c_str ()) == 0) | ||||||
|  |         return 0; | ||||||
|  |     else | ||||||
|  |         return errno; | ||||||
|  |  | ||||||
|  | #else | ||||||
|  |     if (std::rename (LOG4CPLUS_TSTRING_TO_STRING (src).c_str (), | ||||||
|  |             LOG4CPLUS_TSTRING_TO_STRING (target).c_str ()) == 0) | ||||||
|  |         return 0; | ||||||
|  |     else | ||||||
|  |         return errno; | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static | ||||||
|  | long | ||||||
|  | file_remove (tstring const & src) | ||||||
|  | { | ||||||
|  | #if defined (_WIN32_WCE) | ||||||
|  |     if (DeleteFile (src.c_str ())) | ||||||
|  |         return 0; | ||||||
|  |     else | ||||||
|  |         return GetLastError (); | ||||||
|  |  | ||||||
|  | #elif defined (UNICODE) && defined (WIN32) | ||||||
|  |     if (_wremove (src.c_str ()) == 0) | ||||||
|  |         return 0; | ||||||
|  |     else | ||||||
|  |         return errno; | ||||||
|  |  | ||||||
|  | #else | ||||||
|  |     if (std::remove (LOG4CPLUS_TSTRING_TO_STRING (src).c_str ()) == 0) | ||||||
|  |         return 0; | ||||||
|  |     else | ||||||
|  |         return errno; | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static | ||||||
|  | void | ||||||
|  | loglog_renaming_result (helpers::LogLog & loglog, tstring const & src, | ||||||
|  |     tstring const & target, long ret) | ||||||
|  | { | ||||||
|  |     if (ret == 0) | ||||||
|  |     { | ||||||
|  |         loglog.debug ( | ||||||
|  |             LOG4CPLUS_TEXT("Renamed file ")  | ||||||
|  |             + src  | ||||||
|  |             + LOG4CPLUS_TEXT(" to ") | ||||||
|  |             + target); | ||||||
|  |     } | ||||||
|  |     else if (ret != LOG4CPLUS_FILE_NOT_FOUND) | ||||||
|  |     { | ||||||
|  |         tostringstream oss; | ||||||
|  |         oss << LOG4CPLUS_TEXT("Failed to rename file from ") | ||||||
|  |             << target | ||||||
|  |             << LOG4CPLUS_TEXT(" to ") | ||||||
|  |             << target | ||||||
|  |             << LOG4CPLUS_TEXT("; error ") | ||||||
|  |             << ret; | ||||||
|  |         loglog.error (oss.str ()); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static | ||||||
|  | void | ||||||
|  | loglog_opening_result (helpers::LogLog & loglog, | ||||||
|  |     log4cplus::tostream const & os, tstring const & filename) | ||||||
|  | { | ||||||
|  |     if (! os) | ||||||
|  |     { | ||||||
|  |         loglog.error ( | ||||||
|  |             LOG4CPLUS_TEXT("Failed to open file ")  | ||||||
|  |             + filename); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static | ||||||
|  | void | ||||||
|  | rolloverFiles(const tstring& filename, unsigned int maxBackupIndex) | ||||||
|  | { | ||||||
|  |     helpers::SharedObjectPtr<helpers::LogLog> loglog | ||||||
|  |         = helpers::LogLog::getLogLog(); | ||||||
|  |  | ||||||
|  |     // Delete the oldest file | ||||||
|  |     tostringstream buffer; | ||||||
|  |     buffer << filename << LOG4CPLUS_TEXT(".") << maxBackupIndex; | ||||||
|  |     long ret = file_remove (buffer.str ()); | ||||||
|  |  | ||||||
|  |     tostringstream source_oss; | ||||||
|  |     tostringstream target_oss; | ||||||
|  |  | ||||||
|  |     // Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3, 2} | ||||||
|  |     for (int i = maxBackupIndex - 1; i >= 1; --i) | ||||||
|  |     { | ||||||
|  |         source_oss.str(LOG4CPLUS_TEXT("")); | ||||||
|  |         target_oss.str(LOG4CPLUS_TEXT("")); | ||||||
|  |  | ||||||
|  |         source_oss << filename << LOG4CPLUS_TEXT(".") << i; | ||||||
|  |         target_oss << filename << LOG4CPLUS_TEXT(".") << (i+1); | ||||||
|  |  | ||||||
|  |         tstring const source (source_oss.str ()); | ||||||
|  |         tstring const target (target_oss.str ()); | ||||||
|  |  | ||||||
|  | #if defined (WIN32) | ||||||
|  |         // Try to remove the target first. It seems it is not | ||||||
|  |         // possible to rename over existing file. | ||||||
|  |         ret = file_remove (target); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |         ret = file_rename (source, target); | ||||||
|  |         loglog_renaming_result (*loglog, source, target, ret); | ||||||
|  |     } | ||||||
|  | } // end rolloverFiles() | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // FileAppender ctors and dtor | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | FileAppender::FileAppender(const tstring& filename_,  | ||||||
|  |     LOG4CPLUS_OPEN_MODE_TYPE mode, bool immediateFlush_) | ||||||
|  |     : immediateFlush(immediateFlush_) | ||||||
|  |     , reopenDelay(1) | ||||||
|  |     , bufferSize (0) | ||||||
|  |     , buffer (0) | ||||||
|  | { | ||||||
|  |     init(filename_, mode); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | FileAppender::FileAppender(const Properties& properties,  | ||||||
|  |                            LOG4CPLUS_OPEN_MODE_TYPE mode) | ||||||
|  |     : Appender(properties) | ||||||
|  |     , immediateFlush(true) | ||||||
|  |     , reopenDelay(1) | ||||||
|  |     , bufferSize (0) | ||||||
|  |     , buffer (0) | ||||||
|  | { | ||||||
|  |     bool append_ = (mode == std::ios::app); | ||||||
|  |     tstring filename_ = properties.getProperty( LOG4CPLUS_TEXT("File") ); | ||||||
|  |     if (filename_.empty()) | ||||||
|  |     { | ||||||
|  |         getErrorHandler()->error( LOG4CPLUS_TEXT("Invalid filename") ); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |     if(properties.exists( LOG4CPLUS_TEXT("ImmediateFlush") )) { | ||||||
|  |         tstring tmp = properties.getProperty( LOG4CPLUS_TEXT("ImmediateFlush") ); | ||||||
|  |         immediateFlush = (helpers::toLower(tmp) == LOG4CPLUS_TEXT("true")); | ||||||
|  |     } | ||||||
|  |     if(properties.exists( LOG4CPLUS_TEXT("Append") )) { | ||||||
|  |         tstring tmp = properties.getProperty( LOG4CPLUS_TEXT("Append") ); | ||||||
|  |         append_ = (helpers::toLower(tmp) == LOG4CPLUS_TEXT("true")); | ||||||
|  |     } | ||||||
|  |     if(properties.exists( LOG4CPLUS_TEXT("ReopenDelay") )) { | ||||||
|  |         tstring tmp = properties.getProperty( LOG4CPLUS_TEXT("ReopenDelay") ); | ||||||
|  |         reopenDelay = std::atoi(LOG4CPLUS_TSTRING_TO_STRING(tmp).c_str()); | ||||||
|  |     } | ||||||
|  |     if(properties.exists( LOG4CPLUS_TEXT("BufferSize") )) { | ||||||
|  |         tstring tmp = properties.getProperty( LOG4CPLUS_TEXT("BufferSize") ); | ||||||
|  |         bufferSize = std::atoi(LOG4CPLUS_TSTRING_TO_STRING(tmp).c_str()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     init(filename_, (append_ ? std::ios::app : std::ios::trunc)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | FileAppender::init(const tstring& filename_,  | ||||||
|  |                    LOG4CPLUS_OPEN_MODE_TYPE mode) | ||||||
|  | { | ||||||
|  |     this->filename = filename_; | ||||||
|  |     open(mode); | ||||||
|  |  | ||||||
|  |     if (bufferSize != 0) | ||||||
|  |     { | ||||||
|  |         delete[] buffer; | ||||||
|  |         buffer = new tchar[bufferSize]; | ||||||
|  |         out.rdbuf ()->pubsetbuf (buffer, bufferSize); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if(!out.good()) { | ||||||
|  |         getErrorHandler()->error(  LOG4CPLUS_TEXT("Unable to open file: ")  | ||||||
|  |                                  + filename); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |     getLogLog().debug(LOG4CPLUS_TEXT("Just opened file: ") + filename); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | FileAppender::~FileAppender() | ||||||
|  | { | ||||||
|  |     destructorImpl(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // FileAppender public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | FileAppender::close() | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( access_mutex ) | ||||||
|  |         out.close(); | ||||||
|  |         delete[] buffer; | ||||||
|  |         buffer = 0; | ||||||
|  |         closed = true; | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // FileAppender protected methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | // This method does not need to be locked since it is called by | ||||||
|  | // doAppend() which performs the locking | ||||||
|  | void | ||||||
|  | FileAppender::append(const spi::InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     if(!out.good()) { | ||||||
|  |         if(!reopen()) { | ||||||
|  |             getErrorHandler()->error(  LOG4CPLUS_TEXT("file is not open: ")  | ||||||
|  |                                      + filename); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         // Resets the error handler to make it  | ||||||
|  |         // ready to handle a future append error. | ||||||
|  |         else | ||||||
|  |             getErrorHandler()->reset(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     layout->formatAndAppend(out, event); | ||||||
|  |     if(immediateFlush) { | ||||||
|  |         out.flush(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void | ||||||
|  | FileAppender::open(std::ios::openmode mode) | ||||||
|  | { | ||||||
|  |     out.open(LOG4CPLUS_TSTRING_TO_STRING(filename).c_str(), mode); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | FileAppender::reopen() | ||||||
|  | { | ||||||
|  |     // When append never failed and the file re-open attempt must  | ||||||
|  |     // be delayed, set the time when reopen should take place. | ||||||
|  |     if (reopen_time == log4cplus::helpers::Time () && reopenDelay != 0) | ||||||
|  |         reopen_time = log4cplus::helpers::Time::gettimeofday() | ||||||
|  | 			+ log4cplus::helpers::Time(reopenDelay); | ||||||
|  |     else | ||||||
|  | 	{ | ||||||
|  |         // Otherwise, check for end of the delay (or absence of delay) to re-open the file. | ||||||
|  |         if (reopen_time <= log4cplus::helpers::Time::gettimeofday() | ||||||
|  | 			|| reopenDelay == 0) | ||||||
|  | 		{ | ||||||
|  |             // Close the current file | ||||||
|  |             out.close(); | ||||||
|  |             out.clear(); // reset flags since the C++ standard specified that all the | ||||||
|  |                          // flags should remain unchanged on a close | ||||||
|  |  | ||||||
|  |             // Re-open the file. | ||||||
|  |             open(std::ios::app); | ||||||
|  |  | ||||||
|  |             // Reset last fail time. | ||||||
|  |             reopen_time = log4cplus::helpers::Time (); | ||||||
|  |  | ||||||
|  |             // Succeed if no errors are found. | ||||||
|  |             if(out.good()) | ||||||
|  |                 return true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     return false; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // RollingFileAppender ctors and dtor | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | RollingFileAppender::RollingFileAppender(const tstring& filename_, | ||||||
|  |     long maxFileSize_, int maxBackupIndex_, bool immediateFlush_) | ||||||
|  |     : FileAppender(filename_, std::ios::app, immediateFlush_) | ||||||
|  | { | ||||||
|  |     init(maxFileSize_, maxBackupIndex_); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | RollingFileAppender::RollingFileAppender(const Properties& properties) | ||||||
|  |     : FileAppender(properties, std::ios::app) | ||||||
|  | { | ||||||
|  |     int maxFileSize_ = 10*1024*1024; | ||||||
|  |     int maxBackupIndex_ = 1; | ||||||
|  |     if(properties.exists( LOG4CPLUS_TEXT("MaxFileSize") )) { | ||||||
|  |         tstring tmp = properties.getProperty( LOG4CPLUS_TEXT("MaxFileSize") ); | ||||||
|  |         tmp = helpers::toUpper(tmp); | ||||||
|  |         maxFileSize_ = std::atoi(LOG4CPLUS_TSTRING_TO_STRING(tmp).c_str()); | ||||||
|  |         if(tmp.find( LOG4CPLUS_TEXT("MB") ) == (tmp.length() - 2)) { | ||||||
|  |             maxFileSize_ *= (1024 * 1024); // convert to megabytes | ||||||
|  |         } | ||||||
|  |         if(tmp.find( LOG4CPLUS_TEXT("KB") ) == (tmp.length() - 2)) { | ||||||
|  |             maxFileSize_ *= 1024; // convert to kilobytes | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if(properties.exists( LOG4CPLUS_TEXT("MaxBackupIndex") )) { | ||||||
|  |         tstring tmp = properties.getProperty(LOG4CPLUS_TEXT("MaxBackupIndex")); | ||||||
|  |         maxBackupIndex_ = std::atoi(LOG4CPLUS_TSTRING_TO_STRING(tmp).c_str()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     init(maxFileSize_, maxBackupIndex_); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | RollingFileAppender::init(long maxFileSize_, int maxBackupIndex_) | ||||||
|  | { | ||||||
|  |     if (maxFileSize_ < MINIMUM_ROLLING_LOG_SIZE) | ||||||
|  |     { | ||||||
|  |         tostringstream oss; | ||||||
|  |         oss << LOG4CPLUS_TEXT ("RollingFileAppender: MaxFileSize property") | ||||||
|  |             LOG4CPLUS_TEXT (" value is too small. Resetting to ") | ||||||
|  |             << MINIMUM_ROLLING_LOG_SIZE << "."; | ||||||
|  |         getLogLog ().warn (oss.str ()); | ||||||
|  |         maxFileSize_ = MINIMUM_ROLLING_LOG_SIZE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     this->maxFileSize = maxFileSize_; | ||||||
|  |     this->maxBackupIndex = (std::max)(maxBackupIndex_, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | RollingFileAppender::~RollingFileAppender() | ||||||
|  | { | ||||||
|  |     destructorImpl(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // RollingFileAppender protected methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | // This method does not need to be locked since it is called by | ||||||
|  | // doAppend() which performs the locking | ||||||
|  | void | ||||||
|  | RollingFileAppender::append(const spi::InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     FileAppender::append(event); | ||||||
|  |  | ||||||
|  |     if(out.tellp() > maxFileSize) { | ||||||
|  |         rollover(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | RollingFileAppender::rollover() | ||||||
|  | { | ||||||
|  |     helpers::LogLog & loglog = getLogLog(); | ||||||
|  |  | ||||||
|  |     // Close the current file | ||||||
|  |     out.close(); | ||||||
|  |     out.clear(); // reset flags since the C++ standard specified that all the | ||||||
|  |                  // flags should remain unchanged on a close | ||||||
|  |  | ||||||
|  |     // If maxBackups <= 0, then there is no file renaming to be done. | ||||||
|  |     if (maxBackupIndex > 0) | ||||||
|  |     { | ||||||
|  |         rolloverFiles(filename, maxBackupIndex); | ||||||
|  |  | ||||||
|  |         // Rename fileName to fileName.1 | ||||||
|  |         tstring target = filename + LOG4CPLUS_TEXT(".1"); | ||||||
|  |  | ||||||
|  |         long ret; | ||||||
|  |  | ||||||
|  | #if defined (WIN32) | ||||||
|  |         // Try to remove the target first. It seems it is not | ||||||
|  |         // possible to rename over existing file. | ||||||
|  |         ret = file_remove (target); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |         loglog.debug ( | ||||||
|  |             LOG4CPLUS_TEXT("Renaming file ")  | ||||||
|  |             + filename  | ||||||
|  |             + LOG4CPLUS_TEXT(" to ") | ||||||
|  |             + target); | ||||||
|  |         ret = file_rename (filename, target); | ||||||
|  |         loglog_renaming_result (loglog, filename, target, ret); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         loglog.debug (filename + LOG4CPLUS_TEXT(" has no backups specified")); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Open it up again in truncation mode | ||||||
|  |     open(std::ios::out | std::ios::trunc); | ||||||
|  |     loglog_opening_result (loglog, out, filename); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // DailyRollingFileAppender ctors and dtor | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | DailyRollingFileAppender::DailyRollingFileAppender( | ||||||
|  |     const tstring& filename_, DailyRollingFileSchedule schedule_, | ||||||
|  |     bool immediateFlush_, int maxBackupIndex_) | ||||||
|  |     : FileAppender(filename_, std::ios::app, immediateFlush_) | ||||||
|  |     , maxBackupIndex(maxBackupIndex_) | ||||||
|  | { | ||||||
|  |     init(schedule_); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | DailyRollingFileAppender::DailyRollingFileAppender( | ||||||
|  |     const Properties& properties) | ||||||
|  |     : FileAppender(properties, std::ios::app) | ||||||
|  |     , maxBackupIndex(10) | ||||||
|  | { | ||||||
|  |     DailyRollingFileSchedule theSchedule = DAILY; | ||||||
|  |     tstring scheduleStr = properties.getProperty(LOG4CPLUS_TEXT("Schedule")); | ||||||
|  |     scheduleStr = helpers::toUpper(scheduleStr); | ||||||
|  |  | ||||||
|  |     if(scheduleStr == LOG4CPLUS_TEXT("MONTHLY")) | ||||||
|  |         theSchedule = MONTHLY; | ||||||
|  |     else if(scheduleStr == LOG4CPLUS_TEXT("WEEKLY")) | ||||||
|  |         theSchedule = WEEKLY; | ||||||
|  |     else if(scheduleStr == LOG4CPLUS_TEXT("DAILY")) | ||||||
|  |         theSchedule = DAILY; | ||||||
|  |     else if(scheduleStr == LOG4CPLUS_TEXT("TWICE_DAILY")) | ||||||
|  |         theSchedule = TWICE_DAILY; | ||||||
|  |     else if(scheduleStr == LOG4CPLUS_TEXT("HOURLY")) | ||||||
|  |         theSchedule = HOURLY; | ||||||
|  |     else if(scheduleStr == LOG4CPLUS_TEXT("MINUTELY")) | ||||||
|  |         theSchedule = MINUTELY; | ||||||
|  |     else { | ||||||
|  |         getLogLog().warn(  LOG4CPLUS_TEXT("DailyRollingFileAppender::ctor()- \"Schedule\" not valid: ") | ||||||
|  |                          + properties.getProperty(LOG4CPLUS_TEXT("Schedule"))); | ||||||
|  |         theSchedule = DAILY; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     if(properties.exists( LOG4CPLUS_TEXT("MaxBackupIndex") )) { | ||||||
|  |         tstring tmp = properties.getProperty(LOG4CPLUS_TEXT("MaxBackupIndex")); | ||||||
|  |         maxBackupIndex = std::atoi(LOG4CPLUS_TSTRING_TO_STRING(tmp).c_str()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     init(theSchedule); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | DailyRollingFileAppender::init(DailyRollingFileSchedule schedule_) | ||||||
|  | { | ||||||
|  |     this->schedule = schedule_; | ||||||
|  |  | ||||||
|  |     Time now = Time::gettimeofday(); | ||||||
|  |     now.usec(0); | ||||||
|  |     struct tm time; | ||||||
|  |     now.localtime(&time); | ||||||
|  |  | ||||||
|  |     time.tm_sec = 0; | ||||||
|  |     switch (schedule) | ||||||
|  |     { | ||||||
|  |     case MONTHLY: | ||||||
|  |         time.tm_mday = 1; | ||||||
|  |         time.tm_hour = 0; | ||||||
|  |         time.tm_min = 0; | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case WEEKLY: | ||||||
|  |         time.tm_mday -= (time.tm_wday % 7); | ||||||
|  |         time.tm_hour = 0; | ||||||
|  |         time.tm_min = 0; | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case DAILY: | ||||||
|  |         time.tm_hour = 0; | ||||||
|  |         time.tm_min = 0; | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case TWICE_DAILY: | ||||||
|  |         if(time.tm_hour >= 12) { | ||||||
|  |             time.tm_hour = 12; | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             time.tm_hour = 0; | ||||||
|  |         } | ||||||
|  |         time.tm_min = 0; | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case HOURLY: | ||||||
|  |         time.tm_min = 0; | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case MINUTELY: | ||||||
|  |         break; | ||||||
|  |     }; | ||||||
|  |     now.setTime(&time); | ||||||
|  |  | ||||||
|  |     scheduledFilename = getFilename(now); | ||||||
|  |     nextRolloverTime = calculateNextRolloverTime(now); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | DailyRollingFileAppender::~DailyRollingFileAppender() | ||||||
|  | { | ||||||
|  |     destructorImpl(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // DailyRollingFileAppender public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | DailyRollingFileAppender::close() | ||||||
|  | { | ||||||
|  |     rollover(); | ||||||
|  |     FileAppender::close(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // DailyRollingFileAppender protected methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | // This method does not need to be locked since it is called by | ||||||
|  | // doAppend() which performs the locking | ||||||
|  | void | ||||||
|  | DailyRollingFileAppender::append(const spi::InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     if(event.getTimestamp() >= nextRolloverTime) { | ||||||
|  |         rollover(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     FileAppender::append(event); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | DailyRollingFileAppender::rollover() | ||||||
|  | { | ||||||
|  |     // Close the current file | ||||||
|  |     out.close(); | ||||||
|  |     out.clear(); // reset flags since the C++ standard specified that all the | ||||||
|  |                  // flags should remain unchanged on a close | ||||||
|  |  | ||||||
|  |     // If we've already rolled over this time period, we'll make sure that we | ||||||
|  |     // don't overwrite any of those previous files. | ||||||
|  |     // E.g. if "log.2009-11-07.1" already exists we rename it | ||||||
|  |     // to "log.2009-11-07.2", etc. | ||||||
|  |     rolloverFiles(scheduledFilename, maxBackupIndex); | ||||||
|  |  | ||||||
|  |     // Do not overwriet the newest file either, e.g. if "log.2009-11-07" | ||||||
|  |     // already exists rename it to "log.2009-11-07.1" | ||||||
|  |     tostringstream backup_target_oss; | ||||||
|  |     backup_target_oss << scheduledFilename << LOG4CPLUS_TEXT(".") << 1; | ||||||
|  |     tstring backupTarget = backup_target_oss.str(); | ||||||
|  |  | ||||||
|  |     helpers::LogLog & loglog = getLogLog(); | ||||||
|  |     long ret; | ||||||
|  |  | ||||||
|  | #if defined (WIN32) | ||||||
|  |     // Try to remove the target first. It seems it is not | ||||||
|  |     // possible to rename over existing file, e.g. "log.2009-11-07.1". | ||||||
|  |     ret = file_remove (backupTarget); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     // Rename e.g. "log.2009-11-07" to "log.2009-11-07.1". | ||||||
|  |     ret = file_rename (scheduledFilename, backupTarget); | ||||||
|  |     loglog_renaming_result (loglog, scheduledFilename, backupTarget, ret); | ||||||
|  |  | ||||||
|  | #if defined (WIN32) | ||||||
|  |     // Try to remove the target first. It seems it is not | ||||||
|  |     // possible to rename over existing file, e.g. "log.2009-11-07". | ||||||
|  |     ret = file_remove (scheduledFilename); | ||||||
|  | #endif | ||||||
|  |     | ||||||
|  |     // Rename filename to scheduledFilename, | ||||||
|  |     // e.g. rename "log" to "log.2009-11-07". | ||||||
|  |     loglog.debug( | ||||||
|  |         LOG4CPLUS_TEXT("Renaming file ") | ||||||
|  |         + filename  | ||||||
|  |         + LOG4CPLUS_TEXT(" to ") | ||||||
|  |         + scheduledFilename); | ||||||
|  |     ret = file_rename (filename, scheduledFilename); | ||||||
|  |     loglog_renaming_result (loglog, filename, scheduledFilename, ret); | ||||||
|  |  | ||||||
|  |     // Open a new file, e.g. "log". | ||||||
|  |     open(std::ios::out | std::ios::trunc); | ||||||
|  |     loglog_opening_result (loglog, out, filename); | ||||||
|  |  | ||||||
|  |     // Calculate the next rollover time | ||||||
|  |     log4cplus::helpers::Time now = Time::gettimeofday(); | ||||||
|  |     if (now >= nextRolloverTime) | ||||||
|  |     { | ||||||
|  |         scheduledFilename = getFilename(now); | ||||||
|  |         nextRolloverTime = calculateNextRolloverTime(now); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Time | ||||||
|  | DailyRollingFileAppender::calculateNextRolloverTime(const Time& t) const | ||||||
|  | { | ||||||
|  |     switch(schedule) | ||||||
|  |     { | ||||||
|  |     case MONTHLY:  | ||||||
|  |     { | ||||||
|  |         struct tm nextMonthTime; | ||||||
|  |         t.localtime(&nextMonthTime); | ||||||
|  |         nextMonthTime.tm_mon += 1; | ||||||
|  |         nextMonthTime.tm_isdst = 0; | ||||||
|  |  | ||||||
|  |         Time ret; | ||||||
|  |         if(ret.setTime(&nextMonthTime) == -1) { | ||||||
|  |             getLogLog().error( | ||||||
|  |                 LOG4CPLUS_TEXT("DailyRollingFileAppender::calculateNextRolloverTime()-") | ||||||
|  |                 LOG4CPLUS_TEXT(" setTime() returned error")); | ||||||
|  |             // Set next rollover to 31 days in future. | ||||||
|  |             ret = (t + Time(2678400)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return ret; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     case WEEKLY: | ||||||
|  |         return (t + Time(7 * 24 * 60 * 60)); | ||||||
|  |  | ||||||
|  |     default: | ||||||
|  |         getLogLog ().error ( | ||||||
|  |             LOG4CPLUS_TEXT ("DailyRollingFileAppender::calculateNextRolloverTime()-") | ||||||
|  |             LOG4CPLUS_TEXT (" invalid schedule value")); | ||||||
|  |         // Fall through. | ||||||
|  |  | ||||||
|  |     case DAILY: | ||||||
|  |         return (t + Time(24 * 60 * 60)); | ||||||
|  |  | ||||||
|  |     case TWICE_DAILY: | ||||||
|  |         return (t + Time(12 * 60 * 60)); | ||||||
|  |  | ||||||
|  |     case HOURLY: | ||||||
|  |         return (t + Time(60 * 60)); | ||||||
|  |  | ||||||
|  |     case MINUTELY: | ||||||
|  |         return (t + Time(60)); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | tstring | ||||||
|  | DailyRollingFileAppender::getFilename(const Time& t) const | ||||||
|  | { | ||||||
|  |     tchar const * pattern = 0; | ||||||
|  |     switch (schedule) | ||||||
|  |     { | ||||||
|  |     case MONTHLY: | ||||||
|  |         pattern = LOG4CPLUS_TEXT("%Y-%m"); | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case WEEKLY: | ||||||
|  |         pattern = LOG4CPLUS_TEXT("%Y-%W"); | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     default: | ||||||
|  |         getLogLog ().error ( | ||||||
|  |             LOG4CPLUS_TEXT ("DailyRollingFileAppender::getFilename()-") | ||||||
|  |             LOG4CPLUS_TEXT (" invalid schedule value")); | ||||||
|  |         // Fall through. | ||||||
|  |  | ||||||
|  |     case DAILY: | ||||||
|  |         pattern = LOG4CPLUS_TEXT("%Y-%m-%d"); | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case TWICE_DAILY: | ||||||
|  |         pattern = LOG4CPLUS_TEXT("%Y-%m-%d-%p"); | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case HOURLY: | ||||||
|  |         pattern = LOG4CPLUS_TEXT("%Y-%m-%d-%H"); | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case MINUTELY: | ||||||
|  |         pattern = LOG4CPLUS_TEXT("%Y-%m-%d-%H-%M"); | ||||||
|  |         break; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     tstring result (filename); | ||||||
|  |     result += LOG4CPLUS_TEXT("."); | ||||||
|  |     result += t.getFormattedTime(pattern, false); | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } // namespace log4cplus | ||||||
							
								
								
									
										256
									
								
								libs/log4cplus/src/filter.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										256
									
								
								libs/log4cplus/src/filter.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,256 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    filter.cxx | ||||||
|  | // Created: 5/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/spi/filter.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/helpers/stringhelper.h> | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::spi; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // global methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | FilterResult | ||||||
|  | log4cplus::spi::checkFilter(const Filter* filter,  | ||||||
|  |                             const InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     const Filter* currentFilter = filter; | ||||||
|  |     while(currentFilter) { | ||||||
|  |         FilterResult result = currentFilter->decide(event); | ||||||
|  |         if(result != NEUTRAL) { | ||||||
|  |             return result; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         currentFilter = currentFilter->next.get(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return ACCEPT; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Filter implementation | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | Filter::Filter() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Filter::~Filter() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Filter::appendFilter(FilterPtr filter) | ||||||
|  | { | ||||||
|  |     if(next.get() == 0) { | ||||||
|  |         next = filter; | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         next->appendFilter(filter); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // DenyAllFilter implementation | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | DenyAllFilter::DenyAllFilter () | ||||||
|  | { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | DenyAllFilter::DenyAllFilter (const log4cplus::helpers::Properties&) | ||||||
|  | { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | FilterResult | ||||||
|  | DenyAllFilter::decide(const InternalLoggingEvent&) const | ||||||
|  | { | ||||||
|  |     return DENY; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // LogLevelMatchFilter implementation | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | LogLevelMatchFilter::LogLevelMatchFilter() | ||||||
|  | { | ||||||
|  |     init(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LogLevelMatchFilter::LogLevelMatchFilter(const Properties& properties) | ||||||
|  | { | ||||||
|  |     init(); | ||||||
|  |  | ||||||
|  |     tstring tmp = properties.getProperty( LOG4CPLUS_TEXT("AcceptOnMatch") ); | ||||||
|  |     acceptOnMatch = (toLower(tmp) == LOG4CPLUS_TEXT("true")); | ||||||
|  |  | ||||||
|  |     tmp = properties.getProperty( LOG4CPLUS_TEXT("LogLevelToMatch") ); | ||||||
|  |     logLevelToMatch = getLogLevelManager().fromString(tmp); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | LogLevelMatchFilter::init() | ||||||
|  | { | ||||||
|  |     acceptOnMatch = true; | ||||||
|  |     logLevelToMatch = NOT_SET_LOG_LEVEL; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | FilterResult | ||||||
|  | LogLevelMatchFilter::decide(const InternalLoggingEvent& event) const | ||||||
|  | { | ||||||
|  |     if(logLevelToMatch == NOT_SET_LOG_LEVEL) { | ||||||
|  |         return NEUTRAL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     bool matchOccured = (logLevelToMatch == event.getLogLevel()); | ||||||
|  |         | ||||||
|  |     if(matchOccured) { | ||||||
|  |         return (acceptOnMatch ? ACCEPT : DENY); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         return NEUTRAL; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // LogLevelRangeFilter implementation | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | LogLevelRangeFilter::LogLevelRangeFilter() | ||||||
|  | { | ||||||
|  |     init(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LogLevelRangeFilter::LogLevelRangeFilter(const Properties& properties) | ||||||
|  | { | ||||||
|  |     init(); | ||||||
|  |  | ||||||
|  |     tstring tmp = properties.getProperty( LOG4CPLUS_TEXT("AcceptOnMatch") ); | ||||||
|  |     acceptOnMatch = (toLower(tmp) == LOG4CPLUS_TEXT("true")); | ||||||
|  |  | ||||||
|  |     tmp = properties.getProperty( LOG4CPLUS_TEXT("LogLevelMin") ); | ||||||
|  |     logLevelMin = getLogLevelManager().fromString(tmp); | ||||||
|  |  | ||||||
|  |     tmp = properties.getProperty( LOG4CPLUS_TEXT("LogLevelMax") ); | ||||||
|  |     logLevelMax = getLogLevelManager().fromString(tmp); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | LogLevelRangeFilter::init() | ||||||
|  | { | ||||||
|  |     acceptOnMatch = true; | ||||||
|  |     logLevelMin = NOT_SET_LOG_LEVEL; | ||||||
|  |     logLevelMax = NOT_SET_LOG_LEVEL; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | FilterResult | ||||||
|  | LogLevelRangeFilter::decide(const InternalLoggingEvent& event) const | ||||||
|  | { | ||||||
|  |     if((logLevelMin != NOT_SET_LOG_LEVEL) && (event.getLogLevel() < logLevelMin)) { | ||||||
|  |         // priority of event is less than minimum | ||||||
|  |         return DENY; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if((logLevelMax != NOT_SET_LOG_LEVEL) && (event.getLogLevel() > logLevelMax)) { | ||||||
|  |         // priority of event is greater than maximum | ||||||
|  |         return DENY; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if(acceptOnMatch) { | ||||||
|  |         // this filter set up to bypass later filters and always return | ||||||
|  |         // accept if priority in range | ||||||
|  |         return ACCEPT; | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         // event is ok for this filter; allow later filters to have a look... | ||||||
|  |         return NEUTRAL; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // StringMatchFilter implementation | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | StringMatchFilter::StringMatchFilter() | ||||||
|  | { | ||||||
|  |     init(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | StringMatchFilter::StringMatchFilter(const Properties& properties) | ||||||
|  | { | ||||||
|  |     init(); | ||||||
|  |  | ||||||
|  |     tstring tmp = properties.getProperty( LOG4CPLUS_TEXT("AcceptOnMatch") ); | ||||||
|  |     acceptOnMatch = (toLower(tmp) == LOG4CPLUS_TEXT("true")); | ||||||
|  |  | ||||||
|  |     stringToMatch = properties.getProperty( LOG4CPLUS_TEXT("StringToMatch") ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | StringMatchFilter::init() | ||||||
|  | { | ||||||
|  |     acceptOnMatch = true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | FilterResult | ||||||
|  | StringMatchFilter::decide(const InternalLoggingEvent& event) const | ||||||
|  | { | ||||||
|  |     const tstring& message = event.getMessage(); | ||||||
|  |  | ||||||
|  |     if(stringToMatch.empty () || message.empty ()) { | ||||||
|  |         return NEUTRAL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if(message.find(stringToMatch) == tstring::npos) { | ||||||
|  |         return NEUTRAL; | ||||||
|  |     } | ||||||
|  |     else {  // we've got a match | ||||||
|  |         return (acceptOnMatch ? ACCEPT : DENY); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										101
									
								
								libs/log4cplus/src/global-init.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								libs/log4cplus/src/global-init.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    global-init.cxx | ||||||
|  | // Created: 5/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/logger.h> | ||||||
|  | #include <log4cplus/ndc.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Forward Declarations | ||||||
|  | namespace log4cplus | ||||||
|  | { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //! Defined here, used by initializeLayout(). | ||||||
|  | helpers::Time TTCCLayout_time_base; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void initializeFactoryRegistry(); | ||||||
|  | void initializeLayout (); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void initializeLog4cplus() | ||||||
|  | { | ||||||
|  |     static bool initialized = false; | ||||||
|  |     if (initialized) | ||||||
|  |         return; | ||||||
|  |  | ||||||
|  |     helpers::LogLog::getLogLog(); | ||||||
|  |     getLogLevelManager (); | ||||||
|  |     getNDC(); | ||||||
|  |     Logger::getRoot(); | ||||||
|  |     initializeFactoryRegistry(); | ||||||
|  |     initializeLayout (); | ||||||
|  |  | ||||||
|  |     initialized = true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace log4cplus | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if defined (_WIN32) && defined (LOG4CPLUS_BUILD_DLL) | ||||||
|  |  | ||||||
|  | BOOL WINAPI DllMain(LOG4CPLUS_DLLMAIN_HINSTANCE hinstDLL,  // handle to DLL module | ||||||
|  |                     DWORD fdwReason,     // reason for calling function | ||||||
|  |                     LPVOID lpReserved )  // reserved | ||||||
|  | { | ||||||
|  |     // Perform actions based on the reason for calling. | ||||||
|  |     switch( fdwReason )  | ||||||
|  |     {  | ||||||
|  |         case DLL_PROCESS_ATTACH: | ||||||
|  |             log4cplus::initializeLog4cplus(); | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case DLL_THREAD_ATTACH: | ||||||
|  |          // Do thread-specific initialization. | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case DLL_THREAD_DETACH: | ||||||
|  |          // Do thread-specific cleanup. | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case DLL_PROCESS_DETACH: | ||||||
|  |          // Perform any necessary cleanup. | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return TRUE;  // Successful DLL_PROCESS_ATTACH. | ||||||
|  | } | ||||||
|  |   | ||||||
|  | #else | ||||||
|  |  | ||||||
|  | namespace { | ||||||
|  |  | ||||||
|  |     class _static_log4cplus_initializer { | ||||||
|  |     public: | ||||||
|  |         _static_log4cplus_initializer() { | ||||||
|  |             log4cplus::initializeLog4cplus(); | ||||||
|  |         } | ||||||
|  |     } static initializer; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										352
									
								
								libs/log4cplus/src/hierarchy.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										352
									
								
								libs/log4cplus/src/hierarchy.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,352 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    hierarchy.cxx | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/hierarchy.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/spi/loggerimpl.h> | ||||||
|  | #include <log4cplus/spi/rootlogger.h> | ||||||
|  | #include <utility> | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // File "Local" methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | namespace | ||||||
|  | { | ||||||
|  |  | ||||||
|  | static | ||||||
|  | bool startsWith(tstring const & teststr, tstring const & substr) | ||||||
|  | { | ||||||
|  |     bool val = false; | ||||||
|  |     tstring::size_type const len = substr.length(); | ||||||
|  |     if (teststr.length() > len) | ||||||
|  |         val = teststr.compare (0, len, substr) == 0; | ||||||
|  |  | ||||||
|  |     return val; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::Hierarchy static declarations | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | const LogLevel log4cplus::Hierarchy::DISABLE_OFF = -1; | ||||||
|  | const LogLevel log4cplus::Hierarchy::DISABLE_OVERRIDE = -2; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::Hierarchy ctor and dtor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | Hierarchy::Hierarchy() | ||||||
|  |   : hashtable_mutex(LOG4CPLUS_MUTEX_CREATE), | ||||||
|  |     defaultFactory(new DefaultLoggerFactory()), | ||||||
|  |     root(NULL), | ||||||
|  |     disableValue(DISABLE_OFF),  // Don't disable any LogLevel level by default. | ||||||
|  |     emittedNoAppenderWarning(false), | ||||||
|  |     emittedNoResourceBundleWarning(false) | ||||||
|  | { | ||||||
|  |     root = Logger( new spi::RootLogger(*this, DEBUG_LOG_LEVEL) ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Hierarchy::~Hierarchy() | ||||||
|  | { | ||||||
|  |     shutdown(); | ||||||
|  |     LOG4CPLUS_MUTEX_FREE( hashtable_mutex ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::Hierarchy public methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Hierarchy::clear()  | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( hashtable_mutex ) | ||||||
|  |         provisionNodes.erase(provisionNodes.begin(), provisionNodes.end()); | ||||||
|  |         loggerPtrs.erase(loggerPtrs.begin(), loggerPtrs.end()); | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | Hierarchy::exists(const log4cplus::tstring& name) | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( hashtable_mutex ) | ||||||
|  |         LoggerMap::iterator it = loggerPtrs.find(name); | ||||||
|  |         return it != loggerPtrs.end(); | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Hierarchy::disable(const log4cplus::tstring& loglevelStr) | ||||||
|  | { | ||||||
|  |     if(disableValue != DISABLE_OVERRIDE) { | ||||||
|  |         disableValue = getLogLevelManager().fromString(loglevelStr); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Hierarchy::disable(LogLevel ll)  | ||||||
|  | { | ||||||
|  |     if(disableValue != DISABLE_OVERRIDE) { | ||||||
|  |         disableValue = ll; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Hierarchy::disableAll()  | ||||||
|  | {  | ||||||
|  |     disable(FATAL_LOG_LEVEL); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Hierarchy::disableDebug()  | ||||||
|  | {  | ||||||
|  |     disable(DEBUG_LOG_LEVEL); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Hierarchy::disableInfo()  | ||||||
|  | {  | ||||||
|  |     disable(INFO_LOG_LEVEL); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Hierarchy::enableAll()  | ||||||
|  | {  | ||||||
|  |     disableValue = DISABLE_OFF;  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Logger  | ||||||
|  | Hierarchy::getInstance(const log4cplus::tstring& name)  | ||||||
|  | {  | ||||||
|  |     return getInstance(name, *defaultFactory);  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Logger  | ||||||
|  | Hierarchy::getInstance(const log4cplus::tstring& name, spi::LoggerFactory& factory) | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( hashtable_mutex ) | ||||||
|  |         return getInstanceImpl(name, factory); | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LoggerList  | ||||||
|  | Hierarchy::getCurrentLoggers() | ||||||
|  | { | ||||||
|  |     LoggerList ret; | ||||||
|  |      | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( hashtable_mutex ) | ||||||
|  |         initializeLoggerList(ret); | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  |  | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool  | ||||||
|  | Hierarchy::isDisabled(int level)  | ||||||
|  | {  | ||||||
|  |     return disableValue >= level;  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Logger  | ||||||
|  | Hierarchy::getRoot() const | ||||||
|  | {  | ||||||
|  |     return root;  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Hierarchy::resetConfiguration() | ||||||
|  | { | ||||||
|  |     getRoot().setLogLevel(DEBUG_LOG_LEVEL); | ||||||
|  |     disableValue = DISABLE_OFF; | ||||||
|  |  | ||||||
|  |     shutdown(); | ||||||
|  |  | ||||||
|  |     LoggerList loggers = getCurrentLoggers(); | ||||||
|  |     LoggerList::iterator it = loggers.begin(); | ||||||
|  |     while(it != loggers.end()) { | ||||||
|  |         (*it).setLogLevel(NOT_SET_LOG_LEVEL); | ||||||
|  |         (*it).setAdditivity(true); | ||||||
|  |         ++it; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Hierarchy::setLoggerFactory(std::auto_ptr<spi::LoggerFactory> factory)  | ||||||
|  | {  | ||||||
|  |     defaultFactory = factory;  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Hierarchy::shutdown() | ||||||
|  | { | ||||||
|  |     LoggerList loggers = getCurrentLoggers(); | ||||||
|  |  | ||||||
|  |     // begin by closing nested appenders | ||||||
|  |     // then, remove all appenders | ||||||
|  |     root.closeNestedAppenders(); | ||||||
|  |     root.removeAllAppenders(); | ||||||
|  |  | ||||||
|  |     // repeat | ||||||
|  |     LoggerList::iterator it = loggers.begin(); | ||||||
|  |     while(it != loggers.end()) { | ||||||
|  |         (*it).closeNestedAppenders(); | ||||||
|  |         (*it).removeAllAppenders(); | ||||||
|  |         ++it; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::Hierarchy private methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | Logger  | ||||||
|  | Hierarchy::getInstanceImpl(const log4cplus::tstring& name, spi::LoggerFactory& factory) | ||||||
|  | { | ||||||
|  |      LoggerMap::iterator it = loggerPtrs.find(name); | ||||||
|  |      if(it != loggerPtrs.end()) { | ||||||
|  |          return (*it).second; | ||||||
|  |      } | ||||||
|  |      else { | ||||||
|  |          // Need to create a new logger | ||||||
|  |          Logger logger = factory.makeNewLoggerInstance(name, *this); | ||||||
|  |          bool inserted = loggerPtrs.insert(std::make_pair(name, logger)).second; | ||||||
|  |          if(!inserted) { | ||||||
|  |              getLogLog().error(LOG4CPLUS_TEXT("Hierarchy::getInstanceImpl()- Insert failed")); | ||||||
|  |              throw std::runtime_error("Hierarchy::getInstanceImpl()- Insert failed"); | ||||||
|  |          } | ||||||
|  |           | ||||||
|  |          ProvisionNodeMap::iterator it2 = provisionNodes.find(name); | ||||||
|  |          if(it2 != provisionNodes.end()) { | ||||||
|  |              updateChildren(it2->second, logger); | ||||||
|  |              bool deleted = (provisionNodes.erase(name) > 0); | ||||||
|  |              if(!deleted) { | ||||||
|  |                  getLogLog().error(LOG4CPLUS_TEXT("Hierarchy::getInstanceImpl()- Delete failed")); | ||||||
|  |                  throw std::runtime_error("Hierarchy::getInstanceImpl()- Delete failed"); | ||||||
|  |              } | ||||||
|  |          } | ||||||
|  |          updateParents(logger); | ||||||
|  |           | ||||||
|  |          return logger; | ||||||
|  |      } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Hierarchy::initializeLoggerList(LoggerList& list) const | ||||||
|  | { | ||||||
|  |     for(LoggerMap::const_iterator it=loggerPtrs.begin();  | ||||||
|  |         it!= loggerPtrs.end();  | ||||||
|  |         ++it)  | ||||||
|  |     { | ||||||
|  |         list.push_back((*it).second); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Hierarchy::updateParents(Logger logger) | ||||||
|  | { | ||||||
|  |     log4cplus::tstring name = logger.getName(); | ||||||
|  |     size_t length = name.length(); | ||||||
|  |     bool parentFound = false; | ||||||
|  |  | ||||||
|  |     // if name = "w.x.y.z", loop thourgh "w.x.y", "w.x" and "w", but not "w.x.y.z" | ||||||
|  |     for(size_t i=name.find_last_of(LOG4CPLUS_TEXT('.'), length-1);  | ||||||
|  |         i != log4cplus::tstring::npos && i > 0;  | ||||||
|  |         i = name.find_last_of(LOG4CPLUS_TEXT('.'), i-1))  | ||||||
|  |     { | ||||||
|  |         log4cplus::tstring substr = name.substr(0, i); | ||||||
|  |  | ||||||
|  |         LoggerMap::iterator it = loggerPtrs.find(substr); | ||||||
|  |         if(it != loggerPtrs.end()) { | ||||||
|  |             parentFound = true; | ||||||
|  |             logger.value->parent = it->second.value; | ||||||
|  |             break;  // no need to update the ancestors of the closest ancestor | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             ProvisionNodeMap::iterator it2 = provisionNodes.find(substr); | ||||||
|  |             if(it2 != provisionNodes.end()) { | ||||||
|  |                 it2->second.push_back(logger); | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|  |                 ProvisionNode node; | ||||||
|  |                 node.push_back(logger); | ||||||
|  |                 std::pair<ProvisionNodeMap::iterator, bool> tmp =  | ||||||
|  |                     provisionNodes.insert(std::make_pair(substr, node)); | ||||||
|  |                 //bool inserted = provisionNodes.insert(std::make_pair(substr, node)).second; | ||||||
|  |                 if(!tmp.second) { | ||||||
|  |                     getLogLog().error(LOG4CPLUS_TEXT("Hierarchy::updateParents()- Insert failed")); | ||||||
|  |                     throw std::runtime_error("Hierarchy::updateParents()- Insert failed"); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } // end if Logger found | ||||||
|  |     } // end for loop | ||||||
|  |  | ||||||
|  |     if(!parentFound) { | ||||||
|  |         logger.value->parent = root.value; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Hierarchy::updateChildren(ProvisionNode& pn, Logger logger) | ||||||
|  | { | ||||||
|  |  | ||||||
|  |     for(ProvisionNode::iterator it=pn.begin(); it!=pn.end(); ++it) { | ||||||
|  |         Logger& c = *it; | ||||||
|  |         // Unless this child already points to a correct (lower) parent, | ||||||
|  |         // make logger.parent point to c.parent and c.parent to logger. | ||||||
|  |         if( !startsWith(c.value->parent->getName(), logger.getName()) ) { | ||||||
|  |             logger.value->parent = c.value->parent; | ||||||
|  |             c.value->parent = logger.value; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										124
									
								
								libs/log4cplus/src/hierarchylocker.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								libs/log4cplus/src/hierarchylocker.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    hierarchylocker.cxx | ||||||
|  | // Created: 8/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/hierarchylocker.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/spi/loggerimpl.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::HierarchyLocker ctor and dtor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | HierarchyLocker::HierarchyLocker(Hierarchy& _h) | ||||||
|  | : h(_h), | ||||||
|  |   hierarchyLocker(h.hashtable_mutex), | ||||||
|  |   loggerList() | ||||||
|  | { | ||||||
|  |     // Get a copy of all of the Hierarchy's Loggers (except the Root Logger) | ||||||
|  |     h.initializeLoggerList(loggerList); | ||||||
|  |  | ||||||
|  |     // Lock all of the Hierarchy's Loggers' mutexs | ||||||
|  |     try { | ||||||
|  |         for(LoggerList::iterator it=loggerList.begin(); it!=loggerList.end(); ++it) { | ||||||
|  |             LOG4CPLUS_MUTEX_LOCK( (*it).value->appender_list_mutex ) ; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     catch(...) { | ||||||
|  |         h.getLogLog().error(LOG4CPLUS_TEXT("HierarchyLocker::ctor()- An error occurred while locking")); | ||||||
|  |         // TODO --> We need to unlock any Logger mutex that we were able to lock | ||||||
|  |         throw; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |   | ||||||
|  |  | ||||||
|  | HierarchyLocker::~HierarchyLocker() | ||||||
|  | { | ||||||
|  |     try { | ||||||
|  |         for(LoggerList::iterator it=loggerList.begin(); it!=loggerList.end(); ++it) { | ||||||
|  |             LOG4CPLUS_MUTEX_UNLOCK( (*it).value->appender_list_mutex ) ; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     catch(...) { | ||||||
|  |         h.getLogLog().error(LOG4CPLUS_TEXT("HierarchyLocker::dtor()- An error occurred while unlocking")); | ||||||
|  |         throw; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | HierarchyLocker::resetConfiguration() | ||||||
|  | { | ||||||
|  |     Logger root = h.getRoot(); | ||||||
|  |     h.disable(log4cplus::Hierarchy::DISABLE_OFF); | ||||||
|  |  | ||||||
|  |     // begin by closing nested appenders | ||||||
|  |     // then, remove all appenders | ||||||
|  |     root.setLogLevel(DEBUG_LOG_LEVEL); | ||||||
|  |     root.closeNestedAppenders(); | ||||||
|  |     root.removeAllAppenders(); | ||||||
|  |  | ||||||
|  |     // repeat | ||||||
|  |     for(LoggerList::iterator it=loggerList.begin(); it!=loggerList.end(); ++it) { | ||||||
|  |         LOG4CPLUS_MUTEX_UNLOCK( (*it).value->appender_list_mutex ) ; | ||||||
|  |         (*it).closeNestedAppenders(); | ||||||
|  |         (*it).removeAllAppenders(); | ||||||
|  |         LOG4CPLUS_MUTEX_LOCK( (*it).value->appender_list_mutex ) ; | ||||||
|  |         (*it).setLogLevel(NOT_SET_LOG_LEVEL); | ||||||
|  |         (*it).setAdditivity(true); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Logger  | ||||||
|  | HierarchyLocker::getInstance(const log4cplus::tstring& name) | ||||||
|  | { | ||||||
|  |     return h.getInstanceImpl(name, *h.getLoggerFactory()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Logger  | ||||||
|  | HierarchyLocker::getInstance(const log4cplus::tstring& name, spi::LoggerFactory& factory) | ||||||
|  | { | ||||||
|  |     return h.getInstanceImpl(name, factory); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | HierarchyLocker::addAppender(Logger& logger, log4cplus::SharedAppenderPtr& appender) | ||||||
|  | { | ||||||
|  |     for(LoggerList::iterator it=loggerList.begin(); it!=loggerList.end(); ++it) { | ||||||
|  |         if((*it).value == logger.value) { | ||||||
|  |             LOG4CPLUS_MUTEX_UNLOCK( logger.value->appender_list_mutex ); | ||||||
|  |             logger.addAppender(appender); | ||||||
|  |             LOG4CPLUS_MUTEX_LOCK( logger.value->appender_list_mutex ); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     // I don't have this Logger locked | ||||||
|  |     logger.addAppender(appender); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										127
									
								
								libs/log4cplus/src/layout.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								libs/log4cplus/src/layout.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    layout.cxx | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/layout.h> | ||||||
|  | #include <log4cplus/helpers/stringhelper.h> | ||||||
|  | #include <log4cplus/helpers/timehelper.h> | ||||||
|  | #include <log4cplus/spi/loggingevent.h> | ||||||
|  | #include <iomanip> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus | ||||||
|  | { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | extern helpers::Time TTCCLayout_time_base; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | initializeLayout () | ||||||
|  | { | ||||||
|  |     TTCCLayout_time_base = helpers::Time::gettimeofday (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::SimpleLayout public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | SimpleLayout::formatAndAppend(log4cplus::tostream& output,  | ||||||
|  |                               const log4cplus::spi::InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     output << llmCache.toString(event.getLogLevel())  | ||||||
|  |            << LOG4CPLUS_TEXT(" - ") | ||||||
|  |            << event.getMessage()  | ||||||
|  |            << LOG4CPLUS_TEXT("\n"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::TTCCLayout ctors and dtor | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | TTCCLayout::TTCCLayout(bool use_gmtime_) | ||||||
|  | : dateFormat(), | ||||||
|  |   use_gmtime(use_gmtime_) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | TTCCLayout::TTCCLayout(const log4cplus::helpers::Properties& properties) | ||||||
|  | : Layout(properties), | ||||||
|  |   dateFormat(), | ||||||
|  |   use_gmtime(false) | ||||||
|  | { | ||||||
|  |     if(properties.exists( LOG4CPLUS_TEXT("DateFormat") )) { | ||||||
|  |         dateFormat = properties.getProperty( LOG4CPLUS_TEXT("DateFormat") ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     tstring tmp = properties.getProperty( LOG4CPLUS_TEXT("Use_gmtime") ); | ||||||
|  |     use_gmtime = (helpers::toLower(tmp) == LOG4CPLUS_TEXT("true")); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | TTCCLayout::~TTCCLayout() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::TTCCLayout public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | TTCCLayout::formatAndAppend(log4cplus::tostream& output,  | ||||||
|  |                             const log4cplus::spi::InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     if (dateFormat.empty ()) | ||||||
|  |     { | ||||||
|  |         helpers::Time const rel_time = event.getTimestamp () - TTCCLayout_time_base; | ||||||
|  |         tchar const old_fill = output.fill (); | ||||||
|  |         time_t const sec = rel_time.sec (); | ||||||
|  |  | ||||||
|  |         if (sec != 0) | ||||||
|  |             output << sec << std::setfill (LOG4CPLUS_TEXT ('0')) | ||||||
|  |                    << std::setw (3); | ||||||
|  |  | ||||||
|  |         output << rel_time.usec () / 1000; | ||||||
|  |         output.fill (old_fill); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |         output << event.getTimestamp().getFormattedTime(dateFormat, use_gmtime); | ||||||
|  |  | ||||||
|  |     output << LOG4CPLUS_TEXT(" [") | ||||||
|  |            << event.getThread() | ||||||
|  |            << LOG4CPLUS_TEXT("] ") | ||||||
|  |            << llmCache.toString(event.getLogLevel())  | ||||||
|  |            << LOG4CPLUS_TEXT(" ") | ||||||
|  |            << event.getLoggerName() | ||||||
|  |            << LOG4CPLUS_TEXT(" <") | ||||||
|  |            << event.getNDC()  | ||||||
|  |            << LOG4CPLUS_TEXT("> - ") | ||||||
|  |            << event.getMessage() | ||||||
|  |            << LOG4CPLUS_TEXT("\n"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace log4cplus | ||||||
							
								
								
									
										298
									
								
								libs/log4cplus/src/logger.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										298
									
								
								libs/log4cplus/src/logger.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,298 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    logger.cxx | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/logger.h> | ||||||
|  | #include <log4cplus/appender.h> | ||||||
|  | #include <log4cplus/hierarchy.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/spi/loggerimpl.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus | ||||||
|  | { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Logger  | ||||||
|  | DefaultLoggerFactory::makeNewLoggerInstance (const tstring & name, | ||||||
|  |     Hierarchy& h) | ||||||
|  | {  | ||||||
|  |     return Logger (new spi::LoggerImpl (name, h)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // static Logger Methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // | ||||||
|  | Hierarchy &  | ||||||
|  | Logger::getDefaultHierarchy () | ||||||
|  | { | ||||||
|  |     static Hierarchy defaultHierarchy; | ||||||
|  |  | ||||||
|  |     return defaultHierarchy; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool  | ||||||
|  | Logger::exists (const tstring & name) | ||||||
|  | { | ||||||
|  |     return getDefaultHierarchy().exists(name);  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LoggerList | ||||||
|  | Logger::getCurrentLoggers ()  | ||||||
|  | { | ||||||
|  |     return getDefaultHierarchy ().getCurrentLoggers (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Logger  | ||||||
|  | Logger::getInstance (const tstring& name) | ||||||
|  | {  | ||||||
|  |     return getDefaultHierarchy().getInstance(name);  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Logger  | ||||||
|  | Logger::getInstance (const tstring& name, | ||||||
|  |     spi::LoggerFactory& factory) | ||||||
|  | {  | ||||||
|  |     return getDefaultHierarchy().getInstance(name, factory);  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Logger  | ||||||
|  | Logger::getRoot ()  | ||||||
|  | {  | ||||||
|  |     return getDefaultHierarchy ().getRoot ();  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Logger::shutdown ()  | ||||||
|  | {  | ||||||
|  |     getDefaultHierarchy ().shutdown ();  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Logger ctors and dtor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | Logger::Logger () | ||||||
|  |     : value (0) | ||||||
|  | { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Logger::Logger (spi::LoggerImpl * ptr) | ||||||
|  |     : value (ptr) | ||||||
|  | { | ||||||
|  |     if (value) | ||||||
|  |         value->addReference (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Logger::Logger (const Logger& rhs) | ||||||
|  |     : spi::AppenderAttachable (rhs) | ||||||
|  |     , value (rhs.value) | ||||||
|  | { | ||||||
|  |     if (value) | ||||||
|  |         value->addReference (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Logger & | ||||||
|  | Logger::operator = (const Logger& rhs) | ||||||
|  | { | ||||||
|  |     Logger (rhs).swap (*this); | ||||||
|  |     return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Logger::~Logger ()  | ||||||
|  | { | ||||||
|  |     if (value) | ||||||
|  |         value->removeReference (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Logger Methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Logger::swap (Logger & other) | ||||||
|  | { | ||||||
|  |     std::swap (value, other.value); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Logger | ||||||
|  | Logger::getParent () const  | ||||||
|  | { | ||||||
|  |     if (value->parent) | ||||||
|  |         return Logger (value->parent.get ()); | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         value->getLogLog().error(LOG4CPLUS_TEXT("********* This logger has no parent: " + getName())); | ||||||
|  |         return *this; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Logger::addAppender (SharedAppenderPtr newAppender) | ||||||
|  | { | ||||||
|  |     value->addAppender(newAppender); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | SharedAppenderPtrList  | ||||||
|  | Logger::getAllAppenders () | ||||||
|  | { | ||||||
|  |     return value->getAllAppenders(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | SharedAppenderPtr  | ||||||
|  | Logger::getAppender (const tstring& name) | ||||||
|  | { | ||||||
|  |     return value->getAppender (name); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Logger::removeAllAppenders () | ||||||
|  | { | ||||||
|  |     value->removeAllAppenders (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Logger::removeAppender (SharedAppenderPtr appender) | ||||||
|  | { | ||||||
|  |     value->removeAppender(appender); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Logger::removeAppender (const tstring& name) | ||||||
|  | { | ||||||
|  |     value->removeAppender (name); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Logger::assertion (bool assertionVal, const tstring& msg) const | ||||||
|  | { | ||||||
|  |     if (! assertionVal) | ||||||
|  |         log (FATAL_LOG_LEVEL, msg); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Logger::closeNestedAppenders () const | ||||||
|  | { | ||||||
|  |     value->closeNestedAppenders (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | Logger::isEnabledFor (LogLevel ll) const | ||||||
|  | { | ||||||
|  |     return value->isEnabledFor (ll); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Logger::log (LogLevel ll, const tstring& message, const char* file, | ||||||
|  |     int line) const | ||||||
|  | { | ||||||
|  |     value->log (ll, message, file, line); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Logger::forcedLog (LogLevel ll, const tstring& message, | ||||||
|  |     const char* file, int line) const | ||||||
|  | { | ||||||
|  |     value->forcedLog (ll, message, file, line); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Logger::callAppenders (const spi::InternalLoggingEvent& event) const | ||||||
|  | { | ||||||
|  |     value->callAppenders (event); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LogLevel | ||||||
|  | Logger::getChainedLogLevel () const | ||||||
|  | { | ||||||
|  |     return value->getChainedLogLevel (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LogLevel | ||||||
|  | Logger::getLogLevel() const | ||||||
|  | { | ||||||
|  |     return value->getLogLevel (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Logger::setLogLevel (LogLevel ll) | ||||||
|  | { | ||||||
|  |     value->setLogLevel (ll); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Hierarchy & | ||||||
|  | Logger::getHierarchy () const | ||||||
|  | {  | ||||||
|  |     return value->getHierarchy (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | tstring | ||||||
|  | Logger::getName () const | ||||||
|  | { | ||||||
|  |     return value->getName (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | Logger::getAdditivity () const | ||||||
|  | { | ||||||
|  |     return value->getAdditivity (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Logger::setAdditivity (bool additive) | ||||||
|  | {  | ||||||
|  |     value->setAdditivity (additive); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace log4cplus | ||||||
							
								
								
									
										158
									
								
								libs/log4cplus/src/loggerimpl.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								libs/log4cplus/src/loggerimpl.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,158 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    loggerimpl.cxx | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/spi/loggerimpl.h> | ||||||
|  | #include <log4cplus/appender.h> | ||||||
|  | #include <log4cplus/hierarchy.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/spi/loggingevent.h> | ||||||
|  | #include <log4cplus/spi/rootlogger.h> | ||||||
|  | #include <stdexcept> | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  | using namespace log4cplus::spi; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Logger Constructors and Destructor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | LoggerImpl::LoggerImpl(const log4cplus::tstring& name_, Hierarchy& h) | ||||||
|  |   : name(name_), | ||||||
|  |     ll(NOT_SET_LOG_LEVEL), | ||||||
|  |     parent(NULL), | ||||||
|  |     additive(true),  | ||||||
|  |     hierarchy(h) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LoggerImpl::~LoggerImpl()  | ||||||
|  | {  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Logger Methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | LoggerImpl::callAppenders(const InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     int writes = 0; | ||||||
|  |     for(const LoggerImpl* c = this; c != NULL; c=c->parent.get()) { | ||||||
|  |         writes += c->appendLoopOnAppenders(event); | ||||||
|  |         if(!c->additive) { | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // No appenders in hierarchy, warn user only once. | ||||||
|  |     if(!hierarchy.emittedNoAppenderWarning && writes == 0) { | ||||||
|  |         getLogLog().error(  LOG4CPLUS_TEXT("No appenders could be found for logger (")  | ||||||
|  |                           + getName()  | ||||||
|  |                           + LOG4CPLUS_TEXT(").")); | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("Please initialize the log4cplus system properly.")); | ||||||
|  |         hierarchy.emittedNoAppenderWarning = true; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | LoggerImpl::closeNestedAppenders() | ||||||
|  | { | ||||||
|  |     SharedAppenderPtrList appenders = getAllAppenders(); | ||||||
|  |     for(SharedAppenderPtrList::iterator it=appenders.begin(); it!=appenders.end(); ++it) | ||||||
|  |     { | ||||||
|  |         (*it)->close(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool  | ||||||
|  | LoggerImpl::isEnabledFor(LogLevel ll_) const | ||||||
|  | { | ||||||
|  |     if(hierarchy.disableValue >= ll_) { | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |     return ll_ >= getChainedLogLevel(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | LoggerImpl::log(LogLevel ll_,  | ||||||
|  |                 const log4cplus::tstring& message, | ||||||
|  |                 const char* file,  | ||||||
|  |                 int line) | ||||||
|  | { | ||||||
|  |     if(isEnabledFor(ll_)) { | ||||||
|  |         forcedLog(ll_, message, file, line); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LogLevel  | ||||||
|  | LoggerImpl::getChainedLogLevel() const | ||||||
|  | { | ||||||
|  |     for(const LoggerImpl *c=this; c != NULL; c=c->parent.get()) { | ||||||
|  |         if(c->ll != NOT_SET_LOG_LEVEL) { | ||||||
|  |             return c->ll; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     getLogLog().error( LOG4CPLUS_TEXT("LoggerImpl::getChainedLogLevel()- No valid LogLevel found") ); | ||||||
|  |     throw std::runtime_error("No valid LogLevel found"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Hierarchy&  | ||||||
|  | LoggerImpl::getHierarchy() const | ||||||
|  | {  | ||||||
|  |     return hierarchy;  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool  | ||||||
|  | LoggerImpl::getAdditivity() const | ||||||
|  | {  | ||||||
|  |     return additive;  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | LoggerImpl::setAdditivity(bool additive_) | ||||||
|  | { | ||||||
|  |     this->additive = additive_; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | LoggerImpl::forcedLog(LogLevel ll_, | ||||||
|  |                       const log4cplus::tstring& message, | ||||||
|  |                       const char* file, | ||||||
|  |                       int line) | ||||||
|  | { | ||||||
|  |     callAppenders(spi::InternalLoggingEvent(this->getName(), ll_, message, file, line)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										100
									
								
								libs/log4cplus/src/loggingevent.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								libs/log4cplus/src/loggingevent.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    loggingevent.cxx | ||||||
|  | // Created: 6/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/spi/loggingevent.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::spi; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define LOG4CPLUS_DEFAULT_TYPE 1 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // InternalLoggingEvent dtor | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | InternalLoggingEvent::~InternalLoggingEvent() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // InternalLoggingEvent static methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | unsigned int | ||||||
|  | InternalLoggingEvent::getDefaultType() | ||||||
|  | { | ||||||
|  |     return LOG4CPLUS_DEFAULT_TYPE; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // InternalLoggingEvent implementation | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | const log4cplus::tstring&  | ||||||
|  | InternalLoggingEvent::getMessage() const | ||||||
|  | { | ||||||
|  |     return message; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | unsigned int | ||||||
|  | InternalLoggingEvent::getType() const | ||||||
|  | { | ||||||
|  |     return LOG4CPLUS_DEFAULT_TYPE; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | std::auto_ptr<InternalLoggingEvent> | ||||||
|  | InternalLoggingEvent::clone() const | ||||||
|  | { | ||||||
|  |     std::auto_ptr<InternalLoggingEvent> tmp(new InternalLoggingEvent(*this)); | ||||||
|  |     return tmp; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::spi::InternalLoggingEvent& | ||||||
|  | InternalLoggingEvent::operator=(const log4cplus::spi::InternalLoggingEvent& rhs) | ||||||
|  | { | ||||||
|  |     if(this == &rhs) return *this; | ||||||
|  |  | ||||||
|  |     message = rhs.message; | ||||||
|  |     loggerName = rhs.loggerName; | ||||||
|  |     ll = rhs.ll; | ||||||
|  |     ndc = rhs.getNDC(); | ||||||
|  |     thread = rhs.getThread(); | ||||||
|  |     timestamp = rhs.timestamp; | ||||||
|  |     file = rhs.file; | ||||||
|  |     line = rhs.line; | ||||||
|  |     threadCached = true; | ||||||
|  |     ndcCached = true; | ||||||
|  |  | ||||||
|  |     return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										221
									
								
								libs/log4cplus/src/loglevel.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										221
									
								
								libs/log4cplus/src/loglevel.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,221 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    loglevel.cxx | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/loglevel.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/helpers/stringhelper.h> | ||||||
|  | #include <algorithm> | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  |  | ||||||
|  | #define _ALL_STRING LOG4CPLUS_TEXT("ALL") | ||||||
|  | #define _TRACE_STRING LOG4CPLUS_TEXT("TRACE") | ||||||
|  | #define _DEBUG_STRING LOG4CPLUS_TEXT("DEBUG") | ||||||
|  | #define _INFO_STRING LOG4CPLUS_TEXT("INFO") | ||||||
|  | #define _WARN_STRING LOG4CPLUS_TEXT("WARN") | ||||||
|  | #define _ERROR_STRING LOG4CPLUS_TEXT("ERROR") | ||||||
|  | #define _FATAL_STRING LOG4CPLUS_TEXT("FATAL") | ||||||
|  | #define _OFF_STRING LOG4CPLUS_TEXT("OFF") | ||||||
|  | #define _NOTSET_STRING LOG4CPLUS_TEXT("NOTSET") | ||||||
|  | #define _UNKNOWN_STRING LOG4CPLUS_TEXT("UNKNOWN") | ||||||
|  |  | ||||||
|  | #define GET_TO_STRING_NODE static_cast<ToStringNode*>(this->toStringMethods) | ||||||
|  | #define GET_FROM_STRING_NODE static_cast<FromStringNode*>(this->fromStringMethods) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // file LOCAL definitions | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | namespace { | ||||||
|  |     class ToStringNode { | ||||||
|  |     public: | ||||||
|  |         ToStringNode(LogLevelToStringMethod m) : method(m), next(0) {} | ||||||
|  |  | ||||||
|  |         LogLevelToStringMethod method; | ||||||
|  |         ToStringNode* next; | ||||||
|  |     }; | ||||||
|  |      | ||||||
|  |      | ||||||
|  |     class FromStringNode { | ||||||
|  |     public: | ||||||
|  |         FromStringNode(StringToLogLevelMethod m) : method(m), next(0) {} | ||||||
|  |  | ||||||
|  |         StringToLogLevelMethod method; | ||||||
|  |         FromStringNode* next; | ||||||
|  |     }; | ||||||
|  |      | ||||||
|  |      | ||||||
|  |     static | ||||||
|  |     log4cplus::tstring | ||||||
|  |     defaultLogLevelToStringMethod(LogLevel ll) { | ||||||
|  |         switch(ll) { | ||||||
|  |             case OFF_LOG_LEVEL:     return _OFF_STRING; | ||||||
|  |             case FATAL_LOG_LEVEL:   return _FATAL_STRING; | ||||||
|  |             case ERROR_LOG_LEVEL:   return _ERROR_STRING; | ||||||
|  |             case WARN_LOG_LEVEL:    return _WARN_STRING; | ||||||
|  |             case INFO_LOG_LEVEL:    return _INFO_STRING; | ||||||
|  |             case DEBUG_LOG_LEVEL:   return _DEBUG_STRING; | ||||||
|  |             case TRACE_LOG_LEVEL:   return _TRACE_STRING; | ||||||
|  |             //case ALL_LOG_LEVEL:     return _ALL_STRING; | ||||||
|  |             case NOT_SET_LOG_LEVEL: return _NOTSET_STRING; | ||||||
|  |         }; | ||||||
|  |          | ||||||
|  |         return tstring(); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |      | ||||||
|  |     static | ||||||
|  |     LogLevel | ||||||
|  |     defaultStringToLogLevelMethod(const log4cplus::tstring& arg) { | ||||||
|  |         log4cplus::tstring s = log4cplus::helpers::toUpper(arg); | ||||||
|  |          | ||||||
|  |         if(s == _ALL_STRING)   return ALL_LOG_LEVEL; | ||||||
|  |         if(s == _TRACE_STRING) return TRACE_LOG_LEVEL; | ||||||
|  |         if(s == _DEBUG_STRING) return DEBUG_LOG_LEVEL; | ||||||
|  |         if(s == _INFO_STRING)  return INFO_LOG_LEVEL; | ||||||
|  |         if(s == _WARN_STRING)  return WARN_LOG_LEVEL; | ||||||
|  |         if(s == _ERROR_STRING) return ERROR_LOG_LEVEL; | ||||||
|  |         if(s == _FATAL_STRING) return FATAL_LOG_LEVEL; | ||||||
|  |         if(s == _OFF_STRING)   return OFF_LOG_LEVEL; | ||||||
|  |          | ||||||
|  |         return NOT_SET_LOG_LEVEL; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // public static methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | LogLevelManager& | ||||||
|  | log4cplus::getLogLevelManager()  | ||||||
|  | { | ||||||
|  |     static LogLevelManager singleton; | ||||||
|  |     return singleton; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::LogLevelManager ctors and dtor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | LogLevelManager::LogLevelManager()  | ||||||
|  | : toStringMethods(new ToStringNode(defaultLogLevelToStringMethod)), | ||||||
|  |   fromStringMethods(new FromStringNode(defaultStringToLogLevelMethod)) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LogLevelManager::~LogLevelManager()  | ||||||
|  | { | ||||||
|  |     ToStringNode* toStringTmp = GET_TO_STRING_NODE; | ||||||
|  |     while(toStringTmp) { | ||||||
|  |         ToStringNode* tmp = toStringTmp; | ||||||
|  |         toStringTmp = toStringTmp->next; | ||||||
|  |         delete tmp; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     FromStringNode* fromStringTmp = GET_FROM_STRING_NODE; | ||||||
|  |     while(fromStringTmp) { | ||||||
|  |         FromStringNode* tmp = fromStringTmp; | ||||||
|  |         fromStringTmp = fromStringTmp->next; | ||||||
|  |         delete tmp; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::LogLevelManager public methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::tstring  | ||||||
|  | LogLevelManager::toString(LogLevel ll) const | ||||||
|  | { | ||||||
|  |     ToStringNode* toStringTmp = GET_TO_STRING_NODE; | ||||||
|  |     while(toStringTmp) { | ||||||
|  |         tstring ret = toStringTmp->method(ll); | ||||||
|  |         if(! ret.empty ()) { | ||||||
|  |             return ret; | ||||||
|  |         } | ||||||
|  |         toStringTmp = toStringTmp->next; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     return _UNKNOWN_STRING; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LogLevel  | ||||||
|  | LogLevelManager::fromString(const log4cplus::tstring& s) const | ||||||
|  | { | ||||||
|  |     FromStringNode* fromStringTmp = GET_FROM_STRING_NODE; | ||||||
|  |     while(fromStringTmp) { | ||||||
|  |         LogLevel ret = fromStringTmp->method(s); | ||||||
|  |         if(ret != NOT_SET_LOG_LEVEL) { | ||||||
|  |             return ret; | ||||||
|  |         } | ||||||
|  |         fromStringTmp = fromStringTmp->next; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     return NOT_SET_LOG_LEVEL; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | LogLevelManager::pushToStringMethod(LogLevelToStringMethod newToString) | ||||||
|  | { | ||||||
|  |     ToStringNode* toStringTmp = GET_TO_STRING_NODE; | ||||||
|  |     while(1) { | ||||||
|  |         if(toStringTmp->next) { | ||||||
|  |             toStringTmp = toStringTmp->next; | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             toStringTmp->next = new ToStringNode(newToString); | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | LogLevelManager::pushFromStringMethod(StringToLogLevelMethod newFromString) | ||||||
|  | { | ||||||
|  |     FromStringNode* fromStringTmp = GET_FROM_STRING_NODE; | ||||||
|  |     while(1) { | ||||||
|  |         if(fromStringTmp->next) { | ||||||
|  |             fromStringTmp = fromStringTmp->next; | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             fromStringTmp->next = new FromStringNode(newFromString); | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |          | ||||||
							
								
								
									
										122
									
								
								libs/log4cplus/src/loglog.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								libs/log4cplus/src/loglog.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,122 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    loglog.cxx | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/streams.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  |  | ||||||
|  | using namespace std; | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace | ||||||
|  | { | ||||||
|  |  | ||||||
|  | static tchar const PREFIX[] = LOG4CPLUS_TEXT("log4cplus: "); | ||||||
|  | static tchar const WARN_PREFIX[] = LOG4CPLUS_TEXT("log4cplus:WARN "); | ||||||
|  | static tchar const ERR_PREFIX[] = LOG4CPLUS_TEXT("log4cplus:ERROR "); | ||||||
|  |  | ||||||
|  | } // namespace | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // static methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | SharedObjectPtr<LogLog> | ||||||
|  | LogLog::getLogLog() | ||||||
|  | { | ||||||
|  |     static SharedObjectPtr<LogLog> singleton(new LogLog()); | ||||||
|  |     return singleton; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::helpers::LogLog ctor and dtor | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | LogLog::LogLog() | ||||||
|  |  : mutex(LOG4CPLUS_MUTEX_CREATE), | ||||||
|  |    debugEnabled(false), | ||||||
|  |    quietMode(false) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LogLog::~LogLog() | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_MUTEX_FREE( mutex ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::helpers::LogLog public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | LogLog::setInternalDebugging(bool enabled) | ||||||
|  | { | ||||||
|  |     debugEnabled = enabled; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | LogLog::setQuietMode(bool quietModeVal) | ||||||
|  | { | ||||||
|  |     quietMode = quietModeVal; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | LogLog::debug(const log4cplus::tstring& msg) | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( mutex ) | ||||||
|  |         if(debugEnabled && !quietMode) { | ||||||
|  |              tcout << PREFIX << msg << endl; | ||||||
|  |         } | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | LogLog::warn(const log4cplus::tstring& msg) | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( mutex ) | ||||||
|  |         if(quietMode) return; | ||||||
|  |  | ||||||
|  |         tcerr << WARN_PREFIX << msg << endl; | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | LogLog::error(const log4cplus::tstring& msg) | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( mutex ) | ||||||
|  |         if(quietMode) return; | ||||||
|  |  | ||||||
|  |         tcerr << ERR_PREFIX << msg << endl; | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										80
									
								
								libs/log4cplus/src/logloguser.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								libs/log4cplus/src/logloguser.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    logloguser.cxx | ||||||
|  | // Created: 6/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/streams.h> | ||||||
|  | #include <log4cplus/helpers/logloguser.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  |  | ||||||
|  | using namespace std; | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  |  | ||||||
|  | typedef SharedObjectPtr<LogLog> LogLogPtr; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::helpers::LogLogUser ctor and dtor | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | LogLogUser::LogLogUser() | ||||||
|  | { | ||||||
|  |     loglogRef = new SharedObjectPtr<LogLog>(LogLog::getLogLog()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LogLogUser::LogLogUser(const LogLogUser& rhs) | ||||||
|  | { | ||||||
|  |     loglogRef = new SharedObjectPtr<LogLog>(*static_cast<LogLogPtr*>(rhs.loglogRef)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LogLogUser::~LogLogUser() | ||||||
|  | { | ||||||
|  |     delete static_cast<LogLogPtr*>(loglogRef); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::helpers::LogLogUser public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | LogLog& | ||||||
|  | LogLogUser::getLogLog() const | ||||||
|  | { | ||||||
|  |     LogLogPtr* ptr = static_cast<LogLogPtr*>(loglogRef); | ||||||
|  |     return **ptr; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LogLogUser& | ||||||
|  | LogLogUser::operator=(const LogLogUser& rhs) | ||||||
|  | { | ||||||
|  |     if(this == &rhs) { | ||||||
|  |         return *this; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     delete static_cast<LogLogPtr*>(loglogRef); | ||||||
|  |     loglogRef = new SharedObjectPtr<LogLog>(*static_cast<LogLogPtr*>(rhs.loglogRef)); | ||||||
|  |      | ||||||
|  |     return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										329
									
								
								libs/log4cplus/src/ndc.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										329
									
								
								libs/log4cplus/src/ndc.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,329 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    ndc.cxx | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  | #include <log4cplus/ndc.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/helpers/pointer.h> | ||||||
|  | #include <exception> | ||||||
|  | #include <utility> | ||||||
|  | #include <vector> | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | NDC&  | ||||||
|  | log4cplus::getNDC() | ||||||
|  | { | ||||||
|  |     static NDC singleton; | ||||||
|  |     return singleton; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::DiagnosticContext ctors | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | DiagnosticContext::DiagnosticContext(const log4cplus::tstring& message_, DiagnosticContext* parent) | ||||||
|  |  : message(message_), | ||||||
|  |    fullMessage( (  (parent == NULL)  | ||||||
|  |                  ? message  | ||||||
|  |                  : parent->fullMessage + LOG4CPLUS_TEXT(" ") + message) ) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | DiagnosticContext::DiagnosticContext(const log4cplus::tstring& message_) | ||||||
|  |  : message(message_), | ||||||
|  |    fullMessage(message) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::NDC ctor and dtor | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | NDC::NDC()  | ||||||
|  |  : threadLocal(LOG4CPLUS_THREAD_LOCAL_INIT (0)) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | NDC::~NDC()  | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_THREAD_LOCAL_CLEANUP( threadLocal ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::NDC public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | NDC::clear() | ||||||
|  | { | ||||||
|  |     try { | ||||||
|  |         DiagnosticContextStack* ptr = getPtr(); | ||||||
|  |         if(ptr != NULL) { | ||||||
|  |             delete ptr; | ||||||
|  |             LOG4CPLUS_SET_THREAD_LOCAL_VALUE( threadLocal, NULL ); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     catch(std::exception& e) { | ||||||
|  |         getLogLog().error(  LOG4CPLUS_TEXT("NDC::clear()- exception occured: ")  | ||||||
|  |                           + LOG4CPLUS_C_STR_TO_TSTRING(e.what())); | ||||||
|  |     } | ||||||
|  |     catch(...) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("NDC::clear()- exception occured")); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | DiagnosticContextStack | ||||||
|  | NDC::cloneStack() | ||||||
|  | { | ||||||
|  |     try { | ||||||
|  |         DiagnosticContextStack* ptr = getPtr(); | ||||||
|  |         if(ptr != NULL) { | ||||||
|  |             return DiagnosticContextStack(*ptr); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     catch(std::exception& e) { | ||||||
|  |         getLogLog().error(  LOG4CPLUS_TEXT("NDC::cloneStack()- exception occured: ")  | ||||||
|  |                           + LOG4CPLUS_C_STR_TO_TSTRING(e.what())); | ||||||
|  |     } | ||||||
|  |     catch(...) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("NDC::cloneStack()- exception occured")); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return DiagnosticContextStack(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | NDC::inherit(const DiagnosticContextStack& stack) | ||||||
|  | { | ||||||
|  |     try { | ||||||
|  |         DiagnosticContextStack* ptr = getPtr(); | ||||||
|  |         delete ptr; | ||||||
|  |  | ||||||
|  |         ptr = new DiagnosticContextStack(stack); | ||||||
|  |         LOG4CPLUS_SET_THREAD_LOCAL_VALUE( threadLocal, ptr ); | ||||||
|  |     } | ||||||
|  |     catch(std::exception& e) { | ||||||
|  |         getLogLog().error(  LOG4CPLUS_TEXT("NDC::inherit()- exception occured: ")  | ||||||
|  |                           + LOG4CPLUS_C_STR_TO_TSTRING(e.what())); | ||||||
|  |     } | ||||||
|  |     catch(...) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("NDC::inherit()- exception occured")); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::tstring  | ||||||
|  | NDC::get() | ||||||
|  | { | ||||||
|  |     try { | ||||||
|  |         DiagnosticContextStack* ptr = getPtr(); | ||||||
|  |         if(ptr != NULL && !ptr->empty()) { | ||||||
|  |             return ptr->top().fullMessage; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     catch(std::exception& e) { | ||||||
|  |         getLogLog().error(  LOG4CPLUS_TEXT("NDC::get()- exception occured: ")  | ||||||
|  |                           + LOG4CPLUS_C_STR_TO_TSTRING(e.what())); | ||||||
|  |     } | ||||||
|  |     catch(...) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("NDC::get()- exception occured")); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return LOG4CPLUS_TEXT(""); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | size_t  | ||||||
|  | NDC::getDepth() | ||||||
|  | { | ||||||
|  |     try { | ||||||
|  |         DiagnosticContextStack* ptr = getPtr(); | ||||||
|  |         if(ptr != NULL) { | ||||||
|  |             return ptr->size(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     catch(std::exception& e) { | ||||||
|  |         getLogLog().error(  LOG4CPLUS_TEXT("NDC::getDepth()- exception occured: ")  | ||||||
|  |                           + LOG4CPLUS_C_STR_TO_TSTRING(e.what())); | ||||||
|  |     } | ||||||
|  |     catch(...) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("NDC::getDepth()- exception occured")); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::tstring  | ||||||
|  | NDC::pop() | ||||||
|  | { | ||||||
|  |     try { | ||||||
|  |         DiagnosticContextStack* ptr = getPtr(); | ||||||
|  |         if(ptr != NULL && !ptr->empty()) { | ||||||
|  |             DiagnosticContext dc = ptr->top(); | ||||||
|  |             ptr->pop(); | ||||||
|  |             if(ptr->empty()) { | ||||||
|  |                 // If the NDC stack is empty we will delete it so that we can avoid | ||||||
|  |                 // most memory leaks if Threads don't call remove when exiting | ||||||
|  |                 delete ptr; | ||||||
|  |                 LOG4CPLUS_SET_THREAD_LOCAL_VALUE( threadLocal, NULL ); | ||||||
|  |             } | ||||||
|  |             return dc.message; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     catch(std::exception& e) { | ||||||
|  |         getLogLog().error(  LOG4CPLUS_TEXT("NDC::pop()- exception occured: ")  | ||||||
|  |                           + LOG4CPLUS_C_STR_TO_TSTRING(e.what())); | ||||||
|  |     } | ||||||
|  |     catch(...) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("NDC::pop()- exception occured")); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return LOG4CPLUS_TEXT(""); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::tstring  | ||||||
|  | NDC::peek() | ||||||
|  | { | ||||||
|  |     try { | ||||||
|  |         DiagnosticContextStack* ptr = getPtr(); | ||||||
|  |         if(ptr != NULL && !ptr->empty()) { | ||||||
|  |             return ptr->top().message; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     catch(std::exception& e) { | ||||||
|  |         getLogLog().error(  LOG4CPLUS_TEXT("NDC::peek()- exception occured: ")  | ||||||
|  |                           + LOG4CPLUS_C_STR_TO_TSTRING(e.what())); | ||||||
|  |     } | ||||||
|  |     catch(...) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("NDC::peek()- exception occured")); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return LOG4CPLUS_TEXT(""); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | NDC::push(const log4cplus::tstring& message) | ||||||
|  | { | ||||||
|  |     try { | ||||||
|  |         DiagnosticContextStack* ptr = getPtr(); | ||||||
|  |         if(ptr == NULL) { | ||||||
|  |             ptr = new DiagnosticContextStack(); | ||||||
|  |             LOG4CPLUS_SET_THREAD_LOCAL_VALUE( threadLocal, ptr ); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if(ptr->empty()) { | ||||||
|  |             ptr->push( DiagnosticContext(message, NULL) ); | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             DiagnosticContext dc = ptr->top(); | ||||||
|  |             ptr->push( DiagnosticContext(message, &dc) ); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     catch(std::exception& e) { | ||||||
|  |         getLogLog().error(  LOG4CPLUS_TEXT("NDC::push()- exception occured: ")  | ||||||
|  |                           + LOG4CPLUS_C_STR_TO_TSTRING(e.what())); | ||||||
|  |     } | ||||||
|  |     catch(...) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("NDC::push()- exception occured")); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | NDC::remove() | ||||||
|  | { | ||||||
|  |     try { | ||||||
|  |         DiagnosticContextStack* ptr = getPtr(); | ||||||
|  |         delete ptr; | ||||||
|  |         LOG4CPLUS_SET_THREAD_LOCAL_VALUE( threadLocal, NULL ); | ||||||
|  |     } | ||||||
|  |     catch(std::exception& e) { | ||||||
|  |         getLogLog().error(  LOG4CPLUS_TEXT("NDC::remove()- exception occured: ")  | ||||||
|  |                           + LOG4CPLUS_C_STR_TO_TSTRING(e.what())); | ||||||
|  |     } | ||||||
|  |     catch(...) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("NDC::remove()- exception occured")); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | NDC::setMaxDepth(size_t maxDepth) | ||||||
|  | { | ||||||
|  |     try { | ||||||
|  |         DiagnosticContextStack* ptr = getPtr(); | ||||||
|  |         if(ptr != NULL) { | ||||||
|  |             while(maxDepth < ptr->size()) { | ||||||
|  |                 ptr->pop(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     catch(std::exception& e) { | ||||||
|  |         getLogLog().error(  LOG4CPLUS_TEXT("NDC::setMaxDepth()- exception occured: ")  | ||||||
|  |                           + LOG4CPLUS_C_STR_TO_TSTRING(e.what())); | ||||||
|  |     } | ||||||
|  |     catch(...) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("NDC::setMaxDepth()- exception occured")); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | DiagnosticContextStack* NDC::getPtr() | ||||||
|  | {  | ||||||
|  |     return static_cast<DiagnosticContextStack*> | ||||||
|  |         (LOG4CPLUS_GET_THREAD_LOCAL_VALUE( threadLocal ));  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // | ||||||
|  |  | ||||||
|  | NDCContextCreator::NDCContextCreator(const log4cplus::tstring& msg)  | ||||||
|  | {  | ||||||
|  |     getNDC().push(msg);  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | NDCContextCreator::~NDCContextCreator()  | ||||||
|  | {  | ||||||
|  |     getNDC().pop();  | ||||||
|  | } | ||||||
							
								
								
									
										348
									
								
								libs/log4cplus/src/nteventlogappender.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										348
									
								
								libs/log4cplus/src/nteventlogappender.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,348 @@ | |||||||
|  | // Module:  LOG4CPLUS | ||||||
|  | // File:    nteventlogappender.cxx | ||||||
|  | // Created: 4/2003 | ||||||
|  | // Author:  Michael CATANZARITI | ||||||
|  | // | ||||||
|  | // Copyright 2003-2010 Michael CATANZARITI | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/nteventlogappender.h> | ||||||
|  | #include <log4cplus/loglevel.h> | ||||||
|  | #include <log4cplus/streams.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/spi/loggingevent.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if defined (LOG4CPLUS_HAVE_NT_EVENT_LOG) | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::spi; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // File LOCAL methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | namespace { | ||||||
|  |  | ||||||
|  |     bool  | ||||||
|  |     FreeSid(SID* pSid)  | ||||||
|  |     { | ||||||
|  |         return ::HeapFree(GetProcessHeap(), 0, (LPVOID)pSid) != 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     bool  | ||||||
|  |     CopySid(SID** ppDstSid, SID* pSrcSid)  | ||||||
|  |     { | ||||||
|  |         bool bSuccess = false; | ||||||
|  |  | ||||||
|  |         DWORD dwLength = ::GetLengthSid(pSrcSid); | ||||||
|  |         *ppDstSid = (SID *) ::HeapAlloc(GetProcessHeap(), | ||||||
|  |         HEAP_ZERO_MEMORY, dwLength); | ||||||
|  |  | ||||||
|  |         if(::CopySid(dwLength, *ppDstSid, pSrcSid)) { | ||||||
|  |             bSuccess = true; | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             FreeSid(*ppDstSid); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return bSuccess; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     bool  | ||||||
|  |     GetCurrentUserSID(SID** ppSid)  | ||||||
|  |     { | ||||||
|  |         bool bSuccess = false; | ||||||
|  |  | ||||||
|  |         // Pseudohandle so don't need to close it | ||||||
|  |         HANDLE hProcess = ::GetCurrentProcess(); | ||||||
|  |         HANDLE hToken = NULL; | ||||||
|  |         if(::OpenProcessToken(hProcess, TOKEN_QUERY, &hToken)) { | ||||||
|  |             // Get the required size | ||||||
|  |             DWORD tusize = 0; | ||||||
|  |             GetTokenInformation(hToken, TokenUser, NULL, 0, &tusize); | ||||||
|  |             TOKEN_USER* ptu = (TOKEN_USER*)new BYTE[tusize]; | ||||||
|  |  | ||||||
|  |             if(GetTokenInformation(hToken, TokenUser, (LPVOID)ptu, tusize, &tusize)) { | ||||||
|  |                 bSuccess = CopySid(ppSid, (SID *)ptu->User.Sid); | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             CloseHandle(hToken); | ||||||
|  |             delete [] ptu; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return bSuccess; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |     HKEY  | ||||||
|  |     regGetKey(const log4cplus::tstring& subkey, DWORD* disposition) | ||||||
|  |     { | ||||||
|  |         HKEY hkey = 0; | ||||||
|  |         RegCreateKeyEx(HKEY_LOCAL_MACHINE,  | ||||||
|  |                        subkey.c_str(),  | ||||||
|  |                        0,  | ||||||
|  |                        NULL,  | ||||||
|  |                        REG_OPTION_NON_VOLATILE,  | ||||||
|  |                        KEY_SET_VALUE,  | ||||||
|  |                        NULL,  | ||||||
|  |                        &hkey,  | ||||||
|  |                        disposition); | ||||||
|  |         return hkey; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     void  | ||||||
|  |     regSetString(HKEY hkey, const log4cplus::tstring& name, const log4cplus::tstring& value) | ||||||
|  |     { | ||||||
|  |         RegSetValueEx(hkey,  | ||||||
|  |                       name.c_str(),  | ||||||
|  |                       0,  | ||||||
|  |                       REG_SZ,  | ||||||
|  |                       (LPBYTE)value.c_str(),  | ||||||
|  |                       static_cast<DWORD>(value.length() * sizeof(tchar))); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     void  | ||||||
|  |     regSetDword(HKEY hkey, const log4cplus::tstring& name, DWORD value) | ||||||
|  |     { | ||||||
|  |         RegSetValueEx(hkey,  | ||||||
|  |                       name.c_str(),  | ||||||
|  |                       0,  | ||||||
|  |                       REG_DWORD,  | ||||||
|  |                       (LPBYTE)&value,  | ||||||
|  |                       sizeof(DWORD)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::NTEventLogAppender ctor and dtor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | NTEventLogAppender::NTEventLogAppender(const log4cplus::tstring& server,  | ||||||
|  |                                        const log4cplus::tstring& log,  | ||||||
|  |                                        const log4cplus::tstring& source) | ||||||
|  | : server(server),  | ||||||
|  |   log(log),  | ||||||
|  |   source(source),  | ||||||
|  |   hEventLog(NULL),  | ||||||
|  |   pCurrentUserSID(NULL) | ||||||
|  | { | ||||||
|  |     init(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | NTEventLogAppender::NTEventLogAppender(const Properties properties) | ||||||
|  | : Appender(properties), | ||||||
|  |   hEventLog(NULL),  | ||||||
|  |   pCurrentUserSID(NULL) | ||||||
|  | { | ||||||
|  |     server = properties.getProperty( LOG4CPLUS_TEXT("server") ); | ||||||
|  |     log = properties.getProperty( LOG4CPLUS_TEXT("log") ); | ||||||
|  |     source = properties.getProperty( LOG4CPLUS_TEXT("source") ); | ||||||
|  |  | ||||||
|  |     init(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | NTEventLogAppender::init() | ||||||
|  | { | ||||||
|  |     if(source.empty()) { | ||||||
|  |         getLogLog().warn(  LOG4CPLUS_TEXT("Source option not set for appender [") | ||||||
|  |                          + name  | ||||||
|  |                          + LOG4CPLUS_TEXT("].")); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if(log.empty ()) { | ||||||
|  |         log = LOG4CPLUS_TEXT("Application"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // current user security identifier | ||||||
|  |     GetCurrentUserSID(&pCurrentUserSID); | ||||||
|  |  | ||||||
|  |     addRegistryInfo(); | ||||||
|  |  | ||||||
|  |     hEventLog = ::RegisterEventSource(server.empty () ? 0 : server.c_str(), | ||||||
|  |         source.c_str()); | ||||||
|  |     if (! hEventLog || hEventLog == HANDLE(ERROR_INVALID_HANDLE)) | ||||||
|  |         getLogLog().warn (LOG4CPLUS_TEXT("Event source registration failed.")); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | NTEventLogAppender::~NTEventLogAppender() | ||||||
|  | { | ||||||
|  |     destructorImpl(); | ||||||
|  |  | ||||||
|  |     if(pCurrentUserSID != NULL) { | ||||||
|  |         FreeSid(pCurrentUserSID); | ||||||
|  |         pCurrentUserSID = NULL; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::NTEventLogAppender public methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | NTEventLogAppender::close() | ||||||
|  | { | ||||||
|  |     if(hEventLog != NULL) { | ||||||
|  |         ::DeregisterEventSource(hEventLog); | ||||||
|  |         hEventLog = NULL; | ||||||
|  |     } | ||||||
|  |     closed = true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::NTEventLogAppender protected methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | NTEventLogAppender::append(const InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     if(hEventLog == NULL) { | ||||||
|  |         getLogLog().warn(LOG4CPLUS_TEXT("NT EventLog not opened.")); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     tostringstream buf; | ||||||
|  |     layout->formatAndAppend(buf, event); | ||||||
|  |     tstring sz = buf.str(); | ||||||
|  |     const tchar * s = sz.c_str(); | ||||||
|  |  | ||||||
|  |     BOOL bSuccess = ::ReportEvent(hEventLog, | ||||||
|  |                                   getEventType(event), | ||||||
|  |                                   getEventCategory(event), | ||||||
|  |                                   0x1000, | ||||||
|  |                                   pCurrentUserSID, | ||||||
|  |                                   1, | ||||||
|  |                                   0, | ||||||
|  |                                   &s, | ||||||
|  |                                   NULL); | ||||||
|  |  | ||||||
|  |     if(!bSuccess) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("Cannot report event in NT EventLog.")); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | WORD  | ||||||
|  | NTEventLogAppender::getEventType(const InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     WORD ret_val; | ||||||
|  |      | ||||||
|  |     switch ((int)event.getLogLevel()) | ||||||
|  |     { | ||||||
|  |     case FATAL_LOG_LEVEL: | ||||||
|  |     case ERROR_LOG_LEVEL: | ||||||
|  |         ret_val = EVENTLOG_ERROR_TYPE; | ||||||
|  |         break; | ||||||
|  |     case WARN_LOG_LEVEL: | ||||||
|  |         ret_val = EVENTLOG_WARNING_TYPE; | ||||||
|  |         break; | ||||||
|  |     case INFO_LOG_LEVEL: | ||||||
|  |     case DEBUG_LOG_LEVEL: | ||||||
|  |     default: | ||||||
|  |         ret_val = EVENTLOG_INFORMATION_TYPE; | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return ret_val; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | WORD  | ||||||
|  | NTEventLogAppender::getEventCategory(const InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     WORD ret_val; | ||||||
|  |      | ||||||
|  |     switch (event.getLogLevel()) | ||||||
|  |     { | ||||||
|  |     case FATAL_LOG_LEVEL: | ||||||
|  |         ret_val = 1; | ||||||
|  |         break; | ||||||
|  |     case ERROR_LOG_LEVEL: | ||||||
|  |         ret_val = 2; | ||||||
|  |         break; | ||||||
|  |     case WARN_LOG_LEVEL: | ||||||
|  |         ret_val = 3; | ||||||
|  |         break; | ||||||
|  |     case INFO_LOG_LEVEL: | ||||||
|  |         ret_val = 4; | ||||||
|  |         break; | ||||||
|  |     case DEBUG_LOG_LEVEL: | ||||||
|  |     default: | ||||||
|  |         ret_val = 5; | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return ret_val; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Add this source with appropriate configuration keys to the registry. | ||||||
|  | void  | ||||||
|  | NTEventLogAppender::addRegistryInfo() | ||||||
|  | { | ||||||
|  |     DWORD disposition; | ||||||
|  |     HKEY hkey = 0; | ||||||
|  |     tstring subkey =   LOG4CPLUS_TEXT("SYSTEM\\CurrentControlSet\\Services\\EventLog\\") | ||||||
|  |                      + log  | ||||||
|  |                      + LOG4CPLUS_TEXT("\\")  | ||||||
|  |                      + source; | ||||||
|  |      | ||||||
|  |     hkey = regGetKey(subkey, &disposition); | ||||||
|  |     if(disposition == REG_CREATED_NEW_KEY) { | ||||||
|  |         regSetString(hkey,  | ||||||
|  |                      LOG4CPLUS_TEXT("EventMessageFile"),  | ||||||
|  |                      LOG4CPLUS_TEXT("NTEventLogAppender.dll")); | ||||||
|  |         regSetString(hkey,  | ||||||
|  |                      LOG4CPLUS_TEXT("CategoryMessageFile"),  | ||||||
|  |                      LOG4CPLUS_TEXT("NTEventLogAppender.dll")); | ||||||
|  |         regSetDword(hkey, LOG4CPLUS_TEXT("TypesSupported"), (DWORD)7); | ||||||
|  |         regSetDword(hkey, LOG4CPLUS_TEXT("CategoryCount"), (DWORD)5); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     RegCloseKey(hkey); | ||||||
|  |     return; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										74
									
								
								libs/log4cplus/src/nullappender.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								libs/log4cplus/src/nullappender.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    nullappender.cxx | ||||||
|  | // Created: 6/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/nullappender.h> | ||||||
|  |  | ||||||
|  | using namespace std; | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::NullAppender ctors and dtor | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::NullAppender::NullAppender() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::NullAppender::NullAppender(const log4cplus::helpers::Properties& properties) | ||||||
|  | : Appender(properties) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::NullAppender::~NullAppender() | ||||||
|  | { | ||||||
|  |     destructorImpl(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::NullAppender public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | log4cplus::NullAppender::close() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::NullAppender protected methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | // This method does not need to be locked since it is called by | ||||||
|  | // doAppend() which performs the locking | ||||||
|  | void | ||||||
|  | log4cplus::NullAppender::append(const spi::InternalLoggingEvent&) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										113
									
								
								libs/log4cplus/src/objectregistry.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								libs/log4cplus/src/objectregistry.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    objectregistry.cxx | ||||||
|  | // Created: 3/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/spi/objectregistry.h> | ||||||
|  |  | ||||||
|  | using namespace std; | ||||||
|  | using namespace log4cplus::spi; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::spi::ObjectRegistryBase ctor and dtor | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::spi::ObjectRegistryBase::ObjectRegistryBase() | ||||||
|  |  : mutex(LOG4CPLUS_MUTEX_CREATE) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::spi::ObjectRegistryBase::~ObjectRegistryBase() | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_MUTEX_FREE( mutex ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::spi::ObjectRegistryBase public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | log4cplus::spi::ObjectRegistryBase::exists(const log4cplus::tstring& name) const | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( mutex ) | ||||||
|  |         return data.find(name) != data.end(); | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | std::vector<log4cplus::tstring> | ||||||
|  | log4cplus::spi::ObjectRegistryBase::getAllNames() const | ||||||
|  | { | ||||||
|  |     std::vector<log4cplus::tstring> tmp; | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( mutex ) | ||||||
|  |         for(ObjectMap::const_iterator it=data.begin(); it!=data.end(); ++it) | ||||||
|  |             tmp.push_back( (*it).first ); | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  |     return tmp; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::spi::ObjectRegistryBase protected methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | log4cplus::spi::ObjectRegistryBase::putVal(const log4cplus::tstring& name, void* object) | ||||||
|  | { | ||||||
|  |     ObjectMap::value_type value(name, object); | ||||||
|  |     std::pair<ObjectMap::iterator, bool> ret; | ||||||
|  |  | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( mutex ) | ||||||
|  |         ret = data.insert(value); | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  |  | ||||||
|  |     if (! ret.second) | ||||||
|  |         deleteObject( value.second ); | ||||||
|  |     return ret.second; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void* | ||||||
|  | log4cplus::spi::ObjectRegistryBase::getVal(const log4cplus::tstring& name) const | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( mutex ) | ||||||
|  |         ObjectMap::const_iterator it (data.find (name)); | ||||||
|  |         if (it != data.end ()) | ||||||
|  |             return it->second; | ||||||
|  |         else | ||||||
|  |             return 0; | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | log4cplus::spi::ObjectRegistryBase::clear() | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( mutex ) | ||||||
|  |     for(ObjectMap::iterator it=data.begin(); it!=data.end(); ++it) { | ||||||
|  |         deleteObject( (*it).second ); | ||||||
|  |     } | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
							
								
								
									
										957
									
								
								libs/log4cplus/src/patternlayout.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										957
									
								
								libs/log4cplus/src/patternlayout.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,957 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    patternlayout.cxx | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/layout.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/helpers/timehelper.h> | ||||||
|  | #include <log4cplus/helpers/stringhelper.h> | ||||||
|  | #include <log4cplus/helpers/socket.h> | ||||||
|  | #include <log4cplus/spi/loggingevent.h> | ||||||
|  |  | ||||||
|  | #ifdef LOG4CPLUS_HAVE_STDLIB_H | ||||||
|  | #include <stdlib.h> | ||||||
|  | #endif | ||||||
|  | #include <exception> | ||||||
|  |  | ||||||
|  | #ifdef LOG4CPLUS_HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef LOG4CPLUS_HAVE_UNISTD_H | ||||||
|  | #include <unistd.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace | ||||||
|  | { | ||||||
|  |  | ||||||
|  | static | ||||||
|  | #if defined (_WIN32) | ||||||
|  | DWORD | ||||||
|  | get_process_id () | ||||||
|  | { | ||||||
|  |     return GetCurrentProcessId (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #elif defined (LOG4CPLUS_HAVE_GETPID) | ||||||
|  | pid_t | ||||||
|  | get_process_id () | ||||||
|  | { | ||||||
|  |     return getpid (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #else | ||||||
|  | int | ||||||
|  | get_process_id () | ||||||
|  | { | ||||||
|  |     return 0;  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static | ||||||
|  | log4cplus::tstring | ||||||
|  | get_basename (const log4cplus::tstring& filename) | ||||||
|  | { | ||||||
|  | #if defined(_WIN32) | ||||||
|  |     log4cplus::tchar const dir_sep(LOG4CPLUS_TEXT('\\')); | ||||||
|  | #else | ||||||
|  |     log4cplus::tchar const dir_sep(LOG4CPLUS_TEXT('/')); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     log4cplus::tstring::size_type pos = filename.rfind(dir_sep); | ||||||
|  |     if (pos != log4cplus::tstring::npos) | ||||||
|  |         return filename.substr(pos+1); | ||||||
|  |     else | ||||||
|  |         return filename; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace | ||||||
|  |  | ||||||
|  |  | ||||||
|  | using namespace std; | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  | using namespace log4cplus::spi; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define ESCAPE_CHAR LOG4CPLUS_TEXT('%') | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { | ||||||
|  |     namespace pattern { | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This is used by PatternConverter class to inform them how to format | ||||||
|  |          * their output. | ||||||
|  |          */ | ||||||
|  |         struct FormattingInfo { | ||||||
|  |             int minLen; | ||||||
|  |             size_t maxLen; | ||||||
|  |             bool leftAlign; | ||||||
|  |             FormattingInfo() { reset(); } | ||||||
|  |  | ||||||
|  |             void reset(); | ||||||
|  |             void dump(log4cplus::helpers::LogLog&); | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This is the base class of all "Converter" classes that format a | ||||||
|  |          * field of InternalLoggingEvent objects.  In fact, the PatternLayout | ||||||
|  |          * class simply uses an array of PatternConverter objects to format | ||||||
|  |          * and append a logging event. | ||||||
|  |          */ | ||||||
|  |         class PatternConverter : protected log4cplus::helpers::LogLogUser { | ||||||
|  |         public: | ||||||
|  |             PatternConverter(const FormattingInfo& info); | ||||||
|  |             virtual ~PatternConverter() {} | ||||||
|  |             void formatAndAppend(log4cplus::tostream& output,  | ||||||
|  |                                  const InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |         protected: | ||||||
|  |             virtual log4cplus::tstring convert(const InternalLoggingEvent& event) = 0; | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |             int minLen; | ||||||
|  |             size_t maxLen; | ||||||
|  |             bool leftAlign; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This PatternConverter returns a constant string. | ||||||
|  |          */ | ||||||
|  |         class LiteralPatternConverter : public PatternConverter { | ||||||
|  |         public: | ||||||
|  |             LiteralPatternConverter(const log4cplus::tstring& str); | ||||||
|  |             virtual log4cplus::tstring convert(const InternalLoggingEvent&) { | ||||||
|  |                 return str; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |             log4cplus::tstring str; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This PatternConverter is used to format most of the "simple" fields | ||||||
|  |          * found in the InternalLoggingEvent object. | ||||||
|  |          */ | ||||||
|  |         class BasicPatternConverter : public PatternConverter { | ||||||
|  |         public: | ||||||
|  |             enum Type { THREAD_CONVERTER, | ||||||
|  |                         PROCESS_CONVERTER, | ||||||
|  |                         LOGLEVEL_CONVERTER, | ||||||
|  |                         NDC_CONVERTER, | ||||||
|  |                         MESSAGE_CONVERTER, | ||||||
|  |                         NEWLINE_CONVERTER, | ||||||
|  |                         BASENAME_CONVERTER, | ||||||
|  |                         FILE_CONVERTER, | ||||||
|  |                         LINE_CONVERTER, | ||||||
|  |                         FULL_LOCATION_CONVERTER }; | ||||||
|  |             BasicPatternConverter(const FormattingInfo& info, Type type); | ||||||
|  |             virtual log4cplus::tstring convert(const InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |           // Disable copy | ||||||
|  |             BasicPatternConverter(const BasicPatternConverter&); | ||||||
|  |             BasicPatternConverter& operator=(BasicPatternConverter&); | ||||||
|  |              | ||||||
|  |             LogLevelManager& llmCache; | ||||||
|  |             Type type; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This PatternConverter is used to format the Logger field found in | ||||||
|  |          * the InternalLoggingEvent object. | ||||||
|  |          */ | ||||||
|  |         class LoggerPatternConverter : public PatternConverter { | ||||||
|  |         public: | ||||||
|  |             LoggerPatternConverter(const FormattingInfo& info, int precision); | ||||||
|  |             virtual log4cplus::tstring convert(const InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |             int precision; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This PatternConverter is used to format the timestamp field found in | ||||||
|  |          * the InternalLoggingEvent object.  It will be formatted according to | ||||||
|  |          * the specified "pattern". | ||||||
|  |          */ | ||||||
|  |         class DatePatternConverter : public PatternConverter { | ||||||
|  |         public: | ||||||
|  |             DatePatternConverter(const FormattingInfo& info,  | ||||||
|  |                                  const log4cplus::tstring& pattern,  | ||||||
|  |                                  bool use_gmtime); | ||||||
|  |             virtual log4cplus::tstring convert(const InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |             bool use_gmtime; | ||||||
|  |             log4cplus::tstring format; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This PatternConverter is used to format the hostname field. | ||||||
|  |          */ | ||||||
|  |         class HostnamePatternConverter : public PatternConverter { | ||||||
|  |         public: | ||||||
|  |             HostnamePatternConverter(const FormattingInfo& info, bool fqdn); | ||||||
|  |             virtual log4cplus::tstring convert(const InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |             log4cplus::tstring hostname_; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This PatternConverter is used to format the NDC field found in | ||||||
|  |          * the InternalLoggingEvent object, optionally limited to | ||||||
|  |          * \c precision levels (using space to separate levels). | ||||||
|  |          */ | ||||||
|  |         class NDCPatternConverter : public PatternConverter { | ||||||
|  |         public: | ||||||
|  |             NDCPatternConverter(const FormattingInfo& info, int precision); | ||||||
|  |             virtual log4cplus::tstring convert(const InternalLoggingEvent& event); | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |             int precision; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * This class parses a "pattern" string into an array of | ||||||
|  |          * PatternConverter objects. | ||||||
|  |          * <p> | ||||||
|  |          * @see PatternLayout for the formatting of the "pattern" string. | ||||||
|  |          */ | ||||||
|  |         class PatternParser : protected log4cplus::helpers::LogLogUser { | ||||||
|  |         public: | ||||||
|  |             PatternParser(const log4cplus::tstring& pattern, unsigned ndcMaxDepth); | ||||||
|  |             std::vector<PatternConverter*> parse(); | ||||||
|  |  | ||||||
|  |         private: | ||||||
|  |           // Types | ||||||
|  |             enum ParserState { LITERAL_STATE,  | ||||||
|  |                                CONVERTER_STATE, | ||||||
|  |                                DOT_STATE, | ||||||
|  |                                MIN_STATE, | ||||||
|  |                                MAX_STATE }; | ||||||
|  |  | ||||||
|  |           // Methods | ||||||
|  |             log4cplus::tstring extractOption(); | ||||||
|  |             int extractPrecisionOption(); | ||||||
|  |             void finalizeConverter(log4cplus::tchar c); | ||||||
|  |  | ||||||
|  |           // Data | ||||||
|  |             log4cplus::tstring pattern; | ||||||
|  |             FormattingInfo formattingInfo; | ||||||
|  |             std::vector<PatternConverter*> list; | ||||||
|  |             ParserState state; | ||||||
|  |             tstring::size_type pos; | ||||||
|  |             log4cplus::tstring currentLiteral; | ||||||
|  |             unsigned ndcMaxDepth; | ||||||
|  |         }; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | using namespace log4cplus::pattern; | ||||||
|  | typedef std::vector<log4cplus::pattern::PatternConverter*> PatternConverterList; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  | // PatternConverter methods: | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | log4cplus::pattern::FormattingInfo::reset() { | ||||||
|  |     minLen = -1; | ||||||
|  |     maxLen = 0x7FFFFFFF; | ||||||
|  |     leftAlign = false; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | log4cplus::pattern::FormattingInfo::dump(log4cplus::helpers::LogLog& loglog) { | ||||||
|  |     log4cplus::tostringstream buf; | ||||||
|  |     buf << LOG4CPLUS_TEXT("min=") << minLen | ||||||
|  |         << LOG4CPLUS_TEXT(", max=") << maxLen | ||||||
|  |         << LOG4CPLUS_TEXT(", leftAlign=") | ||||||
|  |         << (leftAlign ? LOG4CPLUS_TEXT("true") : LOG4CPLUS_TEXT("false")); | ||||||
|  |     loglog.debug(buf.str()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  | // PatternConverter methods: | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::pattern::PatternConverter::PatternConverter(const FormattingInfo& i) | ||||||
|  | { | ||||||
|  |     minLen = i.minLen; | ||||||
|  |     maxLen = i.maxLen; | ||||||
|  |     leftAlign = i.leftAlign; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | log4cplus::pattern::PatternConverter::formatAndAppend | ||||||
|  |                      (log4cplus::tostream& output, const InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     log4cplus::tstring s = convert(event); | ||||||
|  |     size_t len = s.length(); | ||||||
|  |  | ||||||
|  |     if(len > maxLen) { | ||||||
|  |         output << s.substr(len - maxLen); | ||||||
|  |     } | ||||||
|  |     else if(static_cast<int>(len) < minLen) { | ||||||
|  |         if(leftAlign) { | ||||||
|  |             output << s; | ||||||
|  |             output << log4cplus::tstring(minLen - len, LOG4CPLUS_TEXT(' ')); | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             output << log4cplus::tstring(minLen - len, LOG4CPLUS_TEXT(' ')); | ||||||
|  |             output << s; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         output << s; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  | // LiteralPatternConverter methods: | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::pattern::LiteralPatternConverter::LiteralPatternConverter | ||||||
|  |                                                       (const log4cplus::tstring& str_) | ||||||
|  | : PatternConverter(FormattingInfo()), | ||||||
|  |   str(str_) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  | // BasicPatternConverter methods: | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::pattern::BasicPatternConverter::BasicPatternConverter | ||||||
|  |                                         (const FormattingInfo& info, Type type_) | ||||||
|  | : PatternConverter(info), | ||||||
|  |   llmCache(getLogLevelManager()), | ||||||
|  |   type(type_) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::tstring | ||||||
|  | log4cplus::pattern::BasicPatternConverter::convert | ||||||
|  |                                             (const InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     switch(type) { | ||||||
|  |     case LOGLEVEL_CONVERTER: return llmCache.toString(event.getLogLevel()); | ||||||
|  |     case NDC_CONVERTER:      return event.getNDC(); | ||||||
|  |     case MESSAGE_CONVERTER:  return event.getMessage(); | ||||||
|  |     case NEWLINE_CONVERTER:  return LOG4CPLUS_TEXT("\n"); | ||||||
|  |     case BASENAME_CONVERTER: return get_basename(event.getFile()); | ||||||
|  |     case FILE_CONVERTER:     return event.getFile(); | ||||||
|  |     case THREAD_CONVERTER:   return event.getThread();  | ||||||
|  |     case PROCESS_CONVERTER:  return convertIntegerToString(get_process_id ());  | ||||||
|  |  | ||||||
|  |     case LINE_CONVERTER: | ||||||
|  |         { | ||||||
|  |             int line = event.getLine(); | ||||||
|  |             if(line != -1) { | ||||||
|  |                 return convertIntegerToString(line); | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|  |                 return log4cplus::tstring(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     case FULL_LOCATION_CONVERTER: | ||||||
|  |         { | ||||||
|  |             tstring const & filename = event.getFile(); | ||||||
|  |             if(! filename.empty ()) { | ||||||
|  |                 return   filename  | ||||||
|  |                        + LOG4CPLUS_TEXT(":")  | ||||||
|  |                        + convertIntegerToString(event.getLine()); | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|  |                 return LOG4CPLUS_TEXT(":"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return LOG4CPLUS_TEXT("INTERNAL LOG4CPLUS ERROR"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  | // LoggerPatternConverter methods: | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::pattern::LoggerPatternConverter::LoggerPatternConverter | ||||||
|  |                                     (const FormattingInfo& info, int precision_) | ||||||
|  | : PatternConverter(info), | ||||||
|  |   precision(precision_) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::tstring | ||||||
|  | log4cplus::pattern::LoggerPatternConverter::convert | ||||||
|  |                                             (const InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     const log4cplus::tstring& name = event.getLoggerName(); | ||||||
|  |     if (precision <= 0) { | ||||||
|  |         return name; | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         size_t len = name.length(); | ||||||
|  |  | ||||||
|  |         // We substract 1 from 'len' when assigning to 'end' to avoid out of | ||||||
|  |         // bounds exception in return r.substring(end+1, len). This can happen | ||||||
|  |         // if precision is 1 and the logger name ends with a dot.  | ||||||
|  |         tstring::size_type end = len - 1; | ||||||
|  |         for(int i=precision; i>0; --i) { | ||||||
|  |             end = name.rfind(LOG4CPLUS_TEXT('.'), end - 1); | ||||||
|  |             if(end == tstring::npos) { | ||||||
|  |                 return name; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return name.substr(end + 1); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  | // DatePatternConverter methods: | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::pattern::DatePatternConverter::DatePatternConverter | ||||||
|  |                                                (const FormattingInfo& info, | ||||||
|  |                                                 const log4cplus::tstring& pattern, | ||||||
|  |                                                 bool use_gmtime_) | ||||||
|  | : PatternConverter(info), | ||||||
|  |   use_gmtime(use_gmtime_), | ||||||
|  |   format(pattern) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::tstring  | ||||||
|  | log4cplus::pattern::DatePatternConverter::convert | ||||||
|  |                                             (const InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     return event.getTimestamp().getFormattedTime(format, use_gmtime); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  | // HostnamePatternConverter methods: | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::pattern::HostnamePatternConverter::HostnamePatternConverter ( | ||||||
|  |     const FormattingInfo& info, bool fqdn) | ||||||
|  |     : PatternConverter(info) | ||||||
|  |     , hostname_ (helpers::getHostname (fqdn)) | ||||||
|  | { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::tstring | ||||||
|  | log4cplus::pattern::HostnamePatternConverter::convert ( | ||||||
|  |     const InternalLoggingEvent &) | ||||||
|  | { | ||||||
|  |     return hostname_; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  | // NDCPatternConverter methods: | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::pattern::NDCPatternConverter::NDCPatternConverter ( | ||||||
|  |     const FormattingInfo& info, int precision_) | ||||||
|  |     : PatternConverter(info) | ||||||
|  |     , precision(precision_) | ||||||
|  | { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::tstring | ||||||
|  | log4cplus::pattern::NDCPatternConverter::convert ( | ||||||
|  |     const InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     const log4cplus::tstring& text = event.getNDC(); | ||||||
|  |     if (precision <= 0) | ||||||
|  |         return text; | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         tstring::size_type p = text.find(LOG4CPLUS_TEXT(' ')); | ||||||
|  |         for (int i = 1; i < precision && p != tstring::npos; ++i) | ||||||
|  |             p = text.find(LOG4CPLUS_TEXT(' '), p + 1); | ||||||
|  |  | ||||||
|  |         return text.substr(0, p); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  | // PatternParser methods: | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::pattern::PatternParser::PatternParser( | ||||||
|  |     const log4cplus::tstring& pattern_, unsigned ndcMaxDepth_) | ||||||
|  |     : pattern(pattern_) | ||||||
|  |     , state(LITERAL_STATE) | ||||||
|  |     , pos(0) | ||||||
|  |     , ndcMaxDepth (ndcMaxDepth_) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::tstring  | ||||||
|  | log4cplus::pattern::PatternParser::extractOption()  | ||||||
|  | { | ||||||
|  |     if (   (pos < pattern.length())  | ||||||
|  |         && (pattern[pos] == LOG4CPLUS_TEXT('{')))  | ||||||
|  |     { | ||||||
|  |         tstring::size_type end = pattern.find_first_of(LOG4CPLUS_TEXT('}'), pos); | ||||||
|  |         if (end != tstring::npos) { | ||||||
|  |             log4cplus::tstring r = pattern.substr(pos + 1, end - pos - 1); | ||||||
|  |             pos = end + 1; | ||||||
|  |             return r; | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             log4cplus::tostringstream buf; | ||||||
|  |             buf << LOG4CPLUS_TEXT("No matching '}' found in conversion pattern string \"") | ||||||
|  |                 << pattern | ||||||
|  |                 << LOG4CPLUS_TEXT("\""); | ||||||
|  |             getLogLog().error(buf.str()); | ||||||
|  |             pos = pattern.length(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return LOG4CPLUS_TEXT(""); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int  | ||||||
|  | log4cplus::pattern::PatternParser::extractPrecisionOption()  | ||||||
|  | { | ||||||
|  |     log4cplus::tstring opt = extractOption(); | ||||||
|  |     int r = 0; | ||||||
|  |     if(! opt.empty ()) { | ||||||
|  |         r = std::atoi(LOG4CPLUS_TSTRING_TO_STRING(opt).c_str()); | ||||||
|  |     } | ||||||
|  |     return r; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | PatternConverterList | ||||||
|  | log4cplus::pattern::PatternParser::parse()  | ||||||
|  | { | ||||||
|  |     tchar c; | ||||||
|  |     pos = 0; | ||||||
|  |     while(pos < pattern.length()) { | ||||||
|  |         c = pattern[pos++]; | ||||||
|  |         switch (state) { | ||||||
|  |         case LITERAL_STATE : | ||||||
|  |             // In literal state, the last char is always a literal. | ||||||
|  |             if(pos == pattern.length()) { | ||||||
|  |                 currentLiteral += c; | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |             if(c == ESCAPE_CHAR) { | ||||||
|  |                 // peek at the next char.  | ||||||
|  |                 switch (pattern[pos]) { | ||||||
|  |                 case ESCAPE_CHAR: | ||||||
|  |                     currentLiteral += c; | ||||||
|  |                     pos++; // move pointer | ||||||
|  |                     break; | ||||||
|  |                 default: | ||||||
|  |                     if(! currentLiteral.empty ()) { | ||||||
|  |                         list.push_back | ||||||
|  |                              (new LiteralPatternConverter(currentLiteral)); | ||||||
|  |                         //getLogLog().debug("Parsed LITERAL converter: \""  | ||||||
|  |                         //                  +currentLiteral+"\"."); | ||||||
|  |                     } | ||||||
|  |                     currentLiteral.resize(0); | ||||||
|  |                     currentLiteral += c; // append % | ||||||
|  |                     state = CONVERTER_STATE; | ||||||
|  |                     formattingInfo.reset(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|  |                 currentLiteral += c; | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case CONVERTER_STATE: | ||||||
|  |             currentLiteral += c; | ||||||
|  |             switch (c) { | ||||||
|  |             case LOG4CPLUS_TEXT('-'): | ||||||
|  |                 formattingInfo.leftAlign = true; | ||||||
|  |                 break; | ||||||
|  |             case LOG4CPLUS_TEXT('.'): | ||||||
|  |                 state = DOT_STATE; | ||||||
|  |                 break; | ||||||
|  |             default: | ||||||
|  |                 if(c >= LOG4CPLUS_TEXT('0') && c <= LOG4CPLUS_TEXT('9')) { | ||||||
|  |                     formattingInfo.minLen = c - LOG4CPLUS_TEXT('0'); | ||||||
|  |                     state = MIN_STATE; | ||||||
|  |                 } | ||||||
|  |                 else { | ||||||
|  |                     finalizeConverter(c); | ||||||
|  |                 } | ||||||
|  |             } // switch | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case MIN_STATE: | ||||||
|  |             currentLiteral += c; | ||||||
|  |             if (c >= LOG4CPLUS_TEXT('0') && c <= LOG4CPLUS_TEXT('9')) { | ||||||
|  |                 formattingInfo.minLen = formattingInfo.minLen * 10 + (c - LOG4CPLUS_TEXT('0')); | ||||||
|  |             } | ||||||
|  |             else if(c == LOG4CPLUS_TEXT('.')) { | ||||||
|  |                 state = DOT_STATE; | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|  |                 finalizeConverter(c); | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case DOT_STATE: | ||||||
|  |             currentLiteral += c; | ||||||
|  |             if(c >= LOG4CPLUS_TEXT('0') && c <= LOG4CPLUS_TEXT('9')) { | ||||||
|  |                 formattingInfo.maxLen = c - LOG4CPLUS_TEXT('0'); | ||||||
|  |                 state = MAX_STATE; | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|  |                 log4cplus::tostringstream buf; | ||||||
|  |                 buf << LOG4CPLUS_TEXT("Error occured in position ") | ||||||
|  |                     << pos | ||||||
|  |                     << LOG4CPLUS_TEXT(".\n Was expecting digit, instead got char \"") | ||||||
|  |                     << c | ||||||
|  |                     << LOG4CPLUS_TEXT("\"."); | ||||||
|  |                 getLogLog().error(buf.str()); | ||||||
|  |                 state = LITERAL_STATE; | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |          case MAX_STATE: | ||||||
|  |             currentLiteral += c; | ||||||
|  |             if (c >= LOG4CPLUS_TEXT('0') && c <= LOG4CPLUS_TEXT('9')) | ||||||
|  |                 formattingInfo.maxLen = formattingInfo.maxLen * 10 + (c - LOG4CPLUS_TEXT('0')); | ||||||
|  |             else { | ||||||
|  |                 finalizeConverter(c); | ||||||
|  |                 state = LITERAL_STATE; | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |         } // end switch | ||||||
|  |     } // end while | ||||||
|  |  | ||||||
|  |     if(! currentLiteral.empty ()) { | ||||||
|  |         list.push_back(new LiteralPatternConverter(currentLiteral)); | ||||||
|  |       //getLogLog().debug("Parsed LITERAL converter: \""+currentLiteral+"\"."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return list; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | log4cplus::pattern::PatternParser::finalizeConverter(log4cplus::tchar c)  | ||||||
|  | { | ||||||
|  |     PatternConverter* pc = 0; | ||||||
|  |     switch (c) { | ||||||
|  |         case LOG4CPLUS_TEXT('b'): | ||||||
|  |             pc = new BasicPatternConverter | ||||||
|  |                           (formattingInfo,  | ||||||
|  |                            BasicPatternConverter::BASENAME_CONVERTER); | ||||||
|  |             //getLogLog().debug("BASENAME converter."); | ||||||
|  |             //formattingInfo.dump(getLogLog());       | ||||||
|  |             break; | ||||||
|  |              | ||||||
|  |         case LOG4CPLUS_TEXT('c'): | ||||||
|  |             pc = new LoggerPatternConverter(formattingInfo,  | ||||||
|  |                                             extractPrecisionOption()); | ||||||
|  |             getLogLog().debug( LOG4CPLUS_TEXT("LOGGER converter.") ); | ||||||
|  |             formattingInfo.dump(getLogLog());       | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case LOG4CPLUS_TEXT('d'): | ||||||
|  |         case LOG4CPLUS_TEXT('D'): | ||||||
|  |             { | ||||||
|  |                 log4cplus::tstring dOpt = extractOption(); | ||||||
|  |                 if(dOpt.empty ()) { | ||||||
|  |                     dOpt = LOG4CPLUS_TEXT("%Y-%m-%d %H:%M:%S"); | ||||||
|  |                 } | ||||||
|  |                 bool use_gmtime = c == LOG4CPLUS_TEXT('d'); | ||||||
|  |                 pc = new DatePatternConverter(formattingInfo, dOpt, use_gmtime); | ||||||
|  |                 //if(use_gmtime) { | ||||||
|  |                 //    getLogLog().debug("GMT DATE converter."); | ||||||
|  |                 //} | ||||||
|  |                 //else { | ||||||
|  |                 //    getLogLog().debug("LOCAL DATE converter."); | ||||||
|  |                 //} | ||||||
|  |                 //formattingInfo.dump(getLogLog());       | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case LOG4CPLUS_TEXT('F'): | ||||||
|  |             pc = new BasicPatternConverter | ||||||
|  |                           (formattingInfo,  | ||||||
|  |                            BasicPatternConverter::FILE_CONVERTER); | ||||||
|  |             //getLogLog().debug("FILE NAME converter."); | ||||||
|  |             //formattingInfo.dump(getLogLog());       | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case LOG4CPLUS_TEXT('h'): | ||||||
|  |         case LOG4CPLUS_TEXT('H'): | ||||||
|  |             { | ||||||
|  |                 bool fqdn = (c == LOG4CPLUS_TEXT('H')); | ||||||
|  |                 pc = new HostnamePatternConverter(formattingInfo, fqdn); | ||||||
|  |                 // getLogLog().debug( LOG4CPLUS_TEXT("HOSTNAME converter.") ); | ||||||
|  |                 // formattingInfo.dump(getLogLog()); | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case LOG4CPLUS_TEXT('i'): | ||||||
|  |             pc = new BasicPatternConverter | ||||||
|  |                           (formattingInfo,  | ||||||
|  |                            BasicPatternConverter::PROCESS_CONVERTER); | ||||||
|  |             //getLogLog().debug("PROCESS_CONVERTER converter."); | ||||||
|  |             //formattingInfo.dump(getLogLog());       | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case LOG4CPLUS_TEXT('l'): | ||||||
|  |             pc = new BasicPatternConverter | ||||||
|  |                           (formattingInfo,  | ||||||
|  |                            BasicPatternConverter::FULL_LOCATION_CONVERTER); | ||||||
|  |             //getLogLog().debug("FULL LOCATION converter."); | ||||||
|  |             //formattingInfo.dump(getLogLog());       | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case LOG4CPLUS_TEXT('L'): | ||||||
|  |             pc = new BasicPatternConverter | ||||||
|  |                           (formattingInfo,  | ||||||
|  |                            BasicPatternConverter::LINE_CONVERTER); | ||||||
|  |             //getLogLog().debug("LINE NUMBER converter."); | ||||||
|  |             //formattingInfo.dump(getLogLog());       | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case LOG4CPLUS_TEXT('m'): | ||||||
|  |             pc = new BasicPatternConverter | ||||||
|  |                           (formattingInfo,  | ||||||
|  |                            BasicPatternConverter::MESSAGE_CONVERTER); | ||||||
|  |             //getLogLog().debug("MESSAGE converter."); | ||||||
|  |             //formattingInfo.dump(getLogLog());       | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         // 'M' is METHOD converter in log4j. | ||||||
|  |         // Not implemented. | ||||||
|  |         case LOG4CPLUS_TEXT('M'): | ||||||
|  |             goto not_implemented; | ||||||
|  |  | ||||||
|  |         case LOG4CPLUS_TEXT('n'): | ||||||
|  |             pc = new BasicPatternConverter | ||||||
|  |                           (formattingInfo,  | ||||||
|  |                            BasicPatternConverter::NEWLINE_CONVERTER); | ||||||
|  |             //getLogLog().debug("MESSAGE converter."); | ||||||
|  |             //formattingInfo.dump(getLogLog());       | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case LOG4CPLUS_TEXT('p'): | ||||||
|  |             pc = new BasicPatternConverter | ||||||
|  |                           (formattingInfo,  | ||||||
|  |                            BasicPatternConverter::LOGLEVEL_CONVERTER); | ||||||
|  |             //getLogLog().debug("LOGLEVEL converter."); | ||||||
|  |             //formattingInfo.dump(getLogLog()); | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         // 'r' is RELATIVE time converter in log4j. | ||||||
|  |         // Not implemented. | ||||||
|  |         case LOG4CPLUS_TEXT('r'): | ||||||
|  |             goto not_implemented; | ||||||
|  |  | ||||||
|  |         case LOG4CPLUS_TEXT('t'): | ||||||
|  |             pc = new BasicPatternConverter | ||||||
|  |                           (formattingInfo,  | ||||||
|  |                            BasicPatternConverter::THREAD_CONVERTER); | ||||||
|  |             //getLogLog().debug("THREAD converter."); | ||||||
|  |             //formattingInfo.dump(getLogLog());       | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         case LOG4CPLUS_TEXT('x'): | ||||||
|  |             pc = new NDCPatternConverter (formattingInfo, ndcMaxDepth); | ||||||
|  |             //getLogLog().debug("NDC converter.");       | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |         // 'X' is MDC in log4j. | ||||||
|  |         // Not implemented. | ||||||
|  |         case LOG4CPLUS_TEXT('X'): | ||||||
|  |             goto not_implemented; | ||||||
|  |  | ||||||
|  | not_implemented:; | ||||||
|  |         default: | ||||||
|  |             log4cplus::tostringstream buf; | ||||||
|  |             buf << LOG4CPLUS_TEXT("Unexpected char [") | ||||||
|  |                 << c | ||||||
|  |                 << LOG4CPLUS_TEXT("] at position ") | ||||||
|  |                 << pos | ||||||
|  |                 << LOG4CPLUS_TEXT(" in conversion patterrn."); | ||||||
|  |             getLogLog().error(buf.str()); | ||||||
|  |             pc = new LiteralPatternConverter(currentLiteral); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     currentLiteral.resize(0); | ||||||
|  |     list.push_back(pc); | ||||||
|  |     state = LITERAL_STATE; | ||||||
|  |     formattingInfo.reset(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  | // PatternLayout methods: | ||||||
|  | //////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | PatternLayout::PatternLayout(const log4cplus::tstring& pattern_) | ||||||
|  | { | ||||||
|  |     init(pattern_, 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | PatternLayout::PatternLayout(const log4cplus::helpers::Properties& properties) | ||||||
|  | { | ||||||
|  |     unsigned ndcMaxDepth | ||||||
|  |         = std::atoi (LOG4CPLUS_TSTRING_TO_STRING ( | ||||||
|  |             properties.getProperty ( | ||||||
|  |                 LOG4CPLUS_TEXT ("NDCMaxDepth"), | ||||||
|  |                 LOG4CPLUS_TEXT ("0"))).c_str ()); | ||||||
|  |  | ||||||
|  |     bool hasPattern = properties.exists( LOG4CPLUS_TEXT("Pattern") ); | ||||||
|  |     bool hasConversionPattern = properties.exists( LOG4CPLUS_TEXT("ConversionPattern") ); | ||||||
|  |      | ||||||
|  |     if(hasPattern) { | ||||||
|  |         getLogLog().warn( LOG4CPLUS_TEXT("PatternLayout- the \"Pattern\" property has been deprecated.  Use \"ConversionPattern\" instead.")); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     if(hasConversionPattern) { | ||||||
|  |         init(properties.getProperty( LOG4CPLUS_TEXT("ConversionPattern") ), | ||||||
|  |             ndcMaxDepth); | ||||||
|  |     } | ||||||
|  |     else if(hasPattern) { | ||||||
|  |         init(properties.getProperty( LOG4CPLUS_TEXT("Pattern") ), ndcMaxDepth); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         throw std::runtime_error("ConversionPattern not specified in properties"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | PatternLayout::init(const log4cplus::tstring& pattern_, unsigned ndcMaxDepth) | ||||||
|  | { | ||||||
|  |     this->pattern = pattern_; | ||||||
|  |     this->parsedPattern = PatternParser(pattern, ndcMaxDepth).parse(); | ||||||
|  |  | ||||||
|  |     // Let's validate that our parser didn't give us any NULLs.  If it did, | ||||||
|  |     // we will convert them to a valid PatternConverter that does nothing so | ||||||
|  |     // at least we don't core. | ||||||
|  |     for(PatternConverterList::iterator it=parsedPattern.begin();  | ||||||
|  |         it!=parsedPattern.end();  | ||||||
|  |         ++it) | ||||||
|  |     { | ||||||
|  |         if( (*it) == 0 ) { | ||||||
|  |             getLogLog().error(LOG4CPLUS_TEXT("Parsed Pattern created a NULL PatternConverter")); | ||||||
|  |             (*it) = new LiteralPatternConverter( LOG4CPLUS_TEXT("") ); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     if(parsedPattern.empty ()) { | ||||||
|  |         getLogLog().warn(LOG4CPLUS_TEXT("PatternLayout pattern is empty.  Using default...")); | ||||||
|  |         parsedPattern.push_back | ||||||
|  |            (new BasicPatternConverter(FormattingInfo(),  | ||||||
|  |                                       BasicPatternConverter::MESSAGE_CONVERTER)); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | PatternLayout::~PatternLayout() | ||||||
|  | { | ||||||
|  |     for(PatternConverterList::iterator it=parsedPattern.begin();  | ||||||
|  |         it!=parsedPattern.end();  | ||||||
|  |         ++it) | ||||||
|  |     { | ||||||
|  |         delete (*it); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | PatternLayout::formatAndAppend(log4cplus::tostream& output,  | ||||||
|  |                                const InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     for(PatternConverterList::iterator it=parsedPattern.begin();  | ||||||
|  |         it!=parsedPattern.end();  | ||||||
|  |         ++it) | ||||||
|  |     { | ||||||
|  |         (*it)->formatAndAppend(output, event); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										70
									
								
								libs/log4cplus/src/pointer.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								libs/log4cplus/src/pointer.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    pointer.cxx | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/streams.h> | ||||||
|  | #include <log4cplus/helpers/pointer.h> | ||||||
|  | #include <log4cplus/helpers/threads.h> | ||||||
|  | #include <assert.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { namespace helpers { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::helpers::SharedObject dtor | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | SharedObject::~SharedObject() | ||||||
|  | { | ||||||
|  |     assert(count == 0); | ||||||
|  |     LOG4CPLUS_MUTEX_FREE( access_mutex ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::helpers::SharedObject public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | SharedObject::addReference() const | ||||||
|  | { | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( access_mutex ) | ||||||
|  |         assert (count >= 0); | ||||||
|  |         ++count; | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | SharedObject::removeReference() const | ||||||
|  | { | ||||||
|  |     bool destroy = false; | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( access_mutex ); | ||||||
|  |         assert (count > 0); | ||||||
|  |         if (--count == 0) | ||||||
|  |             destroy = true; | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  |     if (destroy) | ||||||
|  |         delete this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } } // namespace log4cplus { namespace helpers | ||||||
							
								
								
									
										241
									
								
								libs/log4cplus/src/property.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										241
									
								
								libs/log4cplus/src/property.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,241 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    property.cxx | ||||||
|  | // Created: 2/2002 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2002-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <cstring> | ||||||
|  | #if defined (UNICODE) | ||||||
|  | #  include <cwctype> | ||||||
|  | #else | ||||||
|  | #  include <cctype> | ||||||
|  | #endif | ||||||
|  | #include <log4cplus/helpers/property.h> | ||||||
|  | #include <log4cplus/fstreams.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus | ||||||
|  | { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | const tchar helpers::Properties::PROPERTIES_COMMENT_CHAR = LOG4CPLUS_TEXT('#'); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace | ||||||
|  | { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static | ||||||
|  | int | ||||||
|  | is_space (tchar ch) | ||||||
|  | { | ||||||
|  | #if defined (UNICODE) | ||||||
|  |     return std::iswspace (ch); | ||||||
|  | #else | ||||||
|  |     return std::isspace (static_cast<unsigned char>(ch)); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static | ||||||
|  | void | ||||||
|  | trim_leading_ws (tstring & str) | ||||||
|  | { | ||||||
|  |     tstring::iterator it = str.begin (); | ||||||
|  |     for (; it != str.end (); ++it) | ||||||
|  |     { | ||||||
|  |         if (! is_space (*it)) | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  |     str.erase (str.begin (), it); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static | ||||||
|  | void | ||||||
|  | trim_trailing_ws (tstring & str) | ||||||
|  | { | ||||||
|  |     tstring::reverse_iterator rit = str.rbegin (); | ||||||
|  |     for (; rit != str.rend (); ++rit) | ||||||
|  |     { | ||||||
|  |         if (! is_space (*rit)) | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  |     str.erase (rit.base (), str.end ()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static | ||||||
|  | void | ||||||
|  | trim_ws (tstring & str) | ||||||
|  | { | ||||||
|  |     trim_trailing_ws (str); | ||||||
|  |     trim_leading_ws (str); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace helpers | ||||||
|  | { | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Properties ctors and dtor | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | Properties::Properties()  | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Properties::Properties(tistream& input) | ||||||
|  | { | ||||||
|  |     init(input); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Properties::Properties(const tstring& inputFile) | ||||||
|  | { | ||||||
|  |     if (inputFile.empty ()) | ||||||
|  |         return; | ||||||
|  |  | ||||||
|  |     tifstream file (LOG4CPLUS_TSTRING_TO_STRING(inputFile).c_str()); | ||||||
|  |     init(file); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Properties::init(tistream& input)  | ||||||
|  | { | ||||||
|  |     if (! input) | ||||||
|  |         return; | ||||||
|  |  | ||||||
|  |     tstring buffer; | ||||||
|  |     while (std::getline (input, buffer)) | ||||||
|  |     { | ||||||
|  |         trim_leading_ws (buffer); | ||||||
|  |  | ||||||
|  |         tstring::size_type const buffLen = buffer.size (); | ||||||
|  |         if (buffLen == 0 || buffer[0] == PROPERTIES_COMMENT_CHAR) | ||||||
|  |             continue; | ||||||
|  |          | ||||||
|  |         // Check if we have a trailing \r because we are  | ||||||
|  |         // reading a properties file produced on Windows. | ||||||
|  |         if (buffer[buffLen-1] == LOG4CPLUS_TEXT('\r')) | ||||||
|  |             // Remove trailing 'Windows' \r. | ||||||
|  |             buffer.resize (buffLen - 1); | ||||||
|  |  | ||||||
|  |         tstring::size_type const idx = buffer.find('='); | ||||||
|  |         if (idx != tstring::npos) | ||||||
|  |         { | ||||||
|  |             tstring key = buffer.substr(0, idx); | ||||||
|  |             tstring value = buffer.substr(idx + 1); | ||||||
|  |             trim_trailing_ws (key); | ||||||
|  |             trim_ws (value); | ||||||
|  |             setProperty(key, value); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Properties::~Properties()  | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Properties public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | tstring | ||||||
|  | Properties::getProperty(const tstring& key) const  | ||||||
|  | { | ||||||
|  |     StringMap::const_iterator it (data.find(key)); | ||||||
|  |     if (it == data.end()) | ||||||
|  |         return LOG4CPLUS_TEXT(""); | ||||||
|  |     else | ||||||
|  |         return it->second; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | tstring | ||||||
|  | Properties::getProperty(const tstring& key, | ||||||
|  |                                  const tstring& defaultVal) const | ||||||
|  | { | ||||||
|  |     StringMap::const_iterator it (data.find (key)); | ||||||
|  |     if (it == data.end ()) | ||||||
|  |         return defaultVal; | ||||||
|  |     else | ||||||
|  |         return it->second; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | std::vector<tstring> | ||||||
|  | Properties::propertyNames() const  | ||||||
|  | { | ||||||
|  |     std::vector<tstring> tmp; | ||||||
|  |     for (StringMap::const_iterator it=data.begin(); it!=data.end(); ++it) | ||||||
|  |         tmp.push_back(it->first); | ||||||
|  |  | ||||||
|  |     return tmp; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Properties::setProperty(const tstring& key, const tstring& value) | ||||||
|  | { | ||||||
|  |     data[key] = value; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | Properties::removeProperty(const tstring& key) | ||||||
|  | { | ||||||
|  |     return (data.erase(key) > 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Properties  | ||||||
|  | Properties::getPropertySubset( | ||||||
|  |     const tstring& prefix) const | ||||||
|  | { | ||||||
|  |     Properties ret; | ||||||
|  |     std::vector<tstring> const keys = propertyNames(); | ||||||
|  |     size_t const prefix_len = prefix.size (); | ||||||
|  |     for (std::vector<tstring>::const_iterator it = keys.begin(); | ||||||
|  |         it != keys.end(); ++it) | ||||||
|  |     { | ||||||
|  |         int result = it->compare (0, prefix_len, prefix); | ||||||
|  |         if (result == 0) | ||||||
|  |             ret.setProperty (it->substr (prefix_len), getProperty(*it)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } // namespace helpers | ||||||
|  |  | ||||||
|  | } // namespace log4cplus | ||||||
							
								
								
									
										62
									
								
								libs/log4cplus/src/rootlogger.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								libs/log4cplus/src/rootlogger.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    rootlogger.cxx | ||||||
|  | // Created: 4/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/spi/rootlogger.h> | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  | using namespace log4cplus::spi; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // RootLogger Constructor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | RootLogger::RootLogger(Hierarchy& h, LogLevel ll_) | ||||||
|  | : LoggerImpl(LOG4CPLUS_TEXT("root"), h) | ||||||
|  | { | ||||||
|  |     setLogLevel(ll_); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Logger Methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | LogLevel  | ||||||
|  | RootLogger::getChainedLogLevel() const | ||||||
|  | { | ||||||
|  |     return ll; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | RootLogger::setLogLevel(LogLevel ll_) | ||||||
|  | { | ||||||
|  |     if(ll_ == NOT_SET_LOG_LEVEL) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("You have tried to set NOT_SET_LOG_LEVEL to root.")); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         LoggerImpl::setLogLevel(ll_); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										83
									
								
								libs/log4cplus/src/sleep.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								libs/log4cplus/src/sleep.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    sleep.cxx | ||||||
|  | // Created: 5/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/helpers/sleep.h> | ||||||
|  | #include <log4cplus/helpers/timehelper.h> | ||||||
|  |  | ||||||
|  | #ifdef LOG4CPLUS_HAVE_ERRNO_H | ||||||
|  | #include <errno.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | int const MILLIS_TO_NANOS = 1000000; | ||||||
|  | int const SEC_TO_MILLIS = 1000; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | log4cplus::helpers::sleep(unsigned long secs, unsigned long nanosecs) | ||||||
|  | { | ||||||
|  | #if defined(_WIN32) | ||||||
|  |     DWORD const MAX_SLEEP_SECONDS = 4294966;        // (2**32-2)/1000 | ||||||
|  |  | ||||||
|  |     DWORD nano_millis = nanosecs / static_cast<unsigned long>(MILLIS_TO_NANOS); | ||||||
|  |     if (secs <= MAX_SLEEP_SECONDS) { | ||||||
|  |         Sleep((secs * SEC_TO_MILLIS) + nano_millis); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |          | ||||||
|  |     DWORD no_of_max_sleeps = secs / MAX_SLEEP_SECONDS; | ||||||
|  |              | ||||||
|  |     for(DWORD i = 0; i < no_of_max_sleeps; i++) { | ||||||
|  |         Sleep(MAX_SLEEP_SECONDS * SEC_TO_MILLIS); | ||||||
|  |     } | ||||||
|  |                 | ||||||
|  |     Sleep((secs % MAX_SLEEP_SECONDS) * SEC_TO_MILLIS + nano_millis); | ||||||
|  | #else | ||||||
|  |     timespec sleep_time = { secs, nanosecs }; | ||||||
|  |     timespec remain; | ||||||
|  |     while (nanosleep(&sleep_time, &remain)) { | ||||||
|  |         if (errno == EINTR) { | ||||||
|  |             sleep_time.tv_sec  = remain.tv_sec; | ||||||
|  |             sleep_time.tv_nsec = remain.tv_nsec;                | ||||||
|  |             continue; | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | log4cplus::helpers::sleepmillis(unsigned long millis) | ||||||
|  | { | ||||||
|  |     unsigned long secs = millis / SEC_TO_MILLIS; | ||||||
|  |     unsigned long nanosecs = (millis % SEC_TO_MILLIS) * MILLIS_TO_NANOS; | ||||||
|  |     sleep(secs, nanosecs); | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										338
									
								
								libs/log4cplus/src/socket-unix.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										338
									
								
								libs/log4cplus/src/socket-unix.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,338 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    socket-unix.cxx | ||||||
|  | // Created: 4/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/helpers/socket.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/helpers/threads.h> | ||||||
|  | #include <log4cplus/spi/loggingevent.h> | ||||||
|  | #include <log4cplus/helpers/syncprims.h> | ||||||
|  |  | ||||||
|  | #include <arpa/inet.h> | ||||||
|  |   | ||||||
|  | #ifdef LOG4CPLUS_HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef LOG4CPLUS_HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef LOG4CPLUS_HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <errno.h> | ||||||
|  |  | ||||||
|  | #ifdef LOG4CPLUS_HAVE_NETDB_H | ||||||
|  | #include <netdb.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <unistd.h> | ||||||
|  |  | ||||||
|  | #include <cstring> | ||||||
|  | #include <vector> | ||||||
|  | #include <algorithm> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace | ||||||
|  | { | ||||||
|  |  | ||||||
|  | #if ! defined (LOG4CPLUS_SINGLE_THREADED) | ||||||
|  | // We need to use log4cplus::thread here to work around compilation | ||||||
|  | // problem on AIX. | ||||||
|  | static log4cplus::thread::Mutex ghbn_mutex; | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static | ||||||
|  | int | ||||||
|  | get_host_by_name (char const * hostname, std::string * name, | ||||||
|  |     struct sockaddr_in * addr) | ||||||
|  | { | ||||||
|  | #if defined (LOG4CPLUS_HAVE_GETADDRINFO) | ||||||
|  |     struct addrinfo hints; | ||||||
|  |     std::memset (&hints, 0, sizeof (hints)); | ||||||
|  |     hints.ai_family = AF_INET; | ||||||
|  |     hints.ai_socktype = SOCK_STREAM; | ||||||
|  |     hints.ai_protocol = IPPROTO_TCP; | ||||||
|  |     hints.ai_flags = AI_CANONNAME; | ||||||
|  |  | ||||||
|  |     if (inet_addr (hostname) != static_cast<in_addr_t>(-1)) | ||||||
|  | 	hints.ai_flags |= AI_NUMERICHOST; | ||||||
|  |  | ||||||
|  |     struct addrinfo * res = 0; | ||||||
|  |     int ret = getaddrinfo (hostname, 0, &hints, &res); | ||||||
|  |     if (ret != 0) | ||||||
|  |         return ret; | ||||||
|  |  | ||||||
|  |     struct addrinfo const & ai = *res; | ||||||
|  |     assert (ai.ai_family == AF_INET); | ||||||
|  |      | ||||||
|  |     if (name) | ||||||
|  |         *name = ai.ai_canonname; | ||||||
|  |  | ||||||
|  |     if (addr) | ||||||
|  |         std::memcpy (addr, ai.ai_addr, ai.ai_addrlen); | ||||||
|  |  | ||||||
|  |     freeaddrinfo (res); | ||||||
|  |  | ||||||
|  | #else | ||||||
|  | #  if ! defined (LOG4CPLUS_SINGLE_THREADED) | ||||||
|  |     // We need to use log4cplus::thread here to work around | ||||||
|  |     // compilation problem on AIX. | ||||||
|  |     log4cplus::thread::MutexGuard guard (ghbn_mutex); | ||||||
|  | #  endif | ||||||
|  |  | ||||||
|  |     struct ::hostent * hp = gethostbyname (hostname); | ||||||
|  |     if (! hp) | ||||||
|  |         return 1; | ||||||
|  |     assert (hp->h_addrtype == AF_INET); | ||||||
|  |  | ||||||
|  |     if (name) | ||||||
|  |         *name = hp->h_name; | ||||||
|  |  | ||||||
|  |     if (addr) | ||||||
|  |     { | ||||||
|  |         assert (hp->h_length <= sizeof (addr->sin_addr)); | ||||||
|  |         std::memcpy (&addr->sin_addr, hp->h_addr_list[0], hp->h_length); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ///////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Global Methods | ||||||
|  | ///////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | SOCKET_TYPE | ||||||
|  | log4cplus::helpers::openSocket(unsigned short port, SocketState& state) | ||||||
|  | { | ||||||
|  |     SOCKET_TYPE sock = ::socket(AF_INET, SOCK_STREAM, 0); | ||||||
|  |     if(sock < 0) { | ||||||
|  |         return INVALID_SOCKET; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     struct sockaddr_in server; | ||||||
|  |     server.sin_family = AF_INET; | ||||||
|  |     server.sin_addr.s_addr = INADDR_ANY; | ||||||
|  |     server.sin_port = htons(port); | ||||||
|  |  | ||||||
|  |     int optval = 1; | ||||||
|  |     setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval) ); | ||||||
|  |  | ||||||
|  |     if(bind(sock, (struct sockaddr*)&server, sizeof(server)) < 0) { | ||||||
|  |         return INVALID_SOCKET; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if(::listen(sock, 10)) { | ||||||
|  |         return INVALID_SOCKET; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     state = ok; | ||||||
|  |     return sock; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | SOCKET_TYPE | ||||||
|  | log4cplus::helpers::connectSocket(const log4cplus::tstring& hostn, | ||||||
|  |                                   unsigned short port, SocketState& state) | ||||||
|  | { | ||||||
|  |     struct sockaddr_in server; | ||||||
|  |     SOCKET_TYPE sock; | ||||||
|  |     int retval; | ||||||
|  |  | ||||||
|  |     std::memset (&server, 0, sizeof (server)); | ||||||
|  |     retval = get_host_by_name (LOG4CPLUS_TSTRING_TO_STRING(hostn).c_str(), | ||||||
|  |         0, &server); | ||||||
|  |     if (retval != 0) | ||||||
|  |         return INVALID_SOCKET; | ||||||
|  |  | ||||||
|  |     server.sin_port = htons(port); | ||||||
|  |     server.sin_family = AF_INET; | ||||||
|  |  | ||||||
|  |     sock = ::socket(AF_INET, SOCK_STREAM, 0); | ||||||
|  |     if(sock < 0) { | ||||||
|  |         return INVALID_SOCKET; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     while ((retval = ::connect(sock, | ||||||
|  |                 reinterpret_cast<struct sockaddr *>(&server), sizeof (server))) == -1 | ||||||
|  |           && (errno == EINTR)) | ||||||
|  |         ; | ||||||
|  |     if(retval == INVALID_SOCKET) { | ||||||
|  |         ::close(sock); | ||||||
|  |         return INVALID_SOCKET; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     state = ok; | ||||||
|  |     return sock; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace | ||||||
|  | { | ||||||
|  |  | ||||||
|  | //! Helper for accept_wrap(). | ||||||
|  | template <typename T, typename U> | ||||||
|  | struct socklen_var | ||||||
|  | { | ||||||
|  |     typedef T type; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | template <typename U> | ||||||
|  | struct socklen_var<void, U> | ||||||
|  | { | ||||||
|  |     typedef U type; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Some systems like HP-UX have socklen_t but accept() does not use it | ||||||
|  | // as type of its 3rd parameter. This wrapper works around this | ||||||
|  | // incompatibility. | ||||||
|  | template <typename accept_sockaddr_ptr_type, typename accept_socklen_type> | ||||||
|  | static | ||||||
|  | SOCKET_TYPE | ||||||
|  | accept_wrap ( | ||||||
|  |     int (* accept_func) (int, accept_sockaddr_ptr_type, accept_socklen_type *), | ||||||
|  |     SOCKET_TYPE sock, struct sockaddr * sa, socklen_t * len) | ||||||
|  | { | ||||||
|  |     typedef typename socklen_var<accept_socklen_type, socklen_t>::type | ||||||
|  |         socklen_var_type; | ||||||
|  |     socklen_var_type l = static_cast<socklen_var_type>(*len); | ||||||
|  |     SOCKET_TYPE result | ||||||
|  |         = static_cast<SOCKET_TYPE>( | ||||||
|  |             accept_func (sock, sa, | ||||||
|  |                 reinterpret_cast<accept_socklen_type *>(&l))); | ||||||
|  |     *len = static_cast<socklen_t>(l); | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace | ||||||
|  |  | ||||||
|  |  | ||||||
|  | SOCKET_TYPE | ||||||
|  | log4cplus::helpers::acceptSocket(SOCKET_TYPE sock, SocketState& state) | ||||||
|  | { | ||||||
|  |     struct sockaddr_in net_client; | ||||||
|  |     socklen_t len = sizeof(struct sockaddr); | ||||||
|  |     SOCKET_TYPE clientSock; | ||||||
|  |  | ||||||
|  |     while(   (clientSock = accept_wrap (accept, sock, | ||||||
|  |                 (struct sockaddr*)&net_client, &len)) == -1 | ||||||
|  |           && (errno == EINTR)) | ||||||
|  |         ; | ||||||
|  |  | ||||||
|  |     if(clientSock != INVALID_SOCKET) { | ||||||
|  |         state = ok; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return clientSock; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int | ||||||
|  | log4cplus::helpers::closeSocket(SOCKET_TYPE sock) | ||||||
|  | { | ||||||
|  |     return ::close(sock); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | long | ||||||
|  | log4cplus::helpers::read(SOCKET_TYPE sock, SocketBuffer& buffer) | ||||||
|  | { | ||||||
|  |     long read = 0; | ||||||
|  |   | ||||||
|  |     do | ||||||
|  |     {  | ||||||
|  |         long res = ::read(sock, buffer.getBuffer() + read, | ||||||
|  |             buffer.getMaxSize() - read); | ||||||
|  |         if( res <= 0 ) { | ||||||
|  |             return res; | ||||||
|  |         } | ||||||
|  |         read += res; | ||||||
|  |     } while( read < static_cast<long>(buffer.getMaxSize()) ); | ||||||
|  |   | ||||||
|  |     return read; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | long | ||||||
|  | log4cplus::helpers::write(SOCKET_TYPE sock, const SocketBuffer& buffer) | ||||||
|  | { | ||||||
|  | #if defined(MSG_NOSIGNAL) | ||||||
|  |     int flags = MSG_NOSIGNAL; | ||||||
|  | #else | ||||||
|  |     int flags = 0; | ||||||
|  | #endif | ||||||
|  |     return ::send( sock, buffer.getBuffer(), buffer.getSize(), flags ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | tstring | ||||||
|  | log4cplus::helpers::getHostname (bool fqdn) | ||||||
|  | { | ||||||
|  |     char const * hostname = "unknown"; | ||||||
|  |     int ret; | ||||||
|  |     std::vector<char> hn (1024, 0); | ||||||
|  |  | ||||||
|  |     while (true) | ||||||
|  |     { | ||||||
|  |         ret = ::gethostname (&hn[0], static_cast<int>(hn.size ()) - 1); | ||||||
|  |         if (ret == 0) | ||||||
|  |         { | ||||||
|  |             hostname = &hn[0]; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  | #if defined (LOG4CPLUS_HAVE_ENAMETOOLONG) | ||||||
|  |         else if (ret != 0 && errno == ENAMETOOLONG) | ||||||
|  |             // Out buffer was too short. Retry with buffer twice the size. | ||||||
|  |             hn.resize (hn.size () * 2, 0); | ||||||
|  | #endif | ||||||
|  |         else | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (ret != 0 || (ret == 0 && ! fqdn)) | ||||||
|  |         return LOG4CPLUS_STRING_TO_TSTRING (hostname); | ||||||
|  |  | ||||||
|  |     std::string full_hostname; | ||||||
|  |     ret = get_host_by_name (hostname, &full_hostname, 0); | ||||||
|  |     if (ret == 0) | ||||||
|  |         hostname = full_hostname.c_str (); | ||||||
|  |  | ||||||
|  |     return LOG4CPLUS_STRING_TO_TSTRING (hostname); | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										293
									
								
								libs/log4cplus/src/socket-win32.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										293
									
								
								libs/log4cplus/src/socket-win32.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,293 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    socket-win32.cxx | ||||||
|  | // Created: 4/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <cassert> | ||||||
|  | #include <vector> | ||||||
|  | #include <log4cplus/helpers/socket.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ///////////////////////////////////////////////////////////////////////////// | ||||||
|  | // file LOCAL Classes | ||||||
|  | ///////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | namespace | ||||||
|  | { | ||||||
|  |  | ||||||
|  | enum WSInitStates | ||||||
|  | { | ||||||
|  |     WS_UNINITIALIZED, | ||||||
|  |     WS_INITIALIZING, | ||||||
|  |     WS_INITIALIZED | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static WSADATA wsa; | ||||||
|  | static LONG volatile winsock_state = WS_UNINITIALIZED; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static | ||||||
|  | void | ||||||
|  | init_winsock () | ||||||
|  | { | ||||||
|  |     // Quick check first to avoid the expensive interlocked compare | ||||||
|  |     // and exchange. | ||||||
|  |     if (winsock_state == WS_INITIALIZED) | ||||||
|  |         return; | ||||||
|  |  | ||||||
|  |     // Try to change the state to WS_INITIALIZING. | ||||||
|  |     LONG val = ::InterlockedCompareExchange ( | ||||||
|  |         const_cast<LPLONG>(&winsock_state), WS_INITIALIZING, WS_UNINITIALIZED); | ||||||
|  |     switch (val) | ||||||
|  |     { | ||||||
|  |     case WS_UNINITIALIZED: | ||||||
|  |     { | ||||||
|  |         int ret = WSAStartup (MAKEWORD (2, 2), &wsa); | ||||||
|  |         if (ret != 0) | ||||||
|  |         { | ||||||
|  |             // Revert the state back to WS_UNINITIALIZED to unblock other | ||||||
|  |             // threads and let them throw exception. | ||||||
|  |             val = ::InterlockedCompareExchange ( | ||||||
|  |                 const_cast<LPLONG>(&winsock_state), WS_UNINITIALIZED, | ||||||
|  |                 WS_INITIALIZING); | ||||||
|  |             assert (val == WS_INITIALIZING); | ||||||
|  |             throw std::runtime_error ("Could not initialize WinSock."); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // WinSock is initialized, change the state to WS_INITIALIZED. | ||||||
|  |         val = ::InterlockedCompareExchange ( | ||||||
|  |             const_cast<LPLONG>(&winsock_state), WS_INITIALIZED, | ||||||
|  |             WS_INITIALIZING); | ||||||
|  |         assert (val == WS_INITIALIZING); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     case WS_INITIALIZING: | ||||||
|  |         // Wait for state change. | ||||||
|  |         while (true) | ||||||
|  |         { | ||||||
|  |             switch (winsock_state) | ||||||
|  |             { | ||||||
|  |             case WS_INITIALIZED: | ||||||
|  |                 return; | ||||||
|  |  | ||||||
|  |             case WS_INITIALIZING: | ||||||
|  |                 ::Sleep (0); | ||||||
|  |                 continue; | ||||||
|  |          | ||||||
|  |             default: | ||||||
|  |                 assert (0); | ||||||
|  |                 throw std::runtime_error ("Unknown WinSock state."); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     case WS_INITIALIZED: | ||||||
|  |         // WinSock is already initialized. | ||||||
|  |         return; | ||||||
|  |  | ||||||
|  |     default: | ||||||
|  |         assert (0); | ||||||
|  |         throw std::runtime_error ("Unknown WinSock state."); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | struct WinSockInitializer | ||||||
|  | { | ||||||
|  |     ~WinSockInitializer () | ||||||
|  |     { | ||||||
|  |         if (winsock_state == WS_INITIALIZED) | ||||||
|  |             WSACleanup (); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     static WinSockInitializer winSockInitializer; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | WinSockInitializer WinSockInitializer::winSockInitializer; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ///////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Global Methods | ||||||
|  | ///////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | SOCKET_TYPE | ||||||
|  | log4cplus::helpers::openSocket(unsigned short port, SocketState& state) | ||||||
|  | { | ||||||
|  |     init_winsock (); | ||||||
|  |  | ||||||
|  |     SOCKET sock = ::socket(AF_INET, SOCK_STREAM, 0); | ||||||
|  |     if(sock == INVALID_SOCKET) { | ||||||
|  |         return sock; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     struct sockaddr_in server; | ||||||
|  |     server.sin_family = AF_INET; | ||||||
|  |     server.sin_addr.s_addr = htonl(INADDR_ANY); | ||||||
|  |     server.sin_port = htons(port); | ||||||
|  |  | ||||||
|  |     if(bind(sock, (struct sockaddr*)&server, sizeof(server)) != 0) { | ||||||
|  |         return INVALID_SOCKET; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if(::listen(sock, 10) != 0) { | ||||||
|  |         return INVALID_SOCKET; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     state = ok; | ||||||
|  |     return sock; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | SOCKET_TYPE | ||||||
|  | log4cplus::helpers::connectSocket(const log4cplus::tstring& hostn,  | ||||||
|  |                                   unsigned short port, SocketState& state) | ||||||
|  | { | ||||||
|  |     init_winsock (); | ||||||
|  |  | ||||||
|  |     SOCKET sock = ::socket(AF_INET, SOCK_STREAM, 0); | ||||||
|  |     if(sock == INVALID_SOCKET) { | ||||||
|  |         return INVALID_SOCKET; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     unsigned long ip = INADDR_NONE; | ||||||
|  |     struct hostent *hp = ::gethostbyname( LOG4CPLUS_TSTRING_TO_STRING(hostn).c_str() ); | ||||||
|  |     if(hp == 0 || hp->h_addrtype != AF_INET) { | ||||||
|  |         ip = inet_addr( LOG4CPLUS_TSTRING_TO_STRING(hostn).c_str() ); | ||||||
|  |         if(ip == INADDR_NONE) { | ||||||
|  |             state = bad_address; | ||||||
|  |             return INVALID_SOCKET; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     struct sockaddr_in insock; | ||||||
|  |     insock.sin_port = htons(port); | ||||||
|  |     insock.sin_family = AF_INET; | ||||||
|  |     if(hp != 0) { | ||||||
|  |         memcpy(&insock.sin_addr, hp->h_addr, sizeof insock.sin_addr); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         insock.sin_addr.S_un.S_addr = ip; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     int retval; | ||||||
|  |     while(   (retval = ::connect(sock, (struct sockaddr*)&insock, sizeof(insock))) == -1 | ||||||
|  |           && (WSAGetLastError() == WSAEINTR)) | ||||||
|  |         ; | ||||||
|  |     if(retval == SOCKET_ERROR) { | ||||||
|  |         ::closesocket(sock); | ||||||
|  |         return INVALID_SOCKET; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     int enabled = 1; | ||||||
|  |     if(setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char*)&enabled, sizeof(enabled)) != 0) { | ||||||
|  |         ::closesocket(sock);     | ||||||
|  |         return INVALID_SOCKET; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     state = ok; | ||||||
|  |     return sock; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | SOCKET_TYPE | ||||||
|  | log4cplus::helpers::acceptSocket(SOCKET_TYPE sock, SocketState& /*state*/) | ||||||
|  | { | ||||||
|  |     init_winsock (); | ||||||
|  |  | ||||||
|  |     return ::accept(sock, NULL, NULL); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int | ||||||
|  | log4cplus::helpers::closeSocket(SOCKET_TYPE sock) | ||||||
|  | { | ||||||
|  |     return ::closesocket(sock); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | long | ||||||
|  | log4cplus::helpers::read(SOCKET_TYPE sock, SocketBuffer& buffer) | ||||||
|  | { | ||||||
|  |     long read = 0; | ||||||
|  |   | ||||||
|  |     do | ||||||
|  |     {  | ||||||
|  |         long res = ::recv(sock, buffer.getBuffer() + read, | ||||||
|  |             static_cast<int>(buffer.getMaxSize() - read), 0); | ||||||
|  |         if( res <= 0 ) { | ||||||
|  |             return res; | ||||||
|  |         } | ||||||
|  |         read += res; | ||||||
|  |     } while( read < static_cast<long>(buffer.getMaxSize()) ); | ||||||
|  |   | ||||||
|  |     return read; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | long | ||||||
|  | log4cplus::helpers::write(SOCKET_TYPE sock, const SocketBuffer& buffer) | ||||||
|  | { | ||||||
|  |     return ::send(sock, buffer.getBuffer(), static_cast<int>(buffer.getSize()), 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | tstring | ||||||
|  | log4cplus::helpers::getHostname (bool fqdn) | ||||||
|  | { | ||||||
|  |     char const * hostname = "unknown"; | ||||||
|  |     int ret; | ||||||
|  |     std::vector<char> hn (1024, 0); | ||||||
|  |  | ||||||
|  |     while (true) | ||||||
|  |     { | ||||||
|  |         ret = ::gethostname (&hn[0], static_cast<int>(hn.size ()) - 1); | ||||||
|  |         if (ret == 0) | ||||||
|  |         { | ||||||
|  |             hostname = &hn[0]; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         else if (ret != 0 && WSAGetLastError () == WSAEFAULT) | ||||||
|  |             // Out buffer was too short. Retry with buffer twice the size. | ||||||
|  |             hn.resize (hn.size () * 2, 0); | ||||||
|  |         else | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (ret != 0 || (ret == 0 && ! fqdn)) | ||||||
|  |         return LOG4CPLUS_STRING_TO_TSTRING (hostname); | ||||||
|  |  | ||||||
|  |     struct ::hostent * hp = ::gethostbyname (hostname); | ||||||
|  |     if (hp) | ||||||
|  |         hostname = hp->h_name; | ||||||
|  |  | ||||||
|  |     return LOG4CPLUS_STRING_TO_TSTRING (hostname); | ||||||
|  | } | ||||||
							
								
								
									
										226
									
								
								libs/log4cplus/src/socket.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								libs/log4cplus/src/socket.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,226 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    socket-win32.cxx | ||||||
|  | // Created: 4/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/helpers/socket.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  |  | ||||||
|  | #if !defined(_WIN32) | ||||||
|  | #  include <errno.h> | ||||||
|  | #  include <unistd.h> | ||||||
|  | #  define GET_LAST_ERROR errno | ||||||
|  | #else | ||||||
|  | #  define GET_LAST_ERROR WSAGetLastError() | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // AbstractSocket ctors and dtor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::helpers::AbstractSocket::AbstractSocket() | ||||||
|  | : sock(INVALID_SOCKET), | ||||||
|  |   state(not_opened), | ||||||
|  |   err(0) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::helpers::AbstractSocket::AbstractSocket(SOCKET_TYPE sock_, SocketState state_, int err_) | ||||||
|  | : sock(sock_), | ||||||
|  |   state(state_), | ||||||
|  |   err(err_) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::helpers::AbstractSocket::AbstractSocket(const log4cplus::helpers::AbstractSocket& rhs) | ||||||
|  | { | ||||||
|  |     copy(rhs); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::helpers::AbstractSocket::~AbstractSocket() | ||||||
|  | { | ||||||
|  |     close(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // AbstractSocket methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | log4cplus::helpers::AbstractSocket::close() | ||||||
|  | { | ||||||
|  |     if(sock != INVALID_SOCKET) { | ||||||
|  |         closeSocket(sock); | ||||||
|  |         sock = INVALID_SOCKET; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | log4cplus::helpers::AbstractSocket::isOpen() const | ||||||
|  | { | ||||||
|  |     return sock != INVALID_SOCKET; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::helpers::AbstractSocket& | ||||||
|  | log4cplus::helpers::AbstractSocket::operator=(const log4cplus::helpers::AbstractSocket& rhs) | ||||||
|  | { | ||||||
|  |     if(&rhs != this) { | ||||||
|  |         close(); | ||||||
|  |         copy(rhs); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | log4cplus::helpers::AbstractSocket::copy(const log4cplus::helpers::AbstractSocket& r) | ||||||
|  | { | ||||||
|  |     AbstractSocket& rhs = const_cast<AbstractSocket&>(r); | ||||||
|  |     sock = rhs.sock; | ||||||
|  |     state = rhs.state; | ||||||
|  |     err = rhs.err; | ||||||
|  |     rhs.sock = INVALID_SOCKET; | ||||||
|  |     rhs.state = not_opened; | ||||||
|  |     rhs.err = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Socket ctors and dtor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::helpers::Socket::Socket() | ||||||
|  | : AbstractSocket() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::helpers::Socket::Socket(const tstring& address, int port) | ||||||
|  | : AbstractSocket() | ||||||
|  | { | ||||||
|  |     sock = connectSocket(address, port, state); | ||||||
|  |     if(sock == INVALID_SOCKET) { | ||||||
|  |         err = GET_LAST_ERROR; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::helpers::Socket::Socket(SOCKET_TYPE sock_, SocketState state_, int err_) | ||||||
|  | : AbstractSocket(sock_, state_, err_) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::helpers::Socket::~Socket() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Socket methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | log4cplus::helpers::Socket::read(SocketBuffer& buffer) | ||||||
|  | { | ||||||
|  |     long retval = log4cplus::helpers::read(sock, buffer); | ||||||
|  |     if(retval <= 0) { | ||||||
|  |         close(); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         buffer.setSize(retval); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return (retval > 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | log4cplus::helpers::Socket::write(const SocketBuffer& buffer) | ||||||
|  | { | ||||||
|  |     long retval = log4cplus::helpers::write(sock, buffer); | ||||||
|  |     if(retval <= 0) { | ||||||
|  |         close(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return (retval > 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // ServerSocket ctor and dtor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::helpers::ServerSocket::ServerSocket(int port) | ||||||
|  | { | ||||||
|  |     sock = openSocket(port, state); | ||||||
|  |     if(sock == INVALID_SOCKET) { | ||||||
|  |         err = GET_LAST_ERROR; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::helpers::ServerSocket::~ServerSocket() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // ServerSocket methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::helpers::Socket | ||||||
|  | log4cplus::helpers::ServerSocket::accept() | ||||||
|  | { | ||||||
|  |     SocketState state_; | ||||||
|  |     SOCKET_TYPE clientSock = acceptSocket(sock, state_); | ||||||
|  |     return Socket(clientSock, state_, 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										326
									
								
								libs/log4cplus/src/socketappender.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										326
									
								
								libs/log4cplus/src/socketappender.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,326 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    socketappender.cxx | ||||||
|  | // Created: 5/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <cstdlib> | ||||||
|  | #include <log4cplus/socketappender.h> | ||||||
|  | #include <log4cplus/layout.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/spi/loggingevent.h> | ||||||
|  | #include <log4cplus/helpers/sleep.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int const LOG4CPLUS_MESSAGE_VERSION = 2; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus | ||||||
|  | { | ||||||
|  |  | ||||||
|  | #if ! defined (LOG4CPLUS_SINGLE_THREADED) | ||||||
|  | SocketAppender::ConnectorThread::ConnectorThread ( | ||||||
|  |     SocketAppender & socket_appender) | ||||||
|  |     : sa (socket_appender) | ||||||
|  |     , exit_flag (false) | ||||||
|  | { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | SocketAppender::ConnectorThread::~ConnectorThread () | ||||||
|  | { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | SocketAppender::ConnectorThread::run () | ||||||
|  | { | ||||||
|  |     while (true) | ||||||
|  |     { | ||||||
|  |         trigger_ev.timed_wait (30 * 1000); | ||||||
|  |  | ||||||
|  |         getLogLog().debug ( | ||||||
|  |             LOG4CPLUS_TEXT("SocketAppender::ConnectorThread::run()") | ||||||
|  |             LOG4CPLUS_TEXT("- running...")); | ||||||
|  |  | ||||||
|  |         // Check exit condition as the very first thing. | ||||||
|  |  | ||||||
|  |         { | ||||||
|  |             thread::Guard guard (access_mutex); | ||||||
|  |             if (exit_flag) | ||||||
|  |                 return; | ||||||
|  |             trigger_ev.reset (); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Do not try to re-open already open socket. | ||||||
|  |  | ||||||
|  |         { | ||||||
|  |             thread::Guard guard (sa.access_mutex); | ||||||
|  |             if (sa.socket.isOpen ()) | ||||||
|  |                 continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // The socket is not open, try to reconnect. | ||||||
|  |  | ||||||
|  |         helpers::Socket socket (sa.host, sa.port); | ||||||
|  |         if (! socket.isOpen ()) | ||||||
|  |         { | ||||||
|  |             getLogLog().error( | ||||||
|  |                 LOG4CPLUS_TEXT("SocketAppender::ConnectorThread::run()") | ||||||
|  |                 LOG4CPLUS_TEXT("- Cannot connect to server")); | ||||||
|  |  | ||||||
|  |             // Sleep for a short while after unsuccessful connection attempt | ||||||
|  |             // so that we do not try to reconnect after each logging attempt | ||||||
|  |             // which could be many times per second. | ||||||
|  |             helpers::sleep (5); | ||||||
|  |  | ||||||
|  |             continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Connection was successful, move the socket into SocketAppender. | ||||||
|  |  | ||||||
|  |         { | ||||||
|  |             thread::Guard guard (sa.access_mutex); | ||||||
|  |             sa.socket = socket; | ||||||
|  |             sa.connected = true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | SocketAppender::ConnectorThread::terminate () | ||||||
|  | { | ||||||
|  |     { | ||||||
|  |         thread::Guard guard (access_mutex); | ||||||
|  |         exit_flag = true; | ||||||
|  |         trigger_ev.signal (); | ||||||
|  |     } | ||||||
|  |     join (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | SocketAppender::ConnectorThread::trigger () | ||||||
|  | { | ||||||
|  |     trigger_ev.signal (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // SocketAppender ctors and dtor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | SocketAppender::SocketAppender(const tstring& host_, int port_, | ||||||
|  |     const tstring& serverName_) | ||||||
|  | : host(host_), | ||||||
|  |   port(port_), | ||||||
|  |   serverName(serverName_) | ||||||
|  | { | ||||||
|  |     openSocket(); | ||||||
|  |     initConnector (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | SocketAppender::SocketAppender(const helpers::Properties & properties) | ||||||
|  |  : Appender(properties), | ||||||
|  |    port(9998) | ||||||
|  | { | ||||||
|  |     host = properties.getProperty( LOG4CPLUS_TEXT("host") ); | ||||||
|  |     if(properties.exists( LOG4CPLUS_TEXT("port") )) { | ||||||
|  |         tstring tmp = properties.getProperty( LOG4CPLUS_TEXT("port") ); | ||||||
|  |         port = std::atoi(LOG4CPLUS_TSTRING_TO_STRING(tmp).c_str()); | ||||||
|  |     } | ||||||
|  |     serverName = properties.getProperty( LOG4CPLUS_TEXT("ServerName") ); | ||||||
|  |  | ||||||
|  |     openSocket(); | ||||||
|  |     initConnector (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | SocketAppender::~SocketAppender() | ||||||
|  | { | ||||||
|  | #if ! defined (LOG4CPLUS_SINGLE_THREADED) | ||||||
|  |     connector->terminate (); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     destructorImpl(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // SocketAppender public methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | SocketAppender::close() | ||||||
|  | { | ||||||
|  |     getLogLog().debug(LOG4CPLUS_TEXT("Entering SocketAppender::close()...")); | ||||||
|  |  | ||||||
|  | #if ! defined (LOG4CPLUS_SINGLE_THREADED) | ||||||
|  |     connector->terminate (); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     socket.close(); | ||||||
|  |     closed = true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // SocketAppender protected methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | SocketAppender::openSocket() | ||||||
|  | { | ||||||
|  |     if(!socket.isOpen()) { | ||||||
|  |         socket = helpers::Socket(host, port); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | SocketAppender::initConnector () | ||||||
|  | { | ||||||
|  | #if ! defined (LOG4CPLUS_SINGLE_THREADED) | ||||||
|  |     connected = true; | ||||||
|  |     connector = new ConnectorThread (*this); | ||||||
|  |     connector->start (); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | SocketAppender::append(const spi::InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  | #if ! defined (LOG4CPLUS_SINGLE_THREADED) | ||||||
|  |     if (! connected) | ||||||
|  |     { | ||||||
|  |         connector->trigger (); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | #else | ||||||
|  |     if(!socket.isOpen()) { | ||||||
|  |         openSocket(); | ||||||
|  |         if(!socket.isOpen()) { | ||||||
|  |             getLogLog().error(LOG4CPLUS_TEXT("SocketAppender::append()- Cannot connect to server")); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     helpers::SocketBuffer buffer = helpers::convertToBuffer(event, serverName); | ||||||
|  |     helpers::SocketBuffer msgBuffer(LOG4CPLUS_MAX_MESSAGE_SIZE); | ||||||
|  |  | ||||||
|  |     msgBuffer.appendSize_t(buffer.getSize()); | ||||||
|  |     msgBuffer.appendBuffer(buffer); | ||||||
|  |  | ||||||
|  |     bool ret = socket.write(msgBuffer); | ||||||
|  |     if (! ret) | ||||||
|  |     { | ||||||
|  | #if ! defined (LOG4CPLUS_SINGLE_THREADED) | ||||||
|  |         connected = false; | ||||||
|  |         connector->trigger (); | ||||||
|  | #endif | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ///////////////////////////////////////////////////////////////////////////// | ||||||
|  | // namespace helpers methods | ||||||
|  | ///////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | namespace helpers | ||||||
|  | { | ||||||
|  |  | ||||||
|  | SocketBuffer | ||||||
|  | convertToBuffer(const spi::InternalLoggingEvent& event, | ||||||
|  |     const tstring& serverName) | ||||||
|  | { | ||||||
|  |     SocketBuffer buffer(LOG4CPLUS_MAX_MESSAGE_SIZE - sizeof(unsigned int)); | ||||||
|  |  | ||||||
|  |     buffer.appendByte(LOG4CPLUS_MESSAGE_VERSION); | ||||||
|  | #ifndef UNICODE | ||||||
|  |     buffer.appendByte(1); | ||||||
|  | #else | ||||||
|  |     buffer.appendByte(2); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     buffer.appendString(serverName); | ||||||
|  |     buffer.appendString(event.getLoggerName()); | ||||||
|  |     buffer.appendInt(event.getLogLevel()); | ||||||
|  |     buffer.appendString(event.getNDC()); | ||||||
|  |     buffer.appendString(event.getMessage()); | ||||||
|  |     buffer.appendString(event.getThread()); | ||||||
|  |     buffer.appendInt( static_cast<unsigned int>(event.getTimestamp().sec()) ); | ||||||
|  |     buffer.appendInt( static_cast<unsigned int>(event.getTimestamp().usec()) ); | ||||||
|  |     buffer.appendString(event.getFile()); | ||||||
|  |     buffer.appendInt(event.getLine()); | ||||||
|  |  | ||||||
|  |     return buffer; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | spi::InternalLoggingEvent | ||||||
|  | readFromBuffer(SocketBuffer& buffer) | ||||||
|  | { | ||||||
|  |     unsigned char msgVersion = buffer.readByte(); | ||||||
|  |     if(msgVersion != LOG4CPLUS_MESSAGE_VERSION) { | ||||||
|  |         SharedObjectPtr<LogLog> loglog = LogLog::getLogLog(); | ||||||
|  |         loglog->warn(LOG4CPLUS_TEXT("readFromBuffer() received socket message with an invalid version")); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     unsigned char sizeOfChar = buffer.readByte(); | ||||||
|  |  | ||||||
|  |     tstring serverName = buffer.readString(sizeOfChar); | ||||||
|  |     tstring loggerName = buffer.readString(sizeOfChar); | ||||||
|  |     LogLevel ll = buffer.readInt(); | ||||||
|  |     tstring ndc = buffer.readString(sizeOfChar); | ||||||
|  |     if(! serverName.empty ()) { | ||||||
|  |         if(ndc.empty ()) { | ||||||
|  |             ndc = serverName; | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             ndc = serverName + LOG4CPLUS_TEXT(" - ") + ndc; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     tstring message = buffer.readString(sizeOfChar); | ||||||
|  |     tstring thread = buffer.readString(sizeOfChar); | ||||||
|  |     long sec = buffer.readInt(); | ||||||
|  |     long usec = buffer.readInt(); | ||||||
|  |     tstring file = buffer.readString(sizeOfChar); | ||||||
|  |     int line = buffer.readInt(); | ||||||
|  |  | ||||||
|  |     return spi::InternalLoggingEvent(loggerName, | ||||||
|  |                                                 ll, | ||||||
|  |                                                 ndc, | ||||||
|  |                                                 message, | ||||||
|  |                                                 thread, | ||||||
|  |                                                 Time(sec, usec), | ||||||
|  |                                                 file, | ||||||
|  |                                                 line); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } // namespace helpers | ||||||
|  |  | ||||||
|  | } // namespace log4cplus | ||||||
							
								
								
									
										345
									
								
								libs/log4cplus/src/socketbuffer.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										345
									
								
								libs/log4cplus/src/socketbuffer.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,345 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    socketbuffer.cxx | ||||||
|  | // Created: 5/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <cstring> | ||||||
|  | #include <limits> | ||||||
|  | #include <log4cplus/helpers/socketbuffer.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  |  | ||||||
|  | #if !defined(_WIN32) | ||||||
|  | #  include <netdb.h> | ||||||
|  | #else | ||||||
|  | #include <winsock.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined (__CYGWIN__) || defined (LOG4CPLUS_HAVE_NETINET_IN_H) | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // SocketBuffer ctors and dtor | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::helpers::SocketBuffer::SocketBuffer(size_t maxsize_) | ||||||
|  | : maxsize(maxsize_), | ||||||
|  |   size(0), | ||||||
|  |   pos(0), | ||||||
|  |   buffer(new char[maxsize_]) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::helpers::SocketBuffer::SocketBuffer(const SocketBuffer& rhs) | ||||||
|  |     : log4cplus::helpers::LogLogUser () | ||||||
|  | { | ||||||
|  |     copy(rhs); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::helpers::SocketBuffer::~SocketBuffer() | ||||||
|  | { | ||||||
|  |     delete [] buffer; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | SocketBuffer&  | ||||||
|  | log4cplus::helpers::SocketBuffer::operator=(const SocketBuffer& rhs) | ||||||
|  | { | ||||||
|  |     if(&rhs != this) { | ||||||
|  |         delete buffer; | ||||||
|  |         copy(rhs); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | log4cplus::helpers::SocketBuffer::copy(const SocketBuffer& r) | ||||||
|  | { | ||||||
|  |     SocketBuffer& rhs = const_cast<SocketBuffer&>(r); | ||||||
|  |     maxsize = rhs.maxsize; | ||||||
|  |     size = rhs.size; | ||||||
|  |     pos = rhs.pos; | ||||||
|  |     buffer = rhs.buffer; | ||||||
|  |  | ||||||
|  |     rhs.maxsize = 0; | ||||||
|  |     rhs.size = 0; | ||||||
|  |     rhs.pos = 0; | ||||||
|  |     rhs.buffer = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // SocketBuffer methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | unsigned char | ||||||
|  | log4cplus::helpers::SocketBuffer::readByte() | ||||||
|  | { | ||||||
|  |     if(pos >= maxsize) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::readByte()- end of buffer reached")); | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |     else if((pos + sizeof(unsigned char)) > maxsize) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::readByte()- Attempt to read beyond end of buffer")); | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     unsigned char ret = *((unsigned char*)&buffer[pos]); | ||||||
|  |     pos += sizeof(unsigned char); | ||||||
|  |  | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | unsigned short | ||||||
|  | log4cplus::helpers::SocketBuffer::readShort() | ||||||
|  | { | ||||||
|  |     if(pos >= maxsize) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::readShort()- end of buffer reached")); | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |     else if((pos + sizeof(unsigned short)) > maxsize) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::readShort()- Attempt to read beyond end of buffer")); | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     unsigned short ret; | ||||||
|  |     std::memcpy(&ret, buffer + pos, sizeof(ret)); | ||||||
|  |     ret = ntohs(ret); | ||||||
|  |     pos += sizeof(unsigned short); | ||||||
|  |  | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | unsigned int | ||||||
|  | log4cplus::helpers::SocketBuffer::readInt() | ||||||
|  | { | ||||||
|  |     if(pos >= maxsize) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::readInt()- end of buffer reached")); | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |     else if((pos + sizeof(unsigned int)) > maxsize) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::readInt()- Attempt to read beyond end of buffer")); | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     unsigned int ret; | ||||||
|  |     std::memcpy (&ret, buffer + pos, sizeof(ret)); | ||||||
|  |     ret = ntohl(ret); | ||||||
|  |     pos += sizeof(unsigned int); | ||||||
|  |      | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | tstring | ||||||
|  | log4cplus::helpers::SocketBuffer::readString(unsigned char sizeOfChar) | ||||||
|  | { | ||||||
|  |     size_t strlen = readInt(); | ||||||
|  |     size_t bufferLen = strlen * sizeOfChar; | ||||||
|  |  | ||||||
|  |     if(strlen == 0) { | ||||||
|  |         return tstring(); | ||||||
|  |     } | ||||||
|  |     if(pos > maxsize) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::readString()- end of buffer reached")); | ||||||
|  |         return tstring(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if((pos + bufferLen) > maxsize) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::readString()- Attempt to read beyond end of buffer")); | ||||||
|  |         bufferLen = (maxsize - 1) - pos; | ||||||
|  |         strlen = bufferLen / sizeOfChar; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | #ifndef UNICODE | ||||||
|  |     if(sizeOfChar == 1) { | ||||||
|  |         tstring ret(&buffer[pos], strlen); | ||||||
|  |         pos += strlen; | ||||||
|  |         return ret; | ||||||
|  |     } | ||||||
|  |     else if(sizeOfChar == 2) { | ||||||
|  |         tstring ret; | ||||||
|  |         for(tstring::size_type i=0; i<strlen; ++i) { | ||||||
|  |             unsigned short tmp = readShort(); | ||||||
|  |             ret += static_cast<char>(tmp < 256 ? tmp : ' '); | ||||||
|  |         } | ||||||
|  |         return ret; | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::readString()- Invalid sizeOfChar!!!!")); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | #else /* UNICODE */ | ||||||
|  |     if(sizeOfChar == 1) { | ||||||
|  |         std::string ret(&buffer[pos], strlen); | ||||||
|  |         pos += strlen; | ||||||
|  |         return towstring(ret); | ||||||
|  |     } | ||||||
|  |     else if(sizeOfChar == 2) { | ||||||
|  |         tstring ret; | ||||||
|  |         for(tstring::size_type i=0; i<strlen; ++i) { | ||||||
|  |             ret += static_cast<tchar>(readShort()); | ||||||
|  |         } | ||||||
|  |         return ret; | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::readString()- Invalid sizeOfChar!!!!")); | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     return tstring(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | log4cplus::helpers::SocketBuffer::appendByte(unsigned char val) | ||||||
|  | { | ||||||
|  |     if((pos + sizeof(unsigned char)) > maxsize) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::appendByte()- Attempt to write beyond end of buffer")); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     *((unsigned char*)&buffer[pos]) = val; | ||||||
|  |     pos += sizeof(unsigned char); | ||||||
|  |     size = pos; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | log4cplus::helpers::SocketBuffer::appendShort(unsigned short val) | ||||||
|  | { | ||||||
|  |     if((pos + sizeof(unsigned short)) > maxsize) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::appendShort()- Attempt to write beyond end of buffer")); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     unsigned short s = htons(val); | ||||||
|  |     std::memcpy(buffer + pos, &s, sizeof (s)); | ||||||
|  |     pos += sizeof(s); | ||||||
|  |     size = pos; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | log4cplus::helpers::SocketBuffer::appendInt(unsigned int val) | ||||||
|  | { | ||||||
|  |     if((pos + sizeof(unsigned int)) > maxsize) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::appendInt()- Attempt to write beyond end of buffer")); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     int i = htonl(val); | ||||||
|  |     std::memcpy(buffer + pos, &i, sizeof (i)); | ||||||
|  |     pos += sizeof(i); | ||||||
|  |     size = pos; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | log4cplus::helpers::SocketBuffer::appendSize_t(size_t val) | ||||||
|  | { | ||||||
|  |     if ((pos + sizeof(unsigned)) > maxsize) | ||||||
|  |     { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::appendInt(size_t)- ") | ||||||
|  |             LOG4CPLUS_TEXT("Attempt to write beyond end of buffer")); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |     if (val > (std::numeric_limits<unsigned>::max) ()) | ||||||
|  |     { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::appendInt(size_t)-") | ||||||
|  |             LOG4CPLUS_TEXT(" Attempt to write value greater than") | ||||||
|  |             LOG4CPLUS_TEXT(" std::numeric_limits<unsigned>::max")); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     unsigned st = htonl(static_cast<unsigned>(val)); | ||||||
|  |     std::memcpy(buffer + pos, &st, sizeof(st)); | ||||||
|  |     pos += sizeof(st); | ||||||
|  |     size = pos; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | log4cplus::helpers::SocketBuffer::appendString(const tstring& str) | ||||||
|  | { | ||||||
|  | #ifndef UNICODE | ||||||
|  |     size_t strlen = str.length(); | ||||||
|  |  | ||||||
|  |     if((pos + sizeof(unsigned int) + strlen) > maxsize) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::appendString()- Attempt to write beyond end of buffer")); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     appendInt(static_cast<unsigned>(strlen)); | ||||||
|  |     std::memcpy(&buffer[pos], str.data(), strlen); | ||||||
|  |     pos += strlen; | ||||||
|  |     size = pos; | ||||||
|  | #else | ||||||
|  |     size_t strlen = str.length(); | ||||||
|  |  | ||||||
|  |     if((pos + sizeof(unsigned int) + (strlen * 2)) > maxsize) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::appendString()- Attempt to write beyond end of buffer")); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     appendInt(static_cast<unsigned>(strlen)); | ||||||
|  |     for(tstring::size_type i=0; i<str.length(); ++i) { | ||||||
|  |         appendShort(static_cast<unsigned short>(str[i])); | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | log4cplus::helpers::SocketBuffer::appendBuffer(const SocketBuffer& buf) | ||||||
|  | { | ||||||
|  |     if((pos + buf.getSize()) > maxsize) { | ||||||
|  |         getLogLog().error(LOG4CPLUS_TEXT("SocketBuffer::appendBuffer()- Attempt to write beyond end of buffer")); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     std::memcpy(&buffer[pos], buf.buffer, buf.getSize()); | ||||||
|  |     pos += buf.getSize(); | ||||||
|  |     size = pos; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										407
									
								
								libs/log4cplus/src/stringhelper.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										407
									
								
								libs/log4cplus/src/stringhelper.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,407 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    stringhelper.cxx | ||||||
|  | // Created: 4/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/helpers/stringhelper.h> | ||||||
|  | #include <log4cplus/streams.h> | ||||||
|  | #include <log4cplus/loggingmacros.h> | ||||||
|  |  | ||||||
|  | #include <iterator> | ||||||
|  | #include <algorithm> | ||||||
|  | #include <cstring> | ||||||
|  | #include <cwchar> | ||||||
|  | #include <cwctype> | ||||||
|  | #include <cctype> | ||||||
|  |  | ||||||
|  | #ifdef UNICODE | ||||||
|  | #  include <cassert> | ||||||
|  | #  include <vector> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | using namespace log4cplus; | ||||||
|  |  | ||||||
|  | #if defined (LOG4CPLUS_SINGLE_THREADED) | ||||||
|  |  | ||||||
|  | namespace log4cplus | ||||||
|  | { | ||||||
|  |  | ||||||
|  | tostringstream _macros_oss; | ||||||
|  |  | ||||||
|  | namespace | ||||||
|  | { | ||||||
|  |  | ||||||
|  | static tostringstream const _macros_oss_defaults; | ||||||
|  | static tstring const _empty_str; | ||||||
|  |  | ||||||
|  | } // namespace | ||||||
|  |  | ||||||
|  | void _clear_tostringstream (tostringstream & os) | ||||||
|  | { | ||||||
|  |     os.clear (); | ||||||
|  |     os.str (_empty_str); | ||||||
|  |     os.setf (_macros_oss_defaults.flags ()); | ||||||
|  |     os.fill (_macros_oss_defaults.fill ()); | ||||||
|  |     os.precision (_macros_oss_defaults.precision ()); | ||||||
|  |     os.width (_macros_oss_defaults.width ()); | ||||||
|  | #if defined (LOG4CPLUS_WORKING_LOCALE) | ||||||
|  |     std::locale glocale = std::locale (); | ||||||
|  |     if (os.getloc () != glocale) | ||||||
|  |         os.imbue (glocale); | ||||||
|  | #endif // defined (LOG4CPLUS_WORKING_LOCALE) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } // namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Global Methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | #ifdef UNICODE | ||||||
|  | log4cplus::tostream&  | ||||||
|  | operator <<(log4cplus::tostream& stream, const char* str) | ||||||
|  | { | ||||||
|  |     return (stream << log4cplus::helpers::towstring(str)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifdef LOG4CPLUS_WORKING_LOCALE | ||||||
|  |  | ||||||
|  | static | ||||||
|  | void | ||||||
|  | clear_mbstate (std::mbstate_t & mbs) | ||||||
|  | { | ||||||
|  |     // Initialize/clear mbstate_t type. | ||||||
|  |     // XXX: This is just a hack that works. The shape of mbstate_t varies | ||||||
|  |     // from single unsigned to char[128]. Without some sort of initialization | ||||||
|  |     // the codecvt::in/out methods randomly fail because the initial state is | ||||||
|  |     // random/invalid. | ||||||
|  |     ::memset (&mbs, 0, sizeof (std::mbstate_t)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static | ||||||
|  | void | ||||||
|  | towstring_internal (std::wstring & outstr, const char * src, size_t size, | ||||||
|  |     std::locale const & loc) | ||||||
|  | { | ||||||
|  |     if (size == 0) | ||||||
|  |     { | ||||||
|  |         outstr.clear (); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     typedef std::codecvt<wchar_t, char, std::mbstate_t> CodeCvt; | ||||||
|  |     const CodeCvt & cdcvt = std::use_facet<CodeCvt>(loc); | ||||||
|  |     std::mbstate_t state; | ||||||
|  |     clear_mbstate (state); | ||||||
|  |  | ||||||
|  |     char const * from_first = src; | ||||||
|  |     size_t const from_size = size; | ||||||
|  |     char const * const from_last = from_first + from_size; | ||||||
|  |     char const * from_next = from_first; | ||||||
|  |  | ||||||
|  |     std::vector<wchar_t> dest (from_size); | ||||||
|  |  | ||||||
|  |     wchar_t * to_first = &dest.front (); | ||||||
|  |     size_t to_size = dest.size (); | ||||||
|  |     wchar_t * to_last = to_first + to_size; | ||||||
|  |     wchar_t * to_next = to_first; | ||||||
|  |  | ||||||
|  |     CodeCvt::result result; | ||||||
|  |     size_t converted = 0; | ||||||
|  |     while (true) | ||||||
|  |     { | ||||||
|  |         result = cdcvt.in ( | ||||||
|  |             state, from_first, from_last, | ||||||
|  |             from_next, to_first, to_last, | ||||||
|  |             to_next); | ||||||
|  |         // XXX: Even if only half of the input has been converted the | ||||||
|  |         // in() method returns CodeCvt::ok. I think it should return | ||||||
|  |         // CodeCvt::partial. | ||||||
|  |         if ((result == CodeCvt::partial || result == CodeCvt::ok) | ||||||
|  |             && from_next != from_last) | ||||||
|  |         { | ||||||
|  |             to_size = dest.size () * 2; | ||||||
|  |             dest.resize (to_size); | ||||||
|  |             converted = to_next - to_first; | ||||||
|  |             to_first = &dest.front (); | ||||||
|  |             to_last = to_first + to_size; | ||||||
|  |             to_next = to_first + converted; | ||||||
|  |             continue; | ||||||
|  |         } | ||||||
|  |         else if (result == CodeCvt::ok && from_next == from_last) | ||||||
|  |             break; | ||||||
|  |         else if (result == CodeCvt::error | ||||||
|  |             && to_next != to_last && from_next != from_last) | ||||||
|  |         { | ||||||
|  |             clear_mbstate (state); | ||||||
|  |             ++from_next; | ||||||
|  |             from_first = from_next; | ||||||
|  |             *to_next = L'?'; | ||||||
|  |             ++to_next; | ||||||
|  |             to_first = to_next; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  |     converted = to_next - &dest[0]; | ||||||
|  |  | ||||||
|  |     outstr.assign (dest.begin (), dest.begin () + converted); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | std::wstring  | ||||||
|  | log4cplus::helpers::towstring(const std::string& src, std::locale const & loc) | ||||||
|  | { | ||||||
|  |     std::wstring ret; | ||||||
|  |     towstring_internal (ret, src.c_str (), src.size (), loc); | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | std::wstring  | ||||||
|  | log4cplus::helpers::towstring(char const * src, std::locale const & loc) | ||||||
|  | { | ||||||
|  |     std::wstring ret; | ||||||
|  |     towstring_internal (ret, src, std::strlen (src), loc); | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static | ||||||
|  | void | ||||||
|  | tostring_internal (std::string & outstr, const wchar_t * src, size_t size, | ||||||
|  |     std::locale const & loc) | ||||||
|  | { | ||||||
|  |     if (size == 0) | ||||||
|  |     { | ||||||
|  |         outstr.clear (); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     typedef std::codecvt<wchar_t, char, std::mbstate_t> CodeCvt; | ||||||
|  |     const CodeCvt & cdcvt = std::use_facet<CodeCvt>(loc); | ||||||
|  |     std::mbstate_t state; | ||||||
|  |     clear_mbstate (state); | ||||||
|  |  | ||||||
|  |     wchar_t const * from_first = src; | ||||||
|  |     size_t const from_size = size; | ||||||
|  |     wchar_t const * const from_last = from_first + from_size; | ||||||
|  |     wchar_t const * from_next = from_first; | ||||||
|  |  | ||||||
|  |     std::vector<char> dest (from_size); | ||||||
|  |  | ||||||
|  |     char * to_first = &dest.front (); | ||||||
|  |     size_t to_size = dest.size (); | ||||||
|  |     char * to_last = to_first + to_size; | ||||||
|  |     char * to_next = to_first; | ||||||
|  |  | ||||||
|  |     CodeCvt::result result; | ||||||
|  |     size_t converted = 0; | ||||||
|  |     while (from_next != from_last) | ||||||
|  |     { | ||||||
|  |         result = cdcvt.out ( | ||||||
|  |             state, from_first, from_last, | ||||||
|  |             from_next, to_first, to_last, | ||||||
|  |             to_next); | ||||||
|  |         // XXX: Even if only half of the input has been converted the | ||||||
|  |         // in() method returns CodeCvt::ok with VC8. I think it should | ||||||
|  |         // return CodeCvt::partial. | ||||||
|  |         if ((result == CodeCvt::partial || result == CodeCvt::ok) | ||||||
|  |             && from_next != from_last) | ||||||
|  |         { | ||||||
|  |             to_size = dest.size () * 2; | ||||||
|  |             dest.resize (to_size); | ||||||
|  |             converted = to_next - to_first; | ||||||
|  |             to_first = &dest.front (); | ||||||
|  |             to_last = to_first + to_size; | ||||||
|  |             to_next = to_first + converted; | ||||||
|  |         } | ||||||
|  |         else if (result == CodeCvt::ok && from_next == from_last) | ||||||
|  |             break; | ||||||
|  |         else if (result == CodeCvt::error | ||||||
|  |             && to_next != to_last && from_next != from_last) | ||||||
|  |         { | ||||||
|  |             clear_mbstate (state); | ||||||
|  |             ++from_next; | ||||||
|  |             from_first = from_next; | ||||||
|  |             *to_next = '?'; | ||||||
|  |             ++to_next; | ||||||
|  |             to_first = to_next; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  |     converted = to_next - &dest[0]; | ||||||
|  |  | ||||||
|  |     outstr.assign (dest.begin (), dest.begin () + converted); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | std::string  | ||||||
|  | log4cplus::helpers::tostring(const std::wstring& src, std::locale const & loc) | ||||||
|  | { | ||||||
|  |     std::string ret; | ||||||
|  |     tostring_internal (ret, src.c_str (), src.size (), loc); | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | std::string  | ||||||
|  | log4cplus::helpers::tostring(wchar_t const * src, std::locale const & loc) | ||||||
|  | { | ||||||
|  |     std::string ret; | ||||||
|  |     tostring_internal (ret, src, std::wcslen (src), loc); | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #else // LOG4CPLUS_WORKING_LOCALE | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static | ||||||
|  | void | ||||||
|  | tostring_internal (std::string & ret, wchar_t const * src, size_t size) | ||||||
|  | { | ||||||
|  |     ret.resize(size); | ||||||
|  |     for (size_t i = 0; i < size; ++i) | ||||||
|  |     { | ||||||
|  |         ret[i] = static_cast<unsigned> (static_cast<int> (src[i])) < 256 | ||||||
|  |             ? static_cast<char>(src[i]) : '?'; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | std::string  | ||||||
|  | log4cplus::helpers::tostring(const std::wstring& src) | ||||||
|  | { | ||||||
|  |     std::string ret; | ||||||
|  |     tostring_internal (ret, src.c_str (), src.size ()); | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | std::string  | ||||||
|  | log4cplus::helpers::tostring(wchar_t const * src) | ||||||
|  | { | ||||||
|  |     std::string ret; | ||||||
|  |     tostring_internal (ret, src, std::wcslen (src)); | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static | ||||||
|  | void | ||||||
|  | towstring_internal (std::wstring & ret, char const * src, size_t size) | ||||||
|  | { | ||||||
|  |     ret.resize(size); | ||||||
|  |     for (size_t i = 0; i < size; ++i) | ||||||
|  |     { | ||||||
|  |         ret[i] = static_cast<wchar_t> | ||||||
|  |             (static_cast<unsigned char> (src[i])); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | std::wstring  | ||||||
|  | log4cplus::helpers::towstring(const std::string& src) | ||||||
|  | { | ||||||
|  |     std::wstring ret; | ||||||
|  |     towstring_internal (ret, src.c_str (), src.size ()); | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | std::wstring  | ||||||
|  | log4cplus::helpers::towstring(char const * src) | ||||||
|  | { | ||||||
|  |     std::wstring ret; | ||||||
|  |     towstring_internal (ret, src, std::strlen (src)); | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_WORKING_LOCALE | ||||||
|  |  | ||||||
|  | #endif // UNICODE | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace | ||||||
|  | { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | struct toupper_func | ||||||
|  | { | ||||||
|  |     tchar | ||||||
|  |     operator () (tchar ch) const | ||||||
|  |     { | ||||||
|  | #ifdef UNICODE | ||||||
|  | #  if (defined(__MWERKS__) && defined(__MACOS__)) || defined (LOG4CPLUS_WORKING_LOCALE) | ||||||
|  |         return std::towupper (ch); | ||||||
|  | #  else | ||||||
|  |         return ::towupper (ch); | ||||||
|  | #  endif | ||||||
|  | #else | ||||||
|  |         return ::toupper (static_cast<unsigned char>(ch)); | ||||||
|  | #endif | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | struct tolower_func | ||||||
|  | { | ||||||
|  |     tchar | ||||||
|  |     operator () (tchar ch) const | ||||||
|  |     { | ||||||
|  | #ifdef UNICODE | ||||||
|  | #  if (defined(__MWERKS__) && defined(__MACOS__)) || defined (LOG4CPLUS_WORKING_LOCALE) | ||||||
|  |         return std::towlower (ch); | ||||||
|  | #  else | ||||||
|  |         return ::towlower (ch); | ||||||
|  | #  endif | ||||||
|  | #else | ||||||
|  |         return ::tolower (static_cast<unsigned char>(ch)); | ||||||
|  | #endif | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::tstring | ||||||
|  | log4cplus::helpers::toUpper(const log4cplus::tstring& s) | ||||||
|  | { | ||||||
|  |     tstring ret; | ||||||
|  |     std::transform(s.begin(), s.end(), | ||||||
|  |                    string_append_iterator<tstring>(ret), toupper_func ()); | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::tstring | ||||||
|  | log4cplus::helpers::toLower(const log4cplus::tstring& s) | ||||||
|  | { | ||||||
|  |     tstring ret; | ||||||
|  |     std::transform(s.begin(), s.end(), | ||||||
|  |                    string_append_iterator<tstring>(ret), tolower_func ()); | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
							
								
								
									
										42
									
								
								libs/log4cplus/src/syncprims.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								libs/log4cplus/src/syncprims.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | |||||||
|  | //   Copyright (C) 2009, Vaclav Haisman. All rights reserved. | ||||||
|  | //    | ||||||
|  | //   Redistribution and use in source and binary forms, with or without modifica- | ||||||
|  | //   tion, are permitted provided that the following conditions are met: | ||||||
|  | //    | ||||||
|  | //   1. Redistributions of  source code must  retain the above copyright  notice, | ||||||
|  | //      this list of conditions and the following disclaimer. | ||||||
|  | //    | ||||||
|  | //   2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  | //      this list of conditions and the following disclaimer in the documentation | ||||||
|  | //      and/or other materials provided with the distribution. | ||||||
|  | //    | ||||||
|  | //   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, | ||||||
|  | //   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | ||||||
|  | //   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE | ||||||
|  | //   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT, | ||||||
|  | //   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU- | ||||||
|  | //   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS | ||||||
|  | //   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON | ||||||
|  | //   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT | ||||||
|  | //   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF | ||||||
|  | //   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
|  | #include <sstream> | ||||||
|  | #include <log4cplus/helpers/syncprims.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { namespace thread { namespace detail { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LOG4CPLUS_EXPORT | ||||||
|  | void | ||||||
|  | syncprims_throw_exception (char const * const msg, char const * const file, | ||||||
|  |     int line) | ||||||
|  | { | ||||||
|  |     std::ostringstream oss; | ||||||
|  |     oss << file << ":" << line << msg; | ||||||
|  |     throw std::runtime_error (oss.str ()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } } } // namespace log4cplus { namespace thread { namespace detail { | ||||||
							
								
								
									
										244
									
								
								libs/log4cplus/src/syslogappender.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								libs/log4cplus/src/syslogappender.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,244 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    syslogappender.cxx | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // Copyright 2001-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/syslogappender.h> | ||||||
|  | #if defined(LOG4CPLUS_HAVE_SYSLOG_H) && !defined(_WIN32) | ||||||
|  |  | ||||||
|  | #include <log4cplus/streams.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/helpers/stringhelper.h> | ||||||
|  | #include <log4cplus/spi/loggingevent.h> | ||||||
|  |  | ||||||
|  | #include <syslog.h> | ||||||
|  |  | ||||||
|  | using namespace std; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace | ||||||
|  | { | ||||||
|  |  | ||||||
|  | static | ||||||
|  | const char* | ||||||
|  | useIdent (const std::string& string) | ||||||
|  | { | ||||||
|  |     if (string.empty ()) | ||||||
|  |         return 0; | ||||||
|  |     else | ||||||
|  |         return string.c_str (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static | ||||||
|  | int | ||||||
|  | parseFacility (const log4cplus::tstring& text) | ||||||
|  | { | ||||||
|  |     if (text.empty ()) | ||||||
|  |         return 0; | ||||||
|  | #ifdef LOG_AUTH | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("auth")) | ||||||
|  |         return LOG_AUTH; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_AUTHPRIV | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("authpriv")) | ||||||
|  |         return LOG_AUTHPRIV; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_CRON | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("cron")) | ||||||
|  |         return LOG_CRON; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_DAEMON | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("daemon")) | ||||||
|  |         return LOG_DAEMON; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_FTP | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("ftp")) | ||||||
|  |         return LOG_FTP; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_KERN | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("kern")) | ||||||
|  |         return LOG_KERN; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_LOCAL0 | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("local0")) | ||||||
|  |         return LOG_LOCAL0; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_LOCAL1 | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("local1")) | ||||||
|  |         return LOG_LOCAL1; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_LOCAL2 | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("local2")) | ||||||
|  |         return LOG_LOCAL2; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_LOCAL3 | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("local3")) | ||||||
|  |         return LOG_LOCAL3; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_LOCAL4 | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("local4")) | ||||||
|  |         return LOG_LOCAL4; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_LOCAL5 | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("local5")) | ||||||
|  |         return LOG_LOCAL5; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_LOCAL6 | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("local6")) | ||||||
|  |         return LOG_LOCAL6; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_LOCAL7 | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("local7")) | ||||||
|  |         return LOG_LOCAL7; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_LPR | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("lpr")) | ||||||
|  |         return LOG_LPR; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_MAIL | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("mail")) | ||||||
|  |         return LOG_MAIL; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_NEWS | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("news")) | ||||||
|  |         return LOG_NEWS; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_SYSLOG | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("syslog")) | ||||||
|  |         return LOG_SYSLOG; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_USER | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("user")) | ||||||
|  |         return LOG_USER; | ||||||
|  | #endif | ||||||
|  | #ifdef LOG_UUCP | ||||||
|  |     else if (text == LOG4CPLUS_TEXT ("uucp")) | ||||||
|  |         return LOG_UUCP; | ||||||
|  | #endif | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         // Unknown facility. | ||||||
|  |         log4cplus::tstring msg (LOG4CPLUS_TEXT ("Unknown syslog facility: ")); | ||||||
|  |         msg += text; | ||||||
|  |         log4cplus::helpers::LogLog::getLogLog ()->error (msg); | ||||||
|  |  | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } // namespace | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::SysLogAppender ctors and dtor | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::SysLogAppender::SysLogAppender(const tstring& id) | ||||||
|  |     : ident(id) | ||||||
|  |     , facility (0) | ||||||
|  |     // Store std::string form of ident as member of SysLogAppender so | ||||||
|  |     // the address of the c_str() result remains stable for openlog & | ||||||
|  |     // co to use even if we use wstrings. | ||||||
|  |     , identStr(LOG4CPLUS_TSTRING_TO_STRING (id) ) | ||||||
|  | { | ||||||
|  |     ::openlog(useIdent(identStr), 0, 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::SysLogAppender::SysLogAppender(const Properties & properties) | ||||||
|  |     : Appender(properties) | ||||||
|  |     , facility (0) | ||||||
|  | { | ||||||
|  |     ident = properties.getProperty( LOG4CPLUS_TEXT("ident") ); | ||||||
|  |     facility = parseFacility ( | ||||||
|  |         toLower (properties.getProperty (LOG4CPLUS_TEXT ("facility")))); | ||||||
|  |     identStr = LOG4CPLUS_TSTRING_TO_STRING (ident); | ||||||
|  |     ::openlog(useIdent(identStr), 0, 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::SysLogAppender::~SysLogAppender() | ||||||
|  | { | ||||||
|  |     destructorImpl(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::SysLogAppender public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | log4cplus::SysLogAppender::close() | ||||||
|  | { | ||||||
|  |     getLogLog().debug(LOG4CPLUS_TEXT("Entering SysLogAppender::close()...")); | ||||||
|  |     LOG4CPLUS_BEGIN_SYNCHRONIZE_ON_MUTEX( access_mutex ) | ||||||
|  |         ::closelog(); | ||||||
|  |         closed = true; | ||||||
|  |     LOG4CPLUS_END_SYNCHRONIZE_ON_MUTEX; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::SysLogAppender protected methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | int | ||||||
|  | log4cplus::SysLogAppender::getSysLogLevel(const LogLevel& ll) const | ||||||
|  | { | ||||||
|  |     if(ll < DEBUG_LOG_LEVEL) { | ||||||
|  |         return -1; | ||||||
|  |     } | ||||||
|  |     else if(ll < INFO_LOG_LEVEL) { | ||||||
|  |         return LOG_DEBUG; | ||||||
|  |     } | ||||||
|  |     else if(ll < WARN_LOG_LEVEL) { | ||||||
|  |         return LOG_INFO; | ||||||
|  |     } | ||||||
|  |     else if(ll < ERROR_LOG_LEVEL) { | ||||||
|  |         return LOG_WARNING; | ||||||
|  |     } | ||||||
|  |     else if(ll < FATAL_LOG_LEVEL) { | ||||||
|  |         return LOG_ERR; | ||||||
|  |     } | ||||||
|  |     else if(ll == FATAL_LOG_LEVEL) { | ||||||
|  |         return LOG_CRIT; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return LOG_ALERT;  // ll > FATAL_LOG_LEVEL | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // This method does not need to be locked since it is called by | ||||||
|  | // doAppend() which performs the locking | ||||||
|  | void | ||||||
|  | log4cplus::SysLogAppender::append(const spi::InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     int level = getSysLogLevel(event.getLogLevel()); | ||||||
|  |     if(level != -1) { | ||||||
|  |         log4cplus::tostringstream buf; | ||||||
|  |         layout->formatAndAppend(buf, event); | ||||||
|  |         ::syslog(facility | level, "%s", | ||||||
|  |             LOG4CPLUS_TSTRING_TO_STRING(buf.str()).c_str()); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif // defined(LOG4CPLUS_HAVE_SYSLOG_H) | ||||||
|  |  | ||||||
							
								
								
									
										331
									
								
								libs/log4cplus/src/threads.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										331
									
								
								libs/log4cplus/src/threads.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,331 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    threads.cxx | ||||||
|  | // Created: 6/2001 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2001-2010 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_SINGLE_THREADED | ||||||
|  |  | ||||||
|  | #include <cassert> | ||||||
|  | #include <exception> | ||||||
|  | #include <stdexcept> | ||||||
|  | #include <memory> | ||||||
|  |  | ||||||
|  | #include <log4cplus/config.hxx> | ||||||
|  |  | ||||||
|  | #ifdef LOG4CPLUS_HAVE_ERRNO_H | ||||||
|  | #include <errno.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(LOG4CPLUS_USE_PTHREADS) | ||||||
|  | #  include <sched.h> | ||||||
|  | #  include <signal.h> | ||||||
|  | #elif defined (LOG4CPLUS_USE_WIN32_THREADS) && ! defined (_WIN32_WCE) | ||||||
|  | #  include <process.h>  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <log4cplus/helpers/threads.h> | ||||||
|  | #include <log4cplus/streams.h> | ||||||
|  | #include <log4cplus/ndc.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/helpers/stringhelper.h> | ||||||
|  | #include <log4cplus/helpers/timehelper.h> | ||||||
|  | #include <log4cplus/helpers/syncprims.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { namespace thread { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | struct ThreadStart | ||||||
|  | { | ||||||
|  | #  ifdef LOG4CPLUS_USE_PTHREADS | ||||||
|  | static void* threadStartFuncWorker(void *); | ||||||
|  | #  elif defined(LOG4CPLUS_USE_WIN32_THREADS) && defined (_WIN32_WCE) | ||||||
|  | static DWORD threadStartFuncWorker(void *); | ||||||
|  | #  elif defined(LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  | static unsigned threadStartFuncWorker(void *); | ||||||
|  | #  endif | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } } // namespace log4cplus { namespace thread { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace | ||||||
|  | { | ||||||
|  |  | ||||||
|  | #  ifdef LOG4CPLUS_USE_PTHREADS | ||||||
|  | extern "C" void * threadStartFunc(void * param) | ||||||
|  | #  elif defined(LOG4CPLUS_USE_WIN32_THREADS) && defined (_WIN32_WCE) | ||||||
|  | static DWORD WINAPI threadStartFunc(void * param) | ||||||
|  | #  elif defined(LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  | static unsigned WINAPI threadStartFunc(void * param) | ||||||
|  | #  endif | ||||||
|  | { | ||||||
|  |     return log4cplus::thread::ThreadStart::threadStartFuncWorker (param); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } // namespace | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { namespace thread { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | LOG4CPLUS_MUTEX_PTR_DECLARE  | ||||||
|  | createNewMutex() | ||||||
|  | { | ||||||
|  | #if defined(LOG4CPLUS_USE_PTHREADS) | ||||||
|  |     // The mutexes that we provide need to be recursive. This is | ||||||
|  |     // because of double locking, first lock gets acquired in | ||||||
|  |     // ConfigurationWatchDogThread::run() through the HierarchyLocker | ||||||
|  |     // instance there. The second lock on appender_list_mutex is | ||||||
|  |     // attempted in | ||||||
|  |     // helpers::AppenderAttachableImpl::removeAllAppenders(). This | ||||||
|  |     // results into deadlock on (at least) Linux. | ||||||
|  |  | ||||||
|  |     log4cplus::thread::PthreadMutexAttr mattr; | ||||||
|  |     mattr.set_type (log4cplus::thread::Mutex::RECURSIVE); | ||||||
|  |  | ||||||
|  |     std::auto_ptr<pthread_mutex_t> m (new pthread_mutex_t); | ||||||
|  |     int ret = pthread_mutex_init (m.get (), &mattr.attr); | ||||||
|  |     if (ret != 0) | ||||||
|  |         throw std::runtime_error ("createNewMutex(): pthread_mutex_init () has failed."); | ||||||
|  |  | ||||||
|  | #elif defined(LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  | 	std::auto_ptr< ::CRITICAL_SECTION> m (new ::CRITICAL_SECTION); | ||||||
|  |     ::InitializeCriticalSection(m.get ()); | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     return m.release (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | deleteMutex(LOG4CPLUS_MUTEX_PTR_DECLARE m) | ||||||
|  | { | ||||||
|  | #if defined(LOG4CPLUS_USE_PTHREADS) | ||||||
|  |     ::pthread_mutex_destroy(m); | ||||||
|  | #elif defined(LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  |     ::DeleteCriticalSection(m); | ||||||
|  | #endif | ||||||
|  |     delete m; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if defined(LOG4CPLUS_USE_PTHREADS) | ||||||
|  | pthread_key_t* | ||||||
|  | createPthreadKey(void (*cleanupfunc)(void *)) | ||||||
|  | { | ||||||
|  |     ::pthread_key_t* key = new ::pthread_key_t; | ||||||
|  |     ::pthread_key_create(key, cleanupfunc); | ||||||
|  |     return key; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifndef LOG4CPLUS_SINGLE_THREADED | ||||||
|  | void | ||||||
|  | blockAllSignals() | ||||||
|  | { | ||||||
|  | #if defined (LOG4CPLUS_USE_PTHREADS) | ||||||
|  |     // Block all signals. | ||||||
|  |     sigset_t signal_set; | ||||||
|  |     sigfillset (&signal_set); | ||||||
|  |     pthread_sigmask (SIG_BLOCK, &signal_set, 0); | ||||||
|  | #endif     | ||||||
|  | } | ||||||
|  | #endif // LOG4CPLUS_SINGLE_THREADED | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | yield() | ||||||
|  | { | ||||||
|  | #if defined(LOG4CPLUS_USE_PTHREADS) | ||||||
|  |     sched_yield(); | ||||||
|  | #elif defined(LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  |     ::Sleep(0); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | tstring | ||||||
|  | getCurrentThreadName() | ||||||
|  | { | ||||||
|  |     tostringstream tmp; | ||||||
|  |     tmp << LOG4CPLUS_GET_CURRENT_THREAD; | ||||||
|  |     return tmp.str (); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if defined(LOG4CPLUS_USE_PTHREADS) | ||||||
|  | void*  | ||||||
|  | ThreadStart::threadStartFuncWorker(void * arg) | ||||||
|  | #elif defined(LOG4CPLUS_USE_WIN32_THREADS) && defined (_WIN32_WCE) | ||||||
|  | DWORD | ||||||
|  | ThreadStart::threadStartFuncWorker(void * arg) | ||||||
|  | #elif defined(LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  | unsigned | ||||||
|  | ThreadStart::threadStartFuncWorker(void * arg) | ||||||
|  | #endif | ||||||
|  | { | ||||||
|  |     blockAllSignals (); | ||||||
|  |     helpers::SharedObjectPtr<helpers::LogLog> loglog | ||||||
|  |         = helpers::LogLog::getLogLog(); | ||||||
|  |     if (! arg) | ||||||
|  |         loglog->error(LOG4CPLUS_TEXT("threadStartFunc()- arg is NULL")); | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         AbstractThread * ptr = static_cast<AbstractThread*>(arg); | ||||||
|  |         AbstractThreadPtr thread(ptr); | ||||||
|  |  | ||||||
|  |         // Decrease reference count increased by AbstractThread::start(). | ||||||
|  |         ptr->removeReference (); | ||||||
|  |  | ||||||
|  |         try | ||||||
|  |         { | ||||||
|  |             thread->run(); | ||||||
|  |         } | ||||||
|  |         catch(std::exception& e) | ||||||
|  |         { | ||||||
|  |             tstring err = LOG4CPLUS_TEXT("threadStartFunc()- run() terminated with an exception: "); | ||||||
|  |             err += LOG4CPLUS_C_STR_TO_TSTRING(e.what()); | ||||||
|  |             loglog->warn(err); | ||||||
|  |         } | ||||||
|  |         catch(...) | ||||||
|  |         { | ||||||
|  |             loglog->warn(LOG4CPLUS_TEXT("threadStartFunc()- run() terminated with an exception.")); | ||||||
|  |         } | ||||||
|  |         thread->flags &= ~AbstractThread::fRUNNING; | ||||||
|  |         getNDC().remove(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // AbstractThread ctor and dtor | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | AbstractThread::AbstractThread() | ||||||
|  |     : flags (0) | ||||||
|  | #if defined(LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  |     , handle (INVALID_HANDLE_VALUE) | ||||||
|  | #endif | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | AbstractThread::~AbstractThread() | ||||||
|  | { | ||||||
|  | #if defined(LOG4CPLUS_USE_PTHREADS) | ||||||
|  |     if ((flags & fJOINED) == 0) | ||||||
|  |         pthread_detach (handle); | ||||||
|  |  | ||||||
|  | #elif defined(LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  |     if (handle != INVALID_HANDLE_VALUE) | ||||||
|  |         ::CloseHandle (handle); | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // AbstractThread public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | AbstractThread::start() | ||||||
|  | { | ||||||
|  |     flags |= fRUNNING; | ||||||
|  |  | ||||||
|  |     // Increase reference count here. It will be lowered by the running | ||||||
|  |     // thread itself. | ||||||
|  |     addReference (); | ||||||
|  |  | ||||||
|  | #if defined(LOG4CPLUS_USE_PTHREADS) | ||||||
|  |     if (pthread_create(&handle, NULL, threadStartFunc, this) ) | ||||||
|  |     { | ||||||
|  |         removeReference (); | ||||||
|  |         flags &= ~fRUNNING; | ||||||
|  |         throw std::runtime_error("Thread creation was not successful"); | ||||||
|  |     } | ||||||
|  | #elif defined(LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  |     HANDLE h = InterlockedExchangePointer (&handle, INVALID_HANDLE_VALUE); | ||||||
|  |     if (h != INVALID_HANDLE_VALUE) | ||||||
|  |         ::CloseHandle (h); | ||||||
|  |  | ||||||
|  | #if defined (_WIN32_WCE) | ||||||
|  |     h = ::CreateThread  (0, 0, threadStartFunc, this, 0, &thread_id); | ||||||
|  | #else | ||||||
|  |     h = reinterpret_cast<HANDLE>( | ||||||
|  |         ::_beginthreadex (0, 0, threadStartFunc, this, 0, &thread_id)); | ||||||
|  | #endif | ||||||
|  |     if (! h) | ||||||
|  |     { | ||||||
|  |         removeReference (); | ||||||
|  |         flags &= ~fRUNNING; | ||||||
|  |         throw std::runtime_error("Thread creation was not successful"); | ||||||
|  |     } | ||||||
|  |     h = InterlockedExchangePointer (&handle, h); | ||||||
|  |     assert (h == INVALID_HANDLE_VALUE); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LOG4CPLUS_THREAD_KEY_TYPE | ||||||
|  | AbstractThread::getThreadId () const | ||||||
|  | { | ||||||
|  | #if defined(LOG4CPLUS_USE_PTHREADS) | ||||||
|  |     return handle; | ||||||
|  | #elif defined(LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  |     return thread_id; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LOG4CPLUS_THREAD_HANDLE_TYPE | ||||||
|  | AbstractThread::getThreadHandle () const | ||||||
|  | { | ||||||
|  |     return handle; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | AbstractThread::join () | ||||||
|  | { | ||||||
|  | #if defined(LOG4CPLUS_USE_PTHREADS) | ||||||
|  |     pthread_join (handle, 0); | ||||||
|  | #elif defined(LOG4CPLUS_USE_WIN32_THREADS) | ||||||
|  |     ::WaitForSingleObject (handle, INFINITE); | ||||||
|  | #endif | ||||||
|  |     flags |= fJOINED; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } } // namespace log4cplus { namespace thread { | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_SINGLE_THREADED | ||||||
							
								
								
									
										520
									
								
								libs/log4cplus/src/timehelper.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										520
									
								
								libs/log4cplus/src/timehelper.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,520 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    timehelper.cxx | ||||||
|  | // Created: 4/2003 | ||||||
|  | // Author:  Tad E. Smith | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2009 Tad E. Smith | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  | #include <log4cplus/helpers/timehelper.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/streams.h> | ||||||
|  | #include <log4cplus/helpers/stringhelper.h> | ||||||
|  |  | ||||||
|  | #include <ctime> | ||||||
|  | #include <algorithm> | ||||||
|  | #include <stdexcept> | ||||||
|  | #include <vector> | ||||||
|  | #include <iomanip> | ||||||
|  | #include <cassert> | ||||||
|  | #if ! defined (_WIN32_WCE) | ||||||
|  | #include <cerrno> | ||||||
|  | #endif | ||||||
|  | #if defined (UNICODE) | ||||||
|  | #include <cwchar> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined (LOG4CPLUS_HAVE_SYS_TYPES_H) | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(LOG4CPLUS_HAVE_FTIME) | ||||||
|  | #include <sys/timeb.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(LOG4CPLUS_HAVE_GETTIMEOFDAY) | ||||||
|  | #include <sys/time.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(LOG4CPLUS_HAVE_GMTIME_R) && !defined(LOG4CPLUS_SINGLE_THREADED) | ||||||
|  | #define LOG4CPLUS_NEED_GMTIME_R | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(LOG4CPLUS_HAVE_LOCALTIME_R) && !defined(LOG4CPLUS_SINGLE_THREADED) | ||||||
|  | #define LOG4CPLUS_NEED_LOCALTIME_R | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus { namespace helpers { | ||||||
|  |  | ||||||
|  | const int ONE_SEC_IN_USEC = 1000000; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if defined (_WIN32_WCE) | ||||||
|  | using ::mktime; | ||||||
|  | using ::gmtime; | ||||||
|  | using ::localtime; | ||||||
|  | #if defined (UNICODE) | ||||||
|  | using ::wcsftime; | ||||||
|  | #else | ||||||
|  | using ::strftime; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #else | ||||||
|  | using std::mktime; | ||||||
|  | using std::gmtime; | ||||||
|  | using std::localtime; | ||||||
|  | #if defined (UNICODE) | ||||||
|  | using std::wcsftime; | ||||||
|  | #else | ||||||
|  | using std::strftime; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Time ctors | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | Time::Time() | ||||||
|  | : tv_sec(0), | ||||||
|  |   tv_usec(0) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Time::Time(time_t tv_sec_, long tv_usec_) | ||||||
|  | : tv_sec(tv_sec_), | ||||||
|  |   tv_usec(tv_usec_) | ||||||
|  | { | ||||||
|  |     assert (tv_usec < ONE_SEC_IN_USEC); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Time::Time(time_t time) | ||||||
|  | : tv_sec(time), | ||||||
|  |   tv_usec(0) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Time | ||||||
|  | Time::gettimeofday() | ||||||
|  | { | ||||||
|  | #if defined (LOG4CPLUS_HAVE_CLOCK_GETTIME) | ||||||
|  |     struct timespec ts; | ||||||
|  |     int res = clock_gettime (CLOCK_REALTIME, &ts); | ||||||
|  |     assert (res == 0); | ||||||
|  |     if (res != 0) | ||||||
|  |         throw std::runtime_error ("clock_gettime() has failed"); | ||||||
|  |  | ||||||
|  |     return Time (ts.tv_sec, ts.tv_nsec / 1000); | ||||||
|  | #elif defined(LOG4CPLUS_HAVE_GETTIMEOFDAY) | ||||||
|  |     timeval tp; | ||||||
|  |     ::gettimeofday(&tp, 0); | ||||||
|  |  | ||||||
|  |     return Time(tp.tv_sec, tp.tv_usec); | ||||||
|  | #elif defined(LOG4CPLUS_HAVE_FTIME) | ||||||
|  |     struct timeb tp; | ||||||
|  |     ::ftime(&tp); | ||||||
|  |  | ||||||
|  |     return Time(tp.time, tp.millitm * 1000); | ||||||
|  | #else | ||||||
|  | #warning "Time::gettimeofday()- low resolution timer: gettimeofday and ftime unavailable" | ||||||
|  |     return Time(::time(0), 0); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Time methods | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | time_t | ||||||
|  | Time::setTime(tm* t) | ||||||
|  | { | ||||||
|  |     time_t time = helpers::mktime(t); | ||||||
|  |     if (time != -1) | ||||||
|  |         tv_sec = time; | ||||||
|  |  | ||||||
|  |     return time; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | time_t | ||||||
|  | Time::getTime() const | ||||||
|  | { | ||||||
|  |     return tv_sec; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Time::gmtime(tm* t) const | ||||||
|  | { | ||||||
|  |     time_t clock = tv_sec; | ||||||
|  | #ifdef LOG4CPLUS_NEED_GMTIME_R | ||||||
|  |     ::gmtime_r(&clock, t); | ||||||
|  | #else | ||||||
|  |     tm* tmp = helpers::gmtime(&clock); | ||||||
|  |     *t = *tmp; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Time::localtime(tm* t) const | ||||||
|  | { | ||||||
|  |     time_t clock = tv_sec; | ||||||
|  | #ifdef LOG4CPLUS_NEED_LOCALTIME_R | ||||||
|  |     ::localtime_r(&clock, t); | ||||||
|  | #else | ||||||
|  |     tm* tmp = helpers::localtime(&clock); | ||||||
|  |     *t = *tmp; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace  | ||||||
|  | { | ||||||
|  |  | ||||||
|  | static log4cplus::tstring const padding_zeros[4] = | ||||||
|  | { | ||||||
|  |     log4cplus::tstring (LOG4CPLUS_TEXT("000")), | ||||||
|  |     log4cplus::tstring (LOG4CPLUS_TEXT("00")), | ||||||
|  |     log4cplus::tstring (LOG4CPLUS_TEXT("0")), | ||||||
|  |     log4cplus::tstring (LOG4CPLUS_TEXT("")) | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static log4cplus::tstring const uc_q_padding_zeros[4] = | ||||||
|  | { | ||||||
|  |     log4cplus::tstring (LOG4CPLUS_TEXT(".000")), | ||||||
|  |     log4cplus::tstring (LOG4CPLUS_TEXT(".00")), | ||||||
|  |     log4cplus::tstring (LOG4CPLUS_TEXT(".0")), | ||||||
|  |     log4cplus::tstring (LOG4CPLUS_TEXT(".")) | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Time::build_q_value (log4cplus::tstring & q_str) const | ||||||
|  | { | ||||||
|  |     q_str = convertIntegerToString(tv_usec / 1000); | ||||||
|  |     size_t const len = q_str.length(); | ||||||
|  |     if (len <= 2) | ||||||
|  |         q_str.insert (0, padding_zeros[q_str.length()]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void  | ||||||
|  | Time::build_uc_q_value (log4cplus::tstring & uc_q_str) const | ||||||
|  | { | ||||||
|  |     build_q_value (uc_q_str); | ||||||
|  |  | ||||||
|  |     log4cplus::tstring usecs (convertIntegerToString(tv_usec % 1000)); | ||||||
|  |     size_t usecs_len = usecs.length(); | ||||||
|  |     usecs.insert (0, usecs_len <= 3  | ||||||
|  |                   ? uc_q_padding_zeros[usecs_len] : uc_q_padding_zeros[3]); | ||||||
|  |     uc_q_str.append (usecs); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::tstring | ||||||
|  | Time::getFormattedTime(const log4cplus::tstring& fmt_orig, bool use_gmtime) const | ||||||
|  | { | ||||||
|  |     if (fmt_orig.empty () || fmt_orig[0] == 0) | ||||||
|  |         return log4cplus::tstring (); | ||||||
|  |  | ||||||
|  |     tm time; | ||||||
|  |      | ||||||
|  |     if(use_gmtime) | ||||||
|  |         gmtime(&time); | ||||||
|  |     else  | ||||||
|  |         localtime(&time); | ||||||
|  |      | ||||||
|  |     enum State | ||||||
|  |     { | ||||||
|  |         TEXT, | ||||||
|  |         PERCENT_SIGN | ||||||
|  |     }; | ||||||
|  |      | ||||||
|  |     log4cplus::tstring fmt (fmt_orig); | ||||||
|  |     log4cplus::tstring ret; | ||||||
|  |     ret.reserve (static_cast<size_t>(fmt.size () * 1.35)); | ||||||
|  |     State state = TEXT; | ||||||
|  |      | ||||||
|  |     log4cplus::tstring q_str; | ||||||
|  |     bool q_str_valid = false; | ||||||
|  |  | ||||||
|  |     log4cplus::tstring uc_q_str; | ||||||
|  |     bool uc_q_str_valid = false; | ||||||
|  |  | ||||||
|  |     log4cplus::tstring s_str; | ||||||
|  |     bool s_str_valid = false; | ||||||
|  |  | ||||||
|  |     // Walk the format string and process all occurences of %q and %Q. | ||||||
|  |      | ||||||
|  |     for (log4cplus::tstring::const_iterator fmt_it = fmt.begin (); | ||||||
|  |          fmt_it != fmt.end (); ++fmt_it) | ||||||
|  |     { | ||||||
|  |         switch (state) | ||||||
|  |         { | ||||||
|  |         case TEXT: | ||||||
|  |         { | ||||||
|  |             if (*fmt_it == LOG4CPLUS_TEXT ('%')) | ||||||
|  |                 state = PERCENT_SIGN; | ||||||
|  |             else | ||||||
|  |                 ret.push_back (*fmt_it); | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |              | ||||||
|  |         case PERCENT_SIGN: | ||||||
|  |         { | ||||||
|  |             switch (*fmt_it) | ||||||
|  |             { | ||||||
|  |             case LOG4CPLUS_TEXT ('q'): | ||||||
|  |             { | ||||||
|  |                 if (! q_str_valid) | ||||||
|  |                 { | ||||||
|  |                     build_q_value (q_str); | ||||||
|  |                     q_str_valid = true; | ||||||
|  |                 } | ||||||
|  |                 ret.append (q_str); | ||||||
|  |                 state = TEXT; | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |              | ||||||
|  |             case LOG4CPLUS_TEXT ('Q'): | ||||||
|  |             { | ||||||
|  |                 if (! uc_q_str_valid) | ||||||
|  |                 { | ||||||
|  |                     build_uc_q_value (uc_q_str); | ||||||
|  |                     uc_q_str_valid = true; | ||||||
|  |                 } | ||||||
|  |                 ret.append (uc_q_str); | ||||||
|  |                 state = TEXT; | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |             // Windows do not support %s format specifier | ||||||
|  |             // (seconds since epoch). | ||||||
|  |             case LOG4CPLUS_TEXT ('s'): | ||||||
|  |             { | ||||||
|  |                 if (! s_str_valid) | ||||||
|  |                 { | ||||||
|  |                     convertIntegerToString (s_str, tv_sec); | ||||||
|  |                     s_str_valid = true; | ||||||
|  |                 } | ||||||
|  |                 ret.append (s_str); | ||||||
|  |                 state = TEXT; | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |             default: | ||||||
|  |             { | ||||||
|  |                 ret.push_back (LOG4CPLUS_TEXT ('%')); | ||||||
|  |                 ret.push_back (*fmt_it); | ||||||
|  |                 state = TEXT; | ||||||
|  |             } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Finally call strftime/wcsftime to format the rest of the string. | ||||||
|  |  | ||||||
|  |     ret.swap (fmt); | ||||||
|  |     size_t buffer_size = fmt.size () + 1; | ||||||
|  |     std::vector<tchar> buffer; | ||||||
|  |     size_t len; | ||||||
|  |  | ||||||
|  |     // Limit how far can the buffer grow. This is necessary so that we | ||||||
|  |     // catch bad format string. Some implementations of strftime() signal | ||||||
|  |     // both too small buffer and invalid format string by returning 0 | ||||||
|  |     // without changing errno. | ||||||
|  |     size_t const buffer_size_max | ||||||
|  |         = (std::max) (static_cast<size_t>(1024), buffer_size * 16); | ||||||
|  |      | ||||||
|  |     do | ||||||
|  |     { | ||||||
|  |         buffer.resize (buffer_size); | ||||||
|  |         errno = 0; | ||||||
|  | #ifdef UNICODE | ||||||
|  |         len = helpers::wcsftime(&buffer[0], buffer_size, fmt.c_str(), &time); | ||||||
|  | #else | ||||||
|  |         len = helpers::strftime(&buffer[0], buffer_size, fmt.c_str(), &time); | ||||||
|  | #endif | ||||||
|  |         if (len == 0) | ||||||
|  |         { | ||||||
|  |             int const eno = errno; | ||||||
|  |             buffer_size *= 2; | ||||||
|  |             if (buffer_size > buffer_size_max) | ||||||
|  |             { | ||||||
|  |                 log4cplus::tstring msg ( | ||||||
|  |                     LOG4CPLUS_TEXT ("Error in strftime(): ")); | ||||||
|  |                 msg += convertIntegerToString (eno); | ||||||
|  |                 LogLog::getLogLog ()->error (msg); | ||||||
|  |                 throw std::runtime_error (LOG4CPLUS_TSTRING_TO_STRING (msg)); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     }  | ||||||
|  |     while (len == 0); | ||||||
|  |     ret.assign (buffer.begin (), buffer.begin () + len); | ||||||
|  |  | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Time& | ||||||
|  | Time::operator+=(const Time& rhs) | ||||||
|  | { | ||||||
|  |     tv_sec += rhs.tv_sec; | ||||||
|  |     tv_usec += rhs.tv_usec; | ||||||
|  |  | ||||||
|  |     if(tv_usec > ONE_SEC_IN_USEC) { | ||||||
|  |         ++tv_sec; | ||||||
|  |         tv_usec -= ONE_SEC_IN_USEC; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Time& | ||||||
|  | Time::operator-=(const Time& rhs) | ||||||
|  | { | ||||||
|  |     tv_sec -= rhs.tv_sec; | ||||||
|  |     tv_usec -= rhs.tv_usec; | ||||||
|  |  | ||||||
|  |     if(tv_usec < 0) { | ||||||
|  |         --tv_sec; | ||||||
|  |         tv_usec += ONE_SEC_IN_USEC; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Time& | ||||||
|  | Time::operator/=(long rhs) | ||||||
|  | { | ||||||
|  |     long rem_secs = static_cast<long>(tv_sec % rhs); | ||||||
|  |     tv_sec /= rhs; | ||||||
|  |      | ||||||
|  |     tv_usec /= rhs; | ||||||
|  |     tv_usec += static_cast<long>((rem_secs * ONE_SEC_IN_USEC) / rhs); | ||||||
|  |  | ||||||
|  |     return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Time& | ||||||
|  | Time::operator*=(long rhs) | ||||||
|  | { | ||||||
|  |     long new_usec = tv_usec * rhs; | ||||||
|  |     long overflow_sec = new_usec / ONE_SEC_IN_USEC; | ||||||
|  |     tv_usec = new_usec % ONE_SEC_IN_USEC; | ||||||
|  |  | ||||||
|  |     tv_sec *= rhs; | ||||||
|  |     tv_sec += overflow_sec; | ||||||
|  |  | ||||||
|  |     return *this; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // Time globals | ||||||
|  | ////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  |  | ||||||
|  | const Time | ||||||
|  | operator+(const Time& lhs, const Time& rhs) | ||||||
|  | { | ||||||
|  |     return Time(lhs) += rhs; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | const Time | ||||||
|  | operator-(const Time& lhs, const Time& rhs) | ||||||
|  | { | ||||||
|  |     return Time(lhs) -= rhs; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | const Time | ||||||
|  | operator/(const Time& lhs, long rhs) | ||||||
|  | { | ||||||
|  |     return Time(lhs) /= rhs; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | const Time | ||||||
|  | operator*(const Time& lhs, long rhs) | ||||||
|  | { | ||||||
|  |     return Time(lhs) *= rhs; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | operator<(const Time& lhs, const Time& rhs) | ||||||
|  | { | ||||||
|  |     return (   (lhs.sec() < rhs.sec()) | ||||||
|  |             || (   (lhs.sec() == rhs.sec())  | ||||||
|  |                 && (lhs.usec() < rhs.usec())) ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | operator<=(const Time& lhs, const Time& rhs) | ||||||
|  | { | ||||||
|  |     return ((lhs < rhs) || (lhs == rhs)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | operator>(const Time& lhs, const Time& rhs) | ||||||
|  | { | ||||||
|  |     return (   (lhs.sec() > rhs.sec()) | ||||||
|  |             || (   (lhs.sec() == rhs.sec())  | ||||||
|  |                 && (lhs.usec() > rhs.usec())) ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | operator>=(const Time& lhs, const Time& rhs) | ||||||
|  | { | ||||||
|  |     return ((lhs > rhs) || (lhs == rhs)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | operator==(const Time& lhs, const Time& rhs) | ||||||
|  | { | ||||||
|  |     return (   lhs.sec() == rhs.sec() | ||||||
|  |             && lhs.usec() == rhs.usec()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool | ||||||
|  | operator!=(const Time& lhs, const Time& rhs) | ||||||
|  | { | ||||||
|  |     return !(lhs == rhs); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } } // namespace log4cplus { namespace helpers { | ||||||
							
								
								
									
										37
									
								
								libs/log4cplus/src/version.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								libs/log4cplus/src/version.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | //   Copyright (C) 2010, Vaclav Haisman. All rights reserved. | ||||||
|  | //    | ||||||
|  | //   Redistribution and use in source and binary forms, with or without modifica- | ||||||
|  | //   tion, are permitted provided that the following conditions are met: | ||||||
|  | //    | ||||||
|  | //   1. Redistributions of  source code must  retain the above copyright  notice, | ||||||
|  | //      this list of conditions and the following disclaimer. | ||||||
|  | //    | ||||||
|  | //   2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  | //      this list of conditions and the following disclaimer in the documentation | ||||||
|  | //      and/or other materials provided with the distribution. | ||||||
|  | //    | ||||||
|  | //   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, | ||||||
|  | //   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | ||||||
|  | //   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE | ||||||
|  | //   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT, | ||||||
|  | //   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU- | ||||||
|  | //   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS | ||||||
|  | //   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON | ||||||
|  | //   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT | ||||||
|  | //   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF | ||||||
|  | //   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
|  | #include <log4cplus/version.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | namespace log4cplus | ||||||
|  | { | ||||||
|  |  | ||||||
|  | #if ! defined (LOG4CPLUS_VERSION_STR_SUFFIX) | ||||||
|  | #define LOG4CPLUS_VERSION_STR_SUFFIX /* empty */ | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | unsigned const version = LOG4CPLUS_VERSION; | ||||||
|  | char const versionStr[] = LOG4CPLUS_VERSION_STR LOG4CPLUS_VERSION_STR_SUFFIX; | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										177
									
								
								libs/log4cplus/src/win32consoleappender.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								libs/log4cplus/src/win32consoleappender.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | |||||||
|  | //   Copyright (C) 2009-2010, Vaclav Haisman. All rights reserved. | ||||||
|  | //    | ||||||
|  | //   Redistribution and use in source and binary forms, with or without modifica- | ||||||
|  | //   tion, are permitted provided that the following conditions are met: | ||||||
|  | //    | ||||||
|  | //   1. Redistributions of  source code must  retain the above copyright  notice, | ||||||
|  | //      this list of conditions and the following disclaimer. | ||||||
|  | //    | ||||||
|  | //   2. Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  | //      this list of conditions and the following disclaimer in the documentation | ||||||
|  | //      and/or other materials provided with the distribution. | ||||||
|  | //    | ||||||
|  | //   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, | ||||||
|  | //   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | ||||||
|  | //   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE | ||||||
|  | //   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT, | ||||||
|  | //   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU- | ||||||
|  | //   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS | ||||||
|  | //   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON | ||||||
|  | //   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT | ||||||
|  | //   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF | ||||||
|  | //   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #include <log4cplus/win32consoleappender.h> | ||||||
|  | #include <log4cplus/helpers/loglog.h> | ||||||
|  | #include <log4cplus/helpers/stringhelper.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if defined(_WIN32) && defined (LOG4CPLUS_HAVE_WIN32_CONSOLE) | ||||||
|  | namespace log4cplus | ||||||
|  | { | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Win32ConsoleAppender::Win32ConsoleAppender (bool allocConsole) | ||||||
|  |     : alloc_console (allocConsole) | ||||||
|  | { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Win32ConsoleAppender::Win32ConsoleAppender ( | ||||||
|  |     helpers::Properties const & properties) | ||||||
|  |     : Appender (properties) | ||||||
|  |     , alloc_console (true) | ||||||
|  | { | ||||||
|  |     tstring tmp = properties.getProperty (LOG4CPLUS_TEXT ("AllocConsole"), | ||||||
|  |         LOG4CPLUS_TEXT ("true")); | ||||||
|  |     alloc_console = helpers::toLower (tmp) == LOG4CPLUS_TEXT ("true"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Win32ConsoleAppender::~Win32ConsoleAppender () | ||||||
|  | { | ||||||
|  |     destructorImpl(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Win32ConsoleAppender::close () | ||||||
|  | { | ||||||
|  |     closed = true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Win32ConsoleAppender::append (spi::InternalLoggingEvent const & event) | ||||||
|  | { | ||||||
|  |     if (alloc_console) | ||||||
|  |         // We ignore the return value here. If we already have a console, | ||||||
|  |         // it will fail. | ||||||
|  |         AllocConsole (); | ||||||
|  |  | ||||||
|  |     HANDLE const console_out = GetStdHandle (STD_OUTPUT_HANDLE); | ||||||
|  |     if (console_out == INVALID_HANDLE_VALUE) | ||||||
|  |     { | ||||||
|  |         getLogLog ().error ( | ||||||
|  |             LOG4CPLUS_TEXT ("Win32ConsoleAppender::append") | ||||||
|  |             LOG4CPLUS_TEXT ("- Unable to get STD_OUTPUT_HANDLE.")); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     DWORD const handle_type = GetFileType (console_out); | ||||||
|  |     if (handle_type == FILE_TYPE_UNKNOWN && GetLastError () != NO_ERROR) | ||||||
|  |     { | ||||||
|  |         getLogLog ().error ( | ||||||
|  |             LOG4CPLUS_TEXT ("Win32ConsoleAppender::append") | ||||||
|  |             LOG4CPLUS_TEXT ("- Error retrieving handle type.")); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     tostringstream oss; | ||||||
|  |     layout->formatAndAppend (oss, event); | ||||||
|  |     tstring str = oss.str (); | ||||||
|  |     size_t const str_len = str.size (); | ||||||
|  |     tchar const * s = str.c_str (); | ||||||
|  |     DWORD mode; | ||||||
|  |  | ||||||
|  |     if (handle_type == FILE_TYPE_CHAR && GetConsoleMode (console_out, &mode)) | ||||||
|  |         // It seems that we have real console handle here. We can use | ||||||
|  |         // WriteConsole() directly. | ||||||
|  |         write_console (console_out, s, str_len); | ||||||
|  |     else | ||||||
|  |         // It seems that console is redirected. | ||||||
|  |         write_handle (console_out, s, str_len); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Win32ConsoleAppender::write_handle (HANDLE out, tchar const * s, size_t str_len) | ||||||
|  | { | ||||||
|  | #if defined (UNICODE) | ||||||
|  |     std::wstring wstr (s, str_len); | ||||||
|  |     std::string str (helpers::tostring (wstr)); | ||||||
|  |     str_len = str.size (); | ||||||
|  |     char const * const cstr = str.c_str (); | ||||||
|  |  | ||||||
|  | #else | ||||||
|  |     char const * const cstr = s; | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     DWORD const total_to_write = static_cast<DWORD>(str_len); | ||||||
|  |     DWORD total_written = 0; | ||||||
|  |  | ||||||
|  |     do | ||||||
|  |     { | ||||||
|  |         DWORD const to_write = total_to_write - total_written; | ||||||
|  |         DWORD written = 0; | ||||||
|  |  | ||||||
|  |         BOOL ret = WriteFile (out, cstr + total_written, to_write, &written, | ||||||
|  |             0); | ||||||
|  |         if (! ret) | ||||||
|  |         { | ||||||
|  |             getLogLog ().error ( | ||||||
|  |                 LOG4CPLUS_TEXT ("Win32ConsoleAppender::write_handle") | ||||||
|  |                 LOG4CPLUS_TEXT ("- WriteFile has failed.")); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         total_written += written; | ||||||
|  |     } | ||||||
|  |     while (total_written != total_to_write); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void | ||||||
|  | Win32ConsoleAppender::write_console (HANDLE console_out, tchar const * s, | ||||||
|  |     size_t str_len) | ||||||
|  | { | ||||||
|  |     DWORD const total_to_write = static_cast<DWORD>(str_len); | ||||||
|  |     DWORD total_written = 0; | ||||||
|  |  | ||||||
|  |     do | ||||||
|  |     { | ||||||
|  |         DWORD const to_write | ||||||
|  |             = (std::min<DWORD>) (64*1024 - 1, total_to_write - total_written); | ||||||
|  |         DWORD written = 0; | ||||||
|  |          | ||||||
|  |         BOOL ret = WriteConsole (console_out, s + total_written, to_write, | ||||||
|  |             &written, 0); | ||||||
|  |         if (! ret) | ||||||
|  |         { | ||||||
|  |             getLogLog ().error ( | ||||||
|  |                 LOG4CPLUS_TEXT ("Win32ConsoleAppender::write_console") | ||||||
|  |                 LOG4CPLUS_TEXT ("- WriteConsole has failed.")); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         total_written += written; | ||||||
|  |     } | ||||||
|  |     while (total_written != total_to_write); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } // namespace log4cplus | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										86
									
								
								libs/log4cplus/src/win32debugappender.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								libs/log4cplus/src/win32debugappender.cxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | |||||||
|  | // Module:  Log4CPLUS | ||||||
|  | // File:    win32debugappender.cxx | ||||||
|  | // Created: 12/2003 | ||||||
|  | // Author:  Eduardo Francos, Odalio SARL | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Copyright 2003-2010 Odalio SARL | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #include <log4cplus/win32debugappender.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if defined (LOG4CPLUS_HAVE_OUTPUTDEBUGSTRING) | ||||||
|  |  | ||||||
|  | using namespace std; | ||||||
|  | using namespace log4cplus; | ||||||
|  | using namespace log4cplus::helpers; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::Win32DebugAppender ctors and dtor | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | log4cplus::Win32DebugAppender::Win32DebugAppender() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::Win32DebugAppender::Win32DebugAppender( | ||||||
|  |     const log4cplus::helpers::Properties& properties) | ||||||
|  |     : Appender(properties) | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | log4cplus::Win32DebugAppender::~Win32DebugAppender() | ||||||
|  | { | ||||||
|  |     destructorImpl(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::Win32DebugAppender public methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | void | ||||||
|  | log4cplus::Win32DebugAppender::close() | ||||||
|  | { | ||||||
|  |     closed = true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // log4cplus::Win32DebugAppender protected methods | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  | // This method does not need to be locked since it is called by | ||||||
|  | // doAppend() which performs the locking | ||||||
|  | void | ||||||
|  | log4cplus::Win32DebugAppender::append(const spi::InternalLoggingEvent& event) | ||||||
|  | { | ||||||
|  |     tostringstream buf; | ||||||
|  |     layout->formatAndAppend(buf, event); | ||||||
|  |     tstring sz = buf.str(); | ||||||
|  |     const tchar * s = sz.c_str(); | ||||||
|  |     ::OutputDebugString(s); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // LOG4CPLUS_HAVE_OUTPUTDEBUGSTRING | ||||||
							
								
								
									
										13
									
								
								logging.cfg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								logging.cfg
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | log4cplus.rootLogger=INFO, STDOUT, R | ||||||
|  |  | ||||||
|  | log4cplus.appender.STDOUT=log4cplus::ConsoleAppender | ||||||
|  | log4cplus.appender.STDOUT.layout=log4cplus::PatternLayout | ||||||
|  | log4cplus.appender.STDOUT.layout.ConversionPattern=%d{%m/%d/%y %H:%M:%S} [%t] %-5p %c{2} %%%x%% - %m [%l]%n | ||||||
|  |  | ||||||
|  | log4cplus.appender.R=log4cplus::RollingFileAppender | ||||||
|  | log4cplus.appender.R.File=gremlin.log | ||||||
|  | #log4cplus.appender.R.MaxFileSize=5MB | ||||||
|  | log4cplus.appender.R.MaxFileSize=500KB | ||||||
|  | log4cplus.appender.R.MaxBackupIndex=5 | ||||||
|  | log4cplus.appender.R.layout=log4cplus::TTCCLayout | ||||||
|  |  | ||||||
| @@ -15,5 +15,5 @@ add_dependencies( gremlin | |||||||
| )  | )  | ||||||
|  |  | ||||||
| target_link_libraries(gremlin | target_link_libraries(gremlin | ||||||
|    common enet glfw spark ${PLATFORM_LIBRARIES} ${OPENGL_LIBRARIES} |    common enet glfw spark log4cplus ${PLATFORM_LIBRARIES} ${OPENGL_LIBRARIES} | ||||||
| ) | ) | ||||||
|   | |||||||
| @@ -1,8 +1,24 @@ | |||||||
|  | #include <log4cplus/logger.h> | ||||||
|  | #include <log4cplus/configurator.h> | ||||||
|  |  | ||||||
| #include "Client.h" | #include "Client.h" | ||||||
|  |  | ||||||
| #include <iostream> | #include <iostream> | ||||||
|  |  | ||||||
| int main(int argc, const char **argv) { | int main(int argc, const char **argv) { | ||||||
|  | 	log4cplus::BasicConfigurator basicConfig; | ||||||
|  | 	basicConfig.configure(); | ||||||
|  |  | ||||||
|  | 	log4cplus::PropertyConfigurator propConfig("logging.cfg"); | ||||||
|  | 	propConfig.configure(); | ||||||
|  |  | ||||||
|  | 	log4cplus::Logger logger = log4cplus::Logger::getInstance("main"); | ||||||
|  | 	LOG4CPLUS_INFO(logger, "starting gremlin"); | ||||||
|  |  | ||||||
|  | 	LOG4CPLUS_INFO(logger, "arguments (" << argc << "):"); | ||||||
|  | 	for (size_t i = 0; i < argc; i++) | ||||||
|  | 		LOG4CPLUS_INFO(logger, " - " << argv[i]); | ||||||
|  |  | ||||||
| 	try { | 	try { | ||||||
| 		Client app; | 		Client app; | ||||||
| 		Arguments args(argc, argv); | 		Arguments args(argc, argv); | ||||||
| @@ -10,7 +26,6 @@ int main(int argc, const char **argv) { | |||||||
| 		while (app.isRunning()) | 		while (app.isRunning()) | ||||||
| 			app.update(); | 			app.update(); | ||||||
| 		app.shutdown(); | 		app.shutdown(); | ||||||
| 		return 0; |  | ||||||
| 	} catch (const char *str) { | 	} catch (const char *str) { | ||||||
| 		std::cerr << "Exception: " << str << std::endl; | 		std::cerr << "Exception: " << str << std::endl; | ||||||
| 		return 1; | 		return 1; | ||||||
| @@ -18,5 +33,7 @@ int main(int argc, const char **argv) { | |||||||
| 		std::cerr << "Exception: " << e.what() << std::endl; | 		std::cerr << "Exception: " << e.what() << std::endl; | ||||||
| 		return 1; | 		return 1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 gmueller
					gmueller