• 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 
33 KServiceFactory::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 
74 KServiceFactory::~KServiceFactory()
75 {
76  _self = 0L;
77  delete m_nameDict;
78  delete m_relNameDict;
79  delete m_menuIdDict;
80 }
81 
82 KServiceFactory * KServiceFactory::self()
83 {
84  if (!_self) {
85  _self = new KServiceFactory();
86  }
87  return _self;
88 }
89 
90 KService * 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 
113 KService * 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 
136 KService * 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 
159 KService * 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 
182 KService* 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 
206 KService::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 
221 KService::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 
250 KService::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 
287 KServiceFactory *KServiceFactory::_self = 0;
288 
289 void KServiceFactory::virtual_hook( int id, void* data )
290 { KSycocaFactory::virtual_hook( id, data ); }
291 
KService::desktopEntryName
TQString desktopEntryName() const
Returns the filename of the service desktop entry without any extension.
Definition: kservice.h:182
KService
Represent a service, i.e.
Definition: kservice.h:48
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::desktopEntryPath
TQString desktopEntryPath() const
Returns the path to the location where the service desktop entry is stored.
Definition: kservice.h:174
KService::name
virtual TQString name() const
Returns the name of the service.
Definition: kservice.h:98

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
  •     tdecore
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  • tdeioslave
  •   http
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdeio/tdeio by doxygen 1.8.8
This website is maintained by Timothy Pearson.