Fixed body part extraction (only body should be extracted).
This commit is contained in:
parent
f0b1be21dc
commit
ff462a5ee1
@ -192,7 +192,7 @@ void IMAPMessage::extract(utility::outputStream& os, utility::progressListener*
|
|||||||
if (!folder)
|
if (!folder)
|
||||||
throw exceptions::folder_not_found();
|
throw exceptions::folder_not_found();
|
||||||
|
|
||||||
extract(NULL, os, progress, start, length, false, peek);
|
extractImpl(NULL, os, progress, start, length, EXTRACT_HEADER | EXTRACT_BODY | (peek ? EXTRACT_PEEK : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -205,7 +205,7 @@ void IMAPMessage::extractPart
|
|||||||
if (!folder)
|
if (!folder)
|
||||||
throw exceptions::folder_not_found();
|
throw exceptions::folder_not_found();
|
||||||
|
|
||||||
extract(p, os, progress, start, length, false, peek);
|
extractImpl(p, os, progress, start, length, EXTRACT_HEADER | EXTRACT_BODY | (peek ? EXTRACT_PEEK : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -219,7 +219,7 @@ void IMAPMessage::fetchPartHeader(ref <part> p)
|
|||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
utility::outputStreamAdapter ossAdapter(oss);
|
utility::outputStreamAdapter ossAdapter(oss);
|
||||||
|
|
||||||
extract(p, ossAdapter, NULL, 0, -1, true, true);
|
extractImpl(p, ossAdapter, NULL, 0, -1, EXTRACT_HEADER | EXTRACT_PEEK);
|
||||||
|
|
||||||
p.dynamicCast <IMAPPart>()->getOrCreateHeader().parse(oss.str());
|
p.dynamicCast <IMAPPart>()->getOrCreateHeader().parse(oss.str());
|
||||||
}
|
}
|
||||||
@ -240,9 +240,9 @@ void IMAPMessage::fetchPartHeaderForStructure(ref <structure> str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void IMAPMessage::extract(ref <const part> p, utility::outputStream& os,
|
void IMAPMessage::extractImpl(ref <const part> p, utility::outputStream& os,
|
||||||
utility::progressListener* progress, const int start,
|
utility::progressListener* progress, const int start,
|
||||||
const int length, const bool headerOnly, const bool peek) const
|
const int length, const int extractFlags) const
|
||||||
{
|
{
|
||||||
ref <const IMAPFolder> folder = m_folder.acquire();
|
ref <const IMAPFolder> folder = m_folder.acquire();
|
||||||
|
|
||||||
@ -284,18 +284,45 @@ void IMAPMessage::extract(ref <const part> p, utility::outputStream& os,
|
|||||||
else
|
else
|
||||||
command << "UID FETCH " << IMAPUtils::extractUIDFromGlobalUID(m_uid) << " BODY";
|
command << "UID FETCH " << IMAPUtils::extractUIDFromGlobalUID(m_uid) << " BODY";
|
||||||
|
|
||||||
if (peek) command << ".PEEK";
|
/*
|
||||||
|
BODY[] header + body
|
||||||
|
BODY.PEEK[] header + body (peek)
|
||||||
|
BODY[HEADER] header
|
||||||
|
BODY.PEEK[HEADER] header (peek)
|
||||||
|
BODY[TEXT] body
|
||||||
|
BODY.PEEK[TEXT] body (peek)
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (extractFlags & EXTRACT_PEEK)
|
||||||
|
command << ".PEEK";
|
||||||
|
|
||||||
command << "[";
|
command << "[";
|
||||||
|
|
||||||
if (section.str().empty())
|
if (section.str().empty())
|
||||||
{
|
{
|
||||||
if (headerOnly)
|
// header + body
|
||||||
|
if ((extractFlags & EXTRACT_HEADER) && (extractFlags & EXTRACT_BODY))
|
||||||
|
command << "";
|
||||||
|
// body only
|
||||||
|
else if (extractFlags & EXTRACT_BODY)
|
||||||
|
command << "TEXT";
|
||||||
|
// header only
|
||||||
|
else if (extractFlags & EXTRACT_HEADER)
|
||||||
command << "HEADER";
|
command << "HEADER";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
command << section.str();
|
command << section.str();
|
||||||
if (headerOnly) command << ".MIME"; // "MIME" not "HEADER" for parts
|
|
||||||
|
// header + body
|
||||||
|
if ((extractFlags & EXTRACT_HEADER) && (extractFlags & EXTRACT_BODY))
|
||||||
|
*((int *) 0)=42;//throw exceptions::operation_not_supported();
|
||||||
|
// body only
|
||||||
|
else if (extractFlags & EXTRACT_BODY)
|
||||||
|
command << ".TEXT";
|
||||||
|
// header only
|
||||||
|
else if (extractFlags & EXTRACT_HEADER)
|
||||||
|
command << ".MIME"; // "MIME" not "HEADER" for parts
|
||||||
}
|
}
|
||||||
|
|
||||||
command << "]";
|
command << "]";
|
||||||
@ -318,7 +345,7 @@ void IMAPMessage::extract(ref <const part> p, utility::outputStream& os,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!headerOnly)
|
if (extractFlags & EXTRACT_BODY)
|
||||||
{
|
{
|
||||||
// TODO: update the flags (eg. flag "\Seen" may have been set)
|
// TODO: update the flags (eg. flag "\Seen" may have been set)
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,7 @@ void IMAPMessagePartContentHandler::extract
|
|||||||
// No decoding to perform
|
// No decoding to perform
|
||||||
if (!isEncoded())
|
if (!isEncoded())
|
||||||
{
|
{
|
||||||
msg->extractPart(part, os, progress);
|
msg->extractImpl(part, os, progress, 0, -1, IMAPMessage::EXTRACT_BODY);
|
||||||
}
|
}
|
||||||
// Need to decode data
|
// Need to decode data
|
||||||
else
|
else
|
||||||
@ -130,7 +130,7 @@ void IMAPMessagePartContentHandler::extract
|
|||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
utility::outputStreamAdapter tmp(oss);
|
utility::outputStreamAdapter tmp(oss);
|
||||||
|
|
||||||
msg->extractPart(part, tmp, NULL);
|
msg->extractImpl(part, tmp, NULL, 0, -1, IMAPMessage::EXTRACT_BODY);
|
||||||
|
|
||||||
// Encode temporary buffer to output stream
|
// Encode temporary buffer to output stream
|
||||||
utility::inputStreamStringAdapter is(oss.str());
|
utility::inputStreamStringAdapter is(oss.str());
|
||||||
|
@ -47,6 +47,7 @@ class IMAPMessage : public message
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
friend class IMAPFolder;
|
friend class IMAPFolder;
|
||||||
|
friend class IMAPMessagePartContentHandler;
|
||||||
friend class vmime::creator; // vmime::create <IMAPMessage>
|
friend class vmime::creator; // vmime::create <IMAPMessage>
|
||||||
|
|
||||||
IMAPMessage(ref <IMAPFolder> folder, const int num);
|
IMAPMessage(ref <IMAPFolder> folder, const int num);
|
||||||
@ -101,7 +102,16 @@ private:
|
|||||||
*/
|
*/
|
||||||
void constructParsedMessage(ref <bodyPart> parentPart, ref <structure> str, int level = 0);
|
void constructParsedMessage(ref <bodyPart> parentPart, ref <structure> str, int level = 0);
|
||||||
|
|
||||||
void extract(ref <const part> p, utility::outputStream& os, utility::progressListener* progress, const int start, const int length, const bool headerOnly, const bool peek) const;
|
|
||||||
|
enum ExtractFlags
|
||||||
|
{
|
||||||
|
EXTRACT_HEADER = 0x1,
|
||||||
|
EXTRACT_BODY = 0x2,
|
||||||
|
EXTRACT_PEEK = 0x10
|
||||||
|
};
|
||||||
|
|
||||||
|
void extractImpl(ref <const part> p, utility::outputStream& os, utility::progressListener* progress,
|
||||||
|
const int start, const int length, const int extractFlags) const;
|
||||||
|
|
||||||
|
|
||||||
ref <header> getOrCreateHeader();
|
ref <header> getOrCreateHeader();
|
||||||
|
Loading…
Reference in New Issue
Block a user