Skip to content

Commit

Permalink
[qmf] Set contentAvailable and encoding correctly for transferred bod…
Browse files Browse the repository at this point in the history
…y parts.
  • Loading branch information
Valerio Valerio committed Apr 1, 2014
1 parent 752127d commit a111e29
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 7 deletions.
38 changes: 34 additions & 4 deletions qmf/src/libraries/qmfclient/qmailmessage.cpp
Expand Up @@ -3485,6 +3485,16 @@ int QMailMessageBodyPrivate::length() const
return _bodyData.length();
}

bool QMailMessageBodyPrivate::encoded() const
{
return _encoded;
}

void QMailMessageBodyPrivate::setEncoded(bool value)
{
_encoded = value;
}

uint QMailMessageBodyPrivate::indicativeSize() const
{
return (_bodyData.length() / IndicativeSizeUnit);
Expand Down Expand Up @@ -3807,6 +3817,18 @@ uint QMailMessageBody::indicativeSize() const
return impl(this)->indicativeSize();
}

/*! \internal */
bool QMailMessageBody::encoded() const
{
return impl(this)->encoded();
}

/*! \internal */
void QMailMessageBody::setEncoded(bool value)
{
impl(this)->setEncoded(value);
}

/*! \internal */
void QMailMessageBody::output(QDataStream& out, bool includeAttachments) const
{
Expand Down Expand Up @@ -4140,7 +4162,7 @@ const QMailMessageBody& QMailMessagePartContainerPrivate::body() const
return const_cast<QMailMessagePartContainerPrivate*>(this)->_body;
}

void QMailMessagePartContainerPrivate::setBody(const QMailMessageBody& body)
void QMailMessagePartContainerPrivate::setBody(const QMailMessageBody& body, QMailMessageBody::EncodingFormat encodingStatus)
{
// Set the body's properties into our header
setBodyProperties(body.contentType(), body.transferEncoding());
Expand All @@ -4151,6 +4173,12 @@ void QMailMessagePartContainerPrivate::setBody(const QMailMessageBody& body)
_hasBody = !_body.isEmpty();
}

if (encodingStatus == QMailMessageBody::Encoded) {
_body.setEncoded(true);
} else if (encodingStatus == QMailMessageBody::Decoded) {
_body.setEncoded(false);
}

setPreviewDirty(true);
}

Expand Down Expand Up @@ -4723,11 +4751,13 @@ void QMailMessagePartContainer::setBoundary(const QByteArray& text)
}

/*!
Sets the part to contain the body element \a body.
Sets the part to contain the body element \a body, \a encodingStatus describes the current status of \a body regarding encoding.
Note: No encoding/decoding operation will be performed in the body element, only the encoding status flag
will be set if provided.
*/
void QMailMessagePartContainer::setBody(const QMailMessageBody& body)
void QMailMessagePartContainer::setBody(const QMailMessageBody& body, QMailMessageBody::EncodingFormat encodingStatus)
{
impl(this)->setBody(body);
impl(this)->setBody(body, encodingStatus);
}

/*!
Expand Down
5 changes: 4 additions & 1 deletion qmf/src/libraries/qmfclient/qmailmessage.h
Expand Up @@ -274,6 +274,9 @@ class QMF_EXPORT QMailMessageBody : public QPrivatelyImplemented<QMailMessageBod

uint indicativeSize() const;

bool encoded() const;
void setEncoded(bool value);

void output(QDataStream& out, bool includeAttachments) const;
static QMailMessageBody fromLongString(LongString& ls, const QMailMessageContentType& type, TransferEncoding encoding, EncodingStatus status);
};
Expand Down Expand Up @@ -341,7 +344,7 @@ class QMF_EXPORT QMailMessagePartContainer : public QPrivatelyImplemented<QMailM
void setBoundary(const QByteArray& text);

// Body management interface:
void setBody(const QMailMessageBody& body);
void setBody(const QMailMessageBody& body, QMailMessageBody::EncodingFormat encodingStatus = QMailMessageBody::None);
QMailMessageBody body() const;

bool hasBody() const;
Expand Down
5 changes: 4 additions & 1 deletion qmf/src/libraries/qmfclient/qmailmessage_p.h
Expand Up @@ -148,6 +148,9 @@ class QMF_EXPORT QMailMessageBodyPrivate : public QPrivateImplementationBase
bool isEmpty() const;
int length() const;

bool encoded() const;
void setEncoded(bool value);

uint indicativeSize() const;

void output(QDataStream& out, bool includeAttachments) const;
Expand Down Expand Up @@ -225,7 +228,7 @@ class QMF_EXPORT QMailMessagePartContainerPrivate : public QPrivateImplementatio
// Note: this returns a reference:
QMailMessageBody& body();
const QMailMessageBody& body() const;
void setBody(const QMailMessageBody& body);
void setBody(const QMailMessageBody& body, QMailMessageBody::EncodingFormat encodingStatus = QMailMessageBody::None);
void setBodyProperties(const QMailMessageContentType &type, QMailMessageBody::TransferEncoding encoding);

bool hasBody() const;
Expand Down
1 change: 1 addition & 0 deletions qmf/src/libraries/qmfclient/qmailmessagefwd.h
Expand Up @@ -93,6 +93,7 @@ class QMF_EXPORT QMailMessageBodyFwd

enum EncodingFormat
{
None = 0,
Encoded = 1,
Decoded = 2
};
Expand Down
10 changes: 9 additions & 1 deletion qmf/src/plugins/messageservices/imap/imapstrategy.cpp
Expand Up @@ -259,7 +259,15 @@ bool transferPartBodies(QMailMessagePartContainer &destination, const QMailMessa
}

if (source.hasBody()) {
destination.setBody(source.body());
// If the content of the source part is not fully available
// flag the copy with the same status
if(!source.contentAvailable()) {
// Incomplete parts are always saved encoded
destination.setBody(source.body(), QMailMessageBody::Encoded);
destination.setHeaderField("X-qmf-internal-partial-content", "true");
} else {
destination.setBody(source.body());
}
} else if (source.partCount() > 0) {
for (uint i = 0; i < source.partCount(); ++i) {
const QMailMessagePart &sourcePart = source.partAt(i);
Expand Down

0 comments on commit a111e29

Please sign in to comment.