00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef LOGGER_IMPL_H
00015 #define LOGGER_IMPL_H
00016
00017 #include <errno.h>
00018 #include <cstdarg>
00019 #include <string>
00020
00021 #if defined(sun)
00022 #include <sys/varargs.h>
00023 #endif
00024
00025 #if defined (__CYGWIN32__) || defined (__NetBSD__) || defined (WIN32)
00026 # include <stdarg.h>
00027 #endif
00028
00029 #if defined(WIN32)
00030 # include <winsock2.h>
00031 #endif
00032
00033
00034
00035 #if !defined ( _BSDTYPES_DEFINED )
00036
00037 typedef unsigned char u_char;
00038 typedef unsigned short u_short;
00039 typedef unsigned int u_int;
00040 typedef unsigned long u_long;
00041
00042 #define _BSDTYPES_DEFINED
00043
00044 #endif
00045
00046 using std::string;
00047 using std::ostream;
00048
00049 #include "assa/LogMask.h"
00050
00053 #if defined (WIN32)
00054
00055 typedef SOCKET handler_t;
00056 #define BAD_HANDLER INVALID_SOCKET
00057
00060 #define EINPROGRESS WSAEINPROGRESS
00061
00062
00063
00064 #define EWOULDBLOCK WSAEWOULDBLOCK
00065
00066
00067
00068 #define EISCONN WSAEISCONN
00069
00070 #define ENOTSOCK WSAENOTSOCK
00071
00072 #define ECONNREFUSED WSAECONNREFUSED
00073
00074
00075 #define ETIMEDOUT WSAETIMEDOUT
00076
00077
00078 #else
00079
00080 #define BAD_HANDLER -1
00081 typedef int handler_t;
00082
00083 #endif // ifdef WIN32
00084
00085
00086 namespace ASSA {
00087
00088 class Reactor;
00089
00090
00091
00092
00093
00099 inline bool is_valid_handler (handler_t socket_)
00100 {
00101 return (socket_ != BAD_HANDLER);
00102 }
00103
00107 inline void disable_handler (handler_t& socket_)
00108 {
00109 socket_ = BAD_HANDLER;
00110 }
00111
00114 inline int get_errno ()
00115 {
00116 int myerrno;
00117 #if defined (WIN32)
00118 myerrno = WSAGetLastError ();
00119 #else
00120 myerrno = errno;
00121 #endif
00122 return myerrno;
00123 }
00124
00127 inline void set_errno (int new_errno_)
00128 {
00129 #if defined (WIN32)
00130 WSASetLastError (new_errno_);
00131 #else
00132 errno = new_errno_;
00133 #endif
00134 }
00135
00136
00137
00138
00139
00140 class Logger_Impl {
00141 public:
00148 static const unsigned int LOGGER_MAXLINE = 6660;
00149
00150 public:
00151 Logger_Impl ();
00152 virtual ~Logger_Impl () { }
00153
00154 void enable_group (Group g_) { m_groups |= g_; }
00155 void disable_group (Group g_) { m_groups &= ~g_; }
00156
00157 void enable_groups (u_long g_) { m_groups |= g_; }
00158 void disable_groups (u_long g_) { m_groups &= ~g_; }
00159
00160 void enable_all_groups (void) { m_groups = ASSA::ALL; }
00161 void disable_all_groups (void) { m_groups = 0; }
00162
00163 bool group_enabled (Group g_) const { return (m_groups & g_); }
00164
00165 void enable_timestamp (void) { m_tmflg = true; }
00166 void disable_timestamp (void) { m_tmflg = false; }
00167 bool timestamp_enabled (void) const { return m_tmflg; }
00168 void set_timezone (int zone_) { m_tz = zone_; }
00169
00170 void set_indent_step (u_short step_) { m_indent_step = step_; }
00171 u_short get_indent_step (void) const { return m_indent_step; }
00172
00174 virtual int log_open (u_long groups_);
00175
00177 virtual int log_open (const char* logfname_,
00178 u_long groups_,
00179 u_long maxsize_);
00180
00182 virtual int log_open (const char* appname_,
00183 const char* logfname_,
00184 u_long groups_,
00185 u_long maxsize_,
00186 Reactor* reactor_);
00187
00188 virtual int log_close (void) = 0;
00189 virtual void log_resync (void) { }
00190
00191 virtual int log_msg (Group g_,
00192 size_t indent_level_,
00193 const string& func_name_,
00194 size_t expected_sz_,
00195 const char* fmt_,
00196 va_list) = 0;
00197
00198 virtual int log_func (Group g_,
00199 size_t indent_level_,
00200 const string& func_name_,
00201 marker_t type_) = 0;
00202 protected:
00203 virtual u_short add_timestamp (ostream& sink_);
00204 virtual u_short indent_func_name (ostream& sink_,
00205 const string& funcname_,
00206 size_t indent_level_,
00207 marker_t type_);
00208
00225 char* format_msg (size_t expected_sz_,
00226 const char* fmt_,
00227 va_list vap_,
00228 bool& release_);
00229
00230 protected:
00232 static char m_msgbuf [LOGGER_MAXLINE];
00233
00235 u_short m_indent_step;
00236
00238 u_long m_groups;
00239
00241 string m_logfname;
00242
00244 bool m_tmflg;
00245
00247 int m_tz;
00248 };
00249
00250 inline
00251 Logger_Impl::
00252 Logger_Impl ()
00253 : m_indent_step (1),
00254 m_groups (0),
00255 m_tmflg (false),
00256 m_tz (1)
00257 {
00258
00259 }
00260
00261 inline int
00262 Logger_Impl::
00263 log_open (u_long )
00264 {
00265 errno = ENOSYS;
00266 return -1;
00267 }
00268
00269 inline int
00270 Logger_Impl::
00271 log_open (const char*,
00272 u_long,
00273 u_long )
00274 {
00275 errno = ENOSYS;
00276 return -1;
00277 }
00278
00279 inline int
00280 Logger_Impl::
00281 log_open (const char*,
00282 const char*,
00283 u_long,
00284 u_long,
00285 Reactor* )
00286 {
00287 errno = ENOSYS;
00288 return -1;
00289 }
00290
00291 }
00292
00293 #endif