/****************************************************************************** * * This file is part of Log4Qt library. * * Copyright (C) 2007 - 2020 Log4Qt contributors * * 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 "log4qt/log4qtshared.h" #include "log4qt/loggingevent.h" #include #include #include #include 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 Q_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 &fileName); private: ConfiguratorHelper(QObject *parent = nullptr); virtual ~ConfiguratorHelper(); Q_DISABLE_COPY(ConfiguratorHelper) 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 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 &configureError); /*! * Sets the configuration file to \a fileName. The file is watched for * changes. On a file change the function \a pConfigureFunc will be called * and the signal configurationFileChange() will be Q_EMITted. * * Setting the configuration file to an empty string stops the file watch. * * \sa configurationFile(), PropertyConfigurator::configureAndWatch(), * configureError() */ static void setConfigurationFile(const QString &fileName = QString(), ConfigureFunc pConfigureFunc = nullptr); Q_SIGNALS: /*! * The signal is Q_EMITted after a change to the file \a fileName * 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 &fileName, bool error); private Q_SLOTS: void doConfigurationFileChanged(const QString &fileName); void doConfigurationFileDirectoryChanged(const QString &path); void tryToReAddConfigurationFile(); private: void doSetConfigurationFile(const QString &fileName, ConfigureFunc pConfigureFunc); private: mutable QMutex mObjectGuard; QFileInfo mConfigurationFile; ConfigureFunc mConfigureFunc; QFileSystemWatcher *mConfigurationFileWatch; QList mConfigureError; }; inline QList ConfiguratorHelper::configureError() { QMutexLocker locker(&instance()->mObjectGuard); return instance()->mConfigureError; } inline QString ConfiguratorHelper::configurationFile() { QMutexLocker locker(&instance()->mObjectGuard); return instance()->mConfigurationFile.absoluteFilePath(); } inline void ConfiguratorHelper::setConfigureError(const QList &configureError) { QMutexLocker locker(&instance()->mObjectGuard); instance()->mConfigureError = configureError; } inline void ConfiguratorHelper::setConfigurationFile(const QString &fileName, ConfigureFunc pConfigureFunc) { instance()->doSetConfigurationFile(fileName, pConfigureFunc); } } // namespace Log4Qt #endif // LOG4QT_HELPERS_CONFIGURATORHELPER_H