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

📄 rcc.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the tools applications of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "rcc.h"#include <QFile>#include <QDateTime>#include <QByteArray>#include <QDir>#include <QStack>#include <QDomDocument>static bool qt_rcc_write_number(FILE *out, quint32 number, int width, RCCResourceLibrary::Format format){    int dividend = 1;    switch (width) {    case 2:        dividend = 256;        break;    case 3:        dividend = 65536;        break;    case 4:        dividend = 16777216;        break;    default:        break;    }    // Write <width> bytes    while (dividend >= 1) {        const quint8 tmp = number / dividend;        if(format == RCCResourceLibrary::Binary) {            fwrite(&tmp, sizeof(tmp), 1, out);        } else if(format == RCCResourceLibrary::C_Code) {            fprintf(out, "0x%x", tmp);            if (dividend > 1)                fprintf(out, ",");        }        number -= tmp * dividend;        dividend /= 256;    }    return true;}bool RCCFileInfo::writeDataInfo(FILE *out, RCCResourceLibrary::Format format){    //some info    if(format == RCCResourceLibrary::C_Code) {        if(locale != QLocale::c())            fprintf(out, "  // %s [%d::%d]\n  ", resourceName().toLatin1().constData(),                    locale.country(), locale.language());        else            fprintf(out, "  // %s\n  ", resourceName().toLatin1().constData());    }    //pointer data    if(flags & RCCFileInfo::Directory) {        //name offset        qt_rcc_write_number(out, nameOffset, 4, format);        if(format == RCCResourceLibrary::C_Code)            fprintf(out, ",");        //flags        qt_rcc_write_number(out, flags, 2, format);        if(format == RCCResourceLibrary::C_Code)            fprintf(out, ",");        //child count        qt_rcc_write_number(out, children.size(), 4, format);        if(format == RCCResourceLibrary::C_Code)            fprintf(out, ",");        //first child offset        qt_rcc_write_number(out, childOffset, 4, format);    } else {        //name offset        qt_rcc_write_number(out, nameOffset, 4, format);        if(format == RCCResourceLibrary::C_Code)            fprintf(out, ",");        //flags        qt_rcc_write_number(out, flags, 2, format);        if(format == RCCResourceLibrary::C_Code)            fprintf(out, ",");        //locale        qt_rcc_write_number(out, locale.country(), 2, format);        if(format == RCCResourceLibrary::C_Code)            fprintf(out, ",");        qt_rcc_write_number(out, locale.language(), 2, format);        if(format == RCCResourceLibrary::C_Code)            fprintf(out, ",");        //data offset        qt_rcc_write_number(out, dataOffset, 4, format);    }    if(format == RCCResourceLibrary::C_Code)        fprintf(out, ",\n");    return true;}qint64 RCCFileInfo::writeDataBlob(FILE *out, qint64 offset, RCCResourceLibrary::Format format){    //capture the offset    dataOffset = offset;    //find the data to be written    QFile file(fileInfo.absoluteFilePath());    if (!file.open(QFile::ReadOnly)) {        fprintf(stderr, "Couldn't open %s\n", fileInfo.absoluteFilePath().toLatin1().constData());        return false;    }    QByteArray data = file.readAll();#ifndef QT_NO_COMPRESS    // Check if compression is useful for this file    if (mCompressLevel != 0 && data.size() != 0) {        QByteArray compressed = qCompress(reinterpret_cast<uchar *>(data.data()), data.size(), mCompressLevel);        int compressRatio = int(100.0f * (float(data.size() - compressed.size()) / float(data.size())));        if (compressRatio >= mCompressThreshold) {            data = compressed;            flags |= Compressed;        }    }#endif // QT_NO_COMPRESS    //some info    if(format == RCCResourceLibrary::C_Code)        fprintf(out, "  // %s\n  ", fileInfo.absoluteFilePath().toLatin1().constData());    //write the length    qt_rcc_write_number(out, data.size(), 4, format);    if(format == RCCResourceLibrary::C_Code)        fprintf(out, ",\n  ");    offset += 4;    //write the payload    for (int i=0; i<data.size(); i++) {        qt_rcc_write_number(out, data.at(i), 1, format);        if(format == RCCResourceLibrary::C_Code) {            fprintf(out, ",");            if(!(i % 16))                fprintf(out, "\n  ");        }    }    offset += data.size();    //done    if(format == RCCResourceLibrary::C_Code)        fprintf(out, "\n  ");    return offset;}qint64 RCCFileInfo::writeDataName(FILE *out, qint64 offset, RCCResourceLibrary::Format format){    //capture the offset    nameOffset = offset;    //some info    if(format == RCCResourceLibrary::C_Code)        fprintf(out, "  // %s\n  ", name.toLatin1().constData());    //write the length    qt_rcc_write_number(out, name.length(), 2, format);    if(format == RCCResourceLibrary::C_Code)        fprintf(out, ",\n  ");    offset += 2;    //write the hash    qt_rcc_write_number(out, qHash(name), 4, format);    if(format == RCCResourceLibrary::C_Code)        fprintf(out, ",\n  ");    offset += 4;    //write the name    const QChar *unicode = name.unicode();    for (int i=0; i<name.length(); i++) {        qt_rcc_write_number(out, unicode[i].unicode(), 2, format);        if(format == RCCResourceLibrary::C_Code) {            fprintf(out, ",");            if(!(i % 16))                fprintf(out, "\n  ");        }    }    offset += name.length()*2;    //done    if(format == RCCResourceLibrary::C_Code)        fprintf(out, "\n  ");    return offset;}RCCResourceLibrary::~RCCResourceLibrary(){    delete root;}bool RCCResourceLibrary::interpretResourceFile(QIODevice *inputDevice, QString fname, QString currentPath, bool ignoreErrors){    if (!currentPath.isEmpty() && !currentPath.endsWith(QLatin1String("/")))        currentPath += '/';    QDomDocument document;    {        QString errorMsg;        int errorLine, errorColumn;        if(!document.setContent(inputDevice, &errorMsg, &errorLine, &errorColumn)) {            if(ignoreErrors)                return true;            fprintf(stderr, "RCC Parse Error:%s:%d:%d [%s]\n", fname.toLatin1().constData(),                    errorLine, errorColumn, errorMsg.toLatin1().constData());            return false;        }    }    for(QDomElement root = document.firstChild().toElement(); !root.isNull();        root = root.nextSibling().toElement()) {        if (root.tagName() != QLatin1String(TAG_RCC))            continue;        for (QDomElement child = root.firstChild().toElement(); !child.isNull();             child = child.nextSibling().toElement()) {            if (child.tagName() == QLatin1String(TAG_RESOURCE)) {                QLocale lang = QLocale::c();                if (child.hasAttribute(ATTRIBUTE_LANG))                    lang = QLocale(child.attribute(ATTRIBUTE_LANG));                QString prefix;                if (child.hasAttribute(ATTRIBUTE_PREFIX))                    prefix = child.attribute(ATTRIBUTE_PREFIX);                if (!prefix.startsWith(QLatin1String("/")))                    prefix.prepend('/');                if (!prefix.endsWith(QLatin1String("/")))                    prefix += '/';                for (QDomNode res = child.firstChild(); !res.isNull(); res = res.nextSibling()) {                    if (res.toElement().tagName() == QLatin1String(TAG_FILE)) {                        QString fileName(res.firstChild().toText().data());                        if (ignoreErrors && fileName.isEmpty())                            fprintf(stderr, "RCC: Warning: Null node in XML\n");                        QString alias;                        if (res.toElement().hasAttribute(ATTRIBUTE_ALIAS))                            alias = res.toElement().attribute(ATTRIBUTE_ALIAS);                        else                            alias = fileName;                        int compressLevel = mCompressLevel;                        if (res.toElement().hasAttribute(ATTRIBUTE_COMPRESS))                            compressLevel = res.toElement().attribute(ATTRIBUTE_COMPRESS).toInt();                        int compressThreshold = mCompressThreshold;                        if (res.toElement().hasAttribute(ATTRIBUTE_THRESHOLD))                            compressThreshold = res.toElement().attribute(ATTRIBUTE_THRESHOLD).toInt();                        // Special case for -no-compress. Overrides all other settings.                        if (mCompressLevel == -2)                            compressLevel = 0;                        alias = QDir::cleanPath(alias);                        while (alias.startsWith("../"))                            alias.remove(0, 3);                        alias = QDir::cleanPath(mResourceRoot) + prefix + alias;                        QFileInfo file(currentPath + fileName);                        if (!file.exists()) {                            if(ignoreErrors)                                continue;                            fprintf(stderr, "RCC: Error: Cannot find file '%s'\n", fileName.toLatin1().constData());                            return false;                        } else if (file.isFile()) {                            addFile(alias, RCCFileInfo(alias.section('/', -1), file, lang,                                                       RCCFileInfo::NoFlags, compressLevel, compressThreshold));                        } else {                            QDir dir;                            if(file.isDir()) {                                dir.setPath(file.filePath());                            } else {                                dir.setPath(file.path());                                dir.setNameFilters(QStringList(file.fileName()));                                if(alias.endsWith(file.fileName()))                                    alias = alias.left(alias.length()-file.fileName().length());                            }                            if (!alias.endsWith(QLatin1String("/")))                                alias += '/';                            QFileInfoList children = dir.entryInfoList();                            for(int i = 0; i < children.size(); ++i) {                                if(children[i].fileName() != QLatin1String(".") &&                                   children[i].fileName() != QLatin1String(".."))                                    addFile(alias + children[i].fileName(),                                            RCCFileInfo(children[i].fileName(), children[i], lang,                                                        RCCFileInfo::NoFlags, compressLevel, compressThreshold));                            }                        }                    }                }            }

⌨️ 快捷键说明

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