summaryrefslogtreecommitdiffstats
path: root/kpackage/kissInterface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kpackage/kissInterface.cpp')
-rw-r--r--kpackage/kissInterface.cpp422
1 files changed, 422 insertions, 0 deletions
diff --git a/kpackage/kissInterface.cpp b/kpackage/kissInterface.cpp
new file mode 100644
index 0000000..a568a18
--- /dev/null
+++ b/kpackage/kissInterface.cpp
@@ -0,0 +1,422 @@
+/*
+** Copyright (C) 1999,2000 Toivo Pedaste <toivo@ucs.uwa.edu.au>
+**
+*/
+
+/*
+** 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 in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+
+#include "../config.h"
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <ctype.h>
+
+#include <setjmp.h>
+
+#include <qdir.h>
+#include <qfileinfo.h>
+
+#include <kurl.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+
+#include "packageInfo.h"
+#include "kissInterface.h"
+#include "updateLoc.h"
+#include "kpackage.h"
+#include "managementWidget.h"
+#include "utils.h"
+#include "options.h"
+#include "cache.h"
+#include <klocale.h>
+
+
+extern KApplication *app;
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+KISS::KISS():pkgInterface()
+{
+ head = "KISS";
+ name = i18n("KISS");
+ icon = "kiss";
+
+ pict = UserIcon(icon);
+ updated_pict = UserIcon("kupdated");
+ new_pict = UserIcon("knew");
+
+ packagePattern = "*.installer";
+ typeID = "/kiss";
+
+ locatedialog = new Locations(i18n("Location of KISS Packages"));
+ locatedialog->dLocations(2, 6, this, i18n("Folders", "F"),
+ "KISS", "*.installer",
+ i18n("Location of Folders Containing KISS Packages"));
+
+ connect(locatedialog,SIGNAL(returnVal(LcacheObj *)),
+ this,SLOT(setAvail(LcacheObj *)));
+ locatedialog->apply_slot();
+
+ queryMsg = i18n("Querying KISS package list: ");
+ procMsg = i18n("KPackage: Waiting on KISS");
+
+ param paramsInst[] = {
+ param(0,FALSE,FALSE,0)
+ };
+
+ param paramsUninst[] = {
+ param(0,FALSE,FALSE,0)
+ };
+ hasProgram = ifExe("kiss");
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+KISS::~KISS()
+{
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// check if kiss file
+bool KISS::isType(char *buf, const QString &)
+{
+ if (hasProgram) {
+ QString tmp = buf;
+ if (tmp.find("perl",0,false) >= 0)
+ return true;
+ else
+ return false;
+ } else {
+ return false;
+ }
+}
+
+bool KISS::parseName(const QString& name, QString *n, QString *v)
+{
+ int d1, d2, s1;
+
+ s1 = name.findRev('.');
+ if (s1 > 0) {
+ d2 = name.findRev('-',s1-1);
+ if (d2 > 0) {
+ d1 = name.findRev('_',d2-1);
+ if (d1 < 0)
+ d1 = d2;
+ *n = name.left(d1);
+ *v = name.mid(d1+1,s1-d1-1);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void KISS::listInstalledPackages(QPtrList<packageInfo> *pki)
+{
+ QString vb;
+ packageInfo *p;
+
+ QString sline = i18n("Querying KISS package list: ");
+
+ reader.setup("kiss");
+ *reader.proc << "-qq";
+ if (!reader.start(0,FALSE))
+ return;
+
+ kpackage->setStatus(sline);
+ kpackage->setPercent(0);
+
+ vb = "" ;
+
+ int sc, sp = 0;
+ while ((sc = reader.buf.find("\n\n",sp)) >= 0) {
+ if (sc+1 == (signed int)reader.buf.length())
+ break;
+ p = collectInfo(reader.buf.mid(sp,sc-sp).ascii());
+ if (p) {
+ if (!p->pkgInsert(pki, typeID, TRUE)) {
+ delete p;
+ }
+ }
+ sp = sc + 2;
+ }
+
+ kpackage->setPercent(100);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+// mode: i = query installed u = query uninstalled
+packageInfo *KISS::getPackageInfo(char mode, const QString &name, const QString &)
+{
+ packageInfo *pki = 0;
+ QString vb,search;
+
+ switch(mode)
+ {
+ ////////////////////////////////////////////////////////////////////////
+ // query an installed package!
+ case 'i':
+ reader.setup("kiss");
+ *reader.proc << "-q" << name;
+ if (reader.start(0,FALSE)) {
+ reader.buf += "package: " + name + "\n";
+ pki = collectInfo(reader.buf.ascii());
+ }
+ break;
+
+ ////////////////////////////////////////////////////////////////////
+ // query an uninstalled package
+ case 'u':
+ reader.setup("perl");
+ *reader.proc << name << "-q";
+ if (reader.start(0,TRUE)) {
+ pki = collectInfo(reader.buf.ascii());
+
+ QFileInfo fi(name);
+ QString s;
+ s.setNum(fi.size());
+ pki->info.insert("file-size", s);
+ }
+ break;
+ }
+ return pki;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+packageInfo *KISS::collectInfo(const char *_inp)
+{
+ QMap<QString, QString> a;
+
+ char *str, *xstr;
+ QString qstr;
+
+ char *inp = qstrdup(_inp);
+ str = strtok(inp,"\n");
+ do {
+ xstr = strchr(str,':');
+ if (*str == ' ')
+ str++;
+ if (!strncmp("package",str,7))
+ break;
+ } while ((str = strtok(NULL,"\n")));
+
+ // parse 'name: text' elements
+
+ if (str) {
+ do {
+ if (str[0] == 0)
+ break;
+
+ xstr = strchr(str,':');
+ if (xstr) {
+ *xstr++ = 0;
+ xstr++;
+
+ for( int i = 0; str[ i ] != '\0'; ++i )
+ str[ i ] = tolower( str[ i ] );
+
+ if (*str == ' ')
+ str++;
+
+ if (!strcmp("package",str)) {
+ a.insert("name", xstr);
+ } else if (!strcmp("name",str)) {
+ a.insert("summary", xstr);
+ } else if (!strcmp("section",str)) {
+ a.insert("group", xstr);
+ } else if (!strcmp("size",str)) {
+ a.insert("file-size", xstr);
+ } else if (!strcmp("installed-size",str)) {
+ QString str = xstr;
+ a.insert("size", str + "000");
+ } else {
+ a.insert(str, xstr);
+ }
+ }
+ } while ((str = strtok(NULL,"\n")));
+ }
+
+ packageInfo *i = new packageInfo(a,this);
+ i->packageState = packageInfo::INSTALLED;
+ i->fixup();
+ delete [] inp;
+ return i;
+
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+QStringList KISS::getChangeLog(packageInfo *) {
+ return 0;
+}
+
+
+bool KISS::filesTab(packageInfo *) {
+ return TRUE;
+}
+
+bool KISS::changeTab(packageInfo *) {
+ return FALSE;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+QStringList KISS::getFileList(packageInfo *p)
+{
+ QString vb, fn;
+ QString name;
+ char mode;
+
+ fn = p->getFilename();
+ if(!fn.isEmpty())
+ mode = 'u';
+ else
+ mode = 'i';
+
+ QStringList filelist;
+
+ switch(mode)
+ {
+ ////////////////////////////////////////////////////////////////////////
+ // query an installed package!
+ case 'i':
+ name = p->getProperty("name");
+
+ reader.setup("kiss");
+ *reader.proc << "-f" << name;
+ if (reader.start(0,FALSE)) {
+ char *buffer = qstrdup(reader.buf.ascii());
+ char *str = strtok(buffer,"\n");
+ if (str) {
+ do {
+ filelist.append(str);
+ } while ((str = strtok(NULL,"\n")));
+ }
+ delete [] buffer;
+ }
+ break;
+
+ ////////////////////////////////////////////////////////////////////
+ // query an uninstalled package
+ case 'u':
+ reader.setup("perl");
+ *reader.proc << fn << "-f";
+ if (reader.start(0,TRUE)) {
+ char *buffer = qstrdup(reader.buf.ascii());
+ char *str = strtok(buffer,"\n");
+ if (str) {
+ do {
+ filelist.append(strdup(str));
+ } while ((str = strtok(NULL,"\n")));
+ }
+ delete [] buffer;
+ }
+ break;
+ }
+
+ return filelist;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Call the script to install packages setting parameters
+// to kiss dependent on flags
+//////////////////////////////////////////////////////////////////////////////
+QString KISS::uninstall(int uninstallFlags, QPtrList<packageInfo> *plist, bool &test)
+{
+ QString packs;
+ packageInfo *pk;
+
+ for (pk = plist->first(); pk != 0; pk = plist->next()) {
+ packs = pk->getProperty("name");
+ doUninstall(uninstallFlags, packs, test);
+ }
+ return 0;
+}
+
+QString KISS::doUninstall(int, const QString &packs, bool &)
+{
+ return "kiss -d " + packs;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Call the script to install packages setting parameters
+// to kiss dependent on flags, returning whether everyting worked
+//////////////////////////////////////////////////////////////////////////////
+QString KISS::install(int installFlags, QPtrList<packageInfo> *plist, bool &test)
+{
+ packageInfo *pk;
+ int i = 0;
+ for (pk = plist->first(); pk != 0; pk = plist->next()) {
+ QString fname = pk->fetchFilename();
+ if (!fname.isEmpty()) {
+ doInstall(installFlags, fname, test);
+ i++;
+ }
+ }
+ return 0;
+}
+
+QString KISS::doInstall(int, const QString &packs, bool &)
+{
+ return "perl " + packs;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+QStringList KISS::FindFile(const QString &name, bool)
+{
+ QString s = "kiss -p ";
+ s += name;
+
+ QStringList filelist;
+ // filelist = kpty->run(s);
+
+ // for ( QStringList::Iterator it = filelist.begin(); it != filelist.end(); ++it ) {
+ // *it = *it + '\t' + name ;
+ // }
+
+ return filelist;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+void KISS::setLocation()
+{
+ locatedialog->restore();
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+void KISS::setAvail(LcacheObj *slist)
+{
+ if (packageLoc)
+ delete packageLoc;
+ packageLoc = slist;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+#include "kissInterface.moc"