diff -r 000000000000 -r 1918ee327afb tools/assistant/compat/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/assistant/compat/main.cpp Mon Jan 11 14:00:40 2010 +0000 @@ -0,0 +1,465 @@ +/**************************************************************************** +** +** Copyright (C) 2009 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$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "mainwindow.h" +#include "helpdialog.h" +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(USE_STATIC_JPEG_PLUGIN) + #include + Q_IMPORT_PLUGIN(qjpeg) +#endif + +#define INDEX_CHECK( text ) if( i+1 >= argc ) { fprintf(stderr, "%s\n", text); return 1; } + +QT_BEGIN_NAMESPACE + +#if !defined(QT_NO_DBUS) && defined(Q_OS_UNIX) +QT_BEGIN_INCLUDE_NAMESPACE +#include +#include +#include +#include "tabbedbrowser.h" +QT_END_INCLUDE_NAMESPACE + +class HelpWindowAdaptor : public QDBusAbstractAdaptor +{ + Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "com.trolltech.Assistant.HelpWindow") + + Q_PROPERTY(QString source READ source WRITE setSource) + +public: + HelpWindowAdaptor(HelpWindow *w) : QDBusAbstractAdaptor(w), helpWindow(w) + { + setAutoRelaySignals(true); + } + +public Q_SLOTS: + inline QString source() const { return helpWindow->source().toString(); } + inline void setSource(const QString &src) { helpWindow->setSource(src); } + + inline void clearHistory() { helpWindow->clearHistory(); } + inline void backward() { helpWindow->backward(); } + inline void forward() { helpWindow->forward(); } + inline void reload() { helpWindow->reload(); } + inline void home() { helpWindow->home(); } + +private: + HelpWindow *helpWindow; +}; + +class AssistantAdaptor : public QDBusAbstractAdaptor +{ + Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "com.trolltech.Assistant.HelpViewer") + +public: + AssistantAdaptor(MainWindow *mw) : QDBusAbstractAdaptor(mw), mw(mw) + { + QDBusConnection connection = QDBusConnection::sessionBus(); + connection.registerService(QLatin1String("com.trolltech.Assistant")); + connection.registerObject(QLatin1String("/Assistant"), mw); + } + +public slots: + void showLink(const QString &link) { mw->showLink(link); } + QDBusObjectPath createNewTab(); + QDBusObjectPath currentTab(); + +private: + QDBusObjectPath pathForBrowser(HelpWindow *window); + MainWindow *mw; +}; + +QDBusObjectPath AssistantAdaptor::createNewTab() +{ + HelpWindow *window = mw->browsers()->newBackgroundTab(); + return pathForBrowser(window); +} + +QDBusObjectPath AssistantAdaptor::currentTab() +{ + HelpWindow *window = mw->browsers()->currentBrowser(); + return pathForBrowser(window); +} + +QDBusObjectPath AssistantAdaptor::pathForBrowser(HelpWindow *window) +{ + int index = mw->browsers()->browsers().indexOf(window); + if (index == -1) + return QDBusObjectPath(); + + QString name(QLatin1String("/Assistant/Tabs/")); + name += QString::number(index); + QDBusObjectPath path(name); + + if (!window->findChild()) { + (void)new HelpWindowAdaptor(window); + QDBusConnection::sessionBus().registerObject(name, window); + } + + return path; +} + +#endif // QT_NO_DBUS + +class AssistantSocket : public QTcpSocket +{ + Q_OBJECT +public: + AssistantSocket( int sock, QObject *parent = 0 ); + ~AssistantSocket() {} + +signals: + void showLinkRequest( const QString& ); + +private slots: + void readClient(); + void connectionClosed(); +}; + + +class AssistantServer : public QTcpServer +{ + Q_OBJECT +public: + AssistantServer( QObject* parent = 0 ); + quint16 getPort() const; + +signals: + void showLinkRequest( const QString& ); + void newConnect(); + +public slots: + virtual void incomingConnection( int socket ); + +private: + quint16 p; +}; + +AssistantSocket::AssistantSocket( int sock, QObject *parent ) + : QTcpSocket( parent ) +{ + connect( this, SIGNAL(readyRead()), SLOT(readClient()) ); + connect( this, SIGNAL(disconnected()), SLOT(connectionClosed()) ); + setSocketDescriptor( sock ); +} + +void AssistantSocket::readClient() +{ + QString link = QString(); + while ( canReadLine() ) + link = QLatin1String(readLine()); + if ( !link.isNull() ) { + link = link.replace(QLatin1String("\n"), QLatin1String("")); + link = link.replace(QLatin1String("\r"), QLatin1String("")); + QFileInfo fi(link); + link = fi.absoluteFilePath(); + emit showLinkRequest( link ); + } +} + +void AssistantSocket::connectionClosed() +{ + deleteLater(); +} + +AssistantServer::AssistantServer( QObject *parent ) + : QTcpServer( parent ) +{ + listen(QHostAddress::LocalHost, 0); + if ( !isListening() ) { + QMessageBox::critical( 0, tr( "Qt Assistant" ), + tr( "Failed to bind to port %1" ).arg( serverPort() ) ); + exit( 1 ); + } + p = serverPort(); +} + +quint16 AssistantServer::getPort() const +{ + return p; +} + +void AssistantServer::incomingConnection( int socket ) +{ + AssistantSocket *as = new AssistantSocket( socket, this ); + connect( as, SIGNAL(showLinkRequest(QString)), + this, SIGNAL(showLinkRequest(QString)) ); + emit newConnect(); +} + +int runAssistant( int argc, char ** argv ) +{ + bool withGUI = true; +#ifndef Q_WS_WIN + if ( argc > 1 ) { + QString arg = QString::fromLocal8Bit(argv[1]); + arg = arg.toLower(); + if ( arg == QLatin1String("-addcontentfile") + || arg == QLatin1String("-removecontentfile") + || arg == QLatin1String("-help") + || arg == QLatin1String("/?") + ) + withGUI = false; + } +#endif + QApplication a(argc, argv, withGUI); + a.setOrganizationName(QLatin1String("Trolltech")); + a.setApplicationName(QLatin1String("Assistant")); + + QString resourceDir; + AssistantServer *as = 0; + QStringList catlist; + QString file, profileName, aDocPath; + bool server = false; + bool hideSidebar = false; + bool configLoaded = false; + if ( argc == 2 ) { + file = QString::fromLocal8Bit(argv[1]); + if (file.startsWith(QLatin1String("-")) || file == QLatin1String("/?")) { + file.clear(); + } else { + QFileInfo fi(file); + file = fi.absoluteFilePath(); + file = MainWindow::urlifyFileName(file); + } + } + if ( file.isEmpty() ) { + for ( int i = 1; i < argc; i++ ) { + QString opt = QString::fromLocal8Bit(argv[i]).toLower(); + if ( opt == QLatin1String("-file") ) { + INDEX_CHECK( "Missing file argument!" ); + i++; + file = QFile::decodeName(argv[i]); + } else if ( opt == QLatin1String("-server") ) { + server = true; + } else if ( opt == QLatin1String("-profile") ) { + INDEX_CHECK( "Missing profile argument!" ); + profileName = QFile::decodeName(argv[++i]); + } else if ( opt == QLatin1String("-addcontentfile") ) { + INDEX_CHECK( "Missing content file!" ); + Config *c = Config::loadConfig(QString()); + QFileInfo file( QFile::decodeName(argv[i+1]) ); + if( !file.exists() ) { + fprintf(stderr, "Could not locate content file: %s\n", qPrintable(file.absoluteFilePath())); + return 1; + } + DocuParser *parser = DocuParser::createParser( file.absoluteFilePath() ); + if( parser ) { + QFile f( QFile::decodeName(argv[i+1]) ); + if( !parser->parse( &f ) ) { + fprintf(stderr, "Failed to parse file: %s\n", qPrintable(file.absoluteFilePath())); + return 1; + } + parser->addTo( c->profile() ); + c->setDocRebuild( true ); + c->save(); + } + return 0; + } else if ( opt == QLatin1String("-removecontentfile") ) { + INDEX_CHECK("Missing content file!"); + Config *c = Config::loadConfig(QString()); + Profile *profile = c->profile(); + QString contentFile = QString::fromLocal8Bit(argv[i+i]); + QStringList entries; +#ifdef Q_WS_WIN + contentFile.replace(QLatin1Char('\\'), QLatin1Char('/')); + entries = profile->docs.filter(contentFile, Qt::CaseInsensitive); +#else + entries = profile->docs.filter(contentFile); +#endif + if (entries.count() == 0) { + fprintf(stderr, "Could not locate content file: %s\n", qPrintable(contentFile)); + return 1; + } else if (entries.count() > 1) { + fprintf(stderr, "More than one entry matching file name found, " + "please specify full path to file"); + return 1; + } else { + QFileInfo file(entries[0]); + if( !file.exists() ) { + fprintf(stderr, "Could not locate content file: %s\n", qPrintable(file.absoluteFilePath())); + return 1; + } + profile->removeDocFileEntry( file.absoluteFilePath() ); + c->setDocRebuild( true ); + c->save(); + } + return 0; + } else if ( QString( QLatin1String(argv[i]) ).toLower() == QLatin1String("-docpath") ) { + INDEX_CHECK( "Missing path!" ); + QDir dir(QString::fromLocal8Bit(argv[i+1])); + if ( dir.exists() ) { + Config *c = Config::loadConfig(QString()); + c->saveProfile(Profile::createDefaultProfile(dir.absolutePath())); + c->loadDefaultProfile(); + c->setDocRebuild(true); + c->save(); + configLoaded = true; + ++i; + } else { + fprintf(stderr, "The specified path does not exist!\n"); + return 1; + } + } else if ( opt == QLatin1String("-hidesidebar") ) { + hideSidebar = true; + } else if ( opt == QLatin1String("-help") || opt == QLatin1String("/?") ) { + QString helpText = QLatin1String( "Usage: assistant [option]\n" + "Options:\n" + " -file Filename assistant opens the specified file\n" + " -server reads commands from a socket after\n" + " assistant has started\n" + " -profile fileName starts assistant and displays the\n" + " profile specified in the file fileName.\n" + " -addContentFile file adds the content file 'file' to the set of\n" + " documentation available by default\n" + " -removeContentFile file removes the content file 'file' from the\n" + " documentation available by default\n" + " -docPath path sets the Qt documentation root path to\n" + " 'path' and starts assistant\n" + " -hideSidebar assistant will hide the sidebar.\n" + " -resourceDir assistant will load translations from\n" + " this directory.\n" + " -help shows this help."); +#ifdef Q_WS_WIN + QMessageBox::information( 0, QLatin1String("Qt Assistant"), + QLatin1String("
") + helpText + QLatin1String("
") ); +#else + fprintf(stdout, "%s\n", qPrintable(helpText)); +#endif + exit( 0 ); + } else if ( opt == QLatin1String("-resourcedir") ) { + INDEX_CHECK( "Missing resource directory argument!" ); + resourceDir = QFile::decodeName( argv[++i] ); + } else { + fprintf(stderr, "Unrecognized option %s. Try -help to get help.\n", qPrintable(opt)); + return 1; + } + } + } + + if( resourceDir.isNull() ) + resourceDir = QLibraryInfo::location(QLibraryInfo::TranslationsPath); + + QTranslator translator( 0 ); + translator.load( QLatin1String("assistant_adp_") + QLocale::system().name(), resourceDir ); + a.installTranslator( &translator ); + + QTranslator qtTranslator( 0 ); + qtTranslator.load( QLatin1String("qt_") + QLocale::system().name(), resourceDir ); + a.installTranslator( &qtTranslator ); + + Config *conf = 0; + if (configLoaded) + conf = Config::configuration(); + else + conf = Config::loadConfig( profileName ); + if (!conf) { + fprintf( stderr, "Profile '%s' does not exist!\n", profileName.toLatin1().constData() ); + fflush( stderr ); + return -1; + } + + QStringList links = conf->source(); + conf->hideSideBar( hideSidebar ); + + QPointer mw = new MainWindow(); + mw->setObjectName(QLatin1String("Assistant")); + + if ( server ) { + as = new AssistantServer(); + printf("%d\n", as->serverPort() ); + fflush( stdout ); + as->connect( as, SIGNAL(showLinkRequest(QString)), + mw, SLOT(showLinkFromClient(QString)) ); + } + +#if !defined(QT_NO_DBUS) && defined(Q_OS_UNIX) + new AssistantAdaptor(mw); +#endif // QT_NO_DBUS + + FontSettings settings = conf->fontSettings(); + if (mw->font() != settings.windowFont) + a.setFont(settings.windowFont, "QWidget"); + +#ifdef Q_WS_MAC + // Make sure AssitantClient shows the window in front. + mw->raise(); +#endif + mw->show(); + + if (!file.isEmpty()) + mw->showLink( MainWindow::urlifyFileName(file) ); + else if (file.isEmpty()) + mw->showLinks( links ); + + a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) ); + + int appExec = a.exec(); + delete (MainWindow*)mw; + return appExec; +} + +QT_END_NAMESPACE + +int main( int argc, char ** argv ) +{ + Q_INIT_RESOURCE(assistant); + return QT_PREPEND_NAMESPACE(runAssistant)(argc, argv); +} + +#include "main.moc"