• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.14.30 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 
32 class KMimeTypeTrader::Private
33 {
34 public:
35  Private() {}
36 };
37 
38 KMimeTypeTrader* KMimeTypeTrader::self()
39 {
40  K_GLOBAL_STATIC(KMimeTypeTrader, s_self)
41  return s_self;
42 }
43 
44 KMimeTypeTrader::KMimeTypeTrader()
45  : d(new Private())
46 {
47 }
48 
49 KMimeTypeTrader::~KMimeTypeTrader()
50 {
51  delete d;
52 }
53 
54 static 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 
74 static 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 
104 static 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 
122 static 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 
142 KService::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 
157 KService::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 }
KMimeTypeTrader::~KMimeTypeTrader
~KMimeTypeTrader()
Standard destructor.
Definition: kmimetypetrader.cpp:49
CHECK_SERVICETYPE
#define CHECK_SERVICETYPE(genericServiceTypePtr)
Definition: kmimetypetrader.cpp:91
KSharedPtr< KServiceType >
KServiceType::serviceType
static Ptr serviceType(const QString &_name)
Returns a pointer to the servicetype &#39;_name&#39; or 0L if the service type is unknown.
Definition: kservicetype.cpp:191
kdebug.h
kmimetype.h
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
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
KMimeTypeFactory
Definition: kmimetypefactory.h:39
kmimetyperepository_p.h
KServiceTypeTrader::applyConstraints
static void applyConstraints(KService::List &lst, const QString &constraint)
Definition: kservicetypetrader.cpp:53
KMimeTypeRepository::self
static KMimeTypeRepository * self()
Definition: kmimetyperepository.cpp:35
QString
kservicefactory.h
kservicetypetrader.h
kservicetypeprofile.h
KMimeTypeTrader
KDE&#39;s trader for services associated to a given mimetype.
Definition: kmimetypetrader.h:42
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
mimeTypeSycocaOffers
static KServiceOfferList mimeTypeSycocaOffers(const QString &mimeType)
Definition: kmimetypetrader.cpp:54
KService::Ptr
KSharedPtr< KService > Ptr
Definition: kservice.h:61
kmimetypetrader.h
KMimeTypeTrader::self
static KMimeTypeTrader * self()
This is a static pointer to the KMimeTypeTrader singleton.
Definition: kmimetypetrader.cpp:38
mimeTypeSycocaServiceOffers
static KService::List mimeTypeSycocaServiceOffers(const QString &mimeType)
Definition: kmimetypetrader.cpp:74
KServiceType::serviceOffersOffset
int serviceOffersOffset() const
Definition: kservicetype.cpp:226
kWarning
#define kWarning
Definition: kdebug.h:322
kservicetype.h
KServiceFactory::offers
KServiceOfferList offers(int serviceTypeOffset, int serviceOffersOffset)
Definition: kservicefactory.cpp:209
KServiceFactory::serviceOffers
KService::List serviceOffers(int serviceTypeOffset, int serviceOffersOffset)
Definition: kservicefactory.cpp:245
kDebug
#define kDebug
Definition: kdebug.h:316
KSycocaEntry::offset
int offset() const
Definition: ksycocaentry.cpp:133
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&#39;s an alias, and return it otherwise.
Definition: kmimetyperepository.cpp:90
KServiceFactory::self
static KServiceFactory * self()
Definition: kservicefactory.cpp:81
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
kmimetypefactory.h
QList
Definition: kaboutdata.h:33
filterMimeTypeOffers
static void filterMimeTypeOffers(KServiceOfferList &list, const QString &genericServiceType)
Filter the offers for the requested mime type for the genericServiceType.
Definition: kmimetypetrader.cpp:104
This file is part of the KDE documentation.
Documentation copyright © 1996-2017 The KDE developers.
Generated on Sat May 13 2017 06:39:45 by doxygen 1.8.13 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.30 API Reference

Skip menu "kdelibs-4.14.30 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