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