📄 kstddirs.cpp
字号:
return dirname;}QStringList KStandardDirs::resourceDirs(const char *type) const{ QStringList *candidates = dircache.find(type); if (!candidates) { // filling cache if (strcmp(type, "socket") == 0) { char hostname[256]; hostname[0] = 0; gethostname(hostname, 255); QString dir = QString("%1socket-%2").arg(localkdedir()).arg(hostname); char link[1024]; link[1023] = 0; int result = readlink(QFile::encodeName(dir).data(), link, 1023); if ((result == -1) && (errno == ENOENT)) { QString srv = findExe(QString::fromLatin1("lnusertemp"), KDEDIR+QString::fromLatin1("/bin")); if (srv.isEmpty()) srv = findExe(QString::fromLatin1("lnusertemp")); if (!srv.isEmpty()) { system(QFile::encodeName(srv)+" socket"); result = readlink(QFile::encodeName(dir).data(), link, 1023); } } if (result > 0) { link[result] = 0; if (link[0] == '/') dir = QFile::decodeName(link); else dir = QDir::cleanDirPath(dir+QFile::decodeName(link)); } const_cast<KStandardDirs *>(this)->addResourceDir("socket", dir+'/'); } QDir testdir; candidates = new QStringList(); QStringList *dirs; dirs = relatives.find(type); if (dirs) { bool local = true; for (QStringList::ConstIterator pit = prefixes.begin(); pit != prefixes.end(); pit++) { for (QStringList::ConstIterator it = dirs->begin(); it != dirs->end(); ++it) { QString path = realPath(*pit + *it); testdir.setPath(path); if ((local || testdir.exists()) && !candidates->contains(path)) candidates->append(path); } local = false; } } dirs = absolutes.find(type); if (dirs) for (QStringList::ConstIterator it = dirs->begin(); it != dirs->end(); ++it) { testdir.setPath(*it); if (testdir.exists()) { QString filename = realPath(*it); if (!candidates->contains(filename)) candidates->append(filename); } } dircache.insert(type, candidates); }#if 0 kdDebug() << "found dirs for resource " << type << ":" << endl; for (QStringList::ConstIterator pit = candidates->begin(); pit != candidates->end(); pit++) { fprintf(stderr, "%s\n", (*pit).latin1()); }#endif return *candidates;}QString KStandardDirs::findExe( const QString& appname, const QString& pstr, bool ignore){ QFileInfo info; // absolute path ? if (appname.startsWith(QString::fromLatin1("/"))) { info.setFile( appname ); if( info.exists() && ( ignore || info.isExecutable() ) && info.isFile() ) { return appname; } return QString::null; } QStringList tokens; QString p = pstr; if( p == QString::null ) { p = getenv( "PATH" ); } tokenize( tokens, p, ":\b" ); // split path using : or \b as delimiters for( unsigned i = 0; i < tokens.count(); i++ ) { p = tokens[ i ]; if ( p[ 0 ] == '~' ) { int len = p.find( '/' ); if ( len == -1 ) len = p.length(); if ( len == 1 ) p.replace( 0, 1, QDir::homeDirPath() ); else { QString user = p.mid( 1, len - 1 ); struct passwd *dir = getpwnam( user.local8Bit().data() ); if ( dir && strlen( dir->pw_dir ) ) p.replace( 0, len, QString::fromLocal8Bit( dir->pw_dir ) ); } } p += "/"; p += appname; // Check for executable in this tokenized path info.setFile( p ); if( info.exists() && ( ignore || info.isExecutable() ) && info.isFile() ) { return p; } } // If we reach here, the executable wasn't found. // So return empty string. return QString::null;}int KStandardDirs::findAllExe( QStringList& list, const QString& appname, const QString& pstr, bool ignore ){ QString p = pstr; QFileInfo info; QStringList tokens; if( p == QString::null ) { p = getenv( "PATH" ); } list.clear(); tokenize( tokens, p, ":\b" ); for ( unsigned i = 0; i < tokens.count(); i++ ) { p = tokens[ i ]; p += "/"; p += appname; info.setFile( p ); if( info.exists() && (ignore || info.isExecutable()) && info.isFile() ) { list.append( p ); } } return list.count();}static int tokenize( QStringList& tokens, const QString& str, const QString& delim ){ int len = str.length(); QString token = ""; for( int index = 0; index < len; index++) { if ( delim.find( str[ index ] ) >= 0 ) { tokens.append( token ); token = ""; } else { token += str[ index ]; } } if ( token.length() > 0 ) { tokens.append( token ); } return tokens.count();}QString KStandardDirs::kde_default(const char *type) { if (!strcmp(type, "data")) return "share/apps/"; if (!strcmp(type, "html")) return "share/doc/HTML/"; if (!strcmp(type, "icon")) return "share/icons/"; if (!strcmp(type, "config")) return "share/config/"; if (!strcmp(type, "pixmap")) return "share/pixmaps/"; if (!strcmp(type, "apps")) return "share/applnk/"; if (!strcmp(type, "sound")) return "share/sounds/"; if (!strcmp(type, "locale")) return "share/locale/"; if (!strcmp(type, "services")) return "share/services/"; if (!strcmp(type, "servicetypes")) return "share/servicetypes/"; if (!strcmp(type, "mime")) return "share/mimelnk/"; if (!strcmp(type, "cgi")) return "cgi-bin/"; if (!strcmp(type, "wallpaper")) return "share/wallpapers/"; if (!strcmp(type, "templates")) return "share/templates/"; if (!strcmp(type, "exe")) return "bin/"; if (!strcmp(type, "lib")) return "lib/"; if (!strcmp(type, "module")) return "lib/kde2/"; qFatal("unknown resource type %s", type); return QString::null;}QString KStandardDirs::saveLocation(const char *type, const QString& suffix, bool create) const{ QString fullPath; checkConfig(); QStringList *dirs = relatives.find(type); if (!dirs && (strcmp(type, "socket") == 0)) { (void) resourceDirs(type); // Generate socket resource. dirs = relatives.find(type); // Search again. } if (dirs) { // Check for existance of typed directory + suffix fullPath = localkdedir() + dirs->last() + suffix; } else { dirs = absolutes.find(type); if (!dirs) qFatal("KStandardDirs: The resource type %s is not registered", type); fullPath = dirs->last() + suffix; } struct stat st; if (stat(QFile::encodeName(fullPath), &st) != 0 || !(S_ISDIR(st.st_mode))) { if(!create) { kdDebug() << "save location " << fullPath << " doesn't exist" << endl; return localkdedir()+suffix; } if(!makeDir(fullPath, 0700)) { kdDebug() << "failed to create " << fullPath << endl; return localkdedir()+suffix; } dircache.remove(type); } return fullPath;}bool KStandardDirs::makeDir(const QString& dir, int mode){ // we want an absolute path if (dir.at(0) != '/') return false; QString target = dir; uint len = target.length(); // append trailing slash if missing if (dir.at(len - 1) != '/') target += '/'; QString base(""); uint i = 1; while( i < len ) { struct stat st; int pos = target.find('/', i); base += target.mid(i - 1, pos - i + 1); // bail out if we encountered a problem if (stat(QFile::encodeName(base), &st) != 0) { // Directory does not exist.... if ( mkdir(QFile::encodeName(base), (mode_t) mode) != 0) { perror("trying to create local folder"); return false; // Couldn't create it :-( } } i = pos + 1; } return true;}static QString readEnvPath(const char *env){ QCString c_path = getenv(env); if (c_path.isEmpty()) return QString::null; return QFile::decodeName(c_path);}static void fixHomeDir(QString &dir){ if (dir[0] == '~') { dir = QDir::homeDirPath() + dir.mid(1); }}void KStandardDirs::addKDEDefaults(){ QStringList kdedirList; QString kdedirs = readEnvPath("KDEDIRS"); if (!kdedirs.isEmpty()) { tokenize(kdedirList, kdedirs, ":"); } else { QString kdedir = readEnvPath("KDEDIR"); if (!kdedir.isEmpty()) { fixHomeDir(kdedir); kdedirList.append(kdedir); } } kdedirList.append(KDEDIR); QString localKdeDir = readEnvPath("KDEHOME"); if (!localKdeDir.isEmpty()) { if (localKdeDir[localKdeDir.length()-1] != '/') localKdeDir += '/'; } else { localKdeDir = QDir::homeDirPath() + "/.kde/"; } fixHomeDir(localKdeDir); addPrefix(localKdeDir); for (QStringList::ConstIterator it = kdedirList.begin(); it != kdedirList.end(); it++) { QString dir = *it; fixHomeDir(dir); addPrefix(dir); } uint index = 0; while (types[index] != 0) { addResourceType(types[index], kde_default(types[index])); index++; } char hostname[256]; hostname[0] = 0; gethostname(hostname, 255); QString dir = QString("%1tmp-%2/").arg(localKdeDir).arg(hostname); addResourceDir("tmp", dir);}void KStandardDirs::checkConfig() const{ if (!addedCustoms && KGlobal::_instance && KGlobal::_instance->_config) const_cast<KStandardDirs*>(this)->addCustomized(KGlobal::_instance->_config);}bool KStandardDirs::addCustomized(KConfig *config){ if (addedCustoms) // there are already customized entries return false; // we just quite and hope they are the right ones // save the numbers of config directories. If this changes, // we will return true to give KConfig a chance to reparse uint configdirs = resourceDirs("config").count(); // reading the prefixes in QString oldGroup = config->group(); config->setGroup("Directories"); QStringList list; QStringList::ConstIterator it; list = config->readListEntry("prefixes"); for (it = list.begin(); it != list.end(); it++) addPrefix(*it); // iterating over all entries in the group Directories // to find entries that start with dir_$type QMap<QString, QString> entries = config->entryMap("Directories"); QMap<QString, QString>::ConstIterator it2; for (it2 = entries.begin(); it2 != entries.end(); it2++) { QString key = it2.key(); if (key.left(4) == "dir_") { // generate directory list, there may be more than 1. QStringList dirs = QStringList::split(',', *it2); QStringList::Iterator sIt(dirs.begin()); QString resType = key.mid(4, key.length()); for (; sIt != dirs.end(); ++sIt) { addResourceDir(resType.latin1(), *sIt); } } } // save it for future calls - that will return addedCustoms = true; config->setGroup(oldGroup); // return true if the number of config dirs changed return (resourceDirs("config").count() != configdirs);}QString KStandardDirs::localkdedir() const{ // Return the prefix to use for saving return prefixes.first();}// just to make code more readable without macrosQString locate( const char *type, const QString& filename, const KInstance* inst ){ return inst->dirs()->findResource(type, filename);}QString locateLocal( const char *type, const QString& filename, const KInstance* inst ){ // try to find slashes. If there are some, we have to // create the subdir first int slash = filename.findRev('/')+1; if (!slash) // only one filename return inst->dirs()->saveLocation(type) + filename; // split path from filename QString dir = filename.left(slash); QString file = filename.mid(slash); return inst->dirs()->saveLocation(type, dir) + file;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -