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