GCC Code Coverage Report


Directory: src/gate/
File: src/gate/io/cxx_logging.cpp
Date: 2025-09-14 13:10:38
Exec Total Coverage
Lines: 52 125 41.6%
Functions: 18 42 42.9%
Branches: 4 24 16.7%

Line Branch Exec Source
1 /* GATE PROJECT LICENSE:
2 +----------------------------------------------------------------------------+
3 | Copyright(c) 2018-2025, Stefan Meislinger <sm@opengate.at> |
4 | All rights reserved. |
5 | |
6 | Redistribution and use in source and binary forms, with or without |
7 | modification, are permitted provided that the following conditions are met:|
8 | |
9 | 1. Redistributions of source code must retain the above copyright notice, |
10 | this list of conditions and the following disclaimer. |
11 | 2. Redistributions in binary form must reproduce the above copyright |
12 | notice, this list of conditions and the following disclaimer in the |
13 | documentation and/or other materials provided with the distribution. |
14 | |
15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"|
16 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
17 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
18 | ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
19 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
20 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
21 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
22 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
23 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
24 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
25 | THE POSSIBILITY OF SUCH DAMAGE. |
26 +----------------------------------------------------------------------------+
27 */
28
29 #include "gate/io/logging.hpp"
30 #include "gate/results.hpp"
31
32 namespace gate
33 {
34 namespace io
35 {
36 LogEntry::LogEntry()
37 {
38 Mem::clear(static_cast<gate_log_entry_t&>(*this));
39 }
40 LogEntry::LogEntry(LogEntry const& src)
41 : gate_log_entry_t(src)
42 {
43 }
44 LogEntry& LogEntry::operator=(LogEntry const& src)
45 {
46 static_cast<gate_log_entry_t&>(*this) = src;
47 return *this;
48 }
49 LogEntry::~LogEntry()
50 {
51 }
52
53 Time LogEntry::getRecordTime() const
54 {
55 return Time(this->header.record_time);
56 }
57
58 gate_process_id_t LogEntry::getProcessId() const
59 {
60 return this->header.process_id;
61 }
62
63 gate_thread_id_t LogEntry::getThreadId() const
64 {
65 return this->header.thread_id;
66 }
67
68 enumint_t LogEntry::getLogType() const
69 {
70 return this->header.log_type;
71 }
72
73 result_t LogEntry::getResultType() const
74 {
75 return this->header.result_code;
76 }
77
78 int32_t LogEntry::getNativeCode() const
79 {
80 return this->header.native_code;
81 }
82
83 String LogEntry::getOrigin() const
84 {
85 return String(this->origin, gate_str_length_max(this->origin, sizeof(this->origin)));
86
87 }
88
89 String LogEntry::getMessage() const
90 {
91 return String(this->message, gate_str_length_max(this->message, sizeof(this->message)));
92 }
93
94
95 enumint_t const LogProvider::Type_Debug = GATE_LOG_TYPE_DEBUG;
96 enumint_t const LogProvider::Type_Info = GATE_LOG_TYPE_INFO;
97 enumint_t const LogProvider::Type_Status = GATE_LOG_TYPE_STATUS;
98 enumint_t const LogProvider::Type_Warning = GATE_LOG_TYPE_WARN;
99 enumint_t const LogProvider::Type_Error = GATE_LOG_TYPE_ERROR;
100 enumint_t const LogProvider::Type_Fatal = GATE_LOG_TYPE_FATAL;
101
102 1 LogProvider::LogProvider(gate_logger_t const* logger)
103 1 : impl_ptr(logger)
104 {
105 1 this->impl_ptr = logger;
106 1 }
107
108 14 LogProvider::LogProvider(LogProvider const& logger)
109 14 : impl_ptr(logger.impl_ptr)
110 {
111 14 }
112
113 LogProvider& LogProvider::operator=(LogProvider const& logger)
114 {
115 if (this != &logger)
116 {
117 this->impl_ptr = logger.impl_ptr;
118 }
119 return *this;
120 }
121 30 LogProvider::~LogProvider() noexcept
122 {
123 15 this->impl_ptr = NULL;
124 15 }
125
126 gate_logger_t const* LogProvider::c_impl() const noexcept
127 {
128 return this->impl_ptr;
129 }
130
131 12 result_t LogProvider::log(enumint_t log_type, result_t result_code, int32_t native_code, String const& origin, String const& message)
132 {
133
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
12 if (this->impl_ptr)
134 {
135 12 return gate_log(this->impl_ptr, log_type, result_code, native_code, origin.c_impl(), message.c_impl());
136 }
137 return results::NotAvailable;
138 }
139
140 bool_t LogProvider::isEnabled(enumint_t logType) const
141 {
142 if (this->impl_ptr)
143 {
144 return gate_log_enabled(this->impl_ptr, logType);
145 }
146 return false;
147 }
148
149
150 1 result_t GlobalLogProvider::start(String const& file, enumint_t log_type)
151 {
152 1 return gate_logger_start(file.c_impl(), log_type);
153 }
154 1 LogProvider GlobalLogProvider::get()
155 {
156 1 return LogProvider(gate_logger_get());
157 }
158 1 result_t GlobalLogProvider::stop()
159 {
160 1 return gate_logger_stop();
161 }
162
163
164 result_t SysLogProvider::start()
165 {
166 return gate_syslog_start();
167 }
168 LogProvider SysLogProvider::get()
169 {
170 gate_logger_t const* ptr_logger = gate_syslog_get();
171 if (!ptr_logger)
172 {
173 GATEXX_RAISE_EXCEPTION(results::NotAvailable, "No system logger available", 0);
174 }
175
176 return LogProvider(ptr_logger);
177 }
178 result_t SysLogProvider::stop()
179 {
180 return gate_syslog_stop();
181 }
182
183
184
185
186 12 LoggerStream::LoggerStream(LogProvider const& logprovider,
187 12 String const& origin_name, enumint_t logtype, result_t result, int32_t nativecode)
188 24 : Stream((gate_stream_t*)gate_stringstream_create(512)),
189 provider(logprovider),
190 origin(origin_name),
191 log_type(logtype),
192 result_code(result),
193 12 native_code(nativecode)
194 {
195 12 }
196 LoggerStream::LoggerStream(LoggerStream const& stream)
197 : Stream((gate_stream_t*)gate_stringstream_create(512)),
198 provider(stream.provider),
199 origin(stream.origin),
200 log_type(stream.log_type),
201 result_code(stream.result_code),
202 native_code(stream.native_code)
203 {
204 }
205
206 12 LoggerStream::~LoggerStream() noexcept
207 {
208 12 gate_stringstream_t* ss = (gate_stringstream_t*)Stream::c_impl();
209 12 gate_string_t str = GATE_STRING_INIT_EMPTY;
210 12 result_t result = gate_stringstream_to_string(ss, &str);
211
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
12 if (GATE_SUCCEEDED(result))
212 {
213 try
214 {
215 24 String text = String::createFrom(str);
216
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 if (!text.empty())
217 {
218
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 this->provider.log(this->log_type, this->result_code, this->native_code, this->origin, text);
219 }
220 }
221 catch (...) {}
222 }
223 12 }
224
225 void LoggerStream::setResultCode(result_t result)
226 {
227 this->result_code = result;
228 }
229 void LoggerStream::setNativeCode(int32_t nativeCode)
230 {
231 this->native_code = nativeCode;
232 }
233
234
235
236 2 Logger::Logger(LogProvider const& logprovider, String const& logorigin)
237 2 : provider(logprovider), origin(logorigin)
238 {
239 2 }
240 Logger::Logger(Logger const& logger)
241 : provider(logger.provider), origin(logger.origin)
242 {
243
244 }
245 Logger::Logger(Logger const& logger, String const& add_origin)
246 : provider(logger.provider)
247 {
248 StringBuilder builder;
249 builder << logger.origin << ":" << add_origin;
250 this->origin = builder.toString();
251 }
252 2 Logger::~Logger() noexcept
253 {
254 2 }
255
256 12 LoggerStream Logger::get(enumint_t logType, result_t result, int32_t native_code)
257 {
258 12 return LoggerStream(this->provider, this->origin, logType, result, native_code);
259 }
260
261 bool_t Logger::isEnabled(enumint_t logType) const
262 {
263 return this->provider.isEnabled(logType);
264 }
265
266
267 2 LoggerStream Logger::debug(result_t result, int32_t native_code)
268 {
269 2 return this->get(LogProvider::Type_Debug, result, native_code);
270 }
271 2 LoggerStream Logger::info(result_t result, int32_t native_code)
272 {
273 2 return this->get(LogProvider::Type_Info, result, native_code);
274 }
275 2 LoggerStream Logger::status(result_t result, int32_t native_code)
276 {
277 2 return this->get(LogProvider::Type_Status, result, native_code);
278 }
279 2 LoggerStream Logger::warn(result_t result, int32_t native_code)
280 {
281 2 return this->get(LogProvider::Type_Warning, result, native_code);
282 }
283 2 LoggerStream Logger::error(result_t result, int32_t native_code)
284 {
285 2 return this->get(LogProvider::Type_Error, result, native_code);
286 }
287 2 LoggerStream Logger::fatal(result_t result, int32_t native_code)
288 {
289 2 return this->get(LogProvider::Type_Fatal, result, native_code);
290 }
291
292 } // end of namespace io
293 } // end of namespace gate
294