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