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

📄 rcc.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                            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 + -