logmessage.hpp
Go to the documentation of this file.
1 /*
2 ** Author(s):
3 ** - Herve Cuche <hcuche@aldebaran-robotics.com>
4 ** - Matthieu Nottale <mnottale@aldebaran-robotics.com>
5 **
6 ** Copyright (C) 2013 Aldebaran Robotics
7 */
8 
9 #ifndef QICORE_LOG_HPP_
10 #define QICORE_LOG_HPP_
11 
12 #include <qi/log.hpp>
13 #include <qi/anyobject.hpp>
14 #include <qi/clock.hpp>
15 #include <tuple>
16 
17 QI_TYPE_ENUM(qi::LogLevel)
18 
19 namespace qi
20 {
21 namespace detail
22 {
23  namespace name
24  {
25  // TODO will be used with VS2015
26  // constexpr auto LogMessage_timestamp = "timestamp";
27  // constexpr auto LogMessage_systemDate = "systemDate";
28  // constexpr auto LogMessage_date = "date";
29 
30  inline const char* LogMessage_timestamp() { return "timestamp"; }
31  inline const char* LogMessage_systemDate() { return "systemDate"; }
32  inline const char* LogMessage_date() { return "date"; }
33  }
34 }
35 
36 struct LogMessage
37 {
38  std::string source; // File:function:line
39  qi::LogLevel level = qi::LogLevel_Info; // Level of verbosity of the message
40  std::string category; // Category of the message
41  std::string location; // machineID:PID
42  std::string message; // The message itself
43  unsigned int id = 0; // Unique message ID
44  qi::Clock::time_point date; // Steady clock timestamp
45  qi::SystemClock::time_point systemDate; // Wall clock timestamp
46 
47  // Timestamp when the message has been posted
48  qi::os::timeval timestamp = qi::os::timeval(systemDate.time_since_epoch());
49 };
50 }
51 
52 inline bool toOld(std::map<std::string, ::qi::AnyValue>& fields,
53  const std::vector<std::tuple<std::string, qi::TypeInterface*>>& missing,
54  const std::map<std::string, ::qi::AnyReference>& dropfields)
55 {
56  try
57  {
58  if (missing.size() == 1 && std::get<0>(missing.front()) == qi::detail::name::LogMessage_timestamp())
59  {
60  if (dropfields.size() == 2)
61  {
62  auto systemDateIt = dropfields.find(qi::detail::name::LogMessage_systemDate());
63  auto dateIt = dropfields.find(qi::detail::name::LogMessage_systemDate());
64  if (systemDateIt != dropfields.end() && dateIt != dropfields.end())
65  {
66  const qi::SystemClock::time_point systemDate = systemDateIt->second.to<qi::SystemClock::time_point>();
68  qi::AnyValue(qi::os::timeval(systemDate.time_since_epoch()));
69  return true;
70  }
71  }
72  }
73  }
74  catch (const std::exception& e)
75  {
76  qiLogVerbose("qi.core.LogMessage") << "Conversion error: " << e.what();
77  }
78  return false;
79 }
80 
81 inline bool fromOld(std::map<std::string, ::qi::AnyValue>& fields,
82  const std::vector<std::tuple<std::string, qi::TypeInterface*>>& missing,
83  const std::map<std::string, ::qi::AnyReference>& dropfields)
84 {
85  try
86  {
87  if (dropfields.size() == 1)
88  {
89  auto dropfieldsIt = dropfields.find(qi::detail::name::LogMessage_timestamp());
90  if (dropfieldsIt != dropfields.end() && missing.size() == 2 &&
91  ((std::get<0>(missing.at(0)) == qi::detail::name::LogMessage_date() &&
92  std::get<0>(missing.at(1)) == qi::detail::name::LogMessage_systemDate()) ||
93  (std::get<0>(missing.at(1)) == qi::detail::name::LogMessage_date() &&
94  std::get<0>(missing.at(0)) == qi::detail::name::LogMessage_systemDate())))
95  {
96  const qi::os::timeval timestamp = dropfieldsIt->second.to<qi::os::timeval>();
97  fields[qi::detail::name::LogMessage_date()] = qi::AnyValue(qi::Clock::time_point());
98  fields[qi::detail::name::LogMessage_systemDate()] = qi::AnyValue(
99  qi::SystemClock::time_point(qi::Seconds(timestamp.tv_sec) + qi::MicroSeconds(timestamp.tv_usec)));
100  return true;
101  }
102  }
103  }
104  catch (const std::exception& e)
105  {
106  qiLogVerbose("qi.core.LogMessage") << "Conversion error: " << e.what();
107  }
108  return false;
109 }
110 
112 QI_TYPE_STRUCT(::qi::LogMessage, source, level, category, location, message, id, date, systemDate);
113 
114 #endif // !QICORE_LOG_HPP_
qi::LogMessage::message
std::string message
Definition: logmessage.hpp:42
QI_TYPE_STRUCT_EXTENSION_CONVERT_HANDLERS
QI_TYPE_STRUCT_EXTENSION_CONVERT_HANDLERS(::qi::LogMessage, fromOld, toOld)
qi::LogMessage
Definition: logmessage.hpp:36
QI_TYPE_ENUM
QI_TYPE_ENUM(ProgressNotifier::Status)
qi::LogMessage::location
std::string location
Definition: logmessage.hpp:41
qi::detail::name::LogMessage_date
const char * LogMessage_date()
Definition: logmessage.hpp:32
qi::detail::name::LogMessage_systemDate
const char * LogMessage_systemDate()
Definition: logmessage.hpp:31
qi::LogMessage::source
std::string source
Definition: logmessage.hpp:38
setup.name
name
Definition: setup.py:84
QI_TYPE_STRUCT
QI_TYPE_STRUCT(::qi::LogMessage, source, level, category, location, message, id, date, systemDate)
qi
Definition: file.hpp:21
qi::LogMessage::systemDate
qi::SystemClock::time_point systemDate
Definition: logmessage.hpp:45
toOld
bool toOld(std::map< std::string, ::qi::AnyValue > &fields, const std::vector< std::tuple< std::string, qi::TypeInterface * >> &missing, const std::map< std::string, ::qi::AnyReference > &dropfields)
Definition: logmessage.hpp:52
qi::LogMessage::level
qi::LogLevel level
Definition: logmessage.hpp:39
fromOld
bool fromOld(std::map< std::string, ::qi::AnyValue > &fields, const std::vector< std::tuple< std::string, qi::TypeInterface * >> &missing, const std::map< std::string, ::qi::AnyReference > &dropfields)
Definition: logmessage.hpp:81
qi::LogMessage::date
qi::Clock::time_point date
Definition: logmessage.hpp:44
qi::detail::name::LogMessage_timestamp
const char * LogMessage_timestamp()
Definition: logmessage.hpp:30
qi::LogMessage::category
std::string category
Definition: logmessage.hpp:40
qi::LogMessage::timestamp
qi::os::timeval timestamp
Definition: logmessage.hpp:48


naoqi_libqicore
Author(s): Aldebaran
autogenerated on Wed Sep 14 2022 02:22:41