diff options
| author | MattV <qt-info@nokia.com> | 2009-04-03 10:53:20 +1000 |
|---|---|---|
| committer | MattV <qt-info@nokia.com> | 2009-04-03 10:53:20 +1000 |
| commit | e8ce07068f164baf64a3c985c95f68e3fde16a29 (patch) | |
| tree | 211f628adf715dc0b2d4b9246b81873048e20b33 | |
| parent | be6cfcc34feb0e95ee8b19cd0733297fc81586f7 (diff) | |
Correctly handle top-level multipart/alternative parts.
| -rw-r--r-- | src/plugins/messageservices/imap/imapstrategy.cpp | 58 |
1 files changed, 30 insertions, 28 deletions
diff --git a/src/plugins/messageservices/imap/imapstrategy.cpp b/src/plugins/messageservices/imap/imapstrategy.cpp index 6d368de4..5f48eea5 100644 --- a/src/plugins/messageservices/imap/imapstrategy.cpp +++ b/src/plugins/messageservices/imap/imapstrategy.cpp @@ -894,6 +894,35 @@ void ImapSynchronizeBaseStrategy::recursivelyCompleteParts(ImapStrategyContextBa int &partsToRetrieve, int &bytesLeft) { + if (partContainer.multipartType() == QMailMessage::MultipartAlternative) { + // See if there is a preferred sub-part to retrieve + ImapConfiguration imapCfg(context->config()); + + QString preferred(imapCfg.preferredTextSubtype().toLower()); + if (!preferred.isEmpty()) { + for (uint i = 0; i < partContainer.partCount(); ++i) { + const QMailMessagePart part(partContainer.partAt(i)); + const QMailMessageContentDisposition disposition(part.contentDisposition()); + const QMailMessageContentType contentType(part.contentType()); + + if ((contentType.type().toLower() == "text") && (contentType.subType().toLower() == preferred)) { + if (bytesLeft > disposition.size()) { + _completionSectionList.append(qMakePair(part.location(), 0u)); + bytesLeft -= disposition.size(); + ++partsToRetrieve; + } else if (preferred == "plain") { + // We can retrieve the first portion of this part + _completionSectionList.append(qMakePair(part.location(), static_cast<unsigned>(bytesLeft))); + bytesLeft = 0; + ++partsToRetrieve; + } + return; + } + } + } + } + + // Otherwise, consider the subparts individually for (uint i = 0; i < partContainer.partCount(); ++i) { const QMailMessagePart part(partContainer.partAt(i)); const QMailMessageContentDisposition disposition(part.contentDisposition()); @@ -902,34 +931,7 @@ void ImapSynchronizeBaseStrategy::recursivelyCompleteParts(ImapStrategyContextBa if (partsToRetrieve > 10) { break; // sanity check, prevent DOS } else if (part.partCount() > 0) { - bool alternativeSelected(false); - - if (part.multipartType() == QMailMessage::MultipartAlternative) { - // See if there is a preferred sub-part to retrieve - ImapConfiguration imapCfg(context->config()); - QString preferred(imapCfg.preferredTextSubtype().toLower()); - - for (uint j = 0; j < part.partCount(); ++j) { - const QMailMessagePart subpart(part.partAt(j)); - QMailMessageContentType subcontent(subpart.contentType()); - if ((subcontent.type().toLower() == "text") && (subcontent.subType().toLower() == preferred)) { - alternativeSelected = true; - - const QMailMessageContentDisposition subdisposition(subpart.contentDisposition()); - if (bytesLeft > subdisposition.size()) { - _completionSectionList.append(qMakePair(subpart.location(), 0u)); - bytesLeft -= subdisposition.size(); - ++partsToRetrieve; - } - break; - } - } - } - - if (!alternativeSelected) { - // Otherwise, consider the subparts individually - recursivelyCompleteParts(context, part, partsToRetrieve, bytesLeft); - } + recursivelyCompleteParts(context, part, partsToRetrieve, bytesLeft); } else if (part.partialContentAvailable()) { continue; } else if (disposition.size() <= 0) { |
