static bool TryGetMultipartBody (Multipart multipart, TextFormat format, out string body)
{
var alternative = multipart as MultipartAlternative;
if (alternative != null) {
body = alternative.GetTextBody (format);
return body != null;
}
var related = multipart as MultipartRelated;
Multipart multi;
TextPart text;
if (related == null) {
// Note: This is probably a multipart/mixed... and if not, we can still treat it like it is.
for (int i = 0; i < multipart.Count; i++) {
multi = multipart[i] as Multipart;
// descend into nested multiparts, if there are any...
if (multi != null) {
if (TryGetMultipartBody (multi, format, out body))
return true;
// The text body should never come after a multipart.
break;
}
text = multipart[i] as TextPart;
// Look for the first non-attachment text part (realistically, the body text will
// preceed any attachments, but I'm not sure we can rely on that assumption).
if (text != null && !text.IsAttachment) {
if (text.IsFormat (format)) {
body = MultipartAlternative.GetText (text);
return true;
}
// Note: the first text/* part in a multipart/mixed is the text body.
// If it's not in the format we're looking for, then it doesn't exist.
break;
}
}
} else {
// Note: If the multipart/related root document is HTML, then this is the droid we are looking for.
var root = related.Root;
text = root as TextPart;
if (text != null) {
body = text.IsFormat (format) ? text.Text : null;
return body != null;
}
// maybe the root is another multipart (like multipart/alternative)?
multi = root as Multipart;
if (multi != null)
return TryGetMultipartBody (multi, format, out body);
}
body = null;
return false;
}