kservicefactory.cpp00001
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
|