add front demo in this project
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
// -*- C++ -*-
|
||||
// Module: Log4CPLUS
|
||||
// File: customloglevelmanager.h
|
||||
// Created: 12/2018
|
||||
// Author: Jens Rehsack
|
||||
// Author: Václav Haisman
|
||||
//
|
||||
//
|
||||
// Copyright (C) 2018, Jens Rehsack. 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 header contains declaration internal to log4cplus. They must never be
|
||||
* visible from user accesible headers or exported in DLL/shared library.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef LOG4CPLUS_INTERNAL_CUSTOMLOGLEVELMANAGER_HEADER_
|
||||
#define LOG4CPLUS_INTERNAL_CUSTOMLOGLEVELMANAGER_HEADER_
|
||||
|
||||
#include <log4cplus/config.hxx>
|
||||
|
||||
#if defined (LOG4CPLUS_HAVE_PRAGMA_ONCE)
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#if ! defined (INSIDE_LOG4CPLUS)
|
||||
# error "This header must not be be used outside log4cplus' implementation files."
|
||||
#endif
|
||||
|
||||
#include <map>
|
||||
#include <log4cplus/thread/syncprims.h>
|
||||
#include <log4cplus/internal/internal.h>
|
||||
|
||||
|
||||
namespace log4cplus {
|
||||
|
||||
namespace internal {
|
||||
|
||||
|
||||
/**
|
||||
* Custom log level manager used by C API.
|
||||
*/
|
||||
class CustomLogLevelManager {
|
||||
protected:
|
||||
log4cplus::thread::Mutex mtx;
|
||||
bool pushed_methods;
|
||||
std::map<LogLevel,tstring> ll2nm;
|
||||
std::map<tstring,LogLevel> nm2ll;
|
||||
|
||||
public:
|
||||
CustomLogLevelManager()
|
||||
: pushed_methods (false)
|
||||
{ }
|
||||
|
||||
bool add(LogLevel ll, tstring const &nm)
|
||||
{
|
||||
log4cplus::thread::MutexGuard guard (mtx);
|
||||
|
||||
if (! pushed_methods)
|
||||
{
|
||||
pushed_methods = true;
|
||||
getLogLevelManager().pushToStringMethod(customToStringMethod);
|
||||
getLogLevelManager().pushFromStringMethod(customFromStringMethod);
|
||||
}
|
||||
|
||||
auto i = ll2nm.lower_bound(ll);
|
||||
if( ( i != ll2nm.end() ) && ( i->first == ll ) && ( i->second != nm ) )
|
||||
return false;
|
||||
|
||||
auto j = nm2ll.lower_bound(nm);
|
||||
if( ( j != nm2ll.end() ) && ( j->first == nm ) && ( j->second != ll ) )
|
||||
return false;
|
||||
|
||||
// there is no else after return
|
||||
ll2nm.insert( i, std::make_pair(ll, nm) );
|
||||
nm2ll.insert( j, std::make_pair(nm, ll) );
|
||||
return true;
|
||||
}
|
||||
|
||||
bool remove(LogLevel ll, tstring const &nm)
|
||||
{
|
||||
log4cplus::thread::MutexGuard guard (mtx);
|
||||
|
||||
auto i = ll2nm.find(ll);
|
||||
auto j = nm2ll.find(nm);
|
||||
if( ( i != ll2nm.end() ) && ( j != nm2ll.end() ) &&
|
||||
( i->first == j->second ) && ( i->second == j->first ) ) {
|
||||
ll2nm.erase(i);
|
||||
nm2ll.erase(j);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// there is no else after return
|
||||
return false;
|
||||
}
|
||||
|
||||
protected:
|
||||
tstring const & customToStringMethodWorker(LogLevel ll)
|
||||
{
|
||||
log4cplus::thread::MutexGuard guard (mtx);
|
||||
auto i = ll2nm.find(ll);
|
||||
if( i != ll2nm.end() )
|
||||
return i->second;
|
||||
|
||||
return internal::empty_str;
|
||||
}
|
||||
|
||||
LogLevel customFromStringMethodWorker(const tstring& nm)
|
||||
{
|
||||
log4cplus::thread::MutexGuard guard (mtx);
|
||||
auto i = nm2ll.find(nm);
|
||||
if( i != nm2ll.end() )
|
||||
return i->second;
|
||||
|
||||
return NOT_SET_LOG_LEVEL;
|
||||
}
|
||||
|
||||
LOG4CPLUS_PRIVATE static tstring const & customToStringMethod(LogLevel ll);
|
||||
LOG4CPLUS_PRIVATE static LogLevel customFromStringMethod(const tstring& nm);
|
||||
};
|
||||
|
||||
LOG4CPLUS_PRIVATE CustomLogLevelManager & getCustomLogLevelManager ();
|
||||
|
||||
} // namespace internal
|
||||
|
||||
} // namespace log4cplus
|
||||
|
||||
|
||||
#endif // LOG4CPLUS_INTERNAL_CUSTOMLOGLEVELMANAGER_HEADER
|
||||
55
LFtid1056/cloudfront/code/log4cplus/internal/cygwin-win32.h
Normal file
55
LFtid1056/cloudfront/code/log4cplus/internal/cygwin-win32.h
Normal file
@@ -0,0 +1,55 @@
|
||||
// -*- C++ -*-
|
||||
// Module: Log4CPLUS
|
||||
// File: cygwin-win32.h
|
||||
// Created: 7/2011
|
||||
// Author: Vaclav Zeman
|
||||
//
|
||||
// Copyright (C) 2011-2017, Vaclav Zeman. 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_CONFIG_CYGWIN_WIN32_H)
|
||||
#define LOG4CPLUS_CONFIG_CYGWIN_WIN32_H
|
||||
|
||||
#include <log4cplus/config.hxx>
|
||||
|
||||
#if defined (LOG4CPLUS_HAVE_PRAGMA_ONCE)
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#if defined (__CYGWIN__)
|
||||
|
||||
#if ! defined (INSIDE_LOG4CPLUS)
|
||||
# error "This header must not be be used outside log4cplus' implementation files."
|
||||
#endif
|
||||
|
||||
|
||||
namespace log4cplus { namespace cygwin {
|
||||
|
||||
unsigned long get_current_win32_thread_id ();
|
||||
void output_debug_stringW (wchar_t const *);
|
||||
|
||||
} } // namespace log4cplus { namespace cygwin {
|
||||
|
||||
|
||||
#endif // defined (__CYGWIN__)
|
||||
#endif // LOG4CPLUS_CONFIG_CYGWIN_WIN32_H
|
||||
102
LFtid1056/cloudfront/code/log4cplus/internal/env.h
Normal file
102
LFtid1056/cloudfront/code/log4cplus/internal/env.h
Normal file
@@ -0,0 +1,102 @@
|
||||
// -*- C++ -*-
|
||||
// Module: Log4CPLUS
|
||||
// File: env.h
|
||||
// Created: 7/2010
|
||||
// Author: Vaclav Haisman
|
||||
//
|
||||
//
|
||||
// Copyright (C) 2010-2017, 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_INTERNAL_ENV_H
|
||||
#define LOG4CPLUS_INTERNAL_ENV_H
|
||||
|
||||
#include <log4cplus/config.hxx>
|
||||
|
||||
#if defined (LOG4CPLUS_HAVE_PRAGMA_ONCE)
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#include <vector>
|
||||
#include <log4cplus/tstring.h>
|
||||
#include <locale>
|
||||
|
||||
#if defined (_WIN32)
|
||||
#include <log4cplus/config/windowsh-inc.h>
|
||||
#endif
|
||||
#ifdef LOG4CPLUS_HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef LOG4CPLUS_HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
|
||||
namespace log4cplus { namespace internal {
|
||||
|
||||
|
||||
//! Get environment variable value.
|
||||
bool get_env_var (tstring & value, tstring const & name);
|
||||
|
||||
//! Get locale.
|
||||
std::locale get_locale_by_name(tstring const& locale_name);
|
||||
|
||||
//! Parse a string as a boolean value.
|
||||
bool parse_bool (bool & val, tstring const & str);
|
||||
|
||||
//! Parse a path into path components.
|
||||
bool split_path (std::vector<tstring> & components, std::size_t & special,
|
||||
tstring const & path);
|
||||
|
||||
//! Makes directories leading to file.
|
||||
void make_dirs (tstring const & file_path);
|
||||
|
||||
inline
|
||||
#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
|
||||
|
||||
|
||||
} } // namespace log4cplus { namespace internal {
|
||||
|
||||
|
||||
#endif // LOG4CPLUS_INTERNAL_ENV_H
|
||||
244
LFtid1056/cloudfront/code/log4cplus/internal/internal.h
Normal file
244
LFtid1056/cloudfront/code/log4cplus/internal/internal.h
Normal file
@@ -0,0 +1,244 @@
|
||||
// -*- C++ -*-
|
||||
// Module: Log4CPLUS
|
||||
// File: internal.h
|
||||
// Created: 1/2009
|
||||
// Author: Vaclav Haisman
|
||||
//
|
||||
//
|
||||
// Copyright (C) 2009-2017, 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 header contains declaration internal to log4cplus. They must never be
|
||||
* visible from user accesible headers or exported in DLL/shared libray.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef LOG4CPLUS_INTERNAL_INTERNAL_HEADER_
|
||||
#define LOG4CPLUS_INTERNAL_INTERNAL_HEADER_
|
||||
|
||||
#include <log4cplus/config.hxx>
|
||||
|
||||
#if defined (LOG4CPLUS_HAVE_PRAGMA_ONCE)
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#if ! defined (INSIDE_LOG4CPLUS)
|
||||
# error "This header must not be be used outside log4cplus' implementation files."
|
||||
#endif
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <sstream>
|
||||
#include <cstdio>
|
||||
#include <log4cplus/tstring.h>
|
||||
#include <log4cplus/streams.h>
|
||||
#include <log4cplus/ndc.h>
|
||||
#include <log4cplus/mdc.h>
|
||||
#include <log4cplus/spi/loggingevent.h>
|
||||
#include <log4cplus/thread/impl/tls.h>
|
||||
#include <log4cplus/helpers/snprintf.h>
|
||||
|
||||
|
||||
namespace log4cplus {
|
||||
|
||||
namespace internal {
|
||||
|
||||
|
||||
//! Canonical empty string. It is used when the need to return empty string
|
||||
//! by reference arises.
|
||||
extern log4cplus::tstring const empty_str;
|
||||
|
||||
|
||||
struct gft_scratch_pad
|
||||
{
|
||||
gft_scratch_pad ();
|
||||
~gft_scratch_pad ();
|
||||
|
||||
void
|
||||
reset ()
|
||||
{
|
||||
uc_q_str_valid = false;
|
||||
q_str_valid = false;
|
||||
s_str_valid = false;
|
||||
ret.clear ();
|
||||
}
|
||||
|
||||
log4cplus::tstring q_str;
|
||||
log4cplus::tstring uc_q_str;
|
||||
log4cplus::tstring s_str;
|
||||
log4cplus::tstring ret;
|
||||
log4cplus::tstring fmt;
|
||||
log4cplus::tstring tmp;
|
||||
std::vector<tchar> buffer;
|
||||
bool uc_q_str_valid;
|
||||
bool q_str_valid;
|
||||
bool s_str_valid;
|
||||
};
|
||||
|
||||
|
||||
struct appender_sratch_pad
|
||||
{
|
||||
appender_sratch_pad ();
|
||||
~appender_sratch_pad ();
|
||||
|
||||
tostringstream oss;
|
||||
tstring str;
|
||||
std::string chstr;
|
||||
};
|
||||
|
||||
|
||||
//! Per thread data.
|
||||
struct per_thread_data
|
||||
{
|
||||
per_thread_data ();
|
||||
~per_thread_data ();
|
||||
|
||||
tstring macros_str;
|
||||
tostringstream macros_oss;
|
||||
tostringstream layout_oss;
|
||||
DiagnosticContextStack ndc_dcs;
|
||||
MappedDiagnosticContextMap mdc_map;
|
||||
log4cplus::tstring thread_name;
|
||||
log4cplus::tstring thread_name2;
|
||||
gft_scratch_pad gft_sp;
|
||||
appender_sratch_pad appender_sp;
|
||||
log4cplus::tstring faa_str;
|
||||
log4cplus::tstring ll_str;
|
||||
spi::InternalLoggingEvent forced_log_ev;
|
||||
std::FILE * fnull;
|
||||
log4cplus::helpers::snprintf_buf snprintf_buf;
|
||||
};
|
||||
|
||||
|
||||
per_thread_data * alloc_ptd ();
|
||||
|
||||
// TLS key whose value is pointer struct per_thread_data.
|
||||
extern log4cplus::thread::impl::tls_key_type tls_storage_key;
|
||||
|
||||
|
||||
#if ! defined (LOG4CPLUS_SINGLE_THREADED) \
|
||||
&& defined (LOG4CPLUS_THREAD_LOCAL_VAR)
|
||||
|
||||
extern LOG4CPLUS_THREAD_LOCAL_VAR per_thread_data * ptd;
|
||||
|
||||
|
||||
inline
|
||||
void
|
||||
set_ptd (per_thread_data * p)
|
||||
{
|
||||
ptd = p;
|
||||
}
|
||||
|
||||
|
||||
inline
|
||||
per_thread_data *
|
||||
get_ptd (bool alloc = true)
|
||||
{
|
||||
if (LOG4CPLUS_UNLIKELY (! ptd && alloc))
|
||||
return alloc_ptd ();
|
||||
|
||||
// The assert() does not belong here. get_ptd() might be called by
|
||||
// cleanup code that can handle the returned NULL pointer.
|
||||
//assert (ptd);
|
||||
|
||||
return ptd;
|
||||
}
|
||||
|
||||
|
||||
#else // defined (LOG4CPLUS_THREAD_LOCAL_VAR)
|
||||
|
||||
|
||||
inline
|
||||
void
|
||||
set_ptd (per_thread_data * p)
|
||||
{
|
||||
thread::impl::tls_set_value (tls_storage_key, p);
|
||||
}
|
||||
|
||||
|
||||
inline
|
||||
per_thread_data *
|
||||
get_ptd (bool alloc = true)
|
||||
{
|
||||
per_thread_data * ptd
|
||||
= reinterpret_cast<per_thread_data *>(
|
||||
thread::impl::tls_get_value (tls_storage_key));
|
||||
|
||||
if (LOG4CPLUS_UNLIKELY (! ptd && alloc))
|
||||
return alloc_ptd ();
|
||||
|
||||
return ptd;
|
||||
}
|
||||
|
||||
|
||||
#endif // defined (LOG4CPLUS_THREAD_LOCAL_VAR)
|
||||
|
||||
|
||||
inline
|
||||
tstring &
|
||||
get_thread_name_str ()
|
||||
{
|
||||
return get_ptd ()->thread_name;
|
||||
}
|
||||
|
||||
|
||||
inline
|
||||
tstring &
|
||||
get_thread_name2_str ()
|
||||
{
|
||||
return get_ptd ()->thread_name2;
|
||||
}
|
||||
|
||||
|
||||
inline
|
||||
gft_scratch_pad &
|
||||
get_gft_scratch_pad ()
|
||||
{
|
||||
return get_ptd ()->gft_sp;
|
||||
}
|
||||
|
||||
|
||||
inline
|
||||
appender_sratch_pad &
|
||||
get_appender_sp ()
|
||||
{
|
||||
return get_ptd ()->appender_sp;
|
||||
}
|
||||
|
||||
|
||||
} // namespace internal {
|
||||
|
||||
|
||||
namespace detail
|
||||
{
|
||||
|
||||
LOG4CPLUS_EXPORT void clear_tostringstream (tostringstream &);
|
||||
|
||||
} // namespace detail
|
||||
|
||||
|
||||
} // namespace log4cplus {
|
||||
|
||||
|
||||
#endif // LOG4CPLUS_INTERNAL_INTERNAL_HEADER_
|
||||
219
LFtid1056/cloudfront/code/log4cplus/internal/socket.h
Normal file
219
LFtid1056/cloudfront/code/log4cplus/internal/socket.h
Normal file
@@ -0,0 +1,219 @@
|
||||
// -*- C++ -*-
|
||||
// Module: Log4CPLUS
|
||||
// File: socket.h
|
||||
// Created: 1/2010
|
||||
// Author: Vaclav Haisman
|
||||
//
|
||||
//
|
||||
// Copyright (C) 2010-2017, 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 header contains declaration internal to log4cplus. They must never be
|
||||
* visible from user accesible headers or exported in DLL/shared libray.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef LOG4CPLUS_INTERNAL_SOCKET_H_
|
||||
#define LOG4CPLUS_INTERNAL_SOCKET_H_
|
||||
|
||||
#include <log4cplus/config.hxx>
|
||||
|
||||
#if defined (LOG4CPLUS_HAVE_PRAGMA_ONCE)
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#if ! defined (INSIDE_LOG4CPLUS)
|
||||
# error "This header must not be be used outside log4cplus' implementation files."
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32)
|
||||
#include <log4cplus/config/windowsh-inc.h>
|
||||
#endif
|
||||
#include <log4cplus/helpers/socket.h>
|
||||
|
||||
#include <cerrno>
|
||||
#ifdef LOG4CPLUS_HAVE_ERRNO_H
|
||||
#include <errno.h>
|
||||
#endif
|
||||
|
||||
#ifdef LOG4CPLUS_HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if defined (LOG4CPLUS_HAVE_NETDB_H)
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
|
||||
|
||||
namespace log4cplus {
|
||||
|
||||
namespace helpers {
|
||||
|
||||
#if defined(_WIN32)
|
||||
typedef SOCKET os_socket_type;
|
||||
os_socket_type const INVALID_OS_SOCKET_VALUE = INVALID_SOCKET;
|
||||
|
||||
struct ADDRINFOT_deleter
|
||||
{
|
||||
void
|
||||
operator () (ADDRINFOA * ptr) const
|
||||
{
|
||||
FreeAddrInfoA(ptr);
|
||||
}
|
||||
|
||||
void
|
||||
operator () (ADDRINFOW * ptr) const
|
||||
{
|
||||
FreeAddrInfoW(ptr);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
struct socket_closer
|
||||
{
|
||||
void
|
||||
operator () (SOCKET s)
|
||||
{
|
||||
if (s && s != INVALID_OS_SOCKET_VALUE)
|
||||
{
|
||||
DWORD const eno = WSAGetLastError();
|
||||
::closesocket(s);
|
||||
WSASetLastError(eno);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#else
|
||||
typedef int os_socket_type;
|
||||
os_socket_type const INVALID_OS_SOCKET_VALUE = -1;
|
||||
|
||||
|
||||
struct addrinfo_deleter
|
||||
{
|
||||
void
|
||||
operator () (struct addrinfo * ptr) const
|
||||
{
|
||||
freeaddrinfo(ptr);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
struct socket_closer
|
||||
{
|
||||
void
|
||||
operator () (os_socket_type s)
|
||||
{
|
||||
if (s >= 0)
|
||||
{
|
||||
int const eno = errno;
|
||||
close(s);
|
||||
errno = eno;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
struct socket_holder
|
||||
{
|
||||
os_socket_type sock;
|
||||
|
||||
socket_holder()
|
||||
: sock(INVALID_OS_SOCKET_VALUE)
|
||||
{ }
|
||||
|
||||
socket_holder(os_socket_type s)
|
||||
: sock(s)
|
||||
{ }
|
||||
|
||||
~socket_holder()
|
||||
{
|
||||
socket_closer()(sock);
|
||||
}
|
||||
|
||||
void
|
||||
reset(os_socket_type s = INVALID_OS_SOCKET_VALUE)
|
||||
{
|
||||
if (sock != INVALID_OS_SOCKET_VALUE)
|
||||
socket_closer()(sock);
|
||||
|
||||
sock = s;
|
||||
}
|
||||
|
||||
os_socket_type
|
||||
detach()
|
||||
{
|
||||
os_socket_type s = sock;
|
||||
sock = INVALID_OS_SOCKET_VALUE;
|
||||
return s;
|
||||
}
|
||||
|
||||
socket_holder(socket_holder &&) = delete;
|
||||
socket_holder(socket_holder const &) = delete;
|
||||
|
||||
socket_holder operator = (socket_holder &&) = delete;
|
||||
socket_holder operator = (socket_holder const &) = delete;
|
||||
};
|
||||
|
||||
|
||||
static inline
|
||||
os_socket_type
|
||||
to_os_socket (SOCKET_TYPE const & x)
|
||||
{
|
||||
return static_cast<os_socket_type>(x);
|
||||
}
|
||||
|
||||
|
||||
static inline
|
||||
SOCKET_TYPE
|
||||
to_log4cplus_socket (os_socket_type const & x)
|
||||
{
|
||||
return static_cast<SOCKET_TYPE>(x);
|
||||
}
|
||||
|
||||
|
||||
static inline
|
||||
void
|
||||
set_last_socket_error (int err)
|
||||
{
|
||||
errno = err;
|
||||
}
|
||||
|
||||
|
||||
static inline
|
||||
int
|
||||
get_last_socket_error ()
|
||||
{
|
||||
return errno;
|
||||
}
|
||||
|
||||
|
||||
} // namespace helpers {
|
||||
|
||||
} // namespace log4cplus {
|
||||
|
||||
|
||||
#endif // LOG4CPLUS_INTERNAL_SOCKET_H_
|
||||
Reference in New Issue
Block a user