summaryrefslogtreecommitdiffstats
path: root/tools/assistant/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/assistant/main.cpp')
-rw-r--r--tools/assistant/main.cpp342
1 files changed, 342 insertions, 0 deletions
diff --git a/tools/assistant/main.cpp b/tools/assistant/main.cpp
new file mode 100644
index 000000000..9e3c9dae9
--- /dev/null
+++ b/tools/assistant/main.cpp
@@ -0,0 +1,342 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of the TQt Assistant.
+**
+** 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 files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free TQt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing retquirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid TQt Commercial licenses may use this file in
+** accordance with the TQt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "mainwindow.h"
+#include "helpdialogimpl.h"
+#include "config.h"
+
+#include <qapplication.h>
+#include <qserversocket.h>
+#include <qsocket.h>
+#include <qpixmap.h>
+#include <qptrlist.h>
+#include <qstringlist.h>
+#include <qdir.h>
+#include <qmessagebox.h>
+#include <qguardedptr.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <qtextcodec.h>
+
+#ifdef Q_WS_WIN
+#define INDEX_CHECK( text ) if( i+1 >= argc ) { TQMessageBox::information( 0, "TQt Assistant", text ); return 1; }
+#else
+#define INDEX_CHECK( text ) if( i+1 >= argc ) { fprintf( stderr, text "\n" ); return 1; }
+#endif
+
+static bool allowFirstRun = TRUE;
+
+class AssistantSocket : public TQSocket
+{
+ Q_OBJECT
+public:
+ AssistantSocket( int sock, TQObject *parent = 0 );
+ ~AssistantSocket() {}
+
+signals:
+ void showLinkRequest( const TQString& );
+
+private slots:
+ void readClient();
+ void connectionClosed();
+};
+
+
+class AssistantServer : public TQServerSocket
+{
+ Q_OBJECT
+public:
+ AssistantServer( TQObject* parent = 0 );
+ void newConnection( int socket );
+ Q_UINT16 getPort() const;
+
+signals:
+ void showLinkRequest( const TQString& );
+ void newConnect();
+
+private:
+ Q_UINT16 p;
+};
+
+
+AssistantSocket::AssistantSocket( int sock, TQObject *parent )
+ : TQSocket( parent, 0 )
+{
+ connect( this, SIGNAL( readyRead() ),
+ SLOT( readClient() ) );
+ connect( this, SIGNAL( connectionClosed() ),
+ SLOT( connectionClosed() ) );
+ setSocket( sock );
+}
+
+void AssistantSocket::readClient()
+{
+ TQString link = TQString::null;
+ while ( canReadLine() )
+ link = readLine();
+ if ( !link.isNull() ) {
+ link = link.replace( "\n", "" );
+ link = link.replace( "\r", "" );
+ emit showLinkRequest( link );
+ }
+}
+
+void AssistantSocket::connectionClosed()
+{
+ delete this;
+}
+
+AssistantServer::AssistantServer( TQObject *parent )
+ : TQServerSocket( 0x7f000001, 0, 1, parent )
+{
+ if ( !ok() ) {
+ TQMessageBox::critical( 0, tr( "TQt Assistant" ),
+ tr( "Failed to bind to port %1" ).arg( port() ) );
+ exit( 1 );
+ }
+ p = port();
+}
+
+Q_UINT16 AssistantServer::getPort() const
+{
+ return p;
+}
+
+void AssistantServer::newConnection( int socket )
+{
+ AssistantSocket *as = new AssistantSocket( socket, this );
+ connect( as, SIGNAL( showLinkRequest( const TQString& ) ),
+ this, SIGNAL( showLinkRequest( const TQString& ) ) );
+ emit newConnect();
+}
+
+int main( int argc, char ** argv )
+{
+ bool withGUI = TRUE;
+ if ( argc > 1 ) {
+ TQString arg( argv[1] );
+ arg = arg.lower();
+ if ( arg == "-addcontentfile"
+ || arg == "-removecontentfile"
+#ifndef Q_WS_WIN
+ || arg == "-help"
+#endif
+ )
+ withGUI = FALSE;
+ }
+ TQApplication a(argc, argv, withGUI);
+
+ TQString resourceDir;
+ AssistantServer *as = 0;
+ TQStringList catlist;
+ TQString file, profileName, aDocPath;
+ bool server = FALSE;
+ bool hideSidebar = FALSE;
+ bool startClean = FALSE;
+ bool configLoaded = FALSE;
+ if ( argc == 2 ) {
+ if ( (argv[1])[0] != '-' )
+ file = argv[1];
+ }
+ if ( file.isEmpty() ) {
+ for ( int i = 1; i < argc; i++ ) {
+ if ( TQString( argv[i] ).lower() == "-file" ) {
+ INDEX_CHECK( "Missing file argument!" );
+ i++;
+ file = argv[i];
+ } else if ( TQString( argv[i] ).lower() == "-server" ) {
+ server = TRUE;
+ } else if ( TQString( argv[i] ).lower() == "-profile" ) {
+ INDEX_CHECK( "Missing profile argument!" );
+ profileName = argv[++i];
+ } else if ( TQString( argv[i] ).lower() == "-addcontentfile" ) {
+ INDEX_CHECK( "Missing content file!" );
+ Config *c = Config::loadConfig( TQString::null );
+ TQFileInfo file( argv[i+1] );
+ if( !file.exists() ) {
+ fprintf( stderr, "Could not locate content file: '%s'\n",
+ file.absFilePath().latin1() );
+ fflush( stderr );
+ return 1;
+ }
+ DocuParser *parser = DocuParser::createParser( file.absFilePath() );
+ if( parser ) {
+ TQFile f( argv[i+1] );
+ if( !parser->parse( &f ) ) {
+ fprintf( stderr, "Failed to parse file: '%s'\n, ",
+ file.absFilePath().latin1() );
+ fflush( stderr );
+ return 1;
+ }
+ parser->addTo( c->profile() );
+ c->setDocRebuild( TRUE );
+ c->save();
+ }
+ return 0;
+ } else if ( TQString( argv[i] ).lower() == "-removecontentfile" ) {
+ INDEX_CHECK( "Missing content file!" );
+ Config *c = Config::loadConfig( TQString::null );
+ Profile *profile = c->profile();
+ TQStringList entries = profile->docs.grep(argv[i+1]);
+ if (entries.count() == 0) {
+ fprintf(stderr, "Could not locate content file: '%s'\n",
+ argv[i+1]);
+ fflush(stderr);
+ return 1;
+ } else if (entries.count() > 1) {
+ fprintf(stderr, "More than one entry matching file name found, "
+ "please specify full path to file");
+ fflush(stderr);
+ return 1;
+ } else {
+ TQFileInfo file(entries[0]);
+ if( !file.exists() ) {
+ fprintf( stderr, "Could not locate content file: '%s'\n",
+ file.absFilePath().latin1() );
+ fflush( stderr );
+ return 1;
+ }
+ profile->removeDocFileEntry( file.absFilePath() );
+ c->setDocRebuild( TRUE );
+ c->save();
+ }
+ return 0;
+ } else if ( TQString( argv[i] ).lower() == "-docpath" ) {
+ INDEX_CHECK( "Missing path!" );
+ TQDir dir( argv[i+1] );
+ if ( dir.exists() ) {
+ Config *c = Config::loadConfig( TQString::null );
+ c->saveProfile(Profile::createDefaultProfile(dir.absPath()));
+ c->loadDefaultProfile();
+ c->setDocRebuild( TRUE );
+ c->save();
+ configLoaded = TRUE;
+ ++i;
+ } else {
+ fprintf( stderr, "The specified path does not exist!\n");
+ fflush( stderr );
+ return 1;
+ }
+ } else if ( TQString( argv[i] ).lower() == "-hidesidebar" ) {
+ hideSidebar = TRUE;
+ } else if ( TQString( argv[i] ).lower() == "-help" ) {
+ TQString helpText( "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 TQt 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
+ TQMessageBox::information( 0, "TQt Assistant", "<pre>" + helpText + "</pre>" );
+#else
+ printf( "%s\n", helpText.latin1() );
+#endif
+ exit( 0 );
+ } else if ( TQString( argv[i] ).lower() == "-resourcedir" ) {
+ INDEX_CHECK( "Missing resource directory argument!" );
+ resourceDir = TQString( argv[++i] );
+ } else {
+ fprintf( stderr, "Unrecognized option '%s'. Try -help to get help.\n",
+ argv[i] );
+ fflush( stderr );
+ return 1;
+ }
+ }
+ }
+
+ if( resourceDir.isNull() )
+ resourceDir = qInstallPathTranslations();
+
+ TQTranslator translator( 0 );
+ translator.load( TQString("assistant_") + TQTextCodec::locale(), resourceDir );
+ a.installTranslator( &translator );
+
+ TQTranslator qtTranslator( 0 );
+ qtTranslator.load( TQString("qt_") + TQTextCodec::locale(), 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.latin1() );
+ fflush( stderr );
+ return -1;
+ }
+
+ bool max = conf->isMaximized();
+ TQStringList links = conf->source();
+ conf->hideSideBar( hideSidebar );
+
+ TQGuardedPtr<MainWindow> mw = new MainWindow( 0, "Assistant" );
+
+ if ( server ) {
+ as = new AssistantServer();
+ printf("%d\n", as->port() );
+ fflush( stdout );
+ as->connect( as, SIGNAL( showLinkRequest( const TQString& ) ),
+ mw, SLOT( showLinkFromClient( const TQString& ) ) );
+ }
+
+ if ( max )
+ mw->showMaximized();
+ else
+ mw->show();
+
+ if ( !file.isEmpty() )
+ mw->showLink( file );
+ else if ( file.isEmpty() )
+ mw->showLinks( links );
+
+ a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( tquit() ) );
+
+ int appExec = a.exec();
+ delete (MainWindow*)mw;
+ return appExec;
+}
+
+#include "main.moc"