/*************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Qt Software Information (qt-info@nokia.com) ** ** ** Non-Open Source Usage ** ** Licensees may use this file in accordance with the Qt Beta Version ** License Agreement, Agreement version 2.2 provided with the Software or, ** alternatively, in accordance with the terms contained in a written ** agreement between you and Nokia. ** ** GNU General Public License Usage ** ** Alternatively, this file may be used under the terms of the GNU General ** Public License versions 2.0 or 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the packaging ** of this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and ** http://www.gnu.org/copyleft/gpl.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt GPL Exception ** version 1.3, included in the file GPL_EXCEPTION.txt in this package. ** ***************************************************************************/ #include "optionsparser.h" #include using namespace ExtensionSystem; using namespace ExtensionSystem::Internal; static const char *END_OF_OPTIONS = "--"; const char *OptionsParser::NO_LOAD_OPTION = "-noload"; const char *OptionsParser::TEST_OPTION = "-test"; OptionsParser::OptionsParser(const QStringList &args, const QMap &appOptions, QMap *foundAppOptions, QString *errorString, PluginManagerPrivate *pmPrivate) : m_args(args), m_appOptions(appOptions), m_foundAppOptions(foundAppOptions), m_errorString(errorString), m_pmPrivate(pmPrivate), m_it(m_args.constBegin()), m_end(m_args.constEnd()), m_isDependencyRefreshNeeded(false), m_hasError(false) { ++m_it; // jump over program name if (m_errorString) m_errorString->clear(); if (m_foundAppOptions) m_foundAppOptions->clear(); m_pmPrivate->arguments.clear(); } bool OptionsParser::parse() { while (!m_hasError) { if (!nextToken()) // move forward break; if (checkForEndOfOptions()) break; if (checkForNoLoadOption()) continue; if (checkForTestOption()) continue; if (checkForAppOption()) continue; if (checkForPluginOption()) continue; if (checkForUnknownOption()) break; // probably a file or something m_pmPrivate->arguments << m_currentArg; } if (m_isDependencyRefreshNeeded) m_pmPrivate->resolveDependencies(); return !m_hasError; } bool OptionsParser::checkForEndOfOptions() { if (m_currentArg != QLatin1String(END_OF_OPTIONS)) return false; while (nextToken()) { m_pmPrivate->arguments << m_currentArg; } return true; } bool OptionsParser::checkForTestOption() { if (m_currentArg != QLatin1String(TEST_OPTION)) return false; if (nextToken(RequiredToken)) { PluginSpec *spec = m_pmPrivate->pluginByName(m_currentArg); if (!spec) { if (m_errorString) *m_errorString = QCoreApplication::translate("PluginManager", "The plugin '%1' does not exist.").arg(m_currentArg); m_hasError = true; } else { m_pmPrivate->testSpecs.append(spec); } } return true; } bool OptionsParser::checkForNoLoadOption() { if (m_currentArg != QLatin1String(NO_LOAD_OPTION)) return false; if (nextToken(RequiredToken)) { PluginSpec *spec = m_pmPrivate->pluginByName(m_currentArg); if (!spec) { if (m_errorString) *m_errorString = QCoreApplication::translate("PluginManager", "The plugin '%1' does not exist.").arg(m_currentArg); m_hasError = true; } else { m_pmPrivate->pluginSpecs.removeAll(spec); delete spec; m_isDependencyRefreshNeeded = true; } } return true; } bool OptionsParser::checkForAppOption() { if (!m_appOptions.contains(m_currentArg)) return false; QString option = m_currentArg; QString argument; if (m_appOptions.value(m_currentArg) && nextToken(RequiredToken)) { //argument required argument = m_currentArg; } if (m_foundAppOptions) m_foundAppOptions->insert(option, argument); return true; } bool OptionsParser::checkForPluginOption() { bool requiresParameter; PluginSpec *spec = m_pmPrivate->pluginForOption(m_currentArg, &requiresParameter); if (!spec) return false; spec->addArgument(m_currentArg); if (requiresParameter && nextToken(RequiredToken)) { spec->addArgument(m_currentArg); } return true; } bool OptionsParser::checkForUnknownOption() { if (!m_currentArg.startsWith(QLatin1Char('-'))) return false; if (m_errorString) *m_errorString = QCoreApplication::translate("PluginManager", "Unknown option %1").arg(m_currentArg); m_hasError = true; return true; } bool OptionsParser::nextToken(OptionsParser::TokenType type) { if (m_it == m_end) { if (type == OptionsParser::RequiredToken) { m_hasError = true; if (m_errorString) *m_errorString = QCoreApplication::translate("PluginManager", "The option %1 requires an argument.").arg(m_currentArg); } return false; } m_currentArg = *m_it; ++m_it; return true; }