Refactoring of directory structure and CMake files
[platform/core/security/security-manager.git] / src / dpl / log / include / dpl / log / log.h
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *    Licensed under the Apache License, Version 2.0 (the "License");
5  *    you may not use this file except in compliance with the License.
6  *    You may obtain a copy of the License at
7  *
8  *        http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *    Unless required by applicable law or agreed to in writing, software
11  *    distributed under the License is distributed on an "AS IS" BASIS,
12  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  *    See the License for the specific language governing permissions and
14  *    limitations under the License.
15  */
16 /*
17  * @file        log.h
18  * @author      Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
19  * @version     1.0
20  * @brief       This file is the implementation file of log system
21  */
22 #ifndef SECURITYMANAGER_LOG_H
23 #define SECURITYMANAGER_LOG_H
24
25 #include <dpl/singleton.h>
26 #include <dpl/noncopyable.h>
27 #include <dpl/log/abstract_log_provider.h>
28 #include <sstream>
29 #include <list>
30
31 namespace SecurityManager {
32 namespace Log {
33 /**
34  * SecurityManager log system
35  *
36  * To switch logs into old style, export
37  * DPL_USE_OLD_STYLE_LOGS before application start
38  */
39 class LogSystem :
40     private Noncopyable
41 {
42   private:
43     typedef std::list<AbstractLogProvider *> AbstractLogProviderPtrList;
44     AbstractLogProviderPtrList m_providers;
45
46     bool m_isLoggingEnabled;
47
48   public:
49     bool IsLoggingEnabled() const;
50     LogSystem();
51     virtual ~LogSystem();
52
53     /**
54      * Log debug message
55      */
56     void Debug(const char *message,
57                const char *filename,
58                int line,
59                const char *function);
60
61     /**
62      * Log info message
63      */
64     void Info(const char *message,
65               const char *filename,
66               int line,
67               const char *function);
68
69     /**
70      * Log warning message
71      */
72     void Warning(const char *message,
73                  const char *filename,
74                  int line,
75                  const char *function);
76
77     /**
78      * Log error message
79      */
80     void Error(const char *message,
81                const char *filename,
82                int line,
83                const char *function);
84
85     /**
86      * Log pedantic message
87      */
88     void Pedantic(const char *message,
89                   const char *filename,
90                   int line,
91                   const char *function);
92
93     /**
94      * Log pedantic message with secure macro
95      */
96     void SecureDebug(const char *message,
97                const char *filename,
98                int line,
99                const char *function);
100
101     /**
102      * Log info message with secure macro
103      */
104     void SecureInfo(const char *message,
105               const char *filename,
106               int line,
107               const char *function);
108
109     /**
110      * Log warning message with secure macro
111      */
112     void SecureWarning(const char *message,
113                  const char *filename,
114                  int line,
115                  const char *function);
116
117     /**
118      * Log error message with secure macro
119      */
120     void SecureError(const char *message,
121                const char *filename,
122                int line,
123                const char *function);
124
125     /**
126      * Set default's DLOG provider Tag
127      */
128     void SetTag(const char *tag);
129
130     /**
131      * Add abstract provider to providers list
132      *
133      * @notice Ownership is transfered to LogSystem and deleted upon exit
134      */
135     void AddProvider(AbstractLogProvider *provider);
136
137     /**
138      * Remove abstract provider from providers list
139      */
140     void RemoveProvider(AbstractLogProvider *provider);
141 };
142
143 /*
144  * Replacement low overhead null logging class
145  */
146 class NullStream
147 {
148   public:
149     NullStream() {}
150
151     template <typename T>
152     NullStream& operator<<(const T&)
153     {
154         return *this;
155     }
156 };
157
158 /**
159  * Log system singleton
160  */
161 typedef Singleton<LogSystem> LogSystemSingleton;
162 }
163 } // namespace SecurityManager
164
165 //
166 // Log support
167 //
168 //
169
170 /* avoid warnings about unused variables */
171 #define DPL_MACRO_DUMMY_LOGGING(message, function)                         \
172     do {                                                                   \
173         SecurityManager::Log::NullStream ns;                                \
174         ns << message;                                                     \
175     } while (0)
176
177 #define DPL_MACRO_FOR_LOGGING(message, function)                           \
178 do                                                                         \
179 {                                                                          \
180     if (SecurityManager::Log::LogSystemSingleton::Instance().IsLoggingEnabled())   \
181     {                                                                      \
182         std::ostringstream platformLog;                                    \
183         platformLog << message;                                            \
184         SecurityManager::Log::LogSystemSingleton::Instance().function(      \
185             platformLog.str().c_str(),                                     \
186             __FILE__, __LINE__, __FUNCTION__);                             \
187     }                                                                      \
188 } while (0)
189
190 /* Errors must be always logged. */
191 #define  LogError(message) DPL_MACRO_FOR_LOGGING(message, Error)
192 #define  LogSecureError(message) DPL_MACRO_FOR_LOGGING(message, SecureError)
193
194 #ifdef BUILD_TYPE_DEBUG
195     #define LogDebug(message) DPL_MACRO_FOR_LOGGING(message, Debug)
196     #define LogInfo(message) DPL_MACRO_FOR_LOGGING(message, Info)
197     #define LogWarning(message) DPL_MACRO_FOR_LOGGING(message, Warning)
198     #define LogPedantic(message) DPL_MACRO_FOR_LOGGING(message, Pedantic)
199     #define LogSecureDebug(message) DPL_MACRO_FOR_LOGGING(message, SecureDebug)
200     #define LogSecureInfo(message) DPL_MACRO_FOR_LOGGING(message, SecureInfo)
201     #define LogSecureWarning(message) DPL_MACRO_FOR_LOGGING(message, SecureWarning)
202 #else
203     #define LogDebug(message) DPL_MACRO_DUMMY_LOGGING(message, Debug)
204     #define LogInfo(message) DPL_MACRO_DUMMY_LOGGING(message, Info)
205     #define LogWarning(message) DPL_MACRO_DUMMY_LOGGING(message, Warning)
206     #define LogPedantic(message) DPL_MACRO_DUMMY_LOGGING(message, Pedantic)
207     #define LogSecureDebug(message) DPL_MACRO_DUMMY_LOGGING(message, SecureDebug)
208     #define LogSecureInfo(message) DPL_MACRO_DUMMY_LOGGING(message, SecureInfo)
209     #define LogSecureWarning(message) DPL_MACRO_DUMMY_LOGGING(message, SecureWarning)
210 #endif // BUILD_TYPE_DEBUG
211
212 #endif // SECURITYMANAGER_LOG_H