• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdeio/tdeio
 

tdeio/tdeio

  • tdeio
  • tdeio
kservicefactory.cpp
1/* This file is part of the KDE libraries
2 * Copyright (C) 1999 David Faure <faure@kde.org>
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License version 2 as published by the Free Software Foundation;
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Library General Public License for more details.
12 *
13 * You should have received a copy of the GNU Library General Public License
14 * along with this library; see the file COPYING.LIB. If not, write to
15 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16 * Boston, MA 02110-1301, USA.
17 **/
18
19#include "kservicefactory.h"
20#include "tdesycoca.h"
21#include "tdesycocatype.h"
22#include "tdesycocadict.h"
23#include "kservice.h"
24
25#include <tqstring.h>
26
27#include <tdelocale.h>
28#include <kdebug.h>
29#include <tdeglobal.h>
30#include <kstandarddirs.h>
31#include <kstaticdeleter.h>
32
33KServiceFactory::KServiceFactory()
34 : KSycocaFactory( KST_KServiceFactory )
35{
36 m_offerListOffset = 0;
37 m_nameDictOffset = 0;
38 m_relNameDictOffset = 0;
39 m_menuIdDictOffset = 0;
40 if (m_str)
41 {
42 // Read Header
43 TQ_INT32 i;
44 (*m_str) >> i;
45 m_nameDictOffset = i;
46 (*m_str) >> i;
47 m_relNameDictOffset = i;
48 (*m_str) >> i;
49 m_offerListOffset = i;
50 (*m_str) >> i;
51 m_initListOffset = i;
52 (*m_str) >> i;
53 m_menuIdDictOffset = i;
54
55 int saveOffset = m_str->device()->at();
56 // Init index tables
57 m_nameDict = new KSycocaDict(m_str, m_nameDictOffset);
58 // Init index tables
59 m_relNameDict = new KSycocaDict(m_str, m_relNameDictOffset);
60 // Init index tables
61 m_menuIdDict = new KSycocaDict(m_str, m_menuIdDictOffset);
62 saveOffset = m_str->device()->at(saveOffset);
63 }
64 else
65 {
66 // Build new database
67 m_nameDict = new KSycocaDict();
68 m_relNameDict = new KSycocaDict();
69 m_menuIdDict = new KSycocaDict();
70 }
71 _self = this;
72}
73
74KServiceFactory::~KServiceFactory()
75{
76 _self = 0L;
77 delete m_nameDict;
78 delete m_relNameDict;
79 delete m_menuIdDict;
80}
81
82KServiceFactory * KServiceFactory::self()
83{
84 if (!_self) {
85 _self = new KServiceFactory();
86 }
87 return _self;
88}
89
90KService * KServiceFactory::findServiceByName(const TQString &_name)
91{
92 if (!m_sycocaDict) return 0; // Error!
93
94 // Warning : this assumes we're NOT building a database
95 // But since findServiceByName isn't called in that case...
96 // [ see KServiceTypeFactory for how to do it if needed ]
97
98 int offset = m_sycocaDict->find_string( _name );
99 if (!offset) return 0; // Not found
100
101 KService * newService = createEntry(offset);
102
103 // Check whether the dictionary was right.
104 if (newService && (newService->name() != _name))
105 {
106 // No it wasn't...
107 delete newService;
108 newService = 0; // Not found
109 }
110 return newService;
111}
112
113KService * KServiceFactory::findServiceByDesktopName(const TQString &_name)
114{
115 if (!m_nameDict) return 0; // Error!
116
117 // Warning : this assumes we're NOT building a database
118 // But since findServiceByName isn't called in that case...
119 // [ see KServiceTypeFactory for how to do it if needed ]
120
121 int offset = m_nameDict->find_string( _name );
122 if (!offset) return 0; // Not found
123
124 KService * newService = createEntry(offset);
125
126 // Check whether the dictionary was right.
127 if (newService && (newService->desktopEntryName() != _name))
128 {
129 // No it wasn't...
130 delete newService;
131 newService = 0; // Not found
132 }
133 return newService;
134}
135
136KService * KServiceFactory::findServiceByDesktopPath(const TQString &_name)
137{
138 if (!m_relNameDict) return 0; // Error!
139
140 // Warning : this assumes we're NOT building a database
141 // But since findServiceByName isn't called in that case...
142 // [ see KServiceTypeFactory for how to do it if needed ]
143
144 int offset = m_relNameDict->find_string( _name );
145 if (!offset) return 0; // Not found
146
147 KService * newService = createEntry(offset);
148
149 // Check whether the dictionary was right.
150 if (newService && (newService->desktopEntryPath() != _name))
151 {
152 // No it wasn't...
153 delete newService;
154 newService = 0; // Not found
155 }
156 return newService;
157}
158
159KService * KServiceFactory::findServiceByMenuId(const TQString &_menuId)
160{
161 if (!m_menuIdDict) return 0; // Error!
162
163 // Warning : this assumes we're NOT building a database
164 // But since findServiceByMenuId isn't called in that case...
165 // [ see KServiceTypeFactory for how to do it if needed ]
166
167 int offset = m_menuIdDict->find_string( _menuId );
168 if (!offset) return 0; // Not found
169
170 KService * newService = createEntry(offset);
171
172 // Check whether the dictionary was right.
173 if (newService && (newService->menuId() != _menuId))
174 {
175 // No it wasn't...
176 delete newService;
177 newService = 0; // Not found
178 }
179 return newService;
180}
181
182KService* KServiceFactory::createEntry(int offset)
183{
184 KService * newEntry = 0L;
185 KSycocaType type;
186 TQDataStream *str = KSycoca::self()->findEntry(offset, type);
187 switch(type)
188 {
189 case KST_KService:
190 newEntry = new KService(*str, offset);
191 break;
192
193 default:
194 kdError(7011) << TQString(TQString("KServiceFactory: unexpected object entry in KSycoca database (type = %1)").arg((int)type)) << endl;
195 return 0;
196 }
197 if (!newEntry->isValid())
198 {
199 kdError(7011) << "KServiceFactory: corrupt object in KSycoca database!\n" << endl;
200 delete newEntry;
201 newEntry = 0;
202 }
203 return newEntry;
204}
205
206KService::List KServiceFactory::allServices()
207{
208 KService::List result;
209 KSycocaEntry::List list = allEntries();
210 for( KSycocaEntry::List::Iterator it = list.begin();
211 it != list.end();
212 ++it)
213 {
214 KService *newService = dynamic_cast<KService *>((*it).data());
215 if (newService)
216 result.append( KService::Ptr( newService ) );
217 }
218 return result;
219}
220
221KService::List KServiceFactory::allInitServices()
222{
223 KService::List list;
224 if (!m_str) return list;
225
226 // Assume we're NOT building a database
227
228 m_str->device()->at(m_initListOffset);
229 TQ_INT32 entryCount;
230 (*m_str) >> entryCount;
231
232 TQ_INT32 *offsetList = new TQ_INT32[entryCount];
233 for(int i = 0; i < entryCount; i++)
234 {
235 (*m_str) >> offsetList[i];
236 }
237
238 for(int i = 0; i < entryCount; i++)
239 {
240 KService *newEntry = createEntry(offsetList[i]);
241 if (newEntry)
242 {
243 list.append( KService::Ptr( newEntry ) );
244 }
245 }
246 delete [] offsetList;
247 return list;
248}
249
250KService::List KServiceFactory::offers( int serviceTypeOffset )
251{
252 KService::List list;
253
254 TQDataStream *str = m_str;
255 // Jump to the offer list
256 str->device()->at( m_offerListOffset );
257
258 TQ_INT32 aServiceTypeOffset;
259 TQ_INT32 aServiceOffset;
260 // We might want to do a binary search instead of a linear search
261 // since servicetype offsets are sorted. Bah.
262 while (true)
263 {
264 (*str) >> aServiceTypeOffset;
265 if ( aServiceTypeOffset )
266 {
267 (*str) >> aServiceOffset;
268 if ( aServiceTypeOffset == serviceTypeOffset )
269 {
270 // Save stream position !
271 int savedPos = str->device()->at();
272 // Create Service
273 KService * serv = createEntry( aServiceOffset );
274 if (serv)
275 list.append( KService::Ptr( serv ) );
276 // Restore position
277 str->device()->at( savedPos );
278 } else if ( aServiceTypeOffset > (TQ_INT32)serviceTypeOffset )
279 break; // too far
280 }
281 else
282 break; // 0 => end of list
283 }
284 return list;
285}
286
287KServiceFactory *KServiceFactory::_self = 0;
288
289void KServiceFactory::virtual_hook( int id, void* data )
290{ KSycocaFactory::virtual_hook( id, data ); }
291
KService
Represent a service, i.e.
Definition: kservice.h:49
KService::desktopEntryPath
TQString desktopEntryPath() const
Returns the path to the location where the service desktop entry is stored.
Definition: kservice.h:174
KService::isValid
bool isValid() const
Checks whether the service is valid.
Definition: kservice.h:379
KService::menuId
TQString menuId() const
Returns the menu ID of the service desktop entry.
Definition: kservice.cpp:838
KService::name
virtual TQString name() const
Returns the name of the service.
Definition: kservice.h:98
KService::desktopEntryName
TQString desktopEntryName() const
Returns the filename of the service desktop entry without any extension.
Definition: kservice.h:182

tdeio/tdeio

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

tdeio/tdeio

Skip menu "tdeio/tdeio"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdeio/tdeio by doxygen 1.9.4
This website is maintained by Timothy Pearson.