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