1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
|
/******************************************************************************
*
* package: Log4Qt
* file: configuratorhelper.h
* created: September 2007
* author: Martin Heinrich
*
*
* Copyright 2007 Martin Heinrich
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
#ifndef LOG4QT_HELPERS_CONFIGURATORHELPER_H
#define LOG4QT_HELPERS_CONFIGURATORHELPER_H
#include "../log4qtshared.h"
/******************************************************************************
* Dependencies
******************************************************************************/
#include <QtCore/QObject>
#include <QtCore/QList>
#include <QtCore/QMutex>
#include "loggingevent.h"
/******************************************************************************
* Declarations
******************************************************************************/
class QFileSystemWatcher;
namespace Log4Qt
{
/*!
* \brief The class ConfiguratorHelper provides a confiuration file watch
* and last error for configurator classes.
*
* A configuration file can be set using setConfigurationFile(). The file
* is watched for changes. If a change occurs the configuration is reloaded
* and the ConfigurationFileChanged() signal is emitted. Error information
* for the last call to a configure function or the last configuration file
* change can be accessed using configureError().
*
* \note All the functions declared in this class are thread-safe.
*/
class LOG4QT_EXPORT ConfiguratorHelper : public QObject
{
Q_OBJECT
public:
/*!
* Prototype for a configure callback function. The function is called
* when then configuration file is changed and takes the
* configuration file as a parameter.
*
* \sa setConfigurationFile(),
* PropertyConfigurator::configure(const QString &)
*/
typedef bool (*ConfigureFunc)(const QString &rFileName);
private:
ConfiguratorHelper();
ConfiguratorHelper(const ConfiguratorHelper &rOther); // Not implemented
virtual ~ConfiguratorHelper();
ConfiguratorHelper &operator=(const ConfiguratorHelper &rOther); // Not implemented
public:
/*!
* Returns the error information for the last configuration operation
* that took place. The configuration operation could be the result of
* a call to one of the configure methods or through a change
* to the configuration file.
*
* \sa setConfigureError(), PropertyConfigurator::configure(),
* setConfigurationFile()
*/
static QList<LoggingEvent> configureError();
/*!
* Returns the current configuration file.
*
* \sa setConfigurationFile()
*/
static QString configurationFile();
/*!
* Returns the ConfiguratorHelper instance.
*/
static ConfiguratorHelper *instance();
/*!
* Sets the configuration error information for the last configuration
* operation.
*
* \sa configureError()
*/
static void setConfigureError(const QList<LoggingEvent> &rConfigureError);
/*!
* Sets the configuration file to \a rFileName. The file is watched for
* changes. On a file change the function \a pConfigureFunc will be called
* and the signal configurationFileChange() will be emitted.
*
* Setting the configuration file to an empty string stops the file watch.
*
* \sa configurationFile(), PropertyConfigurator::configureAndWatch(),
* configureError()
*/
static void setConfigurationFile(const QString &rFileName = QString(),
ConfigureFunc pConfigureFunc = 0);
signals:
/*!
* The signal is emitted after a change to the file \a rFileName
* was processed. If an error occured during the configuration, the
* flag \a error will be true and error information is available
* over configureError().
*/
void configurationFileChanged(const QString &rFileName,
bool error);
private slots:
void doConfigurationFileChanged(const QString &rFileName);
private:
void doSetConfigurationFile(const QString &rFileName,
ConfigureFunc pConfigureFunc);
private:
mutable QMutex mObjectGuard;
QString mConfigurationFile;
ConfigureFunc mpConfigureFunc;
QFileSystemWatcher *mpConfigurationFileWatch;
QList<LoggingEvent> mConfigureError;
#ifndef QT_NO_DEBUG_STREAM
// Needs to be friend to access details
friend QDebug operator<<(QDebug debug,
const ConfiguratorHelper &rConfiguratorHelper);
#endif // QT_NO_DEBUG_STREAM
};
/**************************************************************************
* Operators, Helper
**************************************************************************/
#ifndef QT_NO_DEBUG_STREAM
/*!
* \relates ConfiguratorHelper
*
* Writes all object member variables to the given debug stream \a rDebug and
* returns the stream.
*
* <tt>
* %ConfiguratorHelper(configurationfile: "" configurefunc: false
* filesystemwatcher: QObject(0x0) )
* </tt>
* \sa QDebug, ConfiguratorHelper::logManager()
*/
QDebug operator<<(QDebug debug,
const ConfiguratorHelper &rConfiguratorHelper);
#endif // QT_NO_DEBUG_STREAM
/**************************************************************************
* Inline
**************************************************************************/
inline QList<LoggingEvent> ConfiguratorHelper::configureError()
{ QMutexLocker locker(&instance()->mObjectGuard);
return instance()->mConfigureError; }
inline QString ConfiguratorHelper::configurationFile()
{ QMutexLocker locker(&instance()->mObjectGuard);
return instance()->mConfigurationFile; }
inline void ConfiguratorHelper::setConfigureError(const QList<LoggingEvent> &rConfigureError)
{ QMutexLocker locker(&instance()->mObjectGuard);
instance()->mConfigureError = rConfigureError; }
inline void ConfiguratorHelper::setConfigurationFile(const QString &rFileName,
ConfigureFunc pConfigureFunc)
{ instance()->doSetConfigurationFile(rFileName, pConfigureFunc); }
} // namespace Log4Qt
// Q_DECLARE_TYPEINFO(Log4Qt::ConfiguratorHelper, Q_COMPLEX_TYPE); // use default
#endif // LOG4QT_HELPERS_CONFIGURATORHELPER_H
|