[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-panel-devel
Subject:    plasmapkg
From:       Petri =?iso-8859-1?q?Damst=E9n?= <petri.damsten () gmail ! com>
Date:       2008-10-30 12:56:31
Message-ID: 200810301456.31456.petri.damsten () gmail ! com
[Download RAW message or body]

[Attachment #2 (multipart/signed)]

[Attachment #4 (multipart/mixed)]


Hi,

I'm trying to upgrade and uninstall from GHNS (uninstall command support still 
needed on that side) with plasmapkg. This adds (whole main.cpp attached) --
upgrade, --uninstall packagefile and working --list as a bonus. It's NOT meant 
to be committed as it is since it's 'a bit hackish'. 

It gets installed packages before and after install to get installed package 
name(s). It then saves them to config so on uninstall we can get the name of 
the package for the package file. Is there a better way of doing this or am I 
going completely to the forest here (Well that's Finnish saying meaning 'that 
went totally to the wrong direction')?

Petri


["main.cpp" (text/x-c++src)]

/*
 * Copyright 2008 Aaron Seigo <aseigo@kde.org>
 *
 *   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,
 *   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 Library 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 <iostream>

#include <QDir>
#include <QDBusInterface>

#include <KApplication>
#include <KAboutData>
#include <KAction>
#include <KCmdLineArgs>
#include <KLocale>
#include <KService>
#include <KServiceTypeTrader>
#include <KShell>
#include <KStandardDirs>
#include <KProcess>
#include <KSycoca>
#include <KConfigGroup>

#include <plasma/packagestructure.h>

static const char description[] = I18N_NOOP("Install, list, remove Plasma packages");
static const char version[] = "0.1";

void output(const QString &msg)
{
    std::cout << msg.toLocal8Bit().constData() << std::endl;
}

void runKbuildsycoca()
{
    QDBusInterface dbus("org.kde.kded", "/kbuildsycoca", "org.kde.kbuildsycoca");
    dbus.call(QDBus::NoBlock, "recreate");
    // To re-open database
    delete KSycoca::self();

    // Personal hack
    /*
    QString bin = KStandardDirs::findExe("kbuildsycoca4");
    if (!bin.isEmpty()) {
        KProcess process;
        process.setProgram(bin);
        process.setOutputChannelMode(KProcess::SeparateChannels);
        process.execute();
    }
    */
}

QStringList removeStrings(const QStringList& list, const QStringList& remove)
{
    QStringList result = list;
    foreach (const QString &s, remove) {
        result.removeAll(s);
    }
    return result;
}

QStringList packages(const QString& type)
{
    QStringList result;
    KService::List services = KServiceTypeTrader::self()->query("Plasma/" + type);
    foreach(const KService::Ptr &service, services) {
        result << service->property("X-KDE-PluginInfo-Name", \
QVariant::String).toString();  }
    return result;
}

void listPackages(const QString& type)
{
    foreach(const QString& package, packages(type)) {
        output(package);
    }
}

int main(int argc, char **argv)
{
    KAboutData aboutData("plasmapkg", 0, ki18n("Plasma Package Manager"),
                         version, ki18n(description), KAboutData::License_GPL,
                         ki18n("(C) 2008, Aaron Seigo"));
    aboutData.addAuthor( ki18n("Aaron Seigo"),
                         ki18n("Original author"),
                        "aseigo@kde.org" );

    KComponentData componentData(aboutData);

    KCmdLineArgs::init( argc, argv, &aboutData );

    KCmdLineOptions options;
    options.add("g");
    options.add("global", ki18n("For install or remove, operates on packages \
installed for all users."));  options.add("t");
    options.add("type <type>",
                ki18n("The type of package, e.g. theme, wallpaper, plasmoid, \
DataEngine, Runner, etc."),  "plasmoid");
    options.add("s");
    options.add("i");
    options.add("install <path>", ki18n("Install the package at <path>"));
    options.add("u");
    options.add("upgrade <path>", ki18n("Upgrade the package at <path>"));
    options.add("l");
    options.add("list", ki18n("List installed packages"));
    options.add("r");
    options.add("remove <name>", ki18n("Remove the package named <name>"));
    options.add("p");
    options.add("packageroot <path>", ki18n("Absolute path to the package root. If \
not supplied, then the standard data directories for this KDE session will be \
searched instead."));  KCmdLineArgs::addCmdLineOptions( options );

    KApplication app;

    KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
    const QString type = args->getOption("type").toLower();
    QString packageRoot = type;
    QString servicePrefix;
    QString pluginType;
    Plasma::PackageStructure *installer = 0;

    if (type == i18n("plasmoid") || type == "plasmoid") {
        packageRoot = "plasma/plasmoids/";
        servicePrefix = "plasma-applet-";
        pluginType = "Applet";
    } else if (type == i18n("theme") || type == "theme") {
        packageRoot = "desktoptheme/";
    } else if (type == i18n("wallpaper") || type == "wallpaper") {
        packageRoot = "wallpapers/";
    } else if (type == i18n("dataengine") || type == "dataengine") {
        packageRoot = "plasma/dataengines/";
        servicePrefix = "plasma-dataengine-";
        pluginType = "DataEngine";
    } else if (type == i18n("runner") || type == "runner") {
        packageRoot = "plasma/runners/";
        servicePrefix = "plasma-runner-";
        pluginType = "Runner";
    } else {
        QString constraint = QString("'%1' == \
                [X-KDE-PluginInfo-Name]").arg(packageRoot);
        KService::List offers = \
KServiceTypeTrader::self()->query("Plasma/PackageStructure", constraint);  if \
                (offers.isEmpty()) {
            output(i18n("Could not find a suitable installer for package of type %1", \
type));  return 1;
        }

        KService::Ptr offer = offers.first();
        QString error;
        installer = offer->createInstance<Plasma::PackageStructure>(0, \
QVariantList(), &error);

        if (!installer) {
            output(i18n("Could not load installer for package of type %1. Error \
reported was: %2",  type, error));
            return 1;
        }
        packageRoot = installer->defaultPackageRoot();
        pluginType = installer->type();
    }

    if (args->isSet("list")) {
        listPackages(pluginType);
    } else {
        // install, remove or upgrade
        if (!installer) {
            Plasma::PackageStructure *installer = new Plasma::PackageStructure();
            installer->setServicePrefix(servicePrefix);
        }

        if (args->isSet("packageroot")) {
            packageRoot = args->getOption("packageroot");
        } else if (args->isSet("global")) {
            packageRoot = KStandardDirs::locate("data", packageRoot);
        } else {
            packageRoot = KStandardDirs::locateLocal("data", packageRoot);
        }

        QString package;
        QString packageFile;
        if (args->isSet("remove")) {
            package = args->getOption("remove");
        } else if (args->isSet("upgrade")) {
            package = args->getOption("upgrade");
        } else if (args->isSet("install")) {
            package = args->getOption("install");
        }
        if (!QDir::isAbsolutePath(package)) {
            packageFile = QDir(QDir::currentPath() + '/' + package).absolutePath();
        } else {
            packageFile = package;
        }

        if (args->isSet("remove") || args->isSet("upgrade")) {
            // Check if this is a package file we have saved on install
            KConfigGroup config(KGlobal::config(), "Packages");
            QMap<QString, QString> entries = config.entryMap();
            QStringList packages = entries.values(packageFile);
            if (packages.isEmpty()) {
                // Not a saved package file
                packages << package;
            }
            foreach (const QString& s, packages) {
                if (installer->uninstallPackage(s, packageRoot)) {
                    output(i18n("Successfully removed %1", s));
                } else if (!args->isSet("upgrade")) {
                    output(i18n("Removal of %1 failed.", s));
                    return 1;
                }
            }
            runKbuildsycoca();
        }
        if (args->isSet("install") || args->isSet("upgrade")) {
            QStringList oldPackages = packages(pluginType);
            if (installer->installPackage(packageFile, packageRoot)) {
                output(i18n("Successfully installed %1", packageFile));
                runKbuildsycoca();
                // Save package file -> package name so we can later uninstall with \
                package file
                QStringList newPackages = removeStrings(packages(pluginType), \
oldPackages);  KConfigGroup config(KGlobal::config(), "Packages");
                foreach (const QString& s, newPackages) {
                    config.writeEntry(packageFile, s);
                }
            } else {
                output(i18n("Installation of %1 failed.", packageFile));
                return 1;
            }
        }
        if (package.isEmpty()) {
            KCmdLineArgs::usageError(i18n("One of install, remove, upgrade or list is \
required."));  }
    }
    return 0;
}


["signature.asc" (application/pgp-signature)]

_______________________________________________
Plasma-devel mailing list
Plasma-devel@kde.org
https://mail.kde.org/mailman/listinfo/plasma-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic