diff -r 139d4b7b2938 -r 99bcbff212ad emailuis/nmailui/src/nmviewerviewnetreply.cpp --- a/emailuis/nmailui/src/nmviewerviewnetreply.cpp Mon May 24 21:02:02 2010 +0300 +++ b/emailuis/nmailui/src/nmviewerviewnetreply.cpp Fri May 28 13:56:43 2010 +0300 @@ -28,18 +28,52 @@ /*! Constructor */ -NmViewerViewNetReply::NmViewerViewNetReply(QVariant data) +NmViewerViewNetReply::NmViewerViewNetReply(QVariant data, NmUiEngine &uiEngine) : QNetworkReply(), mDataArray(data.toByteArray()), + mUiEngine(uiEngine), + mOperation(NULL), mReadIndex(0) { + NM_FUNCTION; + open(ReadWrite); setReadBufferSize(mDataArray.length()); // QNetworkAccessManager starts listening the signals only // after the construction, so we cannot signal reply to be // ready instantly. We need to emit the signals after the // construction. - QTimer::singleShot(100, this, SLOT(signalReady())); + QMetaObject::invokeMethod(this, "signalReady", Qt::QueuedConnection); +} + +/*! + +*/ +NmViewerViewNetReply::NmViewerViewNetReply(QVariant data, NmUiEngine &uiEngine, + const NmId &mailboxId, const NmId &folderId, const NmId &messageId, + const NmId &messagePartId) + : QNetworkReply(), + mDataArray(data.toByteArray()), + mUiEngine(uiEngine), + mMailboxId(mailboxId), + mFolderId(folderId), + mMessageId(messageId), + mMessagePartId(messagePartId), + mOperation(NULL), + mReadIndex(0) +{ + mOperation = uiEngine.fetchMessagePart(mMailboxId, mFolderId, mMessageId, mMessagePartId); + if (mOperation) { + connect(mOperation, SIGNAL(operationCompleted(int)), + this, SLOT(fetchCompleted(int))); + connect(mOperation, SIGNAL(operationCancelled()), + this, SLOT(fetchCancelled())); + } + else { + open(ReadWrite); + setReadBufferSize(mDataArray.length()); + QMetaObject::invokeMethod(this, "signalReady", Qt::QueuedConnection); + } } /*! @@ -47,6 +81,7 @@ */ NmViewerViewNetReply::~NmViewerViewNetReply() { + NM_FUNCTION; } /*! @@ -54,6 +89,8 @@ */ void NmViewerViewNetReply::signalReady() { + NM_FUNCTION; + // Insert embedded images into cache manually if(manager()) { if(manager()->cache() && request().url().scheme() == NMUI_NET_REPLY_CONTENT_ID) { @@ -76,11 +113,60 @@ } /*! + Slot. Called when fetch operation completes +*/ +void NmViewerViewNetReply::fetchCompleted(int result) +{ + NM_FUNCTION; + + Q_UNUSED(result); + NmMessage *message = NULL; + message = mUiEngine.message( + mMailboxId, + mFolderId, + mMessageId); + if (message) { + QList partList; + message->attachmentList(partList); + NmMessagePart *part = NULL; + for (int i = 0; !part && i < partList.count(); i++) { + if (partList[i]->partId() == mMessagePartId) { + part = partList[i]; + } + } + if (part) { + int error = mUiEngine.contentToMessagePart(mMailboxId, mFolderId, mMessageId, *part); + if (error == NmNoError) { + mDataArray = part->binaryContent(); + } + } + } + delete message; + message = NULL; + open(ReadWrite); + setReadBufferSize(mDataArray.length()); + QMetaObject::invokeMethod(this, "signalReady", Qt::QueuedConnection); +} + +/*! + Slot. Called if fetch operation is cancelled +*/ +void NmViewerViewNetReply::fetchCancelled() +{ + NM_FUNCTION; + + // just call fetch completed + fetchCompleted(NmCancelError); +} + +/*! setOriginalRequest. This function is created to provide access to call base class' protected function setRequest */ void NmViewerViewNetReply::setOriginalRequest(const QNetworkRequest &request) { + NM_FUNCTION; + setRequest(request); } @@ -89,6 +175,8 @@ */ qint64 NmViewerViewNetReply::readData(char *data, qint64 maxlen) { + NM_FUNCTION; + qint64 i = 0; const qint64 dataLength(mDataArray.length()); @@ -107,6 +195,8 @@ */ qint64 NmViewerViewNetReply::readBufferSize() const { + NM_FUNCTION; + return mDataArray.length(); } @@ -118,6 +208,8 @@ */ qint64 NmViewerViewNetReply::bytesAvailable() const { + NM_FUNCTION; + return mDataArray.length() + QIODevice::bytesAvailable(); } @@ -126,6 +218,8 @@ */ bool NmViewerViewNetReply::isSequential () const { + NM_FUNCTION; + return false; } @@ -135,5 +229,6 @@ */ void NmViewerViewNetReply::abort() { + NM_FUNCTION; }