emailuis/nmailui/src/nmviewerview.cpp
changeset 74 6c59112cfd31
parent 68 83cc6bae1de8
--- a/emailuis/nmailui/src/nmviewerview.cpp	Wed Sep 15 17:47:19 2010 +0300
+++ b/emailuis/nmailui/src/nmviewerview.cpp	Thu Sep 30 11:43:07 2010 +0300
@@ -79,7 +79,8 @@
 mAttaWidget(NULL),
 mViewReady(false),
 mWaitNoteCancelled(false),
-mErrorNote(NULL)
+mErrorNote(NULL),
+mAttachmentOpen(false)
 {
     // Create documentloader
     mDocumentLoader = new NmUiDocumentLoader(mMainWindow);
@@ -101,6 +102,8 @@
 */
 NmViewerView::~NmViewerView()
 {
+    // Delete opened temporary files.
+    NmUtilities::deleteTempFiles(mTempFiles);
     delete mErrorNote;
     mErrorNote=NULL;
     delete mWebView;
@@ -497,7 +500,7 @@
 void NmViewerView::openAttachment(int index)
 {
     NM_FUNCTION;
-    if (index >= 0) {
+    if (index >= 0 && !mAttachmentOpen) {
         NmId attaId = mAttaIdList.at(index);
         // reload message to get updates part sizes
         loadMessage();
@@ -522,11 +525,16 @@
                  // attachment is fetched, open file
                  else if (messageParts[i]->partId() == attaId) {
                      mAttaManager.cancelFetch();
-                     XQSharableFile file = mUiEngine.messagePartFile(mailboxId, folderId,
-                                                                     messageId, attaId);
-                     int error = NmUtilities::openFile(file);
-                     file.close();
-                     if (error==NmNotFoundError){
+                     mAttachmentOpen = true;
+                     QObject::disconnect(mAttaWidget, SIGNAL(itemActivated(int)),
+                                         this, SLOT(openAttachment(int)));
+					 // We need to fill the part before opening the attachment.
+					 mUiEngine.contentToMessagePart(mailboxId, folderId, messageId, *(messageParts[i]));
+					 int error = NmUtilities::openAttachment(messageParts[i],mTempFiles,this);
+                     if (error==NmGeneralError){
+                         mAttachmentOpen = false;
+                         QObject::connect(mAttaWidget, SIGNAL(itemActivated(int)),
+                                              this, SLOT(openAttachment(int)));
                          delete mErrorNote;
                          mErrorNote=NULL;
                          mErrorNote = NmUtilities::displayWarningNote(
@@ -550,6 +558,11 @@
         NmMessagePart *html = mMessage->htmlBodyPart();
         if (html) {
             msg += formatHtmlMessage(html);
+            // Remove DOCTYPE definition as it will break viewer layout
+            if (msg.startsWith("<!DOCTYPE", Qt::CaseInsensitive)) {
+                int doctypeTagEnd = msg.indexOf(">",0,Qt::CaseInsensitive);
+                msg.remove(0,doctypeTagEnd+1);
+            }     
         }
         else {
             NmMessagePart *plain = mMessage->plainTextBodyPart();
@@ -633,10 +646,13 @@
                 currentFont.setPixelSize(fontSpec.font().pixelSize());
             }
             document.setDefaultFont(currentFont);
-            // convert to html
+            // convert to html with html and body tags
+            // for background and text color
             document.setPlainText(plain->textContent());
-            msg = document.toHtml();
-    
+            msg += "<html><body bgcolor=white text=black>";
+            msg += document.toHtml();
+            msg += "</body></html>";
+            
             if (qApp->layoutDirection()==Qt::RightToLeft){
                 // add right alignment to document css section
                 QRegExp rx("(<style type=\"text/css\">)(.+)(</style>)", Qt::CaseInsensitive);
@@ -809,21 +825,37 @@
         QDesktopServices::openUrl(link);
     } else if (link.scheme() == NmMailtoLinkScheme){
         mAttaManager.cancelFetch();
-        QList<NmAddress*> *addrList = new QList<NmAddress*>();
-        NmAddress *mailtoAddr = new NmAddress();
-        QString address = link.toString(QUrl::RemoveScheme);
-        mailtoAddr->setAddress(address);
-        mailtoAddr->setDisplayName(address);
-        addrList->append(mailtoAddr);
-        // Create start parameters. Address list ownership
-        // is transferred to startparam object
-        NmUiStartParam* param = new NmUiStartParam(NmUiViewMessageEditor,
-                                                   mStartParam->mailboxId(),
-                                                   mStartParam->folderId(),
-                                                   0,
-                                                   NmUiEditorMailto,
-                                                   addrList);
-        mApplication.enterNmUiView(param);
+
+        NmUriParser uriParser;
+        if (uriParser.extractData(link.toString())) {
+            // Create start parameters. Address list ownership
+            // is transferred to startparam object
+            // The ownership of these is passed to NmApplication in launchEditorView()
+            QList<NmAddress*> *toAddresses = NmUtilities::qstringListToNmAddressList(uriParser.toAddresses());
+            QList<NmAddress*> *ccAddresses = NmUtilities::qstringListToNmAddressList(uriParser.ccAddresses());
+            QList<NmAddress*> *bccAddresses = NmUtilities::qstringListToNmAddressList(uriParser.bccAddresses());
+            
+            QString* subject = new QString(uriParser.subject());
+            QString* bodyText = new QString(uriParser.bodyText());
+            
+            NmUiStartParam* param = new NmUiStartParam(NmUiViewMessageEditor,
+                                                       mStartParam->mailboxId(),
+                                                       mStartParam->folderId(),
+                                                       0, // message id
+                                                       NmUiEditorMailto, // editor start mode
+                                                       toAddresses,
+                                                       NULL, // attachment list
+                                                       false, // start as service
+                                                       subject, // message subject
+                                                       ccAddresses, // cc recipients
+                                                       bccAddresses, //bcc recipients
+                                                       bodyText // body text
+                                                       );
+            
+
+            mApplication.enterNmUiView(param);
+        }
+
     }    
 }
 
@@ -1053,8 +1085,12 @@
     }
 }
 
+
 /*!
-    This is called when attachment fetch is completed
+    This method is called when fetching an attachment is either completed or
+    cancelled.
+
+    \param result The result code (NmNoError if success).
 */
 void NmViewerView::fetchCompleted(int result)
 {
@@ -1064,11 +1100,21 @@
             openAttachment(mAttaIndexUnderFetch);
         } else {
             mAttaWidget->hideProgressBar(mAttaIndexUnderFetch);
+
+            if (result == NmDiskFullError) {
+                // Display an error message.
+                delete mErrorNote;
+                mErrorNote = NmUtilities::displayWarningNote(
+                    hbTrId("txt_mail_dialog_downloading_canceled"));
+            }
+
         }
     }
+
     mAttaIndexUnderFetch = NmNotFoundError;
 }
 
+
 /*!
     externalDelete. From NmUiEngine, handles viewer shutdown when current message is deleted.
 */
@@ -1133,3 +1179,17 @@
     return ret;
 }
 
+void NmViewerView::fileOpenCompleted(const QVariant&)
+{
+    mAttachmentOpen = false;
+    QObject::connect(mAttaWidget, SIGNAL(itemActivated(int)),
+                          this, SLOT(openAttachment(int)));
+}
+
+void NmViewerView::fileOpenError(int, const QString&)
+{
+    mAttachmentOpen = false;
+    QObject::connect(mAttaWidget, SIGNAL(itemActivated(int)),
+                          this, SLOT(openAttachment(int)));
+}
+