xref: /src/contrib/opencsd/decoder/source/ocsd_error_logger.cpp (revision c120c5646da1a1d2c4d90fd069a7e2a8d559eb46)
1a6157d81SRuslan Bukin /*
2a6157d81SRuslan Bukin  * \file       ocsd_error_logger.cpp
3a6157d81SRuslan Bukin  * \brief      OpenCSD :
4a6157d81SRuslan Bukin  *
5a6157d81SRuslan Bukin  * \copyright  Copyright (c) 2015, ARM Limited. All Rights Reserved.
6a6157d81SRuslan Bukin  */
7a6157d81SRuslan Bukin 
8a6157d81SRuslan Bukin 
9a6157d81SRuslan Bukin /*
10a6157d81SRuslan Bukin  * Redistribution and use in source and binary forms, with or without modification,
11a6157d81SRuslan Bukin  * are permitted provided that the following conditions are met:
12a6157d81SRuslan Bukin  *
13a6157d81SRuslan Bukin  * 1. Redistributions of source code must retain the above copyright notice,
14a6157d81SRuslan Bukin  * this list of conditions and the following disclaimer.
15a6157d81SRuslan Bukin  *
16a6157d81SRuslan Bukin  * 2. Redistributions in binary form must reproduce the above copyright notice,
17a6157d81SRuslan Bukin  * this list of conditions and the following disclaimer in the documentation
18a6157d81SRuslan Bukin  * and/or other materials provided with the distribution.
19a6157d81SRuslan Bukin  *
20a6157d81SRuslan Bukin  * 3. Neither the name of the copyright holder nor the names of its contributors
21a6157d81SRuslan Bukin  * may be used to endorse or promote products derived from this software without
22a6157d81SRuslan Bukin  * specific prior written permission.
23a6157d81SRuslan Bukin  *
24a6157d81SRuslan Bukin  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
25a6157d81SRuslan Bukin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26a6157d81SRuslan Bukin  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27a6157d81SRuslan Bukin  * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
28a6157d81SRuslan Bukin  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29a6157d81SRuslan Bukin  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30a6157d81SRuslan Bukin  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31a6157d81SRuslan Bukin  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32a6157d81SRuslan Bukin  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33a6157d81SRuslan Bukin  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34a6157d81SRuslan Bukin  */
35a6157d81SRuslan Bukin 
36a6157d81SRuslan Bukin #include "common/ocsd_error_logger.h"
37a6157d81SRuslan Bukin 
38cf98ba14SRuslan Bukin //#include <iostream>
39a6157d81SRuslan Bukin #include <sstream>
40a6157d81SRuslan Bukin 
ocsdDefaultErrorLogger()41a6157d81SRuslan Bukin ocsdDefaultErrorLogger::ocsdDefaultErrorLogger() :
42a6157d81SRuslan Bukin     m_Verbosity(OCSD_ERR_SEV_ERROR),
43a6157d81SRuslan Bukin     m_output_logger(0),
44a6157d81SRuslan Bukin     m_created_output_logger(false)
45a6157d81SRuslan Bukin {
46a6157d81SRuslan Bukin     m_lastErr = 0;
47a6157d81SRuslan Bukin     for(int i = 0; i < 0x80; i++)
48a6157d81SRuslan Bukin         m_lastErrID[i] = 0;
49a6157d81SRuslan Bukin     m_error_sources.push_back("Gen_Err");    // handle 0
50a6157d81SRuslan Bukin     m_error_sources.push_back("Gen_Warn");   // handle 1
51a6157d81SRuslan Bukin     m_error_sources.push_back("Gen_Info");   // handle 2
52a6157d81SRuslan Bukin }
53a6157d81SRuslan Bukin 
~ocsdDefaultErrorLogger()54a6157d81SRuslan Bukin ocsdDefaultErrorLogger::~ocsdDefaultErrorLogger()
55a6157d81SRuslan Bukin {
56a6157d81SRuslan Bukin     if(m_created_output_logger)
57a6157d81SRuslan Bukin         delete m_output_logger;
58a6157d81SRuslan Bukin 
59a6157d81SRuslan Bukin     if(m_lastErr)
60a6157d81SRuslan Bukin         delete m_lastErr;
61a6157d81SRuslan Bukin 
62a6157d81SRuslan Bukin     for(int i = 0; i < 0x80; i++)
63a6157d81SRuslan Bukin         if(m_lastErrID[i] != 0) delete m_lastErrID[i];
64a6157d81SRuslan Bukin }
65a6157d81SRuslan Bukin 
initErrorLogger(const ocsd_err_severity_t verbosity,bool bCreateOutputLogger)66a6157d81SRuslan Bukin bool ocsdDefaultErrorLogger::initErrorLogger(const ocsd_err_severity_t verbosity, bool bCreateOutputLogger /*= false*/)
67a6157d81SRuslan Bukin {
68a6157d81SRuslan Bukin     bool bInit = true;
69a6157d81SRuslan Bukin     m_Verbosity = verbosity;
70a6157d81SRuslan Bukin     if(bCreateOutputLogger)
71a6157d81SRuslan Bukin     {
72a6157d81SRuslan Bukin         m_output_logger = new (std::nothrow) ocsdMsgLogger();
73a6157d81SRuslan Bukin         if(m_output_logger)
74a6157d81SRuslan Bukin         {
75a6157d81SRuslan Bukin             m_created_output_logger = true;
76a6157d81SRuslan Bukin             m_output_logger->setLogOpts(ocsdMsgLogger::OUT_STDERR);
77a6157d81SRuslan Bukin         }
78a6157d81SRuslan Bukin         else
79a6157d81SRuslan Bukin             bInit = false;
80a6157d81SRuslan Bukin     }
81a6157d81SRuslan Bukin     return bInit;
82a6157d81SRuslan Bukin }
83a6157d81SRuslan Bukin 
setOutputLogger(ocsdMsgLogger * pLogger)84a6157d81SRuslan Bukin void ocsdDefaultErrorLogger::setOutputLogger(ocsdMsgLogger *pLogger)
85a6157d81SRuslan Bukin {
86a6157d81SRuslan Bukin     // if we created the current logger, delete it.
87a6157d81SRuslan Bukin     if(m_output_logger && m_created_output_logger)
88a6157d81SRuslan Bukin         delete m_output_logger;
89a6157d81SRuslan Bukin     m_created_output_logger = false;
90a6157d81SRuslan Bukin     m_output_logger = pLogger;
91a6157d81SRuslan Bukin }
92a6157d81SRuslan Bukin 
RegisterErrorSource(const std::string & component_name)93a6157d81SRuslan Bukin const ocsd_hndl_err_log_t ocsdDefaultErrorLogger::RegisterErrorSource(const std::string &component_name)
94a6157d81SRuslan Bukin {
95a6157d81SRuslan Bukin     ocsd_hndl_err_log_t handle = m_error_sources.size();
96a6157d81SRuslan Bukin     m_error_sources.push_back(component_name);
97a6157d81SRuslan Bukin     return handle;
98a6157d81SRuslan Bukin }
99a6157d81SRuslan Bukin 
LogError(const ocsd_hndl_err_log_t handle,const ocsdError * Error)100a6157d81SRuslan Bukin void ocsdDefaultErrorLogger::LogError(const ocsd_hndl_err_log_t handle, const ocsdError *Error)
101a6157d81SRuslan Bukin {
102a6157d81SRuslan Bukin     // only log errors that match or exceed the current verbosity
103a6157d81SRuslan Bukin     if(m_Verbosity >= Error->getErrorSeverity())
104a6157d81SRuslan Bukin     {
105a6157d81SRuslan Bukin         // print out only if required
106a6157d81SRuslan Bukin         if(m_output_logger)
107a6157d81SRuslan Bukin         {
108a6157d81SRuslan Bukin             if(m_output_logger->isLogging())
109a6157d81SRuslan Bukin             {
110a6157d81SRuslan Bukin                 std::string errStr = "unknown";
111a6157d81SRuslan Bukin                 if(handle < m_error_sources.size())
112a6157d81SRuslan Bukin                     errStr = m_error_sources[handle];
113a6157d81SRuslan Bukin                 errStr += " : " + ocsdError::getErrorString(Error);
114a6157d81SRuslan Bukin                 m_output_logger->LogMsg(errStr);
115a6157d81SRuslan Bukin             }
116a6157d81SRuslan Bukin         }
117a6157d81SRuslan Bukin 
118a6157d81SRuslan Bukin         // log last error
119a6157d81SRuslan Bukin         if(m_lastErr == 0)
120a6157d81SRuslan Bukin             CreateErrorObj(&m_lastErr,Error);
121a6157d81SRuslan Bukin         else
122a6157d81SRuslan Bukin             *m_lastErr = Error;
123a6157d81SRuslan Bukin 
124a6157d81SRuslan Bukin         // log last error associated with an ID
125a6157d81SRuslan Bukin         if(OCSD_IS_VALID_CS_SRC_ID(Error->getErrorChanID()))
126a6157d81SRuslan Bukin         {
127a6157d81SRuslan Bukin             if(m_lastErrID[Error->getErrorChanID()] == 0)
128a6157d81SRuslan Bukin                 CreateErrorObj(&m_lastErrID[Error->getErrorChanID()], Error);
129a6157d81SRuslan Bukin             else
130a6157d81SRuslan Bukin                 *m_lastErrID[Error->getErrorChanID()] = Error;
131a6157d81SRuslan Bukin         }
132a6157d81SRuslan Bukin     }
133a6157d81SRuslan Bukin }
134a6157d81SRuslan Bukin 
LogMessage(const ocsd_hndl_err_log_t handle,const ocsd_err_severity_t filter_level,const std::string & msg)135a6157d81SRuslan Bukin void ocsdDefaultErrorLogger::LogMessage(const ocsd_hndl_err_log_t handle, const ocsd_err_severity_t filter_level, const std::string &msg )
136a6157d81SRuslan Bukin {
137a6157d81SRuslan Bukin     // only log errors that match or exceed the current verbosity
138a6157d81SRuslan Bukin     if((m_Verbosity >= filter_level))
139a6157d81SRuslan Bukin     {
140a6157d81SRuslan Bukin         if(m_output_logger)
141a6157d81SRuslan Bukin         {
142a6157d81SRuslan Bukin             if(m_output_logger->isLogging())
143a6157d81SRuslan Bukin             {
144a6157d81SRuslan Bukin                 std::string errStr = "unknown";
145a6157d81SRuslan Bukin                 if(handle < m_error_sources.size())
146a6157d81SRuslan Bukin                     errStr = m_error_sources[handle];
147a6157d81SRuslan Bukin                 errStr += " : " + msg;
148a6157d81SRuslan Bukin                 m_output_logger->LogMsg(errStr);
149a6157d81SRuslan Bukin             }
150a6157d81SRuslan Bukin         }
151a6157d81SRuslan Bukin     }
152a6157d81SRuslan Bukin }
153a6157d81SRuslan Bukin 
CreateErrorObj(ocsdError ** ppErr,const ocsdError * p_from)154a6157d81SRuslan Bukin void ocsdDefaultErrorLogger::CreateErrorObj(ocsdError **ppErr, const ocsdError *p_from)
155a6157d81SRuslan Bukin {
156a6157d81SRuslan Bukin     *ppErr = new (std::nothrow) ocsdError(p_from);
157a6157d81SRuslan Bukin }
158a6157d81SRuslan Bukin 
159a6157d81SRuslan Bukin /* End of File ocsd_error_logger.cpp */
160