void RCCFileInfo::writeDataInfo(RCCResourceLibrary &lib) { const bool text = (lib.m_format == RCCResourceLibrary::C_Code || lib.m_format == RCCResourceLibrary::Go_Code); //some info if (text) { if (m_language != QLocale::C) { lib.writeString(" // "); lib.writeByteArray(resourceName().toLocal8Bit()); lib.writeString(" ["); lib.writeByteArray(QByteArray::number(m_country)); lib.writeString("::"); lib.writeByteArray(QByteArray::number(m_language)); lib.writeString("[\n "); } else { lib.writeString(" // "); lib.writeByteArray(resourceName().toUtf8()); lib.writeString("\n "); } } //pointer data if (m_flags & RCCFileInfo::Directory) { // name offset lib.writeNumber4(m_nameOffset); // flags lib.writeNumber2(m_flags); // child count lib.writeNumber4(m_children.size()); // first child offset lib.writeNumber4(m_childOffset); } else { // name offset lib.writeNumber4(m_nameOffset); // flags lib.writeNumber2(m_flags); // locale lib.writeNumber2(m_country); lib.writeNumber2(m_language); //data offset lib.writeNumber4(m_dataOffset); } if (text) lib.writeChar('\n'); }
qint64 RCCFileInfo::writeDataName(RCCResourceLibrary &lib, qint64 offset) { const bool text = (lib.m_format == RCCResourceLibrary::C_Code || lib.m_format == RCCResourceLibrary::Go_Code); // capture the offset m_nameOffset = offset; // some info if (text) { lib.writeString(" // "); lib.writeByteArray(m_name.toUtf8()); lib.writeString("\n "); } // write the length lib.writeNumber2(m_name.length()); if (text) lib.writeString("\n "); offset += 2; // write the hash #if QT_VERSION >= 0x050000 lib.writeNumber4(qt_hash(m_name)); #else lib.writeNumber4(qHash(m_name)); #endif if (text) lib.writeString("\n "); offset += 4; // write the m_name const QChar *unicode = m_name.unicode(); for (int i = 0; i < m_name.length(); ++i) { lib.writeNumber2(unicode[i].unicode()); if (text && i % 16 == 0) lib.writeString("\n "); } offset += m_name.length()*2; // done if (text) lib.writeString("\n "); return offset; }
qint64 RCCFileInfo::writeDataBlob(RCCResourceLibrary &lib, qint64 offset, QString *errorMessage) { const bool text = (lib.m_format == RCCResourceLibrary::C_Code); //capture the offset m_dataOffset = offset; //find the data to be written QFile file(m_fileInfo.absoluteFilePath()); if (!file.open(QFile::ReadOnly)) { *errorMessage = msgOpenReadFailed(m_fileInfo.absoluteFilePath(), file.errorString()); return 0; } QByteArray data = file.readAll(); #ifndef QT_NO_COMPRESS // Check if compression is useful for this file if (m_compressLevel != 0 && data.size() != 0) { QByteArray compressed = qCompress(reinterpret_cast<uchar *>(data.data()), data.size(), m_compressLevel); int compressRatio = int(100.0 * (data.size() - compressed.size()) / data.size()); if (compressRatio >= m_compressThreshold) { data = compressed; m_flags |= Compressed; } } #endif // QT_NO_COMPRESS // some info if (text) { lib.writeString(" // "); lib.writeByteArray(m_fileInfo.absoluteFilePath().toLocal8Bit()); lib.writeString("\n "); } // write the length lib.writeNumber4(data.size()); if (text) lib.writeString("\n "); offset += 4; // write the payload const char *p = data.constData(); if (text) { for (int i = data.size(), j = 0; --i >= 0; --j) { lib.writeHex(*p++); if (j == 0) { lib.writeString("\n "); j = 16; } } } else { for (int i = data.size(); --i >= 0; ) lib.writeChar(*p++); } offset += data.size(); // done if (text) lib.writeString("\n "); return offset; }