You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdevelop/src/profileengine/lib/profileengine.cpp

265 lines
9.3 KiB

/***************************************************************************
* Copyright (C) 2004 by Alexander Dymo <adymo@kdevelop.org> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Library 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 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 "profileengine.h"
#include <qdir.h>
#include <kurl.h>
#include <kdebug.h>
#include <kglobal.h>
#include <kstandarddirs.h>
#include <kdevplugin.h>
ProfileEngine::ProfileEngine()
{
QStringList dirs = KGlobal::dirs()->findDirs("data", "kdevelop/profiles");
m_rootProfile = new Profile(0, "KDevelop");
QString currPath = "/";
QMap<QString, Profile*> passedPaths;
for (QStringList::const_iterator it = dirs.constBegin(); it != dirs.constEnd(); ++it)
processDir(*it, currPath, passedPaths, m_rootProfile);
}
ProfileEngine::~ProfileEngine()
{
delete m_rootProfile;
}
void ProfileEngine::processDir(const QString &dir, const QString &currPath, QMap<QString, Profile*> &passedPaths, Profile *root)
{
// kdDebug() << "processDir: " << dir << " " << currPath << endl;
QDir qDir(dir);
QStringList entryList = qDir.entryList(QDir::Dirs);
for (QStringList::const_iterator eit = entryList.constBegin(); eit != entryList.constEnd(); ++eit)
{
if ((*eit != "..") && (*eit != "."))
{
QString dirName = *eit;
Profile *profile = 0;
if (passedPaths.contains(currPath + dirName))
profile = passedPaths[currPath + dirName];
else
{
profile = new Profile(root, dirName);
passedPaths[currPath + dirName] = profile;
}
processDir(dir + *eit + "/", currPath + dirName, passedPaths, profile);
}
}
}
KTrader::OfferList ProfileEngine::offers(const QString &profileName, OfferType offerType)
{
ProfileListing listing;
Profile *profile = 0;
getProfileWithListing(listing, &profile, profileName);
if (!profile)
return KTrader::OfferList();
QString constraint = QString::fromLatin1("[X-KDevelop-Version] == %1").arg(KDEVELOP_PLUGIN_VERSION);
switch (offerType) {
case Global:
constraint += QString::fromLatin1(" and [X-KDevelop-Scope] == 'Global'");
break;
case Project:
constraint += QString::fromLatin1(" and [X-KDevelop-Scope] == 'Project'");
break;
case Core:
constraint += QString::fromLatin1(" and [X-KDevelop-Scope] == 'Core'");
break;
}
QString constraint_add = "";
Profile::EntryList properties = profile->list(Profile::Properties);
int i = 0;
for (Profile::EntryList::const_iterator it = properties.begin(); it != properties.end(); ++it)
constraint_add += QString::fromLatin1(" %1 '%2' in [X-KDevelop-Properties]").
arg((i++)==0?"":"or").arg((*it).name);
if (!constraint_add.isEmpty())
constraint += " and ( " + constraint_add + " ) ";
//BEGIN debug
/* kdDebug(9000) << "=============" << endl
<< " =============" << endl
<< " ============= Query for Profile:" << endl
<< " " << constraint << endl << endl << endl;*/
//END debug
KTrader::OfferList list = KTrader::self()->query(QString::fromLatin1("KDevelop/Plugin"), constraint);
QStringList names;
/* Wrong, this is not what we want to do.
Profile::EntryList disableList = profile->list(Profile::ExplicitDisable);
KTrader::OfferList::iterator it = list.begin();
while (it != list.end())
{
QString name = (*it)->desktopEntryName();
names.append(name);
if (profile->hasInEntryList(disableList, name))
{
it = list.remove(it);
continue;
}
++it;
}
*/
Profile::EntryList enableList = profile->list(Profile::ExplicitEnable);
for (Profile::EntryList::const_iterator it = enableList.begin(); it != enableList.end(); ++it)
{
if (names.contains((*it).name))
continue;
QString constraint = QString::fromLatin1("[X-KDevelop-Version] == %1").arg(KDEVELOP_PLUGIN_VERSION);
constraint += QString::fromLatin1("and [Name] == '%1'").arg((*it).name);
KTrader::OfferList enable = KTrader::self()->query(QString::fromLatin1("KDevelop/Plugin"), constraint);
list += enable;
}
/*//BEGIN debug
kdDebug() << "=============" << endl
<< " =============" << endl
<< " ============= Plugins for Profile:" << endl;
for (KTrader::OfferList::const_iterator it = list.begin(); it != list.end(); ++it)
kdDebug() << " " << (*it)->name() << endl;
kdDebug() << endl << endl;
//END debug*/
return list;
}
KTrader::OfferList ProfileEngine::allOffers(OfferType offerType)
{
QString constraint = QString::fromLatin1("[X-KDevelop-Version] == %1").arg(KDEVELOP_PLUGIN_VERSION);
switch (offerType) {
case Global:
constraint += QString::fromLatin1(" and [X-KDevelop-Scope] == 'Global'");
break;
case Project:
constraint += QString::fromLatin1(" and [X-KDevelop-Scope] == 'Project'");
break;
case Core:
constraint += QString::fromLatin1(" and [X-KDevelop-Scope] == 'Core'");
break;
}
return KTrader::self()->query(QString::fromLatin1("KDevelop/Plugin"), constraint);
}
void ProfileEngine::getProfileWithListing(ProfileListing &listing, Profile **profile,
const QString &profileName)
{
if (profileName == "KDevelop")
*profile = m_rootProfile;
else
{
walkProfiles<ProfileListing>(listing, m_rootProfile);
*profile = listing.profiles[profileName];
}
}
KURL::List ProfileEngine::resources(const QString &profileName, const QString &nameFilter)
{
ProfileListing listing;
Profile *profile = 0;
getProfileWithListing(listing, &profile, profileName);
if (!profile)
return KURL::List();
return resources(profile, nameFilter);
}
KURL::List ProfileEngine::resources(Profile *profile, const QString &nameFilter)
{
return profile->resources(nameFilter);
}
KURL::List ProfileEngine::resourcesRecursive(const QString &profileName, const QString &nameFilter)
{
ProfileListing listing;
Profile *profile = 0;
getProfileWithListing(listing, &profile, profileName);
KURL::List resources = profile->resources(nameFilter);
ProfileListingEx listingEx(nameFilter);
walkProfiles<ProfileListingEx>(listingEx, profile);
resources += listingEx.resourceList;
return resources;
}
void ProfileEngine::diffProfiles(OfferType offerType, const QString &profile1,
const QString &profile2, QStringList &unload, KTrader::OfferList &load)
{
KTrader::OfferList offers1 = offers(profile1, offerType);
KTrader::OfferList offers2 = offers(profile2, offerType);
QStringList offers1List;
for (KTrader::OfferList::const_iterator it = offers1.constBegin();
it != offers1.constEnd(); ++it)
offers1List.append((*it)->desktopEntryName());
QMap<QString, KService::Ptr> offers2List;
for (KTrader::OfferList::const_iterator it = offers2.constBegin();
it != offers2.constEnd(); ++it)
offers2List[(*it)->desktopEntryName()] = *it;
// kdDebug() << "OLD PROFILE: " << offers1List << endl;
// kdDebug() << "NEW PROFILE: " << offers2List << endl;
for (QStringList::const_iterator it = offers1List.constBegin();
it != offers1List.constEnd(); ++it)
{
// kdDebug() << "checking: " << *it << endl;
if (offers2List.contains(*it))
{
// kdDebug() << " keep" << endl;
offers2.remove(offers2List[*it]);
}
else
{
// kdDebug() << " unload" << endl;
unload.append(*it);
}
}
load = offers2;
}
Profile *ProfileEngine::findProfile(const QString & profileName)
{
Profile *profile;
ProfileListing listing;
getProfileWithListing(listing, &profile, profileName);
return profile;
}
void ProfileEngine::addResource(const QString &profileName, const KURL &url)
{
ProfileListing listing;
Profile *profile = 0;
getProfileWithListing(listing, &profile, profileName);
if (!profile)
return;
profile->addResource(url);
}