Sophie

Sophie

distrib > Mageia > 5 > i586 > by-pkgid > cf746698214707f972e669b661d0ae59 > files > 65

kdepim4-4.14.10-1.3.mga5.src.rpm

From b6ea90df1c123a555ecca9e0940ef36ffccbdd89 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Vr=C3=A1til?= <daniel.vratil@kdab.com>
Date: Mon, 20 Jun 2016 18:57:07 +0200
Subject: [PATCH 65/74] Fix accessing attachments in deeply nested extra nodes

Certain message types, like opaque S/MIME-encrypted messages
generate a deeper hierarchy of extra nodes. The path in URL
must reflect this, so that we can find the correct parent node.
---
 messageviewer/viewer/nodehelper.cpp | 18 +++++++++++++-----
 messageviewer/viewer/viewer_p.cpp   | 24 ++++++++++++++++--------
 2 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/messageviewer/viewer/nodehelper.cpp b/messageviewer/viewer/nodehelper.cpp
index ddc184886f..6480ad5f70 100644
--- a/messageviewer/viewer/nodehelper.cpp
+++ b/messageviewer/viewer/nodehelper.cpp
@@ -672,12 +672,20 @@ QString NodeHelper::persistentIndex( const KMime::Content * node ) const
   QString indexStr = node->index().toString();
   const KMime::Content * const topLevel = node->topLevel();
   //if the node is an extra node, prepend the index of the extra node to the url
-  Q_FOREACH( const QList<KMime::Content*> & extraNodes, mExtraContents ) {
-    const int extraNodesSize( extraNodes.size() );
-    for ( int i = 0; i < extraNodesSize; ++i )
-      if ( topLevel == extraNodes.at(i) )
-        return indexStr.prepend( QString::fromLatin1("%1:").arg(i) );
+  QMap<KMime::Content*, QList<KMime::Content*> >::ConstIterator it = mExtraContents.constBegin();
+  for (; it != mExtraContents.constEnd(); ++it) {
+    const QList<KMime::Content*> &extraNodes = it.value();
+    for ( int i = 0; i < extraNodes.size(); ++i ) {
+      if ( topLevel == extraNodes.at(i) ) {
+        indexStr.prepend(QString::fromLatin1("%1:").arg(i) );
+        if (topLevel != node) {
+          const QString parentIdx = persistentIndex(topLevel);
+          return indexStr.prepend(persistentIndex(topLevel));
+        }
+      }
+    }
   }
+
   return indexStr;
 }
 
diff --git a/messageviewer/viewer/viewer_p.cpp b/messageviewer/viewer/viewer_p.cpp
index 92937ef007..19bce31b5a 100644
--- a/messageviewer/viewer/viewer_p.cpp
+++ b/messageviewer/viewer/viewer_p.cpp
@@ -307,17 +307,25 @@ KMime::Content * ViewerPrivate::nodeFromUrl( const KUrl & url )
         if ( path.contains(QLatin1Char(':')) ) {
             //if the content was not found, it might be in an extra node. Get the index of the extra node (the first part of the url),
             //and use the remaining part as a ContentIndex to find the node inside the extra node
-            int i = path.left( path.indexOf(QLatin1Char(':')) ).toInt();
-            path = path.mid( path.indexOf(QLatin1Char(':')) + 1 );
-            KMime::ContentIndex idx(path);
-            QList<KMime::Content*> extras = mNodeHelper->extraContents( mMessage.get() );
-            if ( i >= 0 && i < extras.size() ) {
-                KMime::Content* c = extras[i];
-                node = c->content( idx );
+            QStringList indexes = path.split(QLatin1Char(':'));
+            KMime::Content *c = mMessage.get();
+            while (indexes.size() > 1) {
+              int idx = indexes.takeFirst().toInt();
+              QList<KMime::Content*> extras = mNodeHelper->extraContents(c);
+              if (idx < extras.size()) {
+                c = extras[idx];
+              } else {
+                c = 0;
+                break;
+              }
             }
+
+            Q_ASSERT(indexes.size() == 1);
+            KMime::ContentIndex idx(indexes[0]);
+            node = c->content(idx);
         } else {
             if( mMessage )
-                node= mMessage->content( KMime::ContentIndex( path ) );
+                node = mMessage->content( KMime::ContentIndex( path ) );
         }
     } else {
         const QString path = url.toLocalFile();
-- 
2.14.1