blob: 97155b16e7d9565cd1c783fa0564961153fe28da [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the Qt Assistant of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 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 the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "tracer.h"
#include <QtCore/QFileInfo>
#include <QtCore/QStringBuilder>
#include <QtGui/QMessageBox>
#include "cmdlineparser.h"
QT_BEGIN_NAMESPACE
static const char helpMessage[] = QT_TRANSLATE_NOOP("CmdLineParser",
"Usage: assistant [Options]\n\n"
"-collectionFile file Uses the specified collection\n"
" file instead of the default one\n"
"-showUrl url Shows the document with the\n"
" url.\n"
"-enableRemoteControl Enables Assistant to be\n"
" remotely controlled.\n"
"-show widget Shows the specified dockwidget\n"
" which can be \"contents\", \"index\",\n"
" \"bookmarks\" or \"search\".\n"
"-activate widget Activates the specified dockwidget\n"
" which can be \"contents\", \"index\",\n"
" \"bookmarks\" or \"search\".\n"
"-hide widget Hides the specified dockwidget\n"
" which can be \"contents\", \"index\"\n"
" \"bookmarks\" or \"search\".\n"
"-register helpFile Registers the specified help file\n"
" (.qch) in the given collection\n"
" file.\n"
"-unregister helpFile Unregisters the specified help file\n"
" (.qch) from the give collection\n"
" file.\n"
"-setCurrentFilter filter Set the filter as the active filter.\n"
"-remove-search-index Removes the full text search index.\n"
"-rebuild-search-index Re-builds the full text search index (potentially slow).\n"
"-quiet Does not display any error or\n"
" status message.\n"
"-help Displays this help.\n"
);
CmdLineParser::CmdLineParser(const QStringList &arguments)
: m_pos(0),
m_enableRemoteControl(false),
m_contents(Untouched),
m_index(Untouched),
m_bookmarks(Untouched),
m_search(Untouched),
m_register(None),
m_removeSearchIndex(false),
m_rebuildSearchIndex(false),
m_quiet(false)
{
TRACE_OBJ
for (int i = 1; i < arguments.count(); ++i) {
const QString &arg = arguments.at(i);
if (arg.toLower() == "-quiet")
m_quiet = true;
else
m_arguments.append(arg);
}
}
CmdLineParser::Result CmdLineParser::parse()
{
TRACE_OBJ
bool showHelp = false;
while (m_error.isEmpty() && hasMoreArgs()) {
const QString &arg = nextArg().toLower();
if (arg == QLatin1String("-collectionfile"))
handleCollectionFileOption();
else if (arg == QLatin1String("-showurl"))
handleShowUrlOption();
else if (arg == QLatin1String("-enableremotecontrol"))
m_enableRemoteControl = true;
else if (arg == QLatin1String("-show"))
handleShowOption();
else if (arg == QLatin1String("-hide"))
handleHideOption();
else if (arg == QLatin1String("-activate"))
handleActivateOption();
else if (arg == QLatin1String("-register"))
handleRegisterOption();
else if (arg == QLatin1String("-unregister"))
handleUnregisterOption();
else if (arg == QLatin1String("-setcurrentfilter"))
handleSetCurrentFilterOption();
else if (arg == QLatin1String("-remove-search-index"))
m_removeSearchIndex = true;
else if (arg == QLatin1String("-rebuild-search-index"))
m_rebuildSearchIndex = true;
else if (arg == QLatin1String("-help"))
showHelp = true;
else
m_error = tr("Unknown option: %1").arg(arg);
}
if (!m_error.isEmpty()) {
showMessage(m_error + QLatin1String("\n\n\n") + tr(helpMessage), true);
return Error;
} else if (showHelp) {
showMessage(tr(helpMessage), false);
return Help;
}
return Ok;
}
bool CmdLineParser::hasMoreArgs() const
{
TRACE_OBJ
return m_pos < m_arguments.count();
}
const QString &CmdLineParser::nextArg()
{
TRACE_OBJ
Q_ASSERT(hasMoreArgs());
return m_arguments.at(m_pos++);
}
void CmdLineParser::handleCollectionFileOption()
{
TRACE_OBJ
if (hasMoreArgs()) {
const QString &fileName = nextArg();
m_collectionFile = getFileName(fileName);
if (m_collectionFile.isEmpty())
m_error = tr("The collection file '%1' does not exist.").
arg(fileName);
} else {
m_error = tr("Missing collection file.");
}
}
void CmdLineParser::handleShowUrlOption()
{
TRACE_OBJ
if (hasMoreArgs()) {
const QString &urlString = nextArg();
QUrl url(urlString);
if (url.isValid()) {
m_url = url;
} else
m_error = tr("Invalid URL '%1'.").arg(urlString);
} else {
m_error = tr("Missing URL.");
}
}
void CmdLineParser::handleShowOption()
{
TRACE_OBJ
handleShowOrHideOrActivateOption(Show);
}
void CmdLineParser::handleHideOption()
{
TRACE_OBJ
handleShowOrHideOrActivateOption(Hide);
}
void CmdLineParser::handleActivateOption()
{
TRACE_OBJ
handleShowOrHideOrActivateOption(Activate);
}
void CmdLineParser::handleShowOrHideOrActivateOption(ShowState state)
{
TRACE_OBJ
if (hasMoreArgs()) {
const QString &widget = nextArg().toLower();
if (widget == QLatin1String("contents"))
m_contents = state;
else if (widget == QLatin1String("index"))
m_index = state;
else if (widget == QLatin1String("bookmarks"))
m_bookmarks = state;
else if (widget == QLatin1String("search"))
m_search = state;
else
m_error = tr("Unknown widget: %1").arg(widget);
} else {
m_error = tr("Missing widget.");
}
}
void CmdLineParser::handleRegisterOption()
{
TRACE_OBJ
handleRegisterOrUnregisterOption(Register);
}
void CmdLineParser::handleUnregisterOption()
{
TRACE_OBJ
handleRegisterOrUnregisterOption(Unregister);
}
void CmdLineParser::handleRegisterOrUnregisterOption(RegisterState state)
{
TRACE_OBJ
if (hasMoreArgs()) {
const QString &fileName = nextArg();
m_helpFile = getFileName(fileName);
if (m_helpFile.isEmpty())
m_error = tr("The Qt help file '%1' does not exist.").arg(fileName);
else
m_register = state;
} else {
m_error = tr("Missing help file.");
}
}
void CmdLineParser::handleSetCurrentFilterOption()
{
TRACE_OBJ
if (hasMoreArgs())
m_currentFilter = nextArg();
else
m_error = tr("Missing filter argument.");
}
QString CmdLineParser::getFileName(const QString &fileName)
{
TRACE_OBJ
QFileInfo fi(fileName);
if (!fi.exists())
return QString();
return fi.absoluteFilePath();
}
void CmdLineParser::showMessage(const QString &msg, bool error)
{
TRACE_OBJ
if (m_quiet)
return;
#ifdef Q_OS_WIN
QString message = QLatin1String("<pre>") % msg % QLatin1String("</pre>");
if (error)
QMessageBox::critical(0, tr("Error"), message);
else
QMessageBox::information(0, tr("Notice"), message);
#else
fprintf(error ? stderr : stdout, "%s\n", qPrintable(msg));
#endif
}
void CmdLineParser::setCollectionFile(const QString &file)
{
TRACE_OBJ
m_collectionFile = file;
}
QString CmdLineParser::collectionFile() const
{
TRACE_OBJ
return m_collectionFile;
}
bool CmdLineParser::collectionFileGiven() const
{
TRACE_OBJ
return m_arguments.contains(QLatin1String("-collectionfile"),
Qt::CaseInsensitive);
}
QUrl CmdLineParser::url() const
{
TRACE_OBJ
return m_url;
}
bool CmdLineParser::enableRemoteControl() const
{
TRACE_OBJ
return m_enableRemoteControl;
}
CmdLineParser::ShowState CmdLineParser::contents() const
{
TRACE_OBJ
return m_contents;
}
CmdLineParser::ShowState CmdLineParser::index() const
{
TRACE_OBJ
return m_index;
}
CmdLineParser::ShowState CmdLineParser::bookmarks() const
{
TRACE_OBJ
return m_bookmarks;
}
CmdLineParser::ShowState CmdLineParser::search() const
{
TRACE_OBJ
return m_search;
}
QString CmdLineParser::currentFilter() const
{
TRACE_OBJ
return m_currentFilter;
}
bool CmdLineParser::removeSearchIndex() const
{
TRACE_OBJ
return m_removeSearchIndex;
}
bool CmdLineParser::rebuildSearchIndex() const
{
TRACE_OBJ
return m_rebuildSearchIndex;
}
CmdLineParser::RegisterState CmdLineParser::registerRequest() const
{
TRACE_OBJ
return m_register;
}
QString CmdLineParser::helpFile() const
{
TRACE_OBJ
return m_helpFile;
}
QT_END_NAMESPACE