rcc: Replace all occurrences of the marker in two-pass mode

The marker can occur legitimately twice e.g. on iOS
with universal binaries.

Change-Id: Ie334bcd104d45140ff969f44230e6de2212e8e25
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
Reviewed-by: Fawzi Mohamed <fawzi.mohamed@theqtcompany.com>
This commit is contained in:
hjk 2014-11-07 14:42:06 +01:00 committed by Jani Heikkinen
parent ade8e0fc9b
commit 9b7bdd455f

View File

@ -730,33 +730,37 @@ bool RCCResourceLibrary::output(QIODevice &outDevice, QIODevice &tempDevice, QIO
{
m_errorDevice = &errorDevice;
const char pattern[] = { 'Q', 'R', 'C', '_', 'D', 'A', 'T', 'A' };
if (m_format == Pass2) {
char c;
for (int i = 0; i < 8; ) {
if (!tempDevice.getChar(&c)) {
m_errorDevice->write("No data signature found\n");
return false;
}
if (c == pattern[i]) {
++i;
} else {
for (int k = 0; k < i; ++k)
outDevice.putChar(pattern[k]);
outDevice.putChar(c);
i = 0;
const char pattern[] = { 'Q', 'R', 'C', '_', 'D', 'A', 'T', 'A' };
bool foundSignature = false;
while (true) {
char c;
for (int i = 0; i < 8; ) {
if (!tempDevice.getChar(&c)) {
if (foundSignature)
return true;
m_errorDevice->write("No data signature found\n");
return false;
}
if (c == pattern[i]) {
++i;
} else {
for (int k = 0; k < i; ++k)
outDevice.putChar(pattern[k]);
outDevice.putChar(c);
i = 0;
}
}
m_outDevice = &outDevice;
quint64 start = outDevice.pos();
writeDataBlobs();
quint64 len = outDevice.pos() - start;
tempDevice.seek(tempDevice.pos() + len - 8);
foundSignature = true;
}
m_outDevice = &outDevice;
quint64 start = outDevice.pos();
writeDataBlobs();
quint64 len = outDevice.pos() - start;
tempDevice.seek(tempDevice.pos() + len - 8);
outDevice.write(tempDevice.readAll());
return true;
}
//write out