diff options
Diffstat (limited to 'kdeprint/kdeprintcheck.cpp')
-rw-r--r-- | kdeprint/kdeprintcheck.cpp | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/kdeprint/kdeprintcheck.cpp b/kdeprint/kdeprintcheck.cpp new file mode 100644 index 000000000..9e9cccac4 --- /dev/null +++ b/kdeprint/kdeprintcheck.cpp @@ -0,0 +1,134 @@ +/* + * This file is part of the KDE libraries + * Copyright (c) 2001 Michael Goffioul <kdeprint@swing.be> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License version 2 as published by the Free Software Foundation. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + **/ + +/* + * Implementation of simple checking mechanism. Rules are defined in + * the form of an URI. Available syntax is: + * - exec:/<execname> -> check for an executable in + * $PATH variable. + * - config:/path/to/file -> check for the existence of a file + * or directory in KDE or standard + * UNIX config locations + * - file:/path/to/file + * - dir:/path/to/dir -> simply check the existence of the + * a file or directory + * - service:/serv -> try to connect to a port on the + * specified host (usually localhost) + * "serv" can be a port value or service name + * + * TO BE IMPLEMENTED: + * - run:/<execname> -> check for a running executable + */ + +#include "kdeprintcheck.h" + +#include <kstandarddirs.h> +#include <kdebug.h> +#include <kextsock.h> +#include <qfile.h> +#include <unistd.h> + +static const char* const config_stddirs[] = { + "/etc/", + "/usr/etc/", + "/usr/local/etc/", + "/opt/etc/", + "/opt/local/etc/", + 0 +}; + +bool KdeprintChecker::check(KConfig *conf, const QString& group) +{ + if (!group.isEmpty()) + conf->setGroup(group); + QStringList uris = conf->readListEntry("Require"); + return check(uris); +} + +bool KdeprintChecker::check(const QStringList& uris) +{ + bool state(true); + for (QStringList::ConstIterator it=uris.begin(); it!=uris.end() && state; ++it) + { + state = (state && checkURL(KURL(*it))); + // kdDebug( 500 ) << "auto-detection uri=" << *it << ", state=" << state << endl; + } + return state; +} + +bool KdeprintChecker::checkURL(const KURL& url) +{ + QString prot(url.protocol()); + if (prot == "config") + return checkConfig(url); + else if (prot == "exec") + return checkExec(url); + else if (prot == "file" || prot == "dir") + return KStandardDirs::exists(url.url()); + else if (prot == "service") + return checkService(url); + return false; +} + +bool KdeprintChecker::checkConfig(const KURL& url) +{ + // get the config filename (may contain a path) + QString f(url.path().mid(1)); + bool state(false); + + // first check for standard KDE config file + if (!locate("config",f).isEmpty()) + state = true; + else + // otherwise check in standard UNIX config directories + { + const char* const *p = config_stddirs; + while (*p) + { + // kdDebug( 500 ) << "checkConfig() with " << QString::fromLatin1( *p ) + f << endl; + if ( QFile::exists( QString::fromLatin1( *p ) + f ) ) + { + state = true; + break; + } + else + p++; + } + } + return state; +} + +bool KdeprintChecker::checkExec(const KURL& url) +{ + QString execname(url.path().mid(1)); + return !(KStandardDirs::findExe(execname).isEmpty()); +} + +bool KdeprintChecker::checkService(const KURL& url) +{ + QString serv(url.path().mid(1)); + KExtendedSocket sock; + + bool ok; + int port = serv.toInt(&ok); + + if (ok) sock.setAddress("localhost", port); + else sock.setAddress("localhost", serv); + return (sock.connect() == 0); +} |