1/* This file is part of the KDE project
2 Copyright (C) 1998, 1999 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 as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20
21#ifndef __kservicefactory_h__
22#define __kservicefactory_h__
23
24#include <QtCore/QStringList>
25
26#include "kserviceoffer.h"
27#include "ksycocafactory.h"
28#include <assert.h>
29
30class KSycoca;
31class KSycocaDict;
32
33/**
34 * @internal
35 * A sycoca factory for services (e.g. applications)
36 * It loads the services from parsing directories (e.g. prefix/share/applications/)
37 * but can also create service from data streams or single config files
38 *
39 * Exported for kbuildsycoca, but not installed.
40 */
41class KDECORE_EXPORT KServiceFactory : public KSycocaFactory
42{
43 K_SYCOCAFACTORY( KST_KServiceFactory )
44public:
45 /**
46 * Create factory
47 */
48 KServiceFactory();
49 virtual ~KServiceFactory();
50
51 /**
52 * Construct a KService from a config file.
53 */
54 virtual KSycocaEntry *createEntry(const QString &, const char *) const
55 { assert(0); return 0; }
56
57 /**
58 * Find a service (by translated name, e.g. "Terminal")
59 * (Not virtual because not used inside kbuildsycoca4, only an external service for some KDE apps)
60 */
61 KService::Ptr findServiceByName( const QString &_name );
62
63 /**
64 * Find a service (by desktop file name, e.g. "konsole")
65 */
66 virtual KService::Ptr findServiceByDesktopName( const QString &_name );
67
68 /**
69 * Find a service ( by desktop path, e.g. "System/konsole.desktop")
70 */
71 virtual KService::Ptr findServiceByDesktopPath( const QString &_name );
72
73 /**
74 * Find a service ( by menu id, e.g. "kde-konsole.desktop")
75 */
76 virtual KService::Ptr findServiceByMenuId( const QString &_menuId );
77
78 /**
79 * @return the services supporting the given service type
80 * The @p serviceOffersOffset allows to jump to the right entries directly.
81 */
82 KServiceOfferList offers( int serviceTypeOffset, int serviceOffersOffset );
83
84 /**
85 * @return the services supporting the given service type; without information about initialPreference
86 * The @p serviceOffersOffset allows to jump to the right entries directly.
87 */
88 KService::List serviceOffers( int serviceTypeOffset, int serviceOffersOffset );
89
90 /**
91 * Test if a specific service is associated with a specific servicetype
92 * @param serviceTypeOffset the offset of the service type being tested
93 * @param serviceOffersOffset allows to jump to the right entries for the service type directly.
94 * @param testedServiceOffset the offset of the service being tested
95 */
96 bool hasOffer( int serviceTypeOffset, int serviceOffersOffset, int testedServiceOffset );
97
98 /**
99 * @return all services. Very memory consuming, avoid using.
100 */
101 KService::List allServices();
102
103 /**
104 * @return the unique service factory, creating it if necessary
105 */
106 static KServiceFactory * self();
107
108protected:
109 virtual KService * createEntry(int offset) const;
110
111 // All those variables are used by KBuildServiceFactory too
112 int m_offerListOffset;
113 KSycocaDict *m_nameDict;
114 int m_nameDictOffset;
115 KSycocaDict *m_relNameDict;
116 int m_relNameDictOffset;
117 KSycocaDict *m_menuIdDict;
118 int m_menuIdDictOffset;
119
120protected:
121 virtual void virtual_hook( int id, void* data );
122private:
123 class KServiceFactoryPrivate* d;
124};
125
126#endif
127