123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 |
- /******************************************************************************
- *
- * package: Log4Qt
- * file: optionconverter.cpp
- * created: September 2007
- * author: Martin Heinrich
- *
- *
- * changes Feb 2009, Martin Heinrich
- * - Fixed a problem were OptionConverter::toBoolean would not
- * return the default value, if the conversion fails.
- *
- *
- * Copyright 2007 - 2009 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.
- *
- ******************************************************************************/
- /******************************************************************************
- * Dependencies
- ******************************************************************************/
- #include "log4qt/helpers/optionconverter.h"
- #include <QtCore/QDebug>
- #include "log4qt/helpers/logerror.h"
- #include "log4qt/helpers/properties.h"
- #include "log4qt/logger.h"
- #include "log4qt/consoleappender.h"
- namespace Log4Qt
- {
-
-
- /**************************************************************************
- * Declarations
- **************************************************************************/
-
-
-
- /**************************************************************************
- * C helper functions
- **************************************************************************/
-
-
- LOG4QT_DECLARE_STATIC_LOGGER(logger, Log4Qt::OptionConverter)
-
-
- /**************************************************************************
- * Class implementation: OptionConverter
- **************************************************************************/
-
-
- QString OptionConverter::findAndSubst(const Properties &rProperties,
- const QString &rKey)
- {
- QString value = rProperties.property(rKey);
- if (value.isNull())
- return value;
-
- const QString begin_subst = QLatin1String("${");
- const QString end_subst = QLatin1String("}");
- const int begin_length = begin_subst.length();
- const int end_length = end_subst.length();
-
- // Don't return a null string, the null string indicates that the
- // property key does not exist.
- QString result = QLatin1String("");
-
- int i = 0;
- int begin;
- int end;
- while (i < value.length())
- {
- begin = value.indexOf(begin_subst, i);
- if (begin == -1)
- {
- result += value.mid(i);
- i = value.length();
- }
- else
- {
- result += value.mid(i, begin - i);
- end = value.indexOf(end_subst, i + begin_length);
- if (end == -1)
- {
- LogError e = LOG4QT_ERROR(QT_TR_NOOP("Missing closing bracket for opening bracket at %1. Invalid subsitution in value %2."),
- CONFIGURATOR_INVALID_SUBSTITUTION_ERROR,
- "Log4Qt::OptionConverter");
- e << begin << value;
- logger()->error(e);
- return result;
- }
- else
- {
- result += findAndSubst(rProperties, value.mid(begin + begin_length, end - begin - end_length - 1));
- i = end + end_length;
- }
- }
- }
- return result;
- }
-
-
- QString OptionConverter::classNameJavaToCpp(const QString &rClassName)
- {
- const QLatin1String java_class_delimiter(".");
- const QLatin1String cpp_class_delimiter("::");
-
- QString result = rClassName;
- return result.replace(java_class_delimiter, cpp_class_delimiter);
- }
-
-
- bool OptionConverter::toBoolean(const QString &rOption,
- bool *p_ok)
- {
- const QLatin1String str_true("true");
- const QLatin1String str_enabled("enabled");
- const QLatin1String str_one("1");
- const QLatin1String str_false("false");
- const QLatin1String str_disabled("disabled");
- const QLatin1String str_zero("0");
-
- if (p_ok)
- *p_ok = true;
- QString s = rOption.trimmed().toLower();
- if (s == str_true || s == str_enabled || s == str_one)
- return true;
- if (s == str_false || s == str_disabled || s == str_zero)
- return false;
-
- if (p_ok)
- *p_ok = false;
- LogError e = LOG4QT_ERROR(QT_TR_NOOP("Invalid option string '%1' for a boolean"),
- CONFIGURATOR_INVALID_OPTION_ERROR,
- "Log4Qt::OptionConverter");
- e << rOption;
- logger()->error(e);
- return false;
- }
-
- bool OptionConverter::toBoolean(const QString &rOption,
- bool default_value)
- {
- bool ok;
- bool result = toBoolean(rOption, &ok);
- if (ok)
- return result;
- else
- return default_value;
- }
-
- qint64 OptionConverter::toFileSize(const QString &rOption,
- bool *p_ok)
- {
- // - Search for unit
- // - Convert characters befor unit to int
- // - Error, if
- // - the conversion failed
- // - the value < 0
- // - there is text after the unit characters
-
- if (p_ok)
- *p_ok = false;
- QString s = rOption.trimmed().toLower();
- qint64 f = 1;
- int i;
- i = s.indexOf(QLatin1String("kb"));
- if (i >= 0)
- f = 1024;
- else
- {
- i = s.indexOf(QLatin1String("mb"));
- if (i >= 0)
- f = 1024 * 1024;
- else
- {
- i = s.indexOf(QLatin1String("gb"));
- if (i >= 0)
- f = 1024 * 1024 * 1024;
- }
- }
- if (i < 0)
- i = s.length();
- bool ok;
- qint64 value = s.left(i).toLongLong(&ok);
- if (!ok || value < 0 || s.length() > i + 2)
- {
- LogError e = LOG4QT_ERROR(QT_TR_NOOP("Invalid option string '%1' for a file size"),
- CONFIGURATOR_INVALID_OPTION_ERROR,
- "Log4Qt::OptionConverter");
- e << rOption;
- logger()->error(e);
- return 0;
- }
- if (p_ok)
- *p_ok = true;
- return value * f;
- }
-
- int OptionConverter::toInt(const QString &rOption,
- bool *p_ok)
- {
- int value = rOption.trimmed().toInt(p_ok);
- if (*p_ok)
- return value;
-
- LogError e = LOG4QT_ERROR(QT_TR_NOOP("Invalid option string '%1' for an integer"),
- CONFIGURATOR_INVALID_OPTION_ERROR,
- "Log4Qt::OptionConverter");
- e << rOption;
- logger()->error(e);
- return 0;
- }
-
- qint64 OptionConverter::toQInt64(const QString &rOption,
- bool *p_ok)
- {
- int value = rOption.trimmed().toLongLong(p_ok);
- if (*p_ok)
- return value;
- LogError e = LOG4QT_ERROR(QT_TR_NOOP("Invalid option string '%1' for an qint64"),
- CONFIGURATOR_INVALID_OPTION_ERROR,
- "Log4Qt::OptionConverter");
- e << rOption;
- logger()->error(e);
- return 0;
- }
-
- Level OptionConverter::toLevel(const QString &rOption,
- bool *p_ok)
- {
- bool ok;
- Level level = Level::fromString(rOption.toUpper().trimmed(), &ok);
- if (p_ok)
- *p_ok = ok;
- if (ok)
- return level;
- LogError e = LOG4QT_ERROR(QT_TR_NOOP("Invalid option string '%1' for a level"),
- CONFIGURATOR_INVALID_OPTION_ERROR,
- "Log4Qt::OptionConverter");
- e << rOption;
- logger()->error(e);
- return level;
- }
-
- Level OptionConverter::toLevel(const QString &rOption,
- const Level &rDefaultValue)
- {
- bool ok;
- Level result = toLevel(rOption, &ok);
- if (ok)
- return result;
- else
- return rDefaultValue;
- }
-
- int OptionConverter::toTarget(const QString &rOption,
- bool *p_ok)
- {
- const QLatin1String java_stdout("system.out");
- const QLatin1String cpp_stdout("stdout_target");
- const QLatin1String java_stderr("system.err");
- const QLatin1String cpp_stderr("stderr_target");
-
- if (p_ok)
- *p_ok = true;
- QString s = rOption.trimmed().toLower();
- if (s == java_stdout || s == cpp_stdout)
- return ConsoleAppender::STDOUT_TARGET;
- if (s == java_stderr || s == cpp_stderr)
- return ConsoleAppender::STDERR_TARGET;
- if (p_ok)
- *p_ok = false;
- LogError e = LOG4QT_ERROR(QT_TR_NOOP("Invalid option string '%1' for a target"),
- CONFIGURATOR_INVALID_OPTION_ERROR,
- "Log4Qt::OptionConverter");
- e << rOption;
- logger()->error(e);
- return ConsoleAppender::STDOUT_TARGET;
- }
-
-
-
- /**************************************************************************
- * Implementation: Operators, Helper
- **************************************************************************/
-
- } // namespace Log4Qt
|