/*************************************************************************** kio_finger.cpp - description ------------------- begin : Sun Aug 12 2000 copyright : (C) 2000 by Andreas Schlapbach email : schlpbch@iam.unibe.ch ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <string.h> #include <tqtextstream.h> #include <tqdict.h> #include <tqcstring.h> #include <tqfile.h> #include <tqregexp.h> #include <kdebug.h> #include <kinstance.h> #include <kglobal.h> #include <kstandarddirs.h> #include <klocale.h> #include <kurl.h> #include "kio_finger.h" using namespace KIO; static const TQString defaultRefreshRate = "60"; extern "C" { KDE_EXPORT int kdemain( int argc, char **argv ) { KInstance instance( "kio_finger" ); //kdDebug() << "*** Starting kio_finger " << getpid() << endl; if (argc != 4) { fprintf(stderr, "Usage: kio_finger protocol domain-socket1 domain-socket2\n"); exit(-1); } FingerProtocol slave(argv[2], argv[3]); slave.dispatchLoop(); //kdDebug() << "*** kio_finger Done" << endl; return 0; } } /* ---------------------------------------------------------------------------------- */ FingerProtocol::FingerProtocol(const TQCString &pool_socket, const TQCString &app_socket) : TQObject(), SlaveBase("finger", pool_socket, app_socket) { myStdStream = new TQString(); getProgramPath(); } /* ---------------------------------------------------------------------------------- */ FingerProtocol::~FingerProtocol() { //kdDebug() << "FingerProtocol::~FingerProtocol()" << endl; delete myURL; delete myPerlPath; delete myFingerPath; delete myFingerPerlScript; delete myFingerCSSFile; delete myStdStream; } /* ---------------------------------------------------------------------------------- */ void FingerProtocol::get(const KURL& url ) { //kdDebug() << "kio_finger::get(const KURL& url)" << endl ; this->parseCommandLine(url); //kdDebug() << "myURL: " << myURL->prettyURL() << endl; // Reset the stream *myStdStream=""; TQString query = myURL->query(); TQString refreshRate = defaultRefreshRate; //kdDebug() << "query: " << query << endl; // Check the validity of the query TQRegExp regExp("?refreshRate=[0-9][0-9]*", true, true); if (query.tqcontains(regExp)) { //kdDebug() << "looks like a valid query" << endl; TQRegExp regExp( "([0-9]+)" ); regExp.search(query); refreshRate = regExp.cap(0); } //kdDebug() << "Refresh rate: " << refreshRate << endl; myKProcess = new KProcess(); *myKProcess << *myPerlPath << *myFingerPerlScript << *myFingerPath << *myFingerCSSFile << refreshRate << myURL->host() << myURL->user() ; connect(myKProcess, TQT_SIGNAL(receivedStdout(KProcess *, char *, int)), this, TQT_SLOT(slotGetStdOutput(KProcess *, char *, int))); //connect(myKProcess, TQT_SIGNAL(receivedStderr(KProcess *, char *, int)), // this, TQT_SLOT(slotGetStdOutput(KProcess *, char *, int))); myKProcess->start(KProcess::Block, KProcess::All); data(TQCString(TQString(*myStdStream).local8Bit())); data(TQByteArray()); finished(); //clean up delete myKProcess; } /* ---------------------------------------------------------------------------------- */ void FingerProtocol::slotGetStdOutput(KProcess* /* p */, char *s, int len) { //kdDebug() << "void FingerProtocol::slotGetStdoutOutput()" << endl; *myStdStream += TQString::fromLocal8Bit(s, len); } /* ---------------------------------------------------------------------------------- */ void FingerProtocol::mimetype(const KURL & /*url*/) { mimeType("text/html"); finished(); } /* ---------------------------------------------------------------------------------- */ void FingerProtocol::getProgramPath() { //kdDebug() << "kfingerMainWindow::getProgramPath()" << endl; // Not to sure wether I'm using the right error number here. - schlpbch - myPerlPath = new TQString(KGlobal::dirs()->findExe("perl")); if (myPerlPath->isEmpty()) { //kdDebug() << "Perl command not found" << endl; this->error(ERR_CANNOT_LAUNCH_PROCESS, i18n("Could not find the Perl program on your system, please install.")); exit(); } else { //kdDebug() << "Perl command found:" << *myPerlPath << endl; } myFingerPath = new TQString(KGlobal::dirs()->findExe("finger")); if ((myFingerPath->isEmpty())) { //kdDebug() << "Finger command not found" << endl; this->error(ERR_CANNOT_LAUNCH_PROCESS, i18n("Could not find the Finger program on your system, please install.")); exit(); } else { //kdDebug() << "Finger command found:" << *myFingerPath << endl; } myFingerPerlScript = new TQString(locate("data","kio_finger/kio_finger.pl")); if (myFingerPerlScript->isEmpty()) { //kdDebug() << "kio_finger.pl script not found" << endl; this->error(ERR_CANNOT_LAUNCH_PROCESS, i18n("kio_finger Perl script not found.")); exit(); } else { //kdDebug() << "kio_finger perl script found: " << *myFingerPerlScript << endl; } myFingerCSSFile = new TQString(locate("data","kio_finger/kio_finger.css")); if (myFingerCSSFile->isEmpty()) { //kdDebug() << "kio_finger.css file not found" << endl; this->warning(i18n("kio_finger CSS script not found. Output will look ugly.")); } else { //kdDebug() << "kio_finger CSS file found: " << *myFingerCSSFile << endl; } } /* --------------------------------------------------------------------------- */ void FingerProtocol::parseCommandLine(const KURL& url) { myURL = new KURL(url); /* * Generate a valid finger url */ if(myURL->isEmpty() || !myURL->isValid() || (myURL->user().isEmpty() && myURL->host().isEmpty())) { myURL->setProtocol("finger"); myURL->setUser(""); myURL->setHost("localhost"); } /* * If no specific port is specified, set it to 79. */ if(myURL->port() == 0) { myURL->setPort(79); } /* * If no refresh rate is given, set it to defaultRefreshRate */ if (myURL->query().isEmpty()) { myURL->setQuery("?refreshRate="+defaultRefreshRate); } } /* ---------------------------------------------------------------------------------- */ #include "kio_finger.moc" /* ---------------------------------------------------------------------------------- */