Log_Record.cpp

Go to the documentation of this file.
00001 // $Id: Log_Record.cpp 80826 2008-03-04 14:51:23Z wotte $
00002 
00003 #include "ace/Log_Record.h"
00004 
00005 #include "ace/Log_Msg.h"
00006 #include "ace/ACE.h"
00007 #include "ace/OS_NS_stdio.h"
00008 #include "ace/OS_NS_time.h"
00009 #include "ace/CDR_Stream.h"
00010 #include "ace/Auto_Ptr.h"
00011 #include "ace/Truncate.h"
00012 
00013 #if !defined (__ACE_INLINE__)
00014 # include "ace/Log_Record.inl"
00015 #endif /* __ACE_INLINE__ */
00016 
00017 #if !defined (ACE_LACKS_IOSTREAM_TOTALLY)
00018 // FUZZ: disable check_for_streams_include
00019 # include "ace/streams.h"
00020 #endif /* ! ACE_LACKS_IOSTREAM_TOTALLY */
00021 
00022 #include "ace/OS_Memory.h"
00023 
00024 ACE_RCSID(ace, Log_Record, "$Id: Log_Record.cpp 80826 2008-03-04 14:51:23Z wotte $")
00025 
00026 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00027 
00028 ACE_ALLOC_HOOK_DEFINE(ACE_Log_Record)
00029 
00030 namespace
00031 {
00032   // Symbolic names for the <ACE_Log_Priority> enumerators.
00033   ACE_TCHAR const * ace_priority_names[] =
00034     {
00035       ACE_TEXT ("LM_SHUTDOWN"),
00036       ACE_TEXT ("LM_TRACE"),
00037       ACE_TEXT ("LM_DEBUG"),
00038       ACE_TEXT ("LM_INFO"),
00039       ACE_TEXT ("LM_NOTICE"),
00040       ACE_TEXT ("LM_WARNING"),
00041       ACE_TEXT ("LM_STARTUP"),
00042       ACE_TEXT ("LM_ERROR"),
00043       ACE_TEXT ("LM_CRITICAL"),
00044       ACE_TEXT ("LM_ALERT"),
00045       ACE_TEXT ("LM_EMERGENCY"),
00046       ACE_TEXT ("LM_UNK(04000)"),
00047       ACE_TEXT ("LM_UNK(010000)"),
00048       ACE_TEXT ("LM_UNK(020000)"),
00049       ACE_TEXT ("LM_UNK(040000)"),
00050       ACE_TEXT ("LM_UNK(0100000)"),
00051       ACE_TEXT ("LM_UNK(0200000)"),
00052       ACE_TEXT ("LM_UNK(0400000)"),
00053       ACE_TEXT ("LM_UNK(01000000)"),
00054       ACE_TEXT ("LM_UNK(02000000)"),
00055       ACE_TEXT ("LM_UNK(04000000)"),
00056       ACE_TEXT ("LM_UNK(010000000)"),
00057       ACE_TEXT ("LM_UNK(020000000)"),
00058       ACE_TEXT ("LM_UNK(040000000)"),
00059       ACE_TEXT ("LM_UNK(0100000000)"),
00060       ACE_TEXT ("LM_UNK(0200000000)"),
00061       ACE_TEXT ("LM_UNK(0400000000)"),
00062       ACE_TEXT ("LM_UNK(01000000000)"),
00063       ACE_TEXT ("LM_UNK(02000000000)"),
00064       ACE_TEXT ("LM_UNK(04000000000)"),
00065       ACE_TEXT ("LM_UNK(010000000000)"),
00066       ACE_TEXT ("LM_UNK(020000000000)")
00067     };
00068 }
00069 
00070 const ACE_TCHAR *
00071 ACE_Log_Record::priority_name (ACE_Log_Priority p)
00072 {
00073   return ace_priority_names[ACE::log2 (p)];
00074 }
00075 
00076 void
00077 ACE_Log_Record::priority_name (ACE_Log_Priority p,
00078                                const ACE_TCHAR *name)
00079 {
00080   // Name must be a statically allocated string
00081   ace_priority_names[ACE::log2 (p)] = name;
00082 }
00083 
00084 u_long
00085 ACE_Log_Record::priority (void) const
00086 {
00087   ACE_TRACE ("ACE_Log_Record::priority");
00088 
00089   // Get the priority of the <Log_Record> <type_>.  This is computed
00090   // as the base 2 logarithm of <type_> (which must be a power of 2,
00091   // as defined by the enums in <ACE_Log_Priority>).
00092   return ACE::log2 ((u_long) this->type_);
00093 }
00094 
00095 void
00096 ACE_Log_Record::priority (u_long p)
00097 {
00098   ACE_TRACE ("ACE_Log_Record::priority");
00099 
00100   // Set the priority of the <Log_Record> <type_> (which must be a
00101   // power of 2, as defined by the enums in <ACE_Log_Priority>).
00102   this->type_ = (ACE_UINT32) p;
00103 }
00104 
00105 void
00106 ACE_Log_Record::dump (void) const
00107 {
00108 #if defined (ACE_HAS_DUMP)
00109   // ACE_TRACE ("ACE_Log_Record::dump");
00110 
00111   ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
00112   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("length_ = %d\n"), this->length_));
00113   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\ntype_ = %u\n"), this->type_));
00114   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\ntime_stamp_ = (%:, %d)\n"),
00115               this->secs_, this->usecs_));
00116   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\npid_ = %u\n"), this->pid_));
00117   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nmsg_data_ (0x%@) = %s\n"),
00118               this->msg_data_, this->msg_data_));
00119   ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nmsg_data_size_ = %B\n"),
00120               this->msg_data_size_));
00121   ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00122 #endif /* ACE_HAS_DUMP */
00123 }
00124 
00125 int
00126 ACE_Log_Record::msg_data (const ACE_TCHAR *data)
00127 {
00128   // ACE_TRACE ("ACE_Log_Record::msg_data");
00129   size_t const newlen = ACE_OS::strlen (data) + 1;  // Will need room for '\0'
00130   if (newlen > this->msg_data_size_)
00131     {
00132       ACE_TCHAR *new_msg_data = 0;
00133       ACE_NEW_RETURN (new_msg_data, ACE_TCHAR[newlen], -1);
00134       delete [] this->msg_data_;
00135       this->msg_data_ = new_msg_data;
00136       this->msg_data_size_ = newlen;
00137     }
00138   ACE_OS::strcpy (this->msg_data_, data);
00139   this->round_up ();
00140   return 0;
00141 }
00142 
00143 ACE_Log_Record::ACE_Log_Record (ACE_Log_Priority lp,
00144                                 time_t ts_sec,
00145                                 long p)
00146   : length_ (0),
00147     type_ (ACE_UINT32 (lp)),
00148     secs_ (ts_sec),
00149     usecs_ (0),
00150     pid_ (ACE_UINT32 (p)),
00151     msg_data_ (0),
00152     msg_data_size_ (0)
00153 {
00154   // ACE_TRACE ("ACE_Log_Record::ACE_Log_Record");
00155   ACE_NEW_NORETURN (this->msg_data_, ACE_TCHAR[MAXLOGMSGLEN]);
00156   if (0 != this->msg_data_)
00157     {
00158       this->msg_data_size_ = MAXLOGMSGLEN;
00159       this->msg_data_[0] = '\0';
00160     }
00161 }
00162 
00163 ACE_Log_Record::ACE_Log_Record (ACE_Log_Priority lp,
00164                                 const ACE_Time_Value &ts,
00165                                 long p)
00166   : length_ (0),
00167     type_ (ACE_UINT32 (lp)),
00168     secs_ (ts.sec ()),
00169     usecs_ ((ACE_UINT32) ts.usec ()),
00170     pid_ (ACE_UINT32 (p)),
00171     msg_data_ (0),
00172     msg_data_size_ (0)
00173 {
00174   // ACE_TRACE ("ACE_Log_Record::ACE_Log_Record");
00175   ACE_NEW_NORETURN (this->msg_data_, ACE_TCHAR[MAXLOGMSGLEN]);
00176   if (0 != this->msg_data_)
00177     {
00178       this->msg_data_size_ = MAXLOGMSGLEN;
00179       this->msg_data_[0] = '\0';
00180     }
00181 }
00182 
00183 void
00184 ACE_Log_Record::round_up (void)
00185 {
00186   // ACE_TRACE ("ACE_Log_Record::round_up");
00187   // Determine the length of the payload.
00188   size_t len = sizeof (*this) + (sizeof (ACE_TCHAR) * ((ACE_OS::strlen (this->msg_data_) + 1)));
00189 
00190   // Round up to the alignment.
00191   len = ((len + ACE_Log_Record::ALIGN_WORDB - 1)
00192          & ~(ACE_Log_Record::ALIGN_WORDB - 1));
00193   this->length_ = static_cast<ACE_UINT32> (len);
00194 }
00195 
00196 ACE_Log_Record::ACE_Log_Record (void)
00197   : length_ (0),
00198     type_ (0),
00199     secs_ (0),
00200     usecs_ (0),
00201     pid_ (0),
00202     msg_data_ (0),
00203     msg_data_size_ (0)
00204 {
00205   // ACE_TRACE ("ACE_Log_Record::ACE_Log_Record");
00206   ACE_NEW_NORETURN (this->msg_data_, ACE_TCHAR[MAXLOGMSGLEN]);
00207   if (0 != this->msg_data_)
00208     {
00209       this->msg_data_size_ = MAXLOGMSGLEN;
00210       this->msg_data_[0] = '\0';
00211     }
00212 }
00213 
00214 int
00215 ACE_Log_Record::format_msg (const ACE_TCHAR host_name[],
00216                             u_long verbose_flag,
00217                             ACE_TCHAR *verbose_msg)
00218 {
00219   /* 0123456789012345678901234     */
00220   /* Oct 18 14:25:36.000 1989<nul> */
00221   ACE_TCHAR timestamp[26]; // Only used by VERBOSE and VERBOSE_LITE.
00222 
00223   // The sprintf format needs to be different for Windows and POSIX
00224   // in the wide-char case.
00225 #if defined (ACE_WIN32) || !defined (ACE_USES_WCHAR)
00226   const ACE_TCHAR *time_fmt =         ACE_TEXT ("%s.%03ld %s");
00227   const ACE_TCHAR *verbose_fmt =      ACE_TEXT ("%s@%s@%u@%s@%s");
00228   const ACE_TCHAR *verbose_lite_fmt = ACE_TEXT ("%s@%s@%s");
00229 #else
00230   const ACE_TCHAR *time_fmt = ACE_TEXT ("%ls.%03ld %ls");
00231   const ACE_TCHAR *verbose_fmt = ACE_TEXT ("%ls@%ls@%u@%ls@%ls");
00232   const ACE_TCHAR *verbose_lite_fmt = ACE_TEXT ("%ls@%ls@%ls");
00233 #endif
00234 
00235   if (ACE_BIT_ENABLED (verbose_flag,
00236                        ACE_Log_Msg::VERBOSE)
00237       || ACE_BIT_ENABLED (verbose_flag,
00238                           ACE_Log_Msg::VERBOSE_LITE))
00239     {
00240       time_t const now = this->secs_;
00241       ACE_TCHAR ctp[26]; // 26 is a magic number...
00242 
00243       if (ACE_OS::ctime_r (&now, ctp, sizeof ctp) == 0)
00244         return -1;
00245 
00246       /* 01234567890123456789012345 */
00247       /* Wed Oct 18 14:25:36 1989n0 */
00248 
00249       ctp[19] = '\0'; // NUL-terminate after the time.
00250       ctp[24] = '\0'; // NUL-terminate after the date.
00251 
00252       ACE_OS::sprintf (timestamp,
00253                        time_fmt,
00254                        ctp + 4,
00255                        ((long) this->usecs_) / 1000,
00256                        ctp + 20);
00257     }
00258 
00259   if (ACE_BIT_ENABLED (verbose_flag,
00260                        ACE_Log_Msg::VERBOSE))
00261     {
00262       const ACE_TCHAR *lhost_name = ((host_name == 0)
00263                                       ? ACE_TEXT ("<local_host>")
00264                                       : host_name);
00265       ACE_OS::sprintf (verbose_msg,
00266                        verbose_fmt,
00267                        timestamp,
00268                        lhost_name,
00269                        this->pid_,
00270                        ACE_Log_Record::priority_name (ACE_Log_Priority (this->type_)),
00271                        this->msg_data_);
00272     }
00273   else if (ACE_BIT_ENABLED (verbose_flag, ACE_Log_Msg::VERBOSE_LITE))
00274     ACE_OS::sprintf (verbose_msg,
00275                      verbose_lite_fmt,
00276                      timestamp,
00277                      ACE_Log_Record::priority_name (ACE_Log_Priority (this->type_)),
00278                      this->msg_data_);
00279   else
00280     ACE_OS::strcpy (verbose_msg, this->msg_data_);
00281   return 0;
00282 }
00283 
00284 int
00285 ACE_Log_Record::print (const ACE_TCHAR host_name[],
00286                        u_long verbose_flag,
00287                        FILE *fp)
00288 {
00289   if (ACE_LOG_MSG->log_priority_enabled (ACE_Log_Priority (this->type_)))
00290     {
00291       ACE_TCHAR *verbose_msg = 0;
00292       ACE_NEW_RETURN (verbose_msg, ACE_TCHAR[MAXVERBOSELOGMSGLEN], -1);
00293 
00294       int result = this->format_msg (host_name, verbose_flag, verbose_msg);
00295 
00296       if (result == 0)
00297         {
00298           if (fp != 0)
00299             {
00300               int const verbose_msg_len =
00301                 static_cast<int> (ACE_OS::strlen (verbose_msg));
00302 #if !defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
00303               int const fwrite_result = ACE_OS::fprintf (fp,
00304                                                          ACE_TEXT ("%ls"),
00305                                                          verbose_msg);
00306 #else
00307               int const fwrite_result = ACE_OS::fprintf (fp,
00308                                                          ACE_TEXT ("%s"),
00309                                                          verbose_msg);
00310 #endif
00311               // We should have written everything
00312               if (fwrite_result != verbose_msg_len)
00313                 result = -1;
00314               else
00315                 ACE_OS::fflush (fp);
00316             }
00317         }
00318 
00319       delete [] verbose_msg;
00320 
00321       return result;
00322     }
00323   else
00324     return 0;
00325 }
00326 
00327 int
00328 operator<< (ACE_OutputCDR &cdr,
00329             const ACE_Log_Record &log_record)
00330 {
00331   // The written message length can't be more than 32 bits (ACE_CDR::ULong)
00332   // so reduce it here if needed.
00333   ACE_CDR::ULong u_msglen =
00334     ACE_Utils::truncate_cast<ACE_CDR::ULong> (log_record.msg_data_len ());
00335 
00336   // Insert each field from <log_record> into the output CDR stream.
00337   cdr << ACE_CDR::Long (log_record.type ());
00338   cdr << ACE_CDR::Long (log_record.pid ());
00339   cdr << ACE_CDR::LongLong (log_record.time_stamp ().sec ());
00340   cdr << ACE_CDR::Long (log_record.time_stamp ().usec ());
00341   cdr << u_msglen;
00342 #if defined (ACE_USES_WCHAR)
00343   cdr.write_wchar_array (log_record.msg_data (), u_msglen);
00344 #else
00345   cdr.write_char_array (log_record.msg_data (), u_msglen);
00346 #endif /* ACE_USES_WCHAR */
00347   return cdr.good_bit ();
00348 }
00349 
00350 int
00351 operator>> (ACE_InputCDR &cdr,
00352             ACE_Log_Record &log_record)
00353 {
00354   ACE_CDR::Long type;
00355   ACE_CDR::Long pid;
00356   ACE_CDR::LongLong sec;
00357   ACE_CDR::Long usec;
00358   ACE_CDR::ULong buffer_len;
00359 
00360   // Extract each field from input CDR stream into <log_record>.
00361   if ((cdr >> type) && (cdr >> pid) && (cdr >> sec) && (cdr >> usec)
00362       && (cdr >> buffer_len)) {
00363     ACE_TCHAR *log_msg;
00364     ACE_NEW_RETURN (log_msg, ACE_TCHAR[buffer_len + 1], -1);
00365     auto_ptr<ACE_TCHAR> log_msg_p (log_msg);
00366     log_record.type (type);
00367     log_record.pid (pid);
00368     log_record.time_stamp (ACE_Time_Value (ACE_Utils::truncate_cast<time_t> (sec),
00369                                            usec));
00370 #if defined (ACE_USES_WCHAR)
00371     cdr.read_wchar_array (log_msg, buffer_len);
00372 #else
00373     cdr.read_char_array (log_msg, buffer_len);
00374 #endif /* ACE_USES_WCHAR */
00375     log_msg[buffer_len] = '\0';
00376     if (-1 == log_record.msg_data (log_msg))
00377       return -1;
00378   }
00379   return cdr.good_bit ();
00380 }
00381 
00382 #if !defined (ACE_LACKS_IOSTREAM_TOTALLY)
00383 
00384 int
00385 ACE_Log_Record::print (const ACE_TCHAR host_name[],
00386                        u_long verbose_flag,
00387                        ACE_OSTREAM_TYPE &s)
00388 {
00389   if (ACE_LOG_MSG->log_priority_enabled (ACE_Log_Priority (this->type_)))
00390     {
00391       ACE_TCHAR* verbose_msg = 0;
00392       ACE_NEW_RETURN (verbose_msg, ACE_TCHAR[MAXVERBOSELOGMSGLEN], -1);
00393 
00394       int const result = this->format_msg (host_name, verbose_flag, verbose_msg);
00395 
00396       if (result == 0)
00397         {
00398           // Since ostream expects only chars, we cannot pass wchar_t's
00399           s << ACE_TEXT_ALWAYS_CHAR (verbose_msg);
00400           s.flush ();
00401         }
00402 
00403       delete [] verbose_msg;
00404 
00405       return result;
00406     }
00407   return 0;
00408 }
00409 
00410 #endif /* ! ACE_LACKS_IOSTREAM_TOTALLY */
00411 
00412 ACE_END_VERSIONED_NAMESPACE_DECL

Generated on Tue Feb 2 17:18:40 2010 for ACE by  doxygen 1.4.7