⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qfsfileengine_unix.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
bool QFSFileEnginePrivate::isSymlink() const{    if (need_lstat) {        QFSFileEnginePrivate *that = const_cast<QFSFileEnginePrivate *>(this);        that->need_lstat = false;        QT_STATBUF st;          // don't clobber our main one        that->is_link = (QT_LSTAT(QFile::encodeName(file), &st) == 0) ? S_ISLNK(st.st_mode) : false;    }    return is_link;}QAbstractFileEngine::FileFlags QFSFileEngine::fileFlags(QAbstractFileEngine::FileFlags type) const{    Q_D(const QFSFileEngine);    // Force a stat, so that we're guaranteed to get up-to-date results    if (type & QAbstractFileEngine::FileFlag(0x1000000)) { // QDir::Refresh        d->tried_stat = 0;        d->need_lstat = 1;    }    QAbstractFileEngine::FileFlags ret = 0;    bool exists = d->doStat();    if (!exists && !d->isSymlink())        return ret;    if (exists && (type & PermsMask)) {        if(d->st.st_mode & S_IRUSR)            ret |= ReadOwnerPerm;        if(d->st.st_mode & S_IWUSR)            ret |= WriteOwnerPerm;        if(d->st.st_mode & S_IXUSR)            ret |= ExeOwnerPerm;        if(d->st.st_mode & S_IRUSR)            ret |= ReadUserPerm;        if(d->st.st_mode & S_IWUSR)            ret |= WriteUserPerm;        if(d->st.st_mode & S_IXUSR)            ret |= ExeUserPerm;        if(d->st.st_mode & S_IRGRP)            ret |= ReadGroupPerm;        if(d->st.st_mode & S_IWGRP)            ret |= WriteGroupPerm;        if(d->st.st_mode & S_IXGRP)            ret |= ExeGroupPerm;        if(d->st.st_mode & S_IROTH)            ret |= ReadOtherPerm;        if(d->st.st_mode & S_IWOTH)            ret |= WriteOtherPerm;        if(d->st.st_mode & S_IXOTH)            ret |= ExeOtherPerm;    }    if(type & TypesMask) {#if !defined(QWS) && defined(Q_OS_MAC)        bool foundAlias = false;        {            FSRef fref;            if(FSPathMakeRef((const UInt8 *)QFile::encodeName(d->file).data(), &fref, NULL) == noErr) {                Boolean isAlias, isFolder;                if(FSIsAliasFile(&fref, &isAlias, &isFolder) == noErr && isAlias) {                    foundAlias = true;                    ret |= LinkType;                }            }        }        if(!foundAlias)#endif        {            if ((type & LinkType) && d->isSymlink())                ret |= LinkType;            if (exists && (d->st.st_mode & S_IFMT) == S_IFREG)                ret |= FileType;            else if (exists && (d->st.st_mode & S_IFMT) == S_IFDIR)                ret |= DirectoryType;        }    }    if(type & FlagsMask) {        ret |= LocalDiskFlag;        if (exists)            ret |= ExistsFlag;        if(fileName(BaseName)[0] == QLatin1Char('.'))            ret |= HiddenFlag;        if(d->file == QLatin1String("/"))            ret |= RootFlag;    }    return ret;}QString QFSFileEngine::fileName(FileName file) const{    Q_D(const QFSFileEngine);    if(file == BaseName) {        int slash = d->file.lastIndexOf(QLatin1Char('/'));        if(slash != -1)            return d->file.mid(slash + 1);    } else if(file == PathName) {        int slash = d->file.lastIndexOf(QLatin1Char('/'));        if(slash == -1)            return QLatin1String(".");        else if(!slash)            return QLatin1String("/");        return d->file.left(slash);    } else if(file == AbsoluteName || file == AbsolutePathName) {        QString ret;        if(d->file.isEmpty() || !d->file.startsWith(QLatin1Char('/')))            ret = QDir::currentPath();        if(!d->file.isEmpty() && d->file != QLatin1String(".")) {            if(!ret.isEmpty() && !ret.endsWith(QLatin1Char('/')))                ret += QLatin1Char('/');            ret += d->file;        }        if (ret == QLatin1String("/"))            return ret;        bool isDir = ret.endsWith(QLatin1Char('/'));        ret = QDir::cleanPath(ret);        if (isDir)            ret += QLatin1String("/");        if(file == AbsolutePathName) {            int slash = ret.lastIndexOf(QLatin1Char('/'));            if(slash == -1)                return QDir::currentPath();            else if(!slash)                return QLatin1String("/");            return ret.left(slash);        }        return ret;    } else if(file == CanonicalName || file == CanonicalPathName) {        char cur[PATH_MAX+1];        if(::getcwd(cur, PATH_MAX)) {            QString ret;            char real[PATH_MAX+1];            // need the cast for old solaris versions of realpath that doesn't take            // a const char*.            if(::realpath(QFile::encodeName(d->file).data(), real))                ret = QFile::decodeName(QByteArray(real));            ::chdir(cur); // always make sure we go back to the current dir            //check it            QT_STATBUF st;            if(QT_STAT(QFile::encodeName(ret), &st) != 0)                ret = QString();            if(!ret.isEmpty() && file == CanonicalPathName) {                int slash = ret.lastIndexOf(QLatin1Char('/'));                if(slash == -1)                    return QDir::currentPath();                else if(!slash)                    return QLatin1String("/");                return ret.left(slash);            }            return ret;        }        if(file == CanonicalPathName)            return fileName(AbsolutePathName);        return fileName(AbsoluteName);    } else if(file == LinkName) {        if (d->isSymlink()) {            char s[PATH_MAX+1];            int len = readlink(QFile::encodeName(d->file), s, PATH_MAX);            if(len > 0) {                QString ret;                if (S_ISDIR(d->st.st_mode) && s[0] != '/') {                    QDir parent(d->file);                    parent.cdUp();                    ret = parent.path();                    if (!ret.isEmpty() && !ret.endsWith(QLatin1Char('/')))                        ret += QLatin1Char('/');                }                s[len] = '\0';                ret += QFile::decodeName(QByteArray(s));                if (!ret.startsWith(QLatin1Char('/'))) {                    if (d->file.startsWith(QLatin1Char('/'))) {                        ret.prepend(d->file.left(d->file.lastIndexOf('/')) + QLatin1Char('/'));                    } else {                        ret.prepend(QDir::currentPath() + QLatin1Char('/'));                    }                }                ret = QDir::cleanPath(ret);                if (ret.size() > 1 && ret.endsWith(QLatin1Char('/')))                    ret.chop(1);                return ret;            }        }#if !defined(QWS) && defined(Q_OS_MAC)        {            FSRef fref;            if(FSPathMakeRef((const UInt8 *)QFile::encodeName(d->file).data(), &fref, NULL) == noErr) {                Boolean isAlias, isFolder;                if(FSResolveAliasFile(&fref, true, &isFolder, &isAlias) == noErr && isAlias) {                    AliasHandle alias;                    if(FSNewAlias(0, &fref, &alias) == noErr && alias) {                        CFStringRef cfstr;                        if(FSCopyAliasInfo(alias, 0, 0, &cfstr, 0, 0) == noErr)                            return QCFString::toQString(cfstr);                    }                }            }        }#endif        return QString();    }    return d->file;}bool QFSFileEngine::isRelativePath() const{    Q_D(const QFSFileEngine);    int len = d->file.length();    if(len == 0)        return true;    return d->file[0] != QLatin1Char('/');}uint QFSFileEngine::ownerId(FileOwner own) const{    Q_D(const QFSFileEngine);    static const uint nobodyID = (uint) -2;    if(d->doStat()) {        if(own == OwnerUser)            return d->st.st_uid;        else            return d->st.st_gid;    }    return nobodyID;}QString QFSFileEngine::owner(FileOwner own) const{#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)    QVarLengthArray<char, 1024> buf(sysconf(_SC_GETPW_R_SIZE_MAX));#endif    if(own == OwnerUser) {        struct passwd *pw = 0;#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)        struct passwd entry;        getpwuid_r(ownerId(own), &entry, buf.data(), buf.size(), &pw);#else        pw = getpwuid(ownerId(own));#endif        if(pw)            return QFile::decodeName(QByteArray(pw->pw_name));    } else if(own == OwnerGroup) {        struct group *gr = 0;#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)        buf.resize(sysconf(_SC_GETGR_R_SIZE_MAX));        struct group entry;        getgrgid_r(ownerId(own), &entry, buf.data(), buf.size(), &gr);#else        gr = getgrgid(ownerId(own));#endif        if(gr)            return QFile::decodeName(QByteArray(gr->gr_name));    }    return QString();}bool QFSFileEngine::setPermissions(uint perms){    Q_D(QFSFileEngine);    mode_t mode = 0;    if(perms & ReadOwnerPerm)        mode |= S_IRUSR;    if(perms & WriteOwnerPerm)        mode |= S_IWUSR;    if(perms & ExeOwnerPerm)        mode |= S_IXUSR;    if(perms & ReadUserPerm)        mode |= S_IRUSR;    if(perms & WriteUserPerm)        mode |= S_IWUSR;    if(perms & ExeUserPerm)        mode |= S_IXUSR;    if(perms & ReadGroupPerm)        mode |= S_IRGRP;    if(perms & WriteGroupPerm)        mode |= S_IWGRP;    if(perms & ExeGroupPerm)        mode |= S_IXGRP;    if(perms & ReadOtherPerm)        mode |= S_IROTH;    if(perms & WriteOtherPerm)        mode |= S_IWOTH;    if(perms & ExeOtherPerm)        mode |= S_IXOTH;    if(d->fd != -1)        return !fchmod(d->fd, mode);    const QByteArray file = QFile::encodeName(d->file);    return !::chmod(file.data(), mode);}bool QFSFileEngine::setSize(qint64 size){    Q_D(QFSFileEngine);    if(d->fd != -1)        return !QT_FTRUNCATE(d->fd, size);    const QByteArray file = QFile::encodeName(d->file);    return !QT_TRUNCATE(file.data(), size);}QDateTime QFSFileEngine::fileTime(FileTime time) const{    Q_D(const QFSFileEngine);    QDateTime ret;    if(d->doStat()) {        if(time == CreationTime)            ret.setTime_t(d->st.st_ctime ? d->st.st_ctime : d->st.st_mtime);        else if(time == ModificationTime)            ret.setTime_t(d->st.st_mtime);        else if(time == AccessTime)            ret.setTime_t(d->st.st_atime);    }    return ret;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -