19 #include "kbuildservicetypefactory.h"
20 #include "tdesycoca.h"
21 #include "tdesycocadict.h"
22 #include "kresourcelist.h"
24 #include <tdeglobal.h>
25 #include <kstandarddirs.h>
26 #include <kmessageboxwrapper.h>
28 #include <tdelocale.h>
30 #include <kdesktopfile.h>
32 template class TQDict<KMimeType>;
38 m_resourceList =
new KSycocaResourceList;
39 m_resourceList->add(
"servicetypes",
"*.desktop");
40 m_resourceList->add(
"servicetypes",
"*.kdelnk");
41 m_resourceList->add(
"mime",
"*.desktop" );
42 m_resourceList->add(
"mime",
"*.kdelnk" );
49 return TQStringList() <<
"servicetypes" <<
"mime";
52 KBuildServiceTypeFactory::~KBuildServiceTypeFactory()
54 delete m_resourceList;
59 assert (KSycoca::self()->isBuilding());
61 KSycocaEntry::Ptr * servType = (*m_entryDict)[ _name ];
64 return (KServiceType *) ((KSycocaEntry*)*servType);
72 int pos = name.findRev(
'/');
75 name = name.mid(pos+1);
81 KDesktopFile desktopFile(file,
true, resource);
83 if ( desktopFile.readBoolEntry(
"Hidden",
false ) ==
true )
87 TQString mime = desktopFile.readEntry(
"MimeType" );
88 TQString service = desktopFile.readEntry(
"X-TDE-ServiceType" );
90 if ( mime.isEmpty() && service.isEmpty() )
92 TQString tmp = TQString(
"The service/mime type config file\n%1\n"
93 "does not contain a ServiceType=...\nor MimeType=... entry").arg( file );
94 kdWarning(7012) << tmp << endl;
99 if ( mime ==
"inode/directory" )
100 e =
new KFolderType( &desktopFile );
101 else if ( (mime ==
"application/x-desktop")
102 || (mime ==
"media/builtin-mydocuments")
103 || (mime ==
"media/builtin-mycomputer")
104 || (mime ==
"media/builtin-mynetworkplaces")
105 || (mime ==
"media/builtin-printers")
106 || (mime ==
"media/builtin-trash")
107 || (mime ==
"media/builtin-webbrowser") )
108 e =
new KDEDesktopMimeType( &desktopFile );
109 else if ( mime ==
"application/x-executable" || mime ==
"application/x-pie-executable" || mime ==
"application/x-shellscript" )
110 e =
new KExecMimeType( &desktopFile );
111 else if ( !mime.isEmpty() )
112 e =
new KMimeType( &desktopFile );
114 e =
new KServiceType( &desktopFile );
122 if ( !(e->isValid()) )
124 kdWarning(7012) <<
"Invalid ServiceType : " << file << endl;
135 KSycocaFactory::saveHeader(str);
136 str << (TQ_INT32) m_fastPatternOffset;
137 str << (TQ_INT32) m_otherPatternOffset;
138 str << (TQ_INT32) m_propertyTypeDict.count();
140 TQMapIterator<TQString, int> it;
141 for (it = m_propertyTypeDict.begin(); it != m_propertyTypeDict.end(); ++it)
143 str << it.key() << (TQ_INT32)it.data();
151 KSycocaFactory::save(str);
153 savePatternLists(str);
155 int endOfFactoryData = str.device()->at();
161 str.device()->at(endOfFactoryData);
165 KBuildServiceTypeFactory::savePatternLists(TQDataStream &str)
168 TQStringList fastPatterns;
169 TQStringList otherPatterns;
170 TQDict<KMimeType> dict;
173 for(TQDictIterator<KSycocaEntry::Ptr> it ( *m_entryDict );
177 KSycocaEntry *entry = (*it.current());
178 if ( entry->isType( KST_KMimeType ) )
180 KMimeType *mimeType = (KMimeType *) entry;
181 TQStringList pat = mimeType->patterns();
182 TQStringList::ConstIterator patit = pat.begin();
183 for ( ; patit != pat.end() ; ++patit )
185 const TQString &pattern = *patit;
186 if ( pattern.findRev(
'*') == 0
187 && pattern.findRev(
'.') == 1
188 && pattern.length() <= 6 )
191 fastPatterns.append( pattern );
192 else if (!pattern.isEmpty())
193 otherPatterns.append( pattern );
196 dict.replace( pattern, mimeType );
203 TQ_INT32 entrySize = 0;
204 TQ_INT32 nrOfEntries = 0;
206 m_fastPatternOffset = str.device()->at();
209 str.device()->at(m_fastPatternOffset);
214 TQStringList::ConstIterator it = fastPatterns.begin();
215 for ( ; it != fastPatterns.end() ; ++it )
217 int start = str.device()->at();
220 TQString paddedPattern = (*it).leftJustify(6).right(4);
222 str << paddedPattern;
223 str << dict[(*it)]->offset();
224 entrySize = str.device()->at() - start;
229 m_otherPatternOffset = str.device()->at();
232 str.device()->at(m_fastPatternOffset);
237 str.device()->at(m_otherPatternOffset);
239 it = otherPatterns.begin();
240 for ( ; it != otherPatterns.end() ; ++it )
244 str << dict[(*it)]->offset();
253 KServiceType * serviceType = (KServiceType *) newEntry;
254 if ( (*m_entryDict)[ newEntry->name() ] )
257 if (serviceType->desktopEntryPath().endsWith(
"kdelnk"))
261 KSycocaFactory::removeEntry(newEntry);
263 KSycocaFactory::addEntry(newEntry, resource);
266 const TQMap<TQString,TQVariant::Type>& pd = serviceType->propertyDefs();
267 TQMap<TQString,TQVariant::Type>::ConstIterator pit = pd.begin();
268 for( ; pit != pd.end(); ++pit )
270 if (!m_propertyTypeDict.contains(pit.key()))
271 m_propertyTypeDict.insert(pit.key(), pit.data());
272 else if (m_propertyTypeDict[pit.key()] != pit.data())
273 kdWarning(7021) <<
"Property '"<< pit.key() <<
"' is defined multiple times ("<< serviceType->name() <<
")" <<endl;
KBuildServiceTypeFactory()
Create factory.
virtual void saveHeader(TQDataStream &str)
Write out header information.
virtual KServiceType * findServiceTypeByName(const TQString &_name)
Find a service type in the database file.
static TQStringList resourceTypes()
Returns all resource types for this service factory.
virtual void addEntry(KSycocaEntry *newEntry, const char *resource)
Add entry.
virtual KSycocaEntry * createEntry(const TQString &file, const char *resource)
Construct a KServiceType from a config file.
virtual void save(TQDataStream &str)
Write out service type specific index files.