00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
#include "kservicefactory.h"
00020
#include "ksycoca.h"
00021
#include "ksycocatype.h"
00022
#include "ksycocadict.h"
00023
#include "kservice.h"
00024
00025
#include <qstring.h>
00026
00027
#include <klocale.h>
00028
#include <kdebug.h>
00029
#include <kglobal.h>
00030
#include <kstandarddirs.h>
00031
#include <kstaticdeleter.h>
00032
00033 KServiceFactory::KServiceFactory()
00034 : KSycocaFactory( KST_KServiceFactory )
00035 {
00036 m_offerListOffset = 0;
00037 m_nameDictOffset = 0;
00038 m_relNameDictOffset = 0;
00039 m_menuIdDictOffset = 0;
00040
if (m_str)
00041 {
00042
00043 Q_INT32 i;
00044 (*m_str) >> i;
00045 m_nameDictOffset = i;
00046 (*m_str) >> i;
00047 m_relNameDictOffset = i;
00048 (*m_str) >> i;
00049 m_offerListOffset = i;
00050 (*m_str) >> i;
00051 m_initListOffset = i;
00052 (*m_str) >> i;
00053 m_menuIdDictOffset = i;
00054
00055
int saveOffset = m_str->device()->at();
00056
00057 m_nameDict =
new KSycocaDict(m_str, m_nameDictOffset);
00058
00059 m_relNameDict =
new KSycocaDict(m_str, m_relNameDictOffset);
00060
00061 m_menuIdDict =
new KSycocaDict(m_str, m_menuIdDictOffset);
00062 saveOffset = m_str->device()->at(saveOffset);
00063 }
00064
else
00065 {
00066
00067 m_nameDict =
new KSycocaDict();
00068 m_relNameDict =
new KSycocaDict();
00069 m_menuIdDict =
new KSycocaDict();
00070 }
00071 _self =
this;
00072 }
00073
00074 KServiceFactory::~KServiceFactory()
00075 {
00076 _self = 0L;
00077
delete m_nameDict;
00078
delete m_relNameDict;
00079
delete m_menuIdDict;
00080 }
00081
00082 KServiceFactory * KServiceFactory::self()
00083 {
00084
if (!_self) {
00085 _self =
new KServiceFactory();
00086 }
00087
return _self;
00088 }
00089
00090
KService * KServiceFactory::findServiceByName(
const QString &_name)
00091 {
00092
if (!m_sycocaDict)
return 0;
00093
00094
00095
00096
00097
00098
int offset = m_sycocaDict->find_string( _name );
00099
if (!offset)
return 0;
00100
00101
KService * newService = createEntry(offset);
00102
00103
00104
if (newService && (newService->
name() != _name))
00105 {
00106
00107
delete newService;
00108 newService = 0;
00109 }
00110
return newService;
00111 }
00112
00113
KService * KServiceFactory::findServiceByDesktopName(
const QString &_name)
00114 {
00115
if (!m_nameDict)
return 0;
00116
00117
00118
00119
00120
00121
int offset = m_nameDict->find_string( _name );
00122
if (!offset)
return 0;
00123
00124
KService * newService = createEntry(offset);
00125
00126
00127
if (newService && (newService->
desktopEntryName() != _name))
00128 {
00129
00130
delete newService;
00131 newService = 0;
00132 }
00133
return newService;
00134 }
00135
00136
KService * KServiceFactory::findServiceByDesktopPath(
const QString &_name)
00137 {
00138
if (!m_relNameDict)
return 0;
00139
00140
00141
00142
00143
00144
int offset = m_relNameDict->find_string( _name );
00145
if (!offset)
return 0;
00146
00147
KService * newService = createEntry(offset);
00148
00149
00150
if (newService && (newService->
desktopEntryPath() != _name))
00151 {
00152
00153
delete newService;
00154 newService = 0;
00155 }
00156
return newService;
00157 }
00158
00159
KService * KServiceFactory::findServiceByMenuId(
const QString &_menuId)
00160 {
00161
if (!m_menuIdDict)
return 0;
00162
00163
00164
00165
00166
00167
int offset = m_menuIdDict->find_string( _menuId );
00168
if (!offset)
return 0;
00169
00170
KService * newService = createEntry(offset);
00171
00172
00173
if (newService && (newService->
menuId() != _menuId))
00174 {
00175
00176
delete newService;
00177 newService = 0;
00178 }
00179
return newService;
00180 }
00181
00182
KService* KServiceFactory::createEntry(
int offset)
00183 {
00184
KService * newEntry = 0L;
00185 KSycocaType
type;
00186
QDataStream *str = KSycoca::self()->findEntry(offset, type);
00187
switch(type)
00188 {
00189
case KST_KService:
00190 newEntry =
new KService(*str, offset);
00191
break;
00192
00193
default:
00194
kdError(7011) <<
QString(
"KServiceFactory: unexpected object entry in KSycoca database (type = %1)").arg((
int)type) <<
endl;
00195
return 0;
00196 }
00197
if (!newEntry->
isValid())
00198 {
00199
kdError(7011) <<
"KServiceFactory: corrupt object in KSycoca database!\n" <<
endl;
00200
delete newEntry;
00201 newEntry = 0;
00202 }
00203
return newEntry;
00204 }
00205
00206 KService::List KServiceFactory::allServices()
00207 {
00208 KService::List result;
00209
KSycocaEntry::List list = allEntries();
00210
for( KSycocaEntry::List::Iterator it = list.begin();
00211 it != list.end();
00212 ++it)
00213 {
00214
KService *newService = dynamic_cast<KService *>((*it).data());
00215
if (newService)
00216 result.append( KService::Ptr( newService ) );
00217 }
00218
return result;
00219 }
00220
00221 KService::List KServiceFactory::allInitServices()
00222 {
00223 KService::List list;
00224
if (!m_str)
return list;
00225
00226
00227
00228 m_str->device()->at(m_initListOffset);
00229 Q_INT32 entryCount;
00230 (*m_str) >> entryCount;
00231
00232 Q_INT32 *offsetList =
new Q_INT32[entryCount];
00233
for(
int i = 0; i < entryCount; i++)
00234 {
00235 (*m_str) >> offsetList[i];
00236 }
00237
00238
for(
int i = 0; i < entryCount; i++)
00239 {
00240
KService *newEntry = createEntry(offsetList[i]);
00241
if (newEntry)
00242 {
00243 list.append( KService::Ptr( newEntry ) );
00244 }
00245 }
00246
delete [] offsetList;
00247
return list;
00248 }
00249
00250 KService::List KServiceFactory::offers(
int serviceTypeOffset )
00251 {
00252 KService::List list;
00253
00254
QDataStream *str = m_str;
00255
00256 str->device()->at( m_offerListOffset );
00257
00258 Q_INT32 aServiceTypeOffset;
00259 Q_INT32 aServiceOffset;
00260
00261
00262
while (
true)
00263 {
00264 (*str) >> aServiceTypeOffset;
00265
if ( aServiceTypeOffset )
00266 {
00267 (*str) >> aServiceOffset;
00268
if ( aServiceTypeOffset == serviceTypeOffset )
00269 {
00270
00271
int savedPos = str->device()->at();
00272
00273
KService * serv = createEntry( aServiceOffset );
00274
if (serv)
00275 list.append( KService::Ptr( serv ) );
00276
00277 str->device()->at( savedPos );
00278 }
else if ( aServiceTypeOffset > (Q_INT32)serviceTypeOffset )
00279
break;
00280 }
00281
else
00282
break;
00283 }
00284
return list;
00285 }
00286
00287 KServiceFactory *KServiceFactory::_self = 0;
00288
00289
void KServiceFactory::virtual_hook(
int id,
void* data )
00290 { KSycocaFactory::virtual_hook(
id, data ); }
00291