📄 qresource.cpp
字号:
//setup the data now int offset = 0; //magic number if(unmapPointer[offset+0] != 'q' || unmapPointer[offset+1] != 'r' || unmapPointer[offset+2] != 'e' || unmapPointer[offset+3] != 's') { return false; } offset += 4; const int version = (unmapPointer[offset+0] << 24) + (unmapPointer[offset+1] << 16) + (unmapPointer[offset+2] << 8) + (unmapPointer[offset+3] << 0); offset += 4; const int tree_offset = (unmapPointer[offset+0] << 24) + (unmapPointer[offset+1] << 16) + (unmapPointer[offset+2] << 8) + (unmapPointer[offset+3] << 0); offset += 4; const int data_offset = (unmapPointer[offset+0] << 24) + (unmapPointer[offset+1] << 16) + (unmapPointer[offset+2] << 8) + (unmapPointer[offset+3] << 0); offset += 4; const int name_offset = (unmapPointer[offset+0] << 24) + (unmapPointer[offset+1] << 16) + (unmapPointer[offset+2] << 8) + (unmapPointer[offset+3] << 0); offset += 4; if(version == 0x01) { setSource(unmapPointer+tree_offset, unmapPointer+name_offset, unmapPointer+data_offset); return true; } return false; }};static QString qt_resource_fixResourceRoot(QString r) { if(!r.isEmpty()) { if(r.startsWith(QLatin1Char(':'))) r = r.mid(1); if(!r.isEmpty()) r = QDir::cleanPath(r); } return r;}/*! \fn bool QResource::registerResource(const QString &rccFileName, const QString &mapRoot) Registers the resource with the given \a rccFileName at the location in the resource tree specified by \a mapRoot, and returns true if the file is successfully opened; otherwise returns false. \sa unregisterResource()*/boolQResource::registerResource(const QString &rccFilename, const QString &resourceRoot){ QString r = qt_resource_fixResourceRoot(resourceRoot); if(!r.isEmpty() && r[0] != QLatin1Char('/')) { qWarning("QDir::registerResource: Registering a resource [%s] must be rooted in an absolute path (start with /) [%s]", rccFilename.toLocal8Bit().data(), resourceRoot.toLocal8Bit().data()); return false; } QDynamicResourceRoot *root = new QDynamicResourceRoot(r); if(root->registerSelf(rccFilename)) { root->ref.ref(); QMutexLocker lock(resourceMutex()); resourceList()->append(root); return true; } delete root; return false;}/*! \fn bool QResource::unregisterResource(const QString &rccFileName, const QString &mapRoot) Unregisters the resource with the given \a rccFileName at the location in the resource tree specified by \a mapRoot, and returns true if the resource is successfully unloaded; otherwise returns false. \sa registerResource()*/boolQResource::unregisterResource(const QString &rccFilename, const QString &resourceRoot){ QString r = qt_resource_fixResourceRoot(resourceRoot); QMutexLocker lock(resourceMutex()); ResourceList *list = resourceList(); for(int i = 0; i < list->size(); ++i) { QResourceRoot *res = list->at(i); if(res->isDynamicRoot()) { QDynamicResourceRoot *root = reinterpret_cast<QDynamicResourceRoot*>(res); if(root->mappingFile() == rccFilename && root->mappingRoot() == r) { resourceList()->removeAt(i); if(!root->ref.deref()) delete root; return true; } } } return false;}//file type handlerclass QResourceFileEngineHandler : public QAbstractFileEngineHandler{public: QResourceFileEngineHandler() { } ~QResourceFileEngineHandler() { } QAbstractFileEngine *create(const QString &path) const;};QAbstractFileEngine *QResourceFileEngineHandler::create(const QString &path) const{ if (path.size() > 0 && path.startsWith(QLatin1Char(':'))) return new QResourceFileEngine(path); return 0;}//resource engineclass QResourceFileEnginePrivate : public QAbstractFileEnginePrivate{protected: Q_DECLARE_PUBLIC(QResourceFileEngine)private: qint64 offset; QResource resource; QByteArray uncompressed;protected: QResourceFileEnginePrivate() : offset(0) { }};bool QResourceFileEngine::mkdir(const QString &, bool) const{ return false;}bool QResourceFileEngine::rmdir(const QString &, bool) const{ return false;}bool QResourceFileEngine::setSize(qint64){ return false;}QStringList QResourceFileEngine::entryList(QDir::Filters filters, const QStringList &filterNames) const{ Q_D(const QResourceFileEngine); const bool doDirs = (filters & QDir::Dirs) != 0; const bool doFiles = (filters & QDir::Files) != 0; const bool doReadable = (filters & QDir::Readable) != 0; QStringList ret; if((!doDirs && !doFiles) || ((filters & QDir::PermissionMask) && !doReadable)) return ret; if(!d->resource.isValid() || !d->resource.isDir()) return ret; // cannot read the "directory" QStringList entries = d->resource.children(); for(int i = 0; i < entries.size(); i++) { QResource entry(d->resource.fileName() + QLatin1String("/") + entries[i]);#ifndef QT_NO_REGEXP if(!(filters & QDir::AllDirs && entry.isDir())) { bool matched = false; for(QStringList::ConstIterator sit = filterNames.begin(); sit != filterNames.end(); ++sit) { QRegExp rx(*sit, (filters & QDir::CaseSensitive) ? Qt::CaseSensitive : Qt::CaseInsensitive, QRegExp::Wildcard); if (rx.exactMatch(entries[i])) { matched = true; break; } } if(!matched) continue; }#endif if ((doDirs && entry.isDir()) || (doFiles && !entry.isDir())) ret.append(entries[i]); } return ret;}bool QResourceFileEngine::caseSensitive() const{ return true;}QResourceFileEngine::QResourceFileEngine(const QString &file) : QAbstractFileEngine(*new QResourceFileEnginePrivate){ Q_D(QResourceFileEngine); d->resource.setFileName(file); if(d->resource.isCompressed() && d->resource.size()) {#ifndef QT_NO_COMPRESS d->uncompressed = qUncompress(d->resource.data(), d->resource.size());#else Q_ASSERT("QResourceFileEngine::open: Qt built without support for compression");#endif }}QResourceFileEngine::~QResourceFileEngine(){}void QResourceFileEngine::setFileName(const QString &file){ Q_D(QResourceFileEngine); d->resource.setFileName(file);}bool QResourceFileEngine::open(QIODevice::OpenMode flags){ Q_D(QResourceFileEngine); if (d->resource.fileName().isEmpty()) { qWarning("QResourceFileEngine::open: Missing file name"); return false; } if(flags & QIODevice::WriteOnly) return false; if(!d->resource.isValid()) return false; return true;}bool QResourceFileEngine::close(){ Q_D(QResourceFileEngine); d->offset = 0; d->uncompressed.clear(); return true;}bool QResourceFileEngine::flush(){ return false;}qint64 QResourceFileEngine::read(char *data, qint64 len){ Q_D(QResourceFileEngine); if(len > size()-d->offset) len = size()-d->offset; if(len <= 0) return 0; if(d->resource.isCompressed()) memcpy(data, d->uncompressed.constData()+d->offset, len); else memcpy(data, d->resource.data()+d->offset, len); d->offset += len; return len;}qint64 QResourceFileEngine::write(const char *, qint64){ return -1;}bool QResourceFileEngine::remove(){ return false;}bool QResourceFileEngine::copy(const QString &){ return false;}bool QResourceFileEngine::rename(const QString &){ return false;}bool QResourceFileEngine::link(const QString &){ return false;}qint64 QResourceFileEngine::size() const{ Q_D(const QResourceFileEngine); if(!d->resource.isValid()) return 0; if(d->resource.isCompressed()) return d->uncompressed.size(); return d->resource.size();}qint64 QResourceFileEngine::pos() const{ Q_D(const QResourceFileEngine); return d->offset;}bool QResourceFileEngine::atEnd() const{ Q_D(const QResourceFileEngine); if(!d->resource.isValid()) return true; return d->offset == size();}bool QResourceFileEngine::seek(qint64 pos){ Q_D(QResourceFileEngine); if(!d->resource.isValid()) return false; if(d->offset > size()) return false; d->offset = pos; return true;}bool QResourceFileEngine::isSequential() const{ return false;}QAbstractFileEngine::FileFlags QResourceFileEngine::fileFlags(QAbstractFileEngine::FileFlags type) const{ Q_D(const QResourceFileEngine); QAbstractFileEngine::FileFlags ret = 0; if(!d->resource.isValid()) return ret; if(type & PermsMask) ret |= QAbstractFileEngine::FileFlags(ReadOwnerPerm|ReadUserPerm|ReadGroupPerm|ReadOtherPerm); if(type & TypesMask) { if(d->resource.isDir()) ret |= DirectoryType; else ret |= FileType; } if(type & FlagsMask) { ret |= ExistsFlag; if(d->resource.absoluteFilePath() == QLatin1String(":/")) ret |= RootFlag; } return ret;}bool QResourceFileEngine::setPermissions(uint){ return false;}QString QResourceFileEngine::fileName(FileName file) const{ Q_D(const QResourceFileEngine); if(file == BaseName) { int slash = d->resource.fileName().lastIndexOf(QLatin1Char('/')); if (slash == -1) return d->resource.fileName(); return d->resource.fileName().mid(slash + 1); } else if(file == PathName || file == AbsolutePathName) { const QString path = (file == AbsolutePathName) ? d->resource.absoluteFilePath() : d->resource.fileName(); const int slash = path.lastIndexOf(QLatin1Char('/')); if (slash != -1) return path.left(slash); } else if(file == CanonicalName || file == CanonicalPathName) { const QString absoluteFilePath = d->resource.absoluteFilePath(); if(file == CanonicalPathName) { const int slash = absoluteFilePath.lastIndexOf(QLatin1Char('/')); if (slash != -1) return absoluteFilePath.left(slash); } return absoluteFilePath; } return d->resource.fileName();}bool QResourceFileEngine::isRelativePath() const{ return false;}uint QResourceFileEngine::ownerId(FileOwner) const{ static const uint nobodyID = (uint) -2; return nobodyID;}QString QResourceFileEngine::owner(FileOwner) const{ return QString();}QDateTime QResourceFileEngine::fileTime(FileTime) const{ return QDateTime();}bool QResourceFileEngine::extension(Extension extension, const ExtensionOption *option, ExtensionReturn *output){ Q_UNUSED(extension); Q_UNUSED(option); Q_UNUSED(output); return false;}bool QResourceFileEngine::supportsExtension(Extension extension) const{ Q_UNUSED(extension); return false;}//Initialization and cleanupQ_GLOBAL_STATIC(QResourceFileEngineHandler, resource_file_handler)static int qt_force_resource_init() { resource_file_handler(); return 1; }Q_CORE_EXPORT void qInitResourceIO() { resource_file_handler(); }static int qt_forced_resource_init = qt_force_resource_init();Q_CONSTRUCTOR_FUNCTION(qt_force_resource_init)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -