• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.14.38 API Reference
  • KDE Home
  • Contact Us
 

KDECore

  • kdecore
  • services
kmimetypetrader.cpp
Go to the documentation of this file.
1/* This file is part of the KDE libraries
2 Copyright (C) 2000 Torben Weis <weis@kde.org>
3 Copyright (C) 2006 David Faure <faure@kde.org>
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License version 2 as published by the Free Software Foundation.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 Boston, MA 02110-1301, USA.
18*/
19
20#include "kmimetypetrader.h"
21
22#include "kservicetypeprofile.h"
23#include "kservicetype.h"
24#include "kservicetypetrader.h"
25#include "kmimetype.h"
26#include "kservicefactory.h"
27#include "kmimetypefactory.h"
28#include "kmimetyperepository_p.h"
29
30#include <kdebug.h>
31
32class KMimeTypeTrader::Private
33{
34public:
35 Private() {}
36};
37
38KMimeTypeTrader* KMimeTypeTrader::self()
39{
40 K_GLOBAL_STATIC(KMimeTypeTrader, s_self)
41 return s_self;
42}
43
44KMimeTypeTrader::KMimeTypeTrader()
45 : d(new Private())
46{
47}
48
49KMimeTypeTrader::~KMimeTypeTrader()
50{
51 delete d;
52}
53
54static KServiceOfferList mimeTypeSycocaOffers(const QString& mimeType)
55{
56 KServiceOfferList lst;
57
58 const QString mime = KMimeTypeRepository::self()->canonicalName(mimeType);
59 KMimeTypeFactory *factory = KMimeTypeFactory::self();
60 const int offset = factory->entryOffset(mime);
61 if ( !offset ) {
62 if (!mimeType.startsWith(QLatin1String("x-scheme-handler/"))) // don't warn for unknown scheme handler mimetypes
63 kWarning(7014) << "KMimeTypeTrader: mimeType" << mimeType << "not found";
64 return lst; // empty
65 }
66
67 const int serviceOffersOffset = factory->serviceOffersOffset(mime);
68 if ( serviceOffersOffset > -1 ) {
69 lst = KServiceFactory::self()->offers(offset, serviceOffersOffset);
70 }
71 return lst;
72}
73
74static KService::List mimeTypeSycocaServiceOffers(const QString& mimeType)
75{
76 KService::List lst;
77 const QString mime = KMimeTypeRepository::self()->canonicalName(mimeType);
78 KMimeTypeFactory *factory = KMimeTypeFactory::self();
79 const int offset = factory->entryOffset(mime);
80 if ( !offset ) {
81 kWarning(7014) << "KMimeTypeTrader: mimeType" << mimeType << "not found";
82 return lst; // empty
83 }
84 const int serviceOffersOffset = factory->serviceOffersOffset(mime);
85 if ( serviceOffersOffset > -1 ) {
86 lst = KServiceFactory::self()->serviceOffers(offset, serviceOffersOffset);
87 }
88 return lst;
89}
90
91#define CHECK_SERVICETYPE(genericServiceTypePtr) \
92 if (!genericServiceTypePtr) { \
93 kError(7014) << "KMimeTypeTrader: couldn't find service type" << genericServiceType << \
94 "\nPlease ensure that the .desktop file for it is installed; then run kbuildsycoca4."; \
95 return; \
96 }
97
104static void filterMimeTypeOffers(KServiceOfferList& list, const QString& genericServiceType)
105{
106 KServiceType::Ptr genericServiceTypePtr = KServiceType::serviceType(genericServiceType);
107 CHECK_SERVICETYPE(genericServiceTypePtr);
108
109 QMutableListIterator<KServiceOffer> it(list);
110 while(it.hasNext()) {
111 const KService::Ptr servPtr = it.next().service();
112 // Expand servPtr->hasServiceType( genericServiceTypePtr ) to avoid lookup each time:
113 if (!KServiceFactory::self()->hasOffer(genericServiceTypePtr->offset(),
114 genericServiceTypePtr->serviceOffersOffset(),
115 servPtr->offset())
116 || !servPtr->showInKDE()) {
117 it.remove();
118 }
119 }
120}
121
122static void filterMimeTypeOffers(KService::List& list, const QString& genericServiceType)
123{
124 KServiceType::Ptr genericServiceTypePtr = KServiceType::serviceType(genericServiceType);
125 CHECK_SERVICETYPE(genericServiceTypePtr);
126
127 QMutableListIterator<KService::Ptr> it(list);
128 while(it.hasNext()) {
129 const KService::Ptr servPtr = it.next();
130 // Expand servPtr->hasServiceType( genericServiceTypePtr ) to avoid lookup each time:
131 if (!KServiceFactory::self()->hasOffer(genericServiceTypePtr->offset(),
132 genericServiceTypePtr->serviceOffersOffset(),
133 servPtr->offset())
134 || !servPtr->showInKDE()) {
135 it.remove();
136 }
137 }
138}
139
140#undef CHECK_SERVICETYPE
141
142KService::List KMimeTypeTrader::query( const QString& mimeType,
143 const QString& genericServiceType,
144 const QString& constraint ) const
145{
146 // Get all services of this mime type.
147 KService::List lst = mimeTypeSycocaServiceOffers(mimeType);
148 filterMimeTypeOffers(lst, genericServiceType);
149
150 KServiceTypeTrader::applyConstraints(lst, constraint);
151
152 kDebug(7014) << "query for mimeType " << mimeType << ", " << genericServiceType
153 << " : returning " << lst.count() << " offers" << endl;
154 return lst;
155}
156
157KService::Ptr KMimeTypeTrader::preferredService( const QString & mimeType, const QString & genericServiceType )
158{
159 // First, get all offers known to ksycoca.
160 KServiceOfferList offers = mimeTypeSycocaOffers( mimeType );
161
162 // Assign preferences from the profile to those offers - and filter for genericServiceType
163 Q_ASSERT(!genericServiceType.isEmpty());
164 filterMimeTypeOffers(offers, genericServiceType);
165
166 KServiceOfferList::const_iterator itOff = offers.constBegin();
167 // Look for the first one that is allowed as default.
168 // Since the allowed-as-default are first anyway, we only have
169 // to look at the first one to know.
170 if( itOff != offers.constEnd() && (*itOff).allowAsDefault() )
171 return (*itOff).service();
172
173 //kDebug(7014) << "No offers, or none allowed as default";
174 return KService::Ptr();
175}
KMimeTypeFactory
Definition: kmimetypefactory.h:40
KMimeTypeFactory::entryOffset
int entryOffset(const QString &mimeTypeName)
Returns the possible offset for a given mimetype entry.
Definition: kmimetypefactory.cpp:46
KMimeTypeFactory::self
static KMimeTypeFactory * self()
Definition: kmimetypefactory.cpp:41
KMimeTypeFactory::serviceOffersOffset
int serviceOffersOffset(const QString &mimeTypeName)
Returns the offset into the service offers for a given mimetype.
Definition: kmimetypefactory.cpp:55
KMimeTypeRepository::canonicalName
QString canonicalName(const QString &mime)
Resolve mime if it's an alias, and return it otherwise.
Definition: kmimetyperepository.cpp:90
KMimeTypeRepository::self
static KMimeTypeRepository * self()
Definition: kmimetyperepository.cpp:35
KMimeTypeTrader
KDE's trader for services associated to a given mimetype.
Definition: kmimetypetrader.h:43
KMimeTypeTrader::query
KService::List query(const QString &mimeType, const QString &genericServiceType=QString::fromLatin1("Application"), const QString &constraint=QString()) const
This method returns a list of services which are associated with a given mimetype.
Definition: kmimetypetrader.cpp:142
KMimeTypeTrader::~KMimeTypeTrader
~KMimeTypeTrader()
Standard destructor.
Definition: kmimetypetrader.cpp:49
KMimeTypeTrader::preferredService
KService::Ptr preferredService(const QString &mimeType, const QString &genericServiceType=QString::fromLatin1("Application"))
Returns the preferred service for mimeType and genericServiceType.
Definition: kmimetypetrader.cpp:157
KMimeTypeTrader::self
static KMimeTypeTrader * self()
This is a static pointer to the KMimeTypeTrader singleton.
Definition: kmimetypetrader.cpp:38
KServiceFactory::serviceOffers
KService::List serviceOffers(int serviceTypeOffset, int serviceOffersOffset)
Definition: kservicefactory.cpp:245
KServiceFactory::offers
KServiceOfferList offers(int serviceTypeOffset, int serviceOffersOffset)
Definition: kservicefactory.cpp:209
KServiceFactory::self
static KServiceFactory * self()
Definition: kservicefactory.cpp:81
KServiceTypeTrader::applyConstraints
static void applyConstraints(KService::List &lst, const QString &constraint)
Definition: kservicetypetrader.cpp:53
KServiceType::serviceOffersOffset
int serviceOffersOffset() const
Definition: kservicetype.cpp:226
KServiceType::serviceType
static Ptr serviceType(const QString &_name)
Returns a pointer to the servicetype '_name' or 0L if the service type is unknown.
Definition: kservicetype.cpp:191
KService::Ptr
KSharedPtr< KService > Ptr
Definition: kservice.h:61
KService::showInKDE
bool showInKDE() const
Whether the service should be shown in KDE at all (including in context menus).
Definition: kservice.cpp:682
KSharedPtr< KServiceType >
KSycocaEntry::offset
int offset() const
Definition: ksycocaentry.cpp:133
QList
Definition: kaboutdata.h:33
QString
K_GLOBAL_STATIC
#define K_GLOBAL_STATIC(TYPE, NAME)
This macro makes it easy to use non-POD types as global statics.
Definition: kglobal.h:221
kDebug
#define kDebug
Definition: kdebug.h:316
kWarning
#define kWarning
Definition: kdebug.h:322
kdebug.h
kmimetype.h
kmimetypefactory.h
kmimetyperepository_p.h
CHECK_SERVICETYPE
#define CHECK_SERVICETYPE(genericServiceTypePtr)
Definition: kmimetypetrader.cpp:91
filterMimeTypeOffers
static void filterMimeTypeOffers(KServiceOfferList &list, const QString &genericServiceType)
Filter the offers for the requested mime type for the genericServiceType.
Definition: kmimetypetrader.cpp:104
mimeTypeSycocaServiceOffers
static KService::List mimeTypeSycocaServiceOffers(const QString &mimeType)
Definition: kmimetypetrader.cpp:74
mimeTypeSycocaOffers
static KServiceOfferList mimeTypeSycocaOffers(const QString &mimeType)
Definition: kmimetypetrader.cpp:54
kmimetypetrader.h
kservicefactory.h
kservicetype.h
kservicetypeprofile.h
kservicetypetrader.h
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDECore

Skip menu "KDECore"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules
  • Related Pages

kdelibs-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal