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