KDECore
kmimetypetrader.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "kmimetypetrader.h"
00021
00022 #include "kservicetypeprofile.h"
00023 #include "kservicetype.h"
00024 #include "kservicetypetrader.h"
00025 #include "kmimetype.h"
00026 #include "kservicefactory.h"
00027 #include "kmimetypefactory.h"
00028
00029 #include <kdebug.h>
00030
00031 class KMimeTypeTrader::Private
00032 {
00033 public:
00034 Private() {}
00035 };
00036
00037 KMimeTypeTrader* KMimeTypeTrader::self()
00038 {
00039 K_GLOBAL_STATIC(KMimeTypeTrader, s_self)
00040 return s_self;
00041 }
00042
00043 KMimeTypeTrader::KMimeTypeTrader()
00044 : d(new Private())
00045 {
00046 }
00047
00048 KMimeTypeTrader::~KMimeTypeTrader()
00049 {
00050 delete d;
00051 }
00052
00053 static KServiceOfferList mimeTypeSycocaOffers(const QString& mimeType)
00054 {
00055 KServiceOfferList lst;
00056 KMimeType::Ptr mime = KMimeTypeFactory::self()->findMimeTypeByName( mimeType, KMimeType::ResolveAliases );
00057 if ( !mime ) {
00058 kWarning(7014) << "KMimeTypeTrader: mimeType" << mimeType << "not found";
00059 return lst;
00060 }
00061 if ( mime->serviceOffersOffset() > -1 ) {
00062 lst = KServiceFactory::self()->offers( mime->offset(), mime->serviceOffersOffset() );
00063 }
00064 return lst;
00065 }
00066
00067 static KService::List mimeTypeSycocaServiceOffers(const QString& mimeType)
00068 {
00069 KService::List lst;
00070 KMimeType::Ptr mime = KMimeTypeFactory::self()->findMimeTypeByName( mimeType, KMimeType::ResolveAliases );
00071 if ( !mime ) {
00072 kWarning(7014) << "KMimeTypeTrader: mimeType" << mimeType << "not found";
00073 return lst;
00074 }
00075 if ( mime->serviceOffersOffset() > -1 ) {
00076 lst = KServiceFactory::self()->serviceOffers( mime->offset(), mime->serviceOffersOffset() );
00077 }
00078 return lst;
00079 }
00080
00087 static void filterMimeTypeOffers(KServiceOfferList& list, const QString& genericServiceType)
00088 {
00089 KServiceType::Ptr genericServiceTypePtr = KServiceType::serviceType(genericServiceType);
00090 Q_ASSERT(genericServiceTypePtr);
00091
00092 QMutableListIterator<KServiceOffer> it(list);
00093 while(it.hasNext()) {
00094 const KService::Ptr servPtr = it.next().service();
00095
00096 if ( !KServiceFactory::self()->hasOffer(genericServiceTypePtr->offset(),
00097 genericServiceTypePtr->serviceOffersOffset(),
00098 servPtr->offset()) ) {
00099 it.remove();
00100 }
00101 }
00102 }
00103
00104 static void filterMimeTypeOffers(KService::List& list, const QString& genericServiceType)
00105 {
00106 KServiceType::Ptr genericServiceTypePtr = KServiceType::serviceType(genericServiceType);
00107 Q_ASSERT(genericServiceTypePtr);
00108
00109 QMutableListIterator<KService::Ptr> it(list);
00110 while(it.hasNext()) {
00111 const KService::Ptr servPtr = it.next();
00112
00113 if ( !KServiceFactory::self()->hasOffer(genericServiceTypePtr->offset(),
00114 genericServiceTypePtr->serviceOffersOffset(),
00115 servPtr->offset()) ) {
00116 it.remove();
00117 }
00118 }
00119 }
00120
00121 KService::List KMimeTypeTrader::query( const QString& mimeType,
00122 const QString& genericServiceType,
00123 const QString& constraint ) const
00124 {
00125
00126 KService::List lst = mimeTypeSycocaServiceOffers(mimeType);
00127 filterMimeTypeOffers(lst, genericServiceType);
00128
00129 KServiceTypeTrader::applyConstraints(lst, constraint);
00130
00131 kDebug(7014) << "query for mimeType " << mimeType << ", " << genericServiceType
00132 << " : returning " << lst.count() << " offers" << endl;
00133 return lst;
00134 }
00135
00136 KService::Ptr KMimeTypeTrader::preferredService( const QString & mimeType, const QString & genericServiceType )
00137 {
00138
00139 KServiceOfferList offers = mimeTypeSycocaOffers( mimeType );
00140
00141
00142 Q_ASSERT(!genericServiceType.isEmpty());
00143 filterMimeTypeOffers(offers, genericServiceType);
00144
00145 KServiceOfferList::const_iterator itOff = offers.constBegin();
00146
00147
00148
00149 if( itOff != offers.constEnd() && (*itOff).allowAsDefault() )
00150 return (*itOff).service();
00151
00152
00153 return KService::Ptr();
00154 }