• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • kded
 

kded

  • kded
kbuildservicefactory.cpp
1 /* This file is part of the KDE libraries
2  * Copyright (C) 1999 David Faure <faure@kde.org>
3  * 1999 Waldo Bastian <bastian@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 "kbuildservicefactory.h"
21 #include "tdesycoca.h"
22 #include "tdesycocadict.h"
23 #include "kresourcelist.h"
24 #include "kmimetype.h"
25 
26 #include <tdeglobal.h>
27 #include <kstandarddirs.h>
28 #include <kmessageboxwrapper.h>
29 #include <tdelocale.h>
30 #include <kdebug.h>
31 #include <assert.h>
32 
33 KBuildServiceFactory::KBuildServiceFactory( KSycocaFactory *serviceTypeFactory,
34  KBuildServiceGroupFactory *serviceGroupFactory ) :
35  KServiceFactory(),
36  m_serviceDict(977),
37  m_dupeDict(977),
38  m_serviceTypeFactory( serviceTypeFactory ),
39  m_serviceGroupFactory( serviceGroupFactory )
40 {
41  m_resourceList = new KSycocaResourceList();
42 // m_resourceList->add( "apps", "*.desktop" );
43 // m_resourceList->add( "apps", "*.kdelnk" );
44  m_resourceList->add( "services", "*.desktop" );
45  m_resourceList->add( "services", "*.kdelnk" );
46 }
47 
48 // return all service types for this factory
49 // i.e. first arguments to m_resourceList->add() above
50 TQStringList KBuildServiceFactory::resourceTypes()
51 {
52  return TQStringList() << "apps" << "services";
53 }
54 
55 KBuildServiceFactory::~KBuildServiceFactory()
56 {
57  delete m_resourceList;
58 }
59 
60 KService * KBuildServiceFactory::findServiceByName(const TQString &_name)
61 {
62  return m_serviceDict[_name];
63 }
64 
65 
66 KSycocaEntry *
67 KBuildServiceFactory::createEntry( const TQString& file, const char *resource )
68 {
69  TQString name = file;
70  int pos = name.findRev('/');
71  if (pos != -1)
72  {
73  name = name.mid(pos+1);
74  }
75 
76  if (name.isEmpty())
77  return 0;
78 
79  // Is it a .desktop file?
80  if (!name.endsWith(".desktop") && !name.endsWith(".kdelnk"))
81  return 0;
82 
83  KDesktopFile desktopFile(file, true, resource);
84 
85  KService * serv = new KService( &desktopFile );
86 
87  if ( serv->isValid() && !serv->isDeleted() )
88  {
89  return serv;
90  } else {
91  if (!serv->isDeleted())
92  kdWarning(7012) << "Invalid Service : " << file << endl;
93  delete serv;
94  return 0L;
95  }
96 }
97 
98 
99 void
100 KBuildServiceFactory::saveHeader(TQDataStream &str)
101 {
102  KSycocaFactory::saveHeader(str);
103 
104  str << (TQ_INT32) m_nameDictOffset;
105  str << (TQ_INT32) m_relNameDictOffset;
106  str << (TQ_INT32) m_offerListOffset;
107  str << (TQ_INT32) m_initListOffset;
108  str << (TQ_INT32) m_menuIdDictOffset;
109 }
110 
111 void
112 KBuildServiceFactory::save(TQDataStream &str)
113 {
114  KSycocaFactory::save(str);
115 
116  m_nameDictOffset = str.device()->at();
117  m_nameDict->save(str);
118 
119  m_relNameDictOffset = str.device()->at();
120  m_relNameDict->save(str);
121 
122  saveOfferList(str);
123  saveInitList(str);
124 
125  m_menuIdDictOffset = str.device()->at();
126  m_menuIdDict->save(str);
127 
128  int endOfFactoryData = str.device()->at();
129 
130  // Update header (pass #3)
131  saveHeader(str);
132 
133 
134  // Seek to end.
135  str.device()->at(endOfFactoryData);
136 }
137 
138 void
139 KBuildServiceFactory::saveOfferList(TQDataStream &str)
140 {
141  m_offerListOffset = str.device()->at();
142 
143  bool isNumber;
144  for(TQDictIterator<KSycocaEntry::Ptr> itserv ( *m_entryDict );
145  itserv.current();
146  ++itserv)
147  {
148  KService *service = (KService *) ((KSycocaEntry *)(*itserv.current()));
149  TQStringList serviceTypeList = service->serviceTypes();
150  KServiceType::List serviceTypes;
151  TQStringList::ConstIterator it = serviceTypeList.begin();
152  for( ; it != serviceTypeList.end(); ++it )
153  {
154  (*it).toInt(&isNumber);
155  if (isNumber)
156  continue;
157 
158  KServiceType::Ptr serviceType = KServiceType::serviceType(*it);
159  if (!serviceType)
160  {
161  // kdWarning() << "'"<< service->desktopEntryPath() << "' specifies undefined mimetype/servicetype '"<< (*it) << "'" << endl;
162  continue;
163  }
164  serviceTypes.append(serviceType);
165  }
166 
167  while(serviceTypes.count())
168  {
169  KServiceType::Ptr serviceType = serviceTypes.first();
170  serviceTypes.pop_front();
171 
172  KServiceType::Ptr parentType = serviceType->parentType();
173  if (parentType)
174  serviceTypes.append(parentType);
175 
176  serviceType->addService(service);
177  }
178  }
179 
180  // For each entry in servicetypeFactory
181  for(TQDictIterator<KSycocaEntry::Ptr> it ( *(m_serviceTypeFactory->entryDict()) );
182  it.current();
183  ++it)
184  {
185  // export associated services
186  KServiceType *entry = static_cast<KServiceType*>(static_cast<KSycocaEntry*>(*it.current()));
187  KService::List services = entry->services();
188 
189  for(KService::List::ConstIterator it2 = services.begin();
190  it2 != services.end(); ++it2)
191  {
192  KService *service = *it2;
193  str << (TQ_INT32) entry->offset();
194  str << (TQ_INT32) service->offset();
195  }
196  }
197 
198  str << (TQ_INT32) 0; // End of list marker (0)
199 }
200 
201 void
202 KBuildServiceFactory::saveInitList(TQDataStream &str)
203 {
204  m_initListOffset = str.device()->at();
205 
206  KService::List initList;
207 
208  for(TQDictIterator<KSycocaEntry::Ptr> itserv ( *m_entryDict );
209  itserv.current();
210  ++itserv)
211  {
212  KService::Ptr service = (KService *) ((KSycocaEntry *) *itserv.current());
213  if ( !service->init().isEmpty() )
214  {
215  initList.append(service);
216  }
217  }
218  str << (TQ_INT32) initList.count(); // Nr of init services.
219  for(KService::List::Iterator it = initList.begin();
220  it != initList.end();
221  ++it)
222  {
223  str << (TQ_INT32) (*it)->offset();
224  }
225 }
226 
227 void
228 KBuildServiceFactory::addEntry(KSycocaEntry *newEntry, const char *resource)
229 {
230  if (m_dupeDict.find(newEntry))
231  return;
232 
233  KSycocaFactory::addEntry(newEntry, resource);
234 
235  KService * service = (KService *) newEntry;
236  m_dupeDict.insert(newEntry, service);
237 
238  if (!service->isDeleted())
239  {
240  TQString parent = service->parentApp();
241  if (!parent.isEmpty())
242  m_serviceGroupFactory->addNewChild(parent, resource, service);
243  }
244 
245  TQString name = service->desktopEntryName();
246  m_nameDict->add( name, newEntry );
247  m_serviceDict.replace(name, service);
248 
249  TQString relName = service->desktopEntryPath();
250  m_relNameDict->add( relName, newEntry );
251  TQString menuId = service->menuId();
252  if (!menuId.isEmpty())
253  m_menuIdDict->add( menuId, newEntry );
254 }
KBuildServiceFactory::KBuildServiceFactory
KBuildServiceFactory(KSycocaFactory *serviceTypeFactory, KBuildServiceGroupFactory *serviceGroupFactory)
Create factory.
Definition: kbuildservicefactory.cpp:33
KBuildServiceFactory::save
virtual void save(TQDataStream &str)
Write out service specific index files.
Definition: kbuildservicefactory.cpp:112
KBuildServiceFactory::resourceTypes
static TQStringList resourceTypes()
Returns all resource types for this service factory.
Definition: kbuildservicefactory.cpp:50
KBuildServiceFactory::addEntry
void addEntry(KSycocaEntry *newEntry, const char *resource)
Add a new entry.
Definition: kbuildservicefactory.cpp:228
KBuildServiceFactory::saveHeader
virtual void saveHeader(TQDataStream &str)
Write out header information.
Definition: kbuildservicefactory.cpp:100
KBuildServiceFactory::createEntry
virtual KSycocaEntry * createEntry(const TQString &file, const char *resource)
Construct a KService from a config file.
Definition: kbuildservicefactory.cpp:67
KBuildServiceGroupFactory
Service group factory for building tdesycoca.
Definition: kbuildservicegroupfactory.h:31
KBuildServiceGroupFactory::addNewChild
KServiceGroup * addNewChild(const TQString &parent, const char *resource, KSycocaEntry *newEntry)
Adds the entry newEntry to the "parent group" parent, creating the group if necassery.
Definition: kbuildservicegroupfactory.cpp:121

kded

Skip menu "kded"
  • Main Page
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

kded

Skip menu "kded"
  • 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 kded by doxygen 1.9.1
This website is maintained by Timothy Pearson.