From 2da30e747ddd828ec3fe3884ba9e25dc802554b7 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 15 Nov 2017 11:53:14 +0100 Subject: [PATCH] Fix crash on saving time if some of the existing annotations where removed Also rename a variable to make it more clear what it does --- generators/poppler/annots.cpp | 5 +++-- generators/poppler/annots.h | 3 ++- generators/poppler/generator_pdf.cpp | 12 ++++++------ generators/poppler/generator_pdf.h | 4 +++- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/generators/poppler/annots.cpp b/generators/poppler/annots.cpp index c7fd79834..ee44e23bf 100644 --- a/generators/poppler/annots.cpp +++ b/generators/poppler/annots.cpp @@ -62,8 +62,8 @@ static int maskExportedFlags(int flags) } //BEGIN PopplerAnnotationProxy implementation -PopplerAnnotationProxy::PopplerAnnotationProxy( Poppler::Document *doc, QMutex *userMutex ) - : ppl_doc ( doc ), mutex ( userMutex ) +PopplerAnnotationProxy::PopplerAnnotationProxy( Poppler::Document *doc, QMutex *userMutex, QHash *annotsOnOpenHash ) + : ppl_doc ( doc ), mutex ( userMutex ), annotationsOnOpenHash( annotsOnOpenHash ) { } @@ -254,6 +254,7 @@ void PopplerAnnotationProxy::notifyRemoval( Okular::Annotation *okl_ann, int pag QMutexLocker ml(mutex); Poppler::Page *ppl_page = ppl_doc->page( page ); + annotationsOnOpenHash->remove( okl_ann ); ppl_page->removeAnnotation( ppl_ann ); // Also destroys ppl_ann delete ppl_page; diff --git a/generators/poppler/annots.h b/generators/poppler/annots.h index 9dc6aa6d7..d6d1dd651 100644 --- a/generators/poppler/annots.h +++ b/generators/poppler/annots.h @@ -23,7 +23,7 @@ extern Okular::Annotation* createAnnotationFromPopplerAnnotation( Poppler::Annot class PopplerAnnotationProxy : public Okular::AnnotationProxy { public: - PopplerAnnotationProxy( Poppler::Document *doc, QMutex *userMutex ); + PopplerAnnotationProxy( Poppler::Document *doc, QMutex *userMutex, QHash *annotsOnOpenHash ); ~PopplerAnnotationProxy(); bool supports( Capability capability ) const override; @@ -33,6 +33,7 @@ class PopplerAnnotationProxy : public Okular::AnnotationProxy private: Poppler::Document *ppl_doc; QMutex *mutex; + QHash *annotationsOnOpenHash; }; #endif diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index ff13fbf3f..8c2025a2f 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -579,7 +579,7 @@ Okular::Document::OpenResult PDFGenerator::init(QVector & pagesVe pagesVector.resize(pageCount); rectsGenerated.fill(false, pageCount); - annotationsHash.clear(); + annotationsOnOpenHash.clear(); loadPages(pagesVector, 0, false); @@ -587,7 +587,7 @@ Okular::Document::OpenResult PDFGenerator::init(QVector & pagesVe reparseConfig(); // create annotation proxy - annotProxy = new PopplerAnnotationProxy( pdfdoc, userMutex() ); + annotProxy = new PopplerAnnotationProxy( pdfdoc, userMutex(), &annotationsOnOpenHash ); // the file has been loaded correctly return Okular::Document::OpenSuccess; @@ -1006,8 +1006,8 @@ void PDFGenerator::resolveMediaLinkReference( Okular::Action *action ) if ( (action->actionType() != Okular::Action::Movie) && (action->actionType() != Okular::Action::Rendition) ) return; - resolveMediaLinks( action, Okular::Annotation::AMovie, annotationsHash ); - resolveMediaLinks( action, Okular::Annotation::AScreen, annotationsHash ); + resolveMediaLinks( action, Okular::Annotation::AMovie, annotationsOnOpenHash ); + resolveMediaLinks( action, Okular::Annotation::AScreen, annotationsOnOpenHash ); } void PDFGenerator::resolveMediaLinkReferences( Okular::Page *page ) @@ -1564,7 +1564,7 @@ void PDFGenerator::addAnnotations( Poppler::Page * popplerPage, Okular::Page * p } if ( !doDelete ) - annotationsHash.insert( newann, a ); + annotationsOnOpenHash.insert( newann, a ); } if ( doDelete ) delete a; @@ -1718,7 +1718,7 @@ bool PDFGenerator::save( const QString &fileName, SaveOptions options, QString * QMutexLocker locker( userMutex() ); - QHashIterator it( annotationsHash ); + QHashIterator it( annotationsOnOpenHash ); while ( it.hasNext() ) { it.next(); diff --git a/generators/poppler/generator_pdf.h b/generators/poppler/generator_pdf.h index 957a28592..ef8c98a4f 100644 --- a/generators/poppler/generator_pdf.h +++ b/generators/poppler/generator_pdf.h @@ -137,7 +137,9 @@ class PDFGenerator : public Okular::Generator, public Okular::ConfigInterface, p mutable QList docEmbeddedFiles; int nextFontPage; PopplerAnnotationProxy *annotProxy; - QHash annotationsHash; + // the hash below only contains annotations that were present on the file at open time + // this is enough for what we use it for + QHash annotationsOnOpenHash; QBitArray rectsGenerated;