summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattV <qt-info@nokia.com>2009-04-03 10:53:20 +1000
committerMattV <qt-info@nokia.com>2009-04-03 10:53:20 +1000
commite8ce07068f164baf64a3c985c95f68e3fde16a29 (patch)
tree211f628adf715dc0b2d4b9246b81873048e20b33
parentbe6cfcc34feb0e95ee8b19cd0733297fc81586f7 (diff)
Correctly handle top-level multipart/alternative parts.
-rw-r--r--src/plugins/messageservices/imap/imapstrategy.cpp58
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) {