[poppler] 11 commits - glib/poppler-action.cc goo/GooString.h poppler/Annot.cc poppler/Form.cc poppler/Link.cc poppler/Link.h poppler/PDFDocEncoding.h poppler/Sound.cc poppler/Sound.h poppler/Stream.h qt5/src utils/HtmlOutputDev.cc utils/JSInfo.cc

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sun Feb 23 17:17:47 UTC 2020


 glib/poppler-action.cc     |   26 +++-------
 goo/GooString.h            |    3 +
 poppler/Annot.cc           |    2 
 poppler/Form.cc            |   14 ++---
 poppler/Link.cc            |  109 ++++++++++++++-------------------------------
 poppler/Link.h             |   70 ++++++++++++----------------
 poppler/PDFDocEncoding.h   |    4 +
 poppler/Sound.cc           |    5 --
 poppler/Sound.h            |    5 +-
 poppler/Stream.h           |   10 +++-
 qt5/src/poppler-page.cc    |   30 ++++++------
 qt5/src/poppler-private.cc |   12 +++-
 qt5/src/poppler-private.h  |    2 
 utils/HtmlOutputDev.cc     |    2 
 utils/JSInfo.cc            |   19 +++----
 15 files changed, 137 insertions(+), 176 deletions(-)

New commits:
commit 3355e20b2849fc1be131095bc2fe5b0a02d41d5a
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Wed Jan 29 09:41:35 2020 +0100

    Implement fillGooString in terms of fillString
    
    This requires to add a method to GooString that allows access
    as a mutable std::string&.

diff --git a/goo/GooString.h b/goo/GooString.h
index 11baa8ae..78824455 100644
--- a/goo/GooString.h
+++ b/goo/GooString.h
@@ -68,6 +68,7 @@ public:
   explicit GooString(std::string&& str) : std::string(std::move(str)) {}
 
   const std::string& toStr() const { return *this; }
+  std::string& toNonConstStr() { return *this; }
 
   // Create a string from <lengthA> chars at <sA>.  This string
   // can contain null characters.
diff --git a/poppler/Stream.h b/poppler/Stream.h
index e19790e5..04dfd053 100644
--- a/poppler/Stream.h
+++ b/poppler/Stream.h
@@ -142,12 +142,7 @@ public:
 
   inline void fillGooString(GooString *s)
   {
-    unsigned char readBuf[4096];
-    int readChars;
-    reset();
-    while ((readChars = doGetChars(4096, readBuf)) != 0) {
-      s->append((const char *)readBuf, readChars);
-    }
+    fillString(s->toNonConstStr());
   }
   
   inline unsigned char *toUnsignedChars(int *length, int initialSize = 4096, int sizeIncrement = 4096)
commit 5804f51c7cf439432082b668ba8df3b0a6048caf
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Mon Jan 27 17:33:49 2020 +0100

    Use a std::string value in LinkURI

diff --git a/glib/poppler-action.cc b/glib/poppler-action.cc
index e6be5b9b..583efb53 100644
--- a/glib/poppler-action.cc
+++ b/glib/poppler-action.cc
@@ -405,9 +405,7 @@ static void
 build_uri (PopplerAction *action,
 	   const LinkURI       *link)
 {
-	const gchar *uri;
-
-	uri = link->getURI()->c_str ();
+	const gchar *uri = link->getURI().c_str ();
 	if (uri != nullptr)
 		action->uri.uri = g_strdup (uri);
 }
diff --git a/poppler/Link.cc b/poppler/Link.cc
index cfce4d36..318c6b96 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -560,38 +560,33 @@ LinkLaunch::~LinkLaunch() {
 //------------------------------------------------------------------------
 
 LinkURI::LinkURI(const Object *uriObj, const GooString *baseURI) {
-  const GooString *uri2;
-  int n;
-  char c;
-
-  uri = nullptr;
+  hasURIFlag = false;
   if (uriObj->isString()) {
-    uri2 = uriObj->getString();
-    n = (int)strcspn(uri2->c_str(), "/:");
-    if (n < uri2->getLength() && uri2->getChar(n) == ':') {
+    const std::string& uri2 = uriObj->getString()->toStr();
+    size_t n = strcspn(uri2.c_str(), "/:");
+    if (n < uri2.size() && uri2[n] == ':') {
       // "http:..." etc.
-      uri = uri2->copy();
-    } else if (!uri2->cmpN("www.", 4)) {
+      uri = uri2;
+    } else if (!uri2.compare(0,4,"www.")) {
       // "www.[...]" without the leading "http://"
-      uri = new GooString("http://");
-      uri->append(uri2);
+      uri = "http://" + uri2;
     } else {
       // relative URI
       if (baseURI) {
-	uri = baseURI->copy();
-	if (uri->getLength() > 0) {
-	  c = uri->getChar(uri->getLength() - 1);
+	uri = baseURI->toStr();
+	if (uri.size() > 0) {
+	  char c = uri.back();
 	  if (c != '/' && c != '?') {
-	    uri->append('/');
+	    uri += '/';
 	  }
 	}
-	if (uri2->getChar(0) == '/') {
-	  uri->append(uri2->c_str() + 1, uri2->getLength() - 1);
+	if (uri2[0] == '/') {
+	  uri.append(uri2.c_str() + 1, uri2.size() - 1);
 	} else {
-	  uri->append(uri2);
+	  uri += uri2;
 	}
       } else {
-	uri = uri2->copy();
+	uri = uri2;
       }
     }
   } else {
@@ -599,11 +594,6 @@ LinkURI::LinkURI(const Object *uriObj, const GooString *baseURI) {
   }
 }
 
-LinkURI::~LinkURI() {
-  if (uri)
-    delete uri;
-}
-
 //------------------------------------------------------------------------
 // LinkNamed
 //------------------------------------------------------------------------
diff --git a/poppler/Link.h b/poppler/Link.h
index aaaf09c1..1871890f 100644
--- a/poppler/Link.h
+++ b/poppler/Link.h
@@ -253,19 +253,17 @@ public:
   // Build a LinkURI given the URI (string) and base URI.
   LinkURI(const Object *uriObj, const GooString *baseURI);
 
-  // Destructor.
-  ~LinkURI() override;
-
   // Was the LinkURI created successfully?
-  bool isOk() const override { return uri != nullptr; }
+  bool isOk() const override { return hasURIFlag; }
 
   // Accessors.
   LinkActionKind getKind() const override { return actionURI; }
-  const GooString *getURI() const { return uri; }
+  const std::string& getURI() const { return uri; }
 
 private:
 
-  GooString *uri;			// the URI
+  std::string uri;			// the URI
+  bool hasURIFlag;
 };
 
 //------------------------------------------------------------------------
diff --git a/qt5/src/poppler-page.cc b/qt5/src/poppler-page.cc
index 25731146..e36f6fd3 100644
--- a/qt5/src/poppler-page.cc
+++ b/qt5/src/poppler-page.cc
@@ -275,7 +275,7 @@ Link* PageData::convertLinkActionToLink(::LinkAction * a, DocumentData *parentDo
 
     case actionURI:
     {
-      popplerLink = new LinkBrowse( linkArea, ((LinkURI *)a)->getURI()->c_str() );
+      popplerLink = new LinkBrowse( linkArea, ((LinkURI *)a)->getURI().c_str() );
     }
     break;
 
diff --git a/qt5/src/poppler-private.cc b/qt5/src/poppler-private.cc
index cb5bf8f1..e630f565 100644
--- a/qt5/src/poppler-private.cc
+++ b/qt5/src/poppler-private.cc
@@ -228,7 +228,7 @@ namespace Debug {
             case actionURI:
             {
                 const LinkURI * u = static_cast< const LinkURI * >( a );
-                e->setAttribute( QStringLiteral("DestinationURI"), u->getURI()->c_str() );
+                e->setAttribute( QStringLiteral("DestinationURI"), u->getURI().c_str() );
             }
             default: ;
         }
diff --git a/utils/HtmlOutputDev.cc b/utils/HtmlOutputDev.cc
index 75fb5bbb..0212626b 100644
--- a/utils/HtmlOutputDev.cc
+++ b/utils/HtmlOutputDev.cc
@@ -1628,7 +1628,7 @@ GooString* HtmlOutputDev::getLinkDest(AnnotLink *link){
       case actionURI:
 	  { 
 	  LinkURI *ha=(LinkURI *) link->getAction();
-	  GooString* file=new GooString(ha->getURI()->c_str());
+	  GooString* file=new GooString(ha->getURI());
 	  // printf("uri : %s\n",file->c_str());
 	  return file;
 	  }
commit 06a658708d73b4e2d0bcb9f5572be9b2754368eb
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Mon Jan 27 16:24:54 2020 +0100

    Use a std::string value in LinkNamed

diff --git a/glib/poppler-action.cc b/glib/poppler-action.cc
index cbd78d85..e6be5b9b 100644
--- a/glib/poppler-action.cc
+++ b/glib/poppler-action.cc
@@ -416,9 +416,7 @@ static void
 build_named (PopplerAction *action,
 	     const LinkNamed     *link)
 {
-	const gchar *name;
-
-	name = link->getName ()->c_str ();
+	const gchar* name = link->getName ().c_str ();
 	if (name != nullptr)
 		action->named.named_dest = g_strdup (name);
 }
diff --git a/poppler/Link.cc b/poppler/Link.cc
index cd5ca00a..cfce4d36 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -609,15 +609,10 @@ LinkURI::~LinkURI() {
 //------------------------------------------------------------------------
 
 LinkNamed::LinkNamed(const Object *nameObj) {
-  name = nullptr;
+  hasNameFlag = false;
   if (nameObj->isName()) {
-    name = new GooString(nameObj->getName());
-  }
-}
-
-LinkNamed::~LinkNamed() {
-  if (name) {
-    delete name;
+    name = (nameObj->getName()) ? nameObj->getName() : "";
+    hasNameFlag = true;
   }
 }
 
diff --git a/poppler/Link.h b/poppler/Link.h
index 1e1bfd88..aaaf09c1 100644
--- a/poppler/Link.h
+++ b/poppler/Link.h
@@ -278,16 +278,15 @@ public:
   // Build a LinkNamed given the action name.
   LinkNamed(const Object *nameObj);
 
-  ~LinkNamed() override;
-
-  bool isOk() const override { return name != nullptr; }
+  bool isOk() const override { return hasNameFlag; }
 
   LinkActionKind getKind() const override { return actionNamed; }
-  const GooString *getName() const { return name; }
+  const std::string& getName() const { return name; }
 
 private:
 
-  GooString *name;
+  std::string name;
+  bool hasNameFlag;
 };
 
 
diff --git a/qt5/src/poppler-page.cc b/qt5/src/poppler-page.cc
index 39753b7e..25731146 100644
--- a/qt5/src/poppler-page.cc
+++ b/qt5/src/poppler-page.cc
@@ -236,30 +236,30 @@ Link* PageData::convertLinkActionToLink(::LinkAction * a, DocumentData *parentDo
 
     case actionNamed:
     {
-      const char * name = ((LinkNamed *)a)->getName()->c_str();
-      if ( !strcmp( name, "NextPage" ) )
+      const std::string& name = ((LinkNamed *)a)->getName();
+      if ( name == "NextPage" )
         popplerLink = new LinkAction( linkArea, LinkAction::PageNext );
-      else if ( !strcmp( name, "PrevPage" ) )
+      else if ( name == "PrevPage" )
         popplerLink = new LinkAction( linkArea, LinkAction::PagePrev );
-      else if ( !strcmp( name, "FirstPage" ) )
+      else if ( name == "FirstPage" )
         popplerLink = new LinkAction( linkArea, LinkAction::PageFirst );
-      else if ( !strcmp( name, "LastPage" ) )
+      else if ( name == "LastPage" )
         popplerLink = new LinkAction( linkArea, LinkAction::PageLast );
-      else if ( !strcmp( name, "GoBack" ) )
+      else if ( name == "GoBack" )
         popplerLink = new LinkAction( linkArea, LinkAction::HistoryBack );
-      else if ( !strcmp( name, "GoForward" ) )
+      else if ( name == "GoForward" )
         popplerLink = new LinkAction( linkArea, LinkAction::HistoryForward );
-      else if ( !strcmp( name, "Quit" ) )
+      else if ( name == "Quit" )
         popplerLink = new LinkAction( linkArea, LinkAction::Quit );
-      else if ( !strcmp( name, "GoToPage" ) )
+      else if ( name == "GoToPage" )
         popplerLink = new LinkAction( linkArea, LinkAction::GoToPage );
-      else if ( !strcmp( name, "Find" ) )
+      else if ( name == "Find" )
         popplerLink = new LinkAction( linkArea, LinkAction::Find );
-      else if ( !strcmp( name, "FullScreen" ) )
+      else if ( name == "FullScreen" )
         popplerLink = new LinkAction( linkArea, LinkAction::Presentation );
-      else if ( !strcmp( name, "Print" ) )
+      else if ( name == "Print" )
         popplerLink = new LinkAction( linkArea, LinkAction::Print );
-      else if ( !strcmp( name, "Close" ) )
+      else if ( name == "Close" )
       {
         // acroread closes the document always, doesnt care whether 
         // its presentation mode or not
commit 5d9a9c85bc27f7375a57f6c84913c8e0adcc38d1
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Mon Jan 27 16:11:16 2020 +0100

    Use a std::string value in LinkMovie

diff --git a/glib/poppler-action.cc b/glib/poppler-action.cc
index 3851a390..cbd78d85 100644
--- a/glib/poppler-action.cc
+++ b/glib/poppler-action.cc
@@ -436,7 +436,7 @@ find_annot_movie_for_action (PopplerDocument *document,
 
     annotObj = xref->fetch (*ref);
   } else if (link->hasAnnotTitle ()) {
-    const GooString *title = link->getAnnotTitle ();
+    const std::string& title = link->getAnnotTitle ();
     int i;
 
     for (i = 1; i <= document->doc->getNumPages (); ++i) {
@@ -457,11 +457,8 @@ find_annot_movie_for_action (PopplerDocument *document,
 	    }
 
 	    obj1 = annotObj.dictLookup ("T");
-	    if (obj1.isString()) {
-	      const GooString *t = obj1.getString ();
-
-	      if (title->cmp(t) == 0)
-	        found = true;
+	    if (obj1.isString() && obj1.getString()->toStr() == title) {
+              found = true;
 	    }
 	  }
 	  if (!found)
diff --git a/poppler/Link.cc b/poppler/Link.cc
index 0aca017a..cd5ca00a 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -627,7 +627,7 @@ LinkNamed::~LinkNamed() {
 
 LinkMovie::LinkMovie(const Object *obj) {
   annotRef = Ref::INVALID();
-  annotTitle = nullptr;
+  hasAnnotTitleFlag = false;
 
   const Object &annotationObj = obj->dictLookupNF("Annotation");
   if (annotationObj.isRef()) {
@@ -636,10 +636,11 @@ LinkMovie::LinkMovie(const Object *obj) {
 
   Object tmp = obj->dictLookup("T");
   if (tmp.isString()) {
-    annotTitle = tmp.getString()->copy();
+    annotTitle = tmp.getString()->toStr();
+    hasAnnotTitleFlag = true;
   }
 
-  if ((annotTitle == nullptr) && (annotRef == Ref::INVALID())) {
+  if ((!hasAnnotTitleFlag) && (annotRef == Ref::INVALID())) {
     error(errSyntaxError, -1,
 	  "Movie action is missing both the Annot and T keys");
   }
@@ -663,12 +664,6 @@ LinkMovie::LinkMovie(const Object *obj) {
   }
 }
 
-LinkMovie::~LinkMovie() {
-  if (annotTitle) {
-    delete annotTitle;
-  }
-}
-
 //------------------------------------------------------------------------
 // LinkSound
 //------------------------------------------------------------------------
diff --git a/poppler/Link.h b/poppler/Link.h
index f3b2d787..1e1bfd88 100644
--- a/poppler/Link.h
+++ b/poppler/Link.h
@@ -306,25 +306,25 @@ public:
   };
 
   LinkMovie(const Object *obj);
-  ~LinkMovie() override;
 
-  bool isOk() const override { return hasAnnotRef() || hasAnnotTitle(); }
+  bool isOk() const override { return hasAnnotRef() || hasAnnotTitleFlag; }
   LinkActionKind getKind() const override { return actionMovie; }
 
   // a movie action stores either an indirect reference to a movie annotation
   // or the movie annotation title
 
   bool hasAnnotRef() const { return annotRef != Ref::INVALID(); }
-  bool hasAnnotTitle() const { return annotTitle != nullptr; }
+  bool hasAnnotTitle() const { return hasAnnotTitleFlag; }
   const Ref *getAnnotRef() const { return &annotRef; }
-  const GooString *getAnnotTitle() const { return annotTitle; }
+  const std::string& getAnnotTitle() const { return annotTitle; }
 
   OperationType getOperation() const { return operation; }
 
 private:
 
   Ref annotRef;            // Annotation
-  GooString *annotTitle;   // T
+  std::string annotTitle;  // T
+  bool hasAnnotTitleFlag;
 
   OperationType operation; // Operation
 };
commit 42eebb9bade006ceb602805c474bc9df5ef630b9
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Sat Jan 25 20:44:56 2020 +0100

    Use a std::string value in LinkRendition

diff --git a/poppler/Link.cc b/poppler/Link.cc
index 9433fd9f..0aca017a 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -714,7 +714,6 @@ LinkSound::LinkSound(const Object *soundObj) {
 LinkRendition::LinkRendition(const Object *obj) {
   operation = NoRendition;
   media = nullptr;
-  js = nullptr;
   int operationCode = -1;
 
   screenRef = Ref::INVALID();
@@ -723,11 +722,10 @@ LinkRendition::LinkRendition(const Object *obj) {
     Object tmp = obj->dictLookup("JS");
     if (!tmp.isNull()) {
       if (tmp.isString()) {
-        js = new GooString(tmp.getString());
+        js = tmp.getString()->toStr();
       } else if (tmp.isStream()) {
         Stream *stream = tmp.getStream();
-	js = new GooString();
-	stream->fillGooString(js);
+	stream->fillString(js);
       } else {
         error(errSyntaxWarning, -1, "Invalid Rendition Action: JS not string or stream");
       }
@@ -736,7 +734,7 @@ LinkRendition::LinkRendition(const Object *obj) {
     tmp = obj->dictLookup("OP");
     if (tmp.isInt()) {
       operationCode = tmp.getInt();
-      if (!js && (operationCode < 0 || operationCode > 4)) {
+      if (js.empty() && (operationCode < 0 || operationCode > 4)) {
         error(errSyntaxWarning, -1, "Invalid Rendition Action: unrecognized operation valued: {0:d}", operationCode);
       } else {
         // retrieve rendition object
@@ -773,14 +771,13 @@ LinkRendition::LinkRendition(const Object *obj) {
           operation = PlayRendition;
           break;
       }
-    } else if (!js) {
+    } else if (js=="") {
       error(errSyntaxWarning, -1, "Invalid Rendition action: no OP or JS field defined");
     }
   }
 }
 
 LinkRendition::~LinkRendition() {
-  delete js;
   delete media;
 }
 
diff --git a/poppler/Link.h b/poppler/Link.h
index 053cbb85..f3b2d787 100644
--- a/poppler/Link.h
+++ b/poppler/Link.h
@@ -365,7 +365,7 @@ public:
 
   const MediaRendition* getMedia() const { return media; }
 
-  const GooString *getScript() const { return js; }
+  const std::string& getScript() const { return js; }
 
 private:
 
@@ -375,7 +375,7 @@ private:
 
   MediaRendition* media;
 
-  GooString *js;
+  std::string js;
 };
 
 //------------------------------------------------------------------------
diff --git a/utils/JSInfo.cc b/utils/JSInfo.cc
index ba082904..aa9402d5 100644
--- a/utils/JSInfo.cc
+++ b/utils/JSInfo.cc
@@ -71,15 +71,13 @@ void JSInfo::scanLinkAction(LinkAction *link, const char *action, bool deleteLin
 
   if (link->getKind() == actionRendition) {
     LinkRendition *linkr = static_cast<LinkRendition *>(link);
-    if (linkr->getScript()) {
+    if (!linkr->getScript().empty()) {
       hasJS = true;
       if (print) {
-        const GooString *s = linkr->getScript();
-        if (s && s->c_str()) {
-          fprintf(file, "%s (Rendition):\n", action);
-          printJS(s);
-          fputs("\n\n", file);
-        }
+        fprintf(file, "%s (Rendition):\n", action);
+        const GooString s(linkr->getScript());
+        printJS(&s);
+        fputs("\n\n", file);
       }
     }
   }
commit 887d35751979d3441a18db00b99cfc5b6b8d958f
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Sat Jan 25 17:29:54 2020 +0100

    LinkSound: Store Sound in a std::unique_ptr
    
    Because the LinkSound class does own the pointer.

diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index 98f9dfef..102dbf3f 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -6140,7 +6140,7 @@ AnnotSound::~AnnotSound() = default;
 void AnnotSound::initialize(PDFDoc *docA, Dict* dict) {
   Object obj1 = dict->lookup("Sound");
 
-  sound.reset(Sound::parseSound(&obj1));
+  sound = Sound::parseSound(&obj1);
   if (!sound) {
     error(errSyntaxError, -1, "Bad Annot Sound");
     ok = false;
diff --git a/poppler/Link.cc b/poppler/Link.cc
index af8d44dd..9433fd9f 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -707,10 +707,6 @@ LinkSound::LinkSound(const Object *soundObj) {
   }
 }
 
-LinkSound::~LinkSound() {
-  delete sound;
-}
-
 //------------------------------------------------------------------------
 // LinkRendition
 //------------------------------------------------------------------------
diff --git a/poppler/Link.h b/poppler/Link.h
index 184e43e7..053cbb85 100644
--- a/poppler/Link.h
+++ b/poppler/Link.h
@@ -387,8 +387,6 @@ public:
 
   LinkSound(const Object *soundObj);
 
-  ~LinkSound() override;
-
   bool isOk() const override { return sound != nullptr; }
 
   LinkActionKind getKind() const override { return actionSound; }
@@ -397,7 +395,7 @@ public:
   bool getSynchronous() const { return sync; }
   bool getRepeat() const { return repeat; }
   bool getMix() const { return mix; }
-  Sound *getSound() const { return sound; }
+  Sound *getSound() const { return sound.get(); }
 
 private:
 
@@ -405,7 +403,7 @@ private:
   bool sync;
   bool repeat;
   bool mix;
-  Sound *sound;
+  std::unique_ptr<Sound> sound;
 };
 
 //------------------------------------------------------------------------
diff --git a/poppler/Sound.cc b/poppler/Sound.cc
index 3e0323a7..20c1b7f8 100644
--- a/poppler/Sound.cc
+++ b/poppler/Sound.cc
@@ -22,7 +22,7 @@
 #include "Stream.h"
 #include "FileSpec.h"
 
-Sound *Sound::parseSound(Object *obj)
+std::unique_ptr<Sound> Sound::parseSound(Object *obj)
 {
   // let's try to see if this Object is a Sound, according to the PDF specs
   // (section 9.2)
@@ -40,7 +40,7 @@ Sound *Sound::parseSound(Object *obj)
   // the Dict must have the 'R' key of type num
   Object tmp = dict->lookup("R");
   if (tmp.isNum()) {
-    return new Sound(obj);
+    return std::unique_ptr<Sound>(new Sound(obj));
   } else {
     return nullptr;
   }
diff --git a/poppler/Sound.h b/poppler/Sound.h
index 802f6ff4..5c049448 100644
--- a/poppler/Sound.h
+++ b/poppler/Sound.h
@@ -20,6 +20,8 @@
 #ifndef Sound_H
 #define Sound_H
 
+#include <memory>
+
 class Object;
 class Stream;
 
@@ -41,7 +43,7 @@ class Sound
 {
 public:
   // Try to parse the Object obj
-  static Sound *parseSound(Object *obj);
+  static std::unique_ptr<Sound> parseSound(Object *obj);
 
   // Destructor
   ~Sound();
commit 57c7c79df6105300f32b1f5d8775a2be8d1b96f9
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Sat Jan 25 17:29:28 2020 +0100

    Do not include GooString.h
    
    It is not actually used.

diff --git a/poppler/Sound.cc b/poppler/Sound.cc
index fb7c4344..3e0323a7 100644
--- a/poppler/Sound.cc
+++ b/poppler/Sound.cc
@@ -17,7 +17,6 @@
  * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include "GooString.h"
 #include "Object.h"
 #include "Sound.h"
 #include "Stream.h"
diff --git a/poppler/Sound.h b/poppler/Sound.h
index c23fd0e1..802f6ff4 100644
--- a/poppler/Sound.h
+++ b/poppler/Sound.h
@@ -20,7 +20,6 @@
 #ifndef Sound_H
 #define Sound_H
 
-class GooString;
 class Object;
 class Stream;
 
commit 70ba56662286257a84d0d979c8f47eb3d3a5356b
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Sat Jan 25 10:20:03 2020 +0100

    Use a std::string value in LinkJavaScript

diff --git a/glib/poppler-action.cc b/glib/poppler-action.cc
index 193536c2..3851a390 100644
--- a/glib/poppler-action.cc
+++ b/glib/poppler-action.cc
@@ -523,11 +523,10 @@ static void
 build_javascript (PopplerAction *action,
 		  const LinkJavaScript *link)
 {
-	const GooString *script;
-
-	script = link->getScript();
-	if (script)
-		action->javascript.script = _poppler_goo_string_to_utf8 (script);
+	if (link->isOk()) {
+	        const GooString script(link->getScript());
+		action->javascript.script = _poppler_goo_string_to_utf8 (&script);
+        }
 
 }
 
diff --git a/poppler/Link.cc b/poppler/Link.cc
index f9d4edf9..af8d44dd 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -794,21 +794,16 @@ LinkRendition::~LinkRendition() {
 //------------------------------------------------------------------------
 
 LinkJavaScript::LinkJavaScript(Object *jsObj) {
-  js = nullptr;
+  isValid = false;
 
   if (jsObj->isString()) {
-    js = new GooString(jsObj->getString());
+    js = jsObj->getString()->toStr();
+    isValid = true;
   }
   else if (jsObj->isStream()) {
     Stream *stream = jsObj->getStream();
-    js = new GooString();
-    stream->fillGooString(js);
-  }
-}
-
-LinkJavaScript::~LinkJavaScript() {
-  if (js) {
-    delete js;
+    stream->fillString(js);
+    isValid = true;
   }
 }
 
diff --git a/poppler/Link.h b/poppler/Link.h
index 48a7a91e..184e43e7 100644
--- a/poppler/Link.h
+++ b/poppler/Link.h
@@ -418,18 +418,17 @@ public:
   // Build a LinkJavaScript given the action name.
   LinkJavaScript(Object *jsObj);
 
-  ~LinkJavaScript() override;
-
-  bool isOk() const override { return js != nullptr; }
+  bool isOk() const override { return isValid; }
 
   LinkActionKind getKind() const override { return actionJavaScript; }
-  const GooString *getScript() const { return js; }
+  const std::string& getScript() const { return js; }
 
   static Object createObject(XRef *xref, const GooString &js);
 
 private:
 
-  GooString *js;
+  std::string js;
+  bool isValid;
 };
 
 //------------------------------------------------------------------------
diff --git a/poppler/Stream.h b/poppler/Stream.h
index 758433b3..e19790e5 100644
--- a/poppler/Stream.h
+++ b/poppler/Stream.h
@@ -28,6 +28,7 @@
 // Copyright (C) 2013 Pino Toscano <pino at kde.org>
 // Copyright (C) 2019 Volker Krause <vkrause at kde.org>
 // Copyright (C) 2019 Alexander Volkov <a.volkov at rusbitech.ru>
+// Copyright (C) 2020 Oliver Sander <oliver.sander at tu-dresden.de>
 //
 // To see a description of the changes please see the Changelog file that
 // came with your tarball or type make ChangeLog if you are building from git
@@ -129,6 +130,16 @@ public:
     }
   }
 
+  inline void fillString(std::string& s)
+  {
+    unsigned char readBuf[4096];
+    int readChars;
+    reset();
+    while ((readChars = doGetChars(4096, readBuf)) != 0) {
+      s.append((const char *)readBuf, readChars);
+    }
+  }
+
   inline void fillGooString(GooString *s)
   {
     unsigned char readBuf[4096];
diff --git a/qt5/src/poppler-page.cc b/qt5/src/poppler-page.cc
index 9e08134a..39753b7e 100644
--- a/qt5/src/poppler-page.cc
+++ b/qt5/src/poppler-page.cc
@@ -289,7 +289,7 @@ Link* PageData::convertLinkActionToLink(::LinkAction * a, DocumentData *parentDo
     case actionJavaScript:
     {
       ::LinkJavaScript *ljs = (::LinkJavaScript *)a;
-      popplerLink = new LinkJavaScript( linkArea, UnicodeParsedString(ljs->getScript()) );
+      popplerLink = new LinkJavaScript( linkArea, UnicodeParsedString( ljs->getScript() ) );
     }
     break;
 
diff --git a/utils/JSInfo.cc b/utils/JSInfo.cc
index 1ebd8a4c..ba082904 100644
--- a/utils/JSInfo.cc
+++ b/utils/JSInfo.cc
@@ -59,10 +59,11 @@ void JSInfo::scanLinkAction(LinkAction *link, const char *action, bool deleteLin
     hasJS = true;
     if (print) {
       LinkJavaScript *linkjs = static_cast<LinkJavaScript *>(link);
-      const GooString *s = linkjs->getScript();
-      if (s && s->c_str()) {
+      if (linkjs->isOk()) {
+	const std::string& s = linkjs->getScript();
 	fprintf(file, "%s:\n", action);
-	printJS(s);
+	GooString gooS = GooString(s);
+	printJS(&gooS);
 	fputs("\n\n", file);
       }
     }
commit e9278387cbff75ce75a87a92bc297b53256bd3fc
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Sat Jan 25 09:46:10 2020 +0100

    Use a std::string value in LinkHide

diff --git a/poppler/Link.cc b/poppler/Link.cc
index 74b16d7f..f9d4edf9 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -872,13 +872,14 @@ LinkOCGState::LinkOCGState(const Object *obj)
 //------------------------------------------------------------------------
 
 LinkHide::LinkHide(const Object *hideObj) {
-  targetName = nullptr;
+  hasTargetNameFlag = false;
   show = false; // Default
 
   if (hideObj->isDict()) {
       const Object targetObj = hideObj->dictLookup("T");
       if (targetObj.isString()) {
-	targetName = targetObj.getString()->copy();
+	targetName = targetObj.getString()->toStr();
+        hasTargetNameFlag = true;
       }
       const Object shouldHide = hideObj->dictLookup("H");
       if (shouldHide.isBool()) {
@@ -887,10 +888,6 @@ LinkHide::LinkHide(const Object *hideObj) {
   }
 }
 
-LinkHide::~LinkHide() {
-  delete targetName;
-}
-
 //------------------------------------------------------------------------
 // LinkUnknown
 //------------------------------------------------------------------------
diff --git a/poppler/Link.h b/poppler/Link.h
index 532eac74..48a7a91e 100644
--- a/poppler/Link.h
+++ b/poppler/Link.h
@@ -470,9 +470,7 @@ class LinkHide: public LinkAction {
 public:
   LinkHide(const Object *hideObj);
 
-  ~LinkHide() override;
-
-  bool isOk() const override { return targetName != nullptr; }
+  bool isOk() const override { return hasTargetNameFlag; }
   LinkActionKind getKind() const override { return actionHide; }
 
   // According to spec the target can be either:
@@ -484,14 +482,16 @@ public:
   // While b / c appear to be very uncommon and can't easily be
   // created with Adobe Acrobat DC. So only support hide
   // actions with named targets (yet).
-  bool hasTargetName() const { return targetName != nullptr; }
-  const GooString *getTargetName() const { return targetName; }
+  bool hasTargetName() const { return hasTargetNameFlag; }
+  const std::string& getTargetName() const { return targetName; }
 
   // Should this action show or hide.
   bool isShowAction() const { return show; }
 
 private:
-  GooString *targetName;
+
+  bool hasTargetNameFlag;
+  std::string targetName;
   bool show;
 };
 
commit 9c8d05116e8d4fc26c5a9cd5a41aadb1f39b7f9f
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Sun Jan 26 04:46:44 2020 +0100

    Implement UnicodeParsedString for std::string

diff --git a/goo/GooString.h b/goo/GooString.h
index 5d17c4e5..11baa8ae 100644
--- a/goo/GooString.h
+++ b/goo/GooString.h
@@ -173,7 +173,9 @@ public:
   bool endsWith(const char *suffix) const;
 
   bool hasUnicodeMarker() const { return size() >= 2 && (*this)[0] == '\xfe' && (*this)[1] == '\xff'; }
+  static bool hasUnicodeMarker(const std::string& s) { return s.size() >= 2 && s[0] == '\xfe' && s[1] == '\xff'; }
   bool hasUnicodeMarkerLE() const { return size() >= 2 && (*this)[0] == '\xff' && (*this)[1] == '\xfe'; }
+  static bool hasUnicodeMarkerLE(const std::string& s) { return s.size() >= 2 && s[0] == '\xff' && s[1] == '\xfe'; }
   bool hasJustUnicodeMarker() const { return size() == 2 && hasUnicodeMarker(); }
 
   void prependUnicodeMarker();
diff --git a/poppler/Form.cc b/poppler/Form.cc
index 2a8d5df6..60226223 100644
--- a/poppler/Form.cc
+++ b/poppler/Form.cc
@@ -59,12 +59,12 @@
 #include "Lexer.h"
 
 //return a newly allocated char* containing an UTF16BE string of size length
-char* pdfDocEncodingToUTF16 (const GooString* orig, int* length)
+char* pdfDocEncodingToUTF16 (const std::string& orig, int* length)
 {
   //double size, a unicode char takes 2 char, add 2 for the unicode marker
-  *length = 2+2*orig->getLength();
+  *length = 2+2*orig.size();
   char *result = new char[(*length)];
-  const char *cstring = orig->c_str();
+  const char *cstring = orig.c_str();
   //unicode marker
   result[0] = '\xfe';
   result[1] = '\xff';
@@ -80,7 +80,7 @@ char* pdfDocEncodingToUTF16 (const GooString* orig, int* length)
 static GooString *convertToUtf16(GooString *pdfDocEncodingString)
 {
   int tmp_length;
-  char* tmp_str = pdfDocEncodingToUTF16(pdfDocEncodingString, &tmp_length);
+  char* tmp_str = pdfDocEncodingToUTF16(pdfDocEncodingString->toStr(), &tmp_length);
   delete pdfDocEncodingString;
   pdfDocEncodingString = new GooString(tmp_str, tmp_length);
   delete [] tmp_str;
@@ -877,7 +877,7 @@ GooString* FormField::getFullyQualifiedName() {
           full_name->insert(0, parent_name->c_str() + 2, parent_name->getLength() - 2); // Remove the unicode BOM
         } else {
           int tmp_length;
-          char* tmp_str = pdfDocEncodingToUTF16(parent_name, &tmp_length);
+          char* tmp_str = pdfDocEncodingToUTF16(parent_name->toStr(), &tmp_length);
           full_name->insert(0, tmp_str + 2, tmp_length - 2); // Remove the unicode BOM
           delete [] tmp_str;
         }
@@ -901,7 +901,7 @@ GooString* FormField::getFullyQualifiedName() {
         full_name->append(partialName->c_str() + 2, partialName->getLength() - 2); // Remove the unicode BOM
       } else {
         int tmp_length;
-        char* tmp_str = pdfDocEncodingToUTF16(partialName, &tmp_length);
+        char* tmp_str = pdfDocEncodingToUTF16(partialName->toStr(), &tmp_length);
         full_name->append(tmp_str + 2, tmp_length - 2); // Remove the unicode BOM
         delete [] tmp_str;
       }
@@ -1189,7 +1189,7 @@ FormFieldText::FormFieldText(PDFDoc *docA, Object &&dictObj, const Ref refA, For
     } else if (obj1.getString()->getLength() > 0) {
       //non-unicode string -- assume pdfDocEncoding and try to convert to UTF16BE
       int tmp_length;
-      char* tmp_str = pdfDocEncodingToUTF16(obj1.getString(), &tmp_length);
+      char* tmp_str = pdfDocEncodingToUTF16(obj1.getString()->toStr(), &tmp_length);
       content = new GooString(tmp_str, tmp_length);
       delete [] tmp_str;
     }
diff --git a/poppler/PDFDocEncoding.h b/poppler/PDFDocEncoding.h
index 1d6080e1..7df3e8cb 100644
--- a/poppler/PDFDocEncoding.h
+++ b/poppler/PDFDocEncoding.h
@@ -24,12 +24,14 @@
 #ifndef PDFDOCENCODING_H
 #define PDFDOCENCODING_H
 
+#include <string>
+
 #include "CharTypes.h"
 
 class GooString;
 
 extern const Unicode pdfDocEncoding[256];
 
-char* pdfDocEncodingToUTF16 (const GooString* orig, int* length);
+char* pdfDocEncodingToUTF16 (const std::string& orig, int* length);
 
 #endif
diff --git a/qt5/src/poppler-private.cc b/qt5/src/poppler-private.cc
index 81af2bed..cb5bf8f1 100644
--- a/qt5/src/poppler-private.cc
+++ b/qt5/src/poppler-private.cc
@@ -97,12 +97,16 @@ namespace Debug {
     }
 
     QString UnicodeParsedString(const GooString *s1) {
-        if ( !s1 || s1->getLength() == 0 )
+        return (s1) ? UnicodeParsedString(s1->toStr()) : QString();
+    }
+
+    QString UnicodeParsedString(const std::string& s1) {
+        if ( s1.empty() )
             return QString();
 
-        if ( s1->hasUnicodeMarker() || s1->hasUnicodeMarkerLE() )
+        if ( GooString::hasUnicodeMarker(s1) || GooString::hasUnicodeMarkerLE(s1) )
         {
-            return QString::fromUtf16(reinterpret_cast<const ushort *>(s1->c_str()), s1->getLength() / 2);
+            return QString::fromUtf16(reinterpret_cast<const ushort *>(s1.c_str()), s1.size() / 2);
         }
         else
         {
diff --git a/qt5/src/poppler-private.h b/qt5/src/poppler-private.h
index 9131dba6..c6161364 100644
--- a/qt5/src/poppler-private.h
+++ b/qt5/src/poppler-private.h
@@ -71,6 +71,8 @@ namespace Poppler {
 
     POPPLER_QT5_EXPORT QString UnicodeParsedString(const GooString *s1);
 
+    POPPLER_QT5_EXPORT QString UnicodeParsedString(const std::string& s1);
+
     POPPLER_QT5_EXPORT GooString *QStringToUnicodeGooString(const QString &s);
 
     POPPLER_QT5_EXPORT GooString *QStringToGooString(const QString &s);
commit be45004531235f4dc3cce92e5a24b7cff6c385c1
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Thu Jan 23 17:57:52 2020 +0100

    Use a std::string value in LinkUnknown

diff --git a/poppler/Link.cc b/poppler/Link.cc
index 8d823919..74b16d7f 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -896,11 +896,7 @@ LinkHide::~LinkHide() {
 //------------------------------------------------------------------------
 
 LinkUnknown::LinkUnknown(const char *actionA) {
-  action = new GooString(actionA);
-}
-
-LinkUnknown::~LinkUnknown() {
-  delete action;
+  action = std::string(actionA ? actionA : "");
 }
 
 //------------------------------------------------------------------------
diff --git a/poppler/Link.h b/poppler/Link.h
index 4d10f2dd..532eac74 100644
--- a/poppler/Link.h
+++ b/poppler/Link.h
@@ -505,19 +505,17 @@ public:
   // Build a LinkUnknown with the specified action type.
   LinkUnknown(const char *actionA);
 
-  // Destructor.
-  ~LinkUnknown() override;
-
   // Was the LinkUnknown create successfully?
-  bool isOk() const override { return action != nullptr; }
+  // Yes: nothing can go wrong when creating LinkUnknown objects
+  bool isOk() const override { return true; }
 
   // Accessors.
   LinkActionKind getKind() const override { return actionUnknown; }
-  const GooString *getAction() const { return action; }
+  const std::string& getAction() const { return action; }
 
 private:
 
-  GooString *action;		// action subtype
+  std::string action;		// action subtype
 };
 
 //------------------------------------------------------------------------


More information about the poppler mailing list