diff options
Diffstat (limited to 'khelpcenter/khc_indexbuilder.cpp')
-rw-r--r-- | khelpcenter/khc_indexbuilder.cpp | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/khelpcenter/khc_indexbuilder.cpp b/khelpcenter/khc_indexbuilder.cpp new file mode 100644 index 000000000..9c605687b --- /dev/null +++ b/khelpcenter/khc_indexbuilder.cpp @@ -0,0 +1,221 @@ +/* + This file is part of the TDE Help Center + + Copyright (c) 2003 Cornelius Schumacher <[email protected]> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA +*/ + +#include "khc_indexbuilder.h" + +#include "version.h" + +#include <tdeaboutdata.h> +#include <tdelocale.h> +#include <tdecmdlineargs.h> +#include <kuniqueapplication.h> +#include <kdebug.h> +#include <dcopclient.h> +#include <kprocess.h> +#include <kstandarddirs.h> +#include <tdeconfig.h> + +#include <tqfile.h> +#include <tqfileinfo.h> +#include <tqdir.h> +#include <tqtextstream.h> + +#include <unistd.h> +#include <stdlib.h> +#include <iostream> + +using namespace KHC; + +IndexBuilder::IndexBuilder(const TQString& cmdFile) +{ + m_cmdFile = cmdFile; + kdDebug(1402) << "IndexBuilder()" << endl; +} + +void IndexBuilder::buildIndices() +{ + TQFile f( m_cmdFile ); + if ( !f.open( IO_ReadOnly ) ) { + kdError() << "Unable to open file '" << m_cmdFile << "'" << endl; + exit( 1 ); + } + kdDebug(1402) << "Opened file '" << m_cmdFile << "'" << endl; + TQTextStream ts( &f ); + TQString line = ts.readLine(); + while ( !line.isNull() ) { + kdDebug(1402) << "LINE: " << line << endl; + mCmdQueue.append( line ); + line = ts.readLine(); + } + + processCmdQueue(); +} + +void IndexBuilder::processCmdQueue() +{ + kdDebug(1402) << "IndexBuilder::processCmdQueue()" << endl; + + TQStringList::Iterator it = mCmdQueue.begin(); + + if ( it == mCmdQueue.end() ) { + quit(); + return; + } + + TQString cmd = *it; + + kdDebug(1402) << "PROCESS: " << cmd << endl; + + TDEProcess *proc = new TDEProcess; + proc->setRunPrivileged( true ); + + TQStringList args = TQStringList::split( " ", cmd ); + *proc << args; + + + connect( proc, TQT_SIGNAL( processExited( TDEProcess * ) ), + TQT_SLOT( slotProcessExited( TDEProcess * ) ) ); + connect( proc, TQT_SIGNAL( receivedStdout(TDEProcess *, char *, int ) ), + TQT_SLOT( slotReceivedStdout(TDEProcess *, char *, int ) ) ); + connect( proc, TQT_SIGNAL( receivedStderr(TDEProcess *, char *, int ) ), + TQT_SLOT( slotReceivedStderr(TDEProcess *, char *, int ) ) ); + + mCmdQueue.remove( it ); + + if ( !proc->start( TDEProcess::NotifyOnExit, TDEProcess::AllOutput ) ) { + sendErrorSignal( i18n("Unable to start command '%1'.").arg( cmd ) ); + processCmdQueue(); + } +} + +void IndexBuilder::slotProcessExited( TDEProcess *proc ) +{ + kdDebug(1402) << "IndexBuilder::slotIndexFinished()" << endl; + + if ( !proc->normalExit() ) { + kdError(1402) << "Process failed" << endl; + } else { + int status = proc->exitStatus(); + kdDebug(1402) << "Exit status: " << status << endl; + } + + delete proc; + + sendProgressSignal(); + + processCmdQueue(); +} + +void IndexBuilder::slotReceivedStdout( TDEProcess *, char *buffer, int buflen ) +{ + TQString text = TQString::fromLocal8Bit( buffer, buflen ); + std::cout << text.local8Bit().data() << std::flush; +} + +void IndexBuilder::slotReceivedStderr( TDEProcess *, char *buffer, int buflen ) +{ + TQString text = TQString::fromLocal8Bit( buffer, buflen ); + std::cerr << text.local8Bit().data() << std::flush; +} + +void IndexBuilder::sendErrorSignal( const TQString &error ) +{ + kdDebug(1402) << "IndexBuilder::sendErrorSignal()" << endl; + + TQByteArray params; + TQDataStream stream( params, IO_WriteOnly ); + stream << error; + kapp->dcopClient()->emitDCOPSignal("buildIndexError(TQString)", params ); +} + +void IndexBuilder::sendProgressSignal() +{ + kdDebug(1402) << "IndexBuilder::sendProgressSignal()" << endl; + + kapp->dcopClient()->emitDCOPSignal("buildIndexProgress()", TQByteArray() ); +} + +void IndexBuilder::quit() +{ + kdDebug(1402) << "IndexBuilder::quit()" << endl; + + kapp->quit(); +} + + +static TDECmdLineOptions options[] = +{ + { "+cmdfile", I18N_NOOP("Document to be indexed"), 0 }, + { "+indexdir", I18N_NOOP("Index directory"), 0 }, + TDECmdLineLastOption +}; + +int main( int argc, char **argv ) +{ + TDEAboutData aboutData( "khc_indexbuilder", + I18N_NOOP("KHelpCenter Index Builder"), + HELPCENTER_VERSION, + I18N_NOOP("The TDE Help Center"), + TDEAboutData::License_GPL, + I18N_NOOP("(c) 2003, The KHelpCenter developers") ); + + aboutData.addAuthor( "Cornelius Schumacher", 0, "[email protected]" ); + + TDECmdLineArgs::init( argc, argv, &aboutData ); + TDECmdLineArgs::addCmdLineOptions( options ); + KUniqueApplication::addCmdLineOptions(); + + TDEApplication app; + + TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs(); + + if ( args->count() != 2 ) { + kdDebug(1402) << "Wrong number of arguments." << endl; + return 1; + } + + TQString cmdFile = args->arg( 0 ); + TQString indexDir = args->arg( 1 ); + + kdDebug(1402) << "cmdFile: " << cmdFile << endl; + kdDebug(1402) << "indexDir: " << indexDir << endl; + + TQFile file( indexDir + "/testaccess" ); + if ( !file.open( IO_WriteOnly ) || file.putch( ' ' ) < 0 ) { + kdDebug(1402) << "access denied" << endl; + return 2; + } else { + kdDebug(1402) << "can access" << endl; + file.remove(); + } + + app.dcopClient()->registerAs( "khc_indexbuilder", false ); + + IndexBuilder builder(cmdFile); + + TQTimer::singleShot(0, &builder, TQT_SLOT(buildIndices())); + + return app.exec(); +} + +#include "khc_indexbuilder.moc" + +// vim:ts=2:sw=2:et |