📄 rcc.cpp
字号:
QDirIterator it(dir, QDirIterator::FollowSymlinks|QDirIterator::Subdirectories); while(it.hasNext()) { it.next(); QFileInfo child(it.fileInfo()); if(child.fileName() != QLatin1String(".") && child.fileName() != QLatin1String("..")) addFile(alias + child.fileName(), RCCFileInfo(child.fileName(), child, language, country, RCCFileInfo::NoFlags, compressLevel, compressThreshold)); } } } } } } } if(!ignoreErrors && this->root == 0) fprintf(stderr, "RCC: Warning: No resources in resource description.\n"); return true;}bool RCCResourceLibrary::addFile(const QString &alias, const RCCFileInfo &file){ if (file.fileInfo.size() > 0xffffffff) { fprintf(stderr, "File too big: %s", qPrintable(file.fileInfo.absoluteFilePath())); return false; } if(!root) root = new RCCFileInfo(QLatin1String(""), QFileInfo(), QLocale::C, QLocale::AnyCountry, RCCFileInfo::Directory); RCCFileInfo *parent = root; const QStringList nodes = alias.split(QLatin1Char('/')); for(int i = 1; i < nodes.size()-1; ++i) { const QString node = nodes.at(i); if(node.isEmpty()) continue; if(!parent->children.contains(node)) { RCCFileInfo *s = new RCCFileInfo(node, QFileInfo(), QLocale::C, QLocale::AnyCountry, RCCFileInfo::Directory); s->parent = parent; parent->children.insert(node, s); parent = s; } else { parent = parent->children[node]; } } const QString filename = nodes.at(nodes.size()-1); RCCFileInfo *s = new RCCFileInfo(file); s->parent = parent; parent->children.insertMulti(filename, s); return true;}bool RCCResourceLibrary::readFiles(bool ignoreErrors){ //read in data if (mVerbose) fprintf(stderr, "Processing %d files [%d]\n", mFileNames.size(), ignoreErrors); for (int i=0; i<mFileNames.size(); ++i) { QFile fileIn; QString fname = mFileNames.at(i), pwd; if(fname == QLatin1String("-")) { fname = QLatin1String("(stdin)"); pwd = QDir::currentPath(); fileIn.setFileName(fname); if (!fileIn.open(stdin, QIODevice::ReadOnly)) { fprintf(stderr, "Unable to open file: %s\n", qPrintable(fname)); return false; } } else { pwd = QFileInfo(fname).path(); fileIn.setFileName(fname); if (!fileIn.open(QIODevice::ReadOnly)) { fprintf(stderr, "Unable to open file: %s\n", qPrintable(fname)); return false; } } if (mVerbose) fprintf(stderr, "Interpreting %s\n", qPrintable(fname)); if (!interpretResourceFile(&fileIn, fname, pwd, ignoreErrors)) return false; } return true;}QStringListRCCResourceLibrary::dataFiles() const{ QStringList ret; QStack<RCCFileInfo*> pending; if (!root) return ret; pending.push(root); while(!pending.isEmpty()) { RCCFileInfo *file = pending.pop(); for(QHash<QString, RCCFileInfo*>::iterator it = file->children.begin(); it != file->children.end(); ++it) { RCCFileInfo *child = it.value(); if(child->flags & RCCFileInfo::Directory) pending.push(child); ret.append(child->fileInfo.filePath()); } } return ret;}bool RCCResourceLibrary::output(FILE *out){ //write out if (mVerbose) fprintf(stderr, "Outputting code\n"); if (!writeHeader(out)) { fprintf(stderr, "Couldn't write header\n"); return false; } if(this->root) { if (!writeDataBlobs(out)) { fprintf(stderr, "Couldn't write data blob\n"); return false; } if (!writeDataNames(out)) { fprintf(stderr, "Couldn't write file names\n"); return false; } if (!writeDataStructure(out)) { fprintf(stderr, "Couldn't write data tree\n"); return false; } } if (!writeInitializer(out)) { fprintf(stderr, "Couldn't write footer\n"); return false; } return true;}boolRCCResourceLibrary::writeHeader(FILE *out){ if(mFormat == C_Code) { fprintf(out, "/****************************************************************************\n"); fprintf(out, "** Resource object code\n"); fprintf(out, "**\n"); fprintf(out, "** Created: %s\n", qPrintable(QDateTime::currentDateTime().toString())); fprintf(out, "** by: The Resource Compiler for Qt version %s\n", QT_VERSION_STR); fprintf(out, "**\n"); fprintf(out, "** WARNING! All changes made in this file will be lost!\n"); fprintf(out, "*****************************************************************************/\n\n"); fprintf(out, "#include <QtCore/qglobal.h>\n\n"); } else if(mFormat == Binary) { fprintf(out,"qres"); qt_rcc_write_number(out, 0, 4, mFormat); qt_rcc_write_number(out, 0, 4, mFormat); qt_rcc_write_number(out, 0, 4, mFormat); qt_rcc_write_number(out, 0, 4, mFormat); } return true;}boolRCCResourceLibrary::writeDataBlobs(FILE *out){ if(mFormat == C_Code) fprintf(out, "static const unsigned char qt_resource_data[] = {\n"); else if(mFormat == Binary) mDataOffset = ftell(out); QStack<RCCFileInfo*> pending; if (!root) return false; pending.push(root); qint64 offset = 0; while(!pending.isEmpty()) { RCCFileInfo *file = pending.pop(); for(QHash<QString, RCCFileInfo*>::iterator it = file->children.begin(); it != file->children.end(); ++it) { RCCFileInfo *child = it.value(); if(child->flags & RCCFileInfo::Directory) pending.push(child); else offset = child->writeDataBlob(out, offset, mFormat); } } if(mFormat == C_Code) fprintf(out, "\n};\n\n"); return true;}boolRCCResourceLibrary::writeDataNames(FILE *out){ if(mFormat == C_Code) fprintf(out, "static const unsigned char qt_resource_name[] = {\n"); else if(mFormat == Binary) mNamesOffset = ftell(out); QHash<QString, int> names; QStack<RCCFileInfo*> pending; if (!root) return false; pending.push(root); qint64 offset = 0; while(!pending.isEmpty()) { RCCFileInfo *file = pending.pop(); for(QHash<QString, RCCFileInfo*>::iterator it = file->children.begin(); it != file->children.end(); ++it) { RCCFileInfo *child = it.value(); if(child->flags & RCCFileInfo::Directory) pending.push(child); if(names.contains(child->name)) { child->nameOffset = names.value(child->name); } else { names.insert(child->name, offset); offset = child->writeDataName(out, offset, mFormat); } } } if(mFormat == C_Code) fprintf(out, "\n};\n\n"); return true;}static bool qt_rcc_compare_hash(const RCCFileInfo *left, const RCCFileInfo *right){ return qHash(left->name) < qHash(right->name);}boolRCCResourceLibrary::writeDataStructure(FILE *out){ if(mFormat == C_Code) fprintf(out, "static const unsigned char qt_resource_struct[] = {\n"); else if(mFormat == Binary) mTreeOffset = ftell(out); QStack<RCCFileInfo*> pending; if (!root) return false; //calculate the child offsets (flat) pending.push(root); int offset = 1; while(!pending.isEmpty()) { RCCFileInfo *file = pending.pop(); file->childOffset = offset; //sort by hash value for binary lookup QList<RCCFileInfo*> children = file->children.values(); qSort(children.begin(), children.end(), qt_rcc_compare_hash); //write out the actual data now for(int i = 0; i < children.size(); ++i) { RCCFileInfo *child = children.at(i); ++offset; if(child->flags & RCCFileInfo::Directory) pending.push(child); } } //write out the structure (ie iterate again!) pending.push(root); root->writeDataInfo(out, mFormat); while(!pending.isEmpty()) { RCCFileInfo *file = pending.pop(); //sort by hash value for binary lookup QList<RCCFileInfo*> children = file->children.values(); qSort(children.begin(), children.end(), qt_rcc_compare_hash); //write out the actual data now for(int i = 0; i < children.size(); ++i) { RCCFileInfo *child = children.at(i); child->writeDataInfo(out, mFormat); if(child->flags & RCCFileInfo::Directory) pending.push(child); } } if(mFormat == C_Code) fprintf(out, "\n};\n\n"); return true;}boolRCCResourceLibrary::writeInitializer(FILE *out){ if(mFormat == C_Code) { QString initName = mInitName; if(!initName.isEmpty()) { initName.prepend(QLatin1Char('_')); initName.replace(QRegExp(QLatin1String("[^a-zA-Z0-9_]")), QLatin1String("_")); } //init fprintf(out, "int qInitResources%s()\n{\n", initName.toLatin1().constData()); if(this->root) { fprintf(out, " extern bool qRegisterResourceData(int, const unsigned char *, " "const unsigned char *, const unsigned char *);\n"); fprintf(out, " qRegisterResourceData(0x01, qt_resource_struct, " "qt_resource_name, qt_resource_data);\n"); } fprintf(out, " return 1;\n"); fprintf(out, "}\n"); fprintf(out, "Q_CONSTRUCTOR_FUNCTION(qInitResources%s)\n", initName.toLatin1().constData()); //cleanup fprintf(out, "int qCleanupResources%s()\n{\n", initName.toLatin1().constData()); if(this->root) { fprintf(out, " extern bool qUnregisterResourceData(int, const unsigned char *, " "const unsigned char *, const unsigned char *);\n"); fprintf(out, " qUnregisterResourceData(0x01, qt_resource_struct, " "qt_resource_name, qt_resource_data);\n"); } fprintf(out, " return 1;\n"); fprintf(out, "}\n"); fprintf(out, "Q_DESTRUCTOR_FUNCTION(qCleanupResources%s)\n", initName.toLatin1().constData()); } else if(mFormat == Binary) { const long old_pos = ftell(out); fseek(out, 4, SEEK_SET); qt_rcc_write_number(out, 0x01, 4, mFormat); qt_rcc_write_number(out, mTreeOffset, 4, mFormat); qt_rcc_write_number(out, mDataOffset, 4, mFormat); qt_rcc_write_number(out, mNamesOffset, 4, mFormat); fseek(out, old_pos, SEEK_SET); } return true;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -