glib/poppler-action.cc | 2 - glib/poppler-attachment.cc | 15 +++--------- glib/poppler-media.cc | 19 ++++++---------- poppler/Annot.cc | 5 ---- poppler/FileSpec.h | 1 poppler/Rendition.cc | 53 ++++++++++++++++++++++----------------------- poppler/Rendition.h | 6 +++-- poppler/Stream.cc | 1 poppler/Stream.h | 18 +++++---------- 9 files changed, 51 insertions(+), 69 deletions(-)
New commits: commit b1f4e35fa2da8909dee07529ce1dd9445639793b Author: Albert Astals Cid <aa...@kde.org> Date: Fri May 12 23:03:28 2017 +0200 Make Stream incRef/decRef private Object handles it for us Also remove incRef/decRef from OutStream diff --git a/glib/poppler-action.cc b/glib/poppler-action.cc index e74d822d..ad8ed18d 100644 --- a/glib/poppler-action.cc +++ b/glib/poppler-action.cc @@ -476,7 +476,7 @@ find_annot_movie_for_action (PopplerDocument *document, if (annotObj.isDict ()) { Object tmp; - annot = new AnnotMovie (document->doc, annotObj.getDict(), &tmp); + annot = new AnnotMovie (document->doc, &annotObj, &tmp); if (!annot->isOk ()) { delete annot; annot = NULL; diff --git a/glib/poppler-attachment.cc b/glib/poppler-attachment.cc index 55936e78..5d84595a 100644 --- a/glib/poppler-attachment.cc +++ b/glib/poppler-attachment.cc @@ -35,7 +35,7 @@ typedef struct _PopplerAttachmentPrivate PopplerAttachmentPrivate; struct _PopplerAttachmentPrivate { - Object *obj_stream; + Object obj_stream; }; #define POPPLER_ATTACHMENT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), POPPLER_TYPE_ATTACHMENT, PopplerAttachmentPrivate)) @@ -64,12 +64,7 @@ poppler_attachment_dispose (GObject *obj) PopplerAttachmentPrivate *priv; priv = POPPLER_ATTACHMENT_GET_PRIVATE (obj); - - if (priv->obj_stream) - { - delete priv->obj_stream; - priv->obj_stream = NULL; - } + priv->obj_stream = Object(); G_OBJECT_CLASS (poppler_attachment_parent_class)->dispose (obj); } @@ -126,9 +121,7 @@ _poppler_attachment_new (FileSpec *emb_file) if (embFile->checksum () && embFile->checksum ()->getLength () > 0) attachment->checksum = g_string_new_len (embFile->checksum ()->getCString (), embFile->checksum ()->getLength ()); - priv->obj_stream = new Object(embFile->stream()); - // Copy the stream - embFile->stream()->incRef(); + priv->obj_stream = embFile->streamObject()->copy(); return attachment; } @@ -241,7 +234,7 @@ poppler_attachment_save_to_callback (PopplerAttachment *attachment, g_return_val_if_fail (POPPLER_IS_ATTACHMENT (attachment), FALSE); - stream = POPPLER_ATTACHMENT_GET_PRIVATE (attachment)->obj_stream->getStream(); + stream = POPPLER_ATTACHMENT_GET_PRIVATE (attachment)->obj_stream.getStream(); stream->reset(); do diff --git a/glib/poppler-media.cc b/glib/poppler-media.cc index 57123719..8634af43 100644 --- a/glib/poppler-media.cc +++ b/glib/poppler-media.cc @@ -40,7 +40,7 @@ struct _PopplerMedia gchar *filename; gchar *mime_type; - Stream *stream; + Object stream; }; struct _PopplerMediaClass @@ -65,10 +65,7 @@ poppler_media_finalize (GObject *object) media->mime_type = NULL; } - if (media->stream) { - media->stream->decRef(); - media->stream = NULL; - } + media->stream = Object(); G_OBJECT_CLASS (poppler_media_parent_class)->finalize (object); } @@ -98,7 +95,7 @@ _poppler_media_new (MediaRendition *poppler_media) if (poppler_media->getIsEmbedded()) { GooString* mime_type; - media->stream = poppler_media->getEmbbededStream(); + media->stream = poppler_media->getEmbbededStreamObject()->copy(); mime_type = poppler_media->getContentType(); if (mime_type) media->mime_type = g_strdup (mime_type->getCString()); @@ -124,7 +121,7 @@ const gchar * poppler_media_get_filename (PopplerMedia *poppler_media) { g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), NULL); - g_return_val_if_fail (poppler_media->stream == NULL, NULL); + g_return_val_if_fail (!poppler_media->stream.isStream(), NULL); return poppler_media->filename; } @@ -147,7 +144,7 @@ poppler_media_is_embedded (PopplerMedia *poppler_media) { g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), FALSE); - return poppler_media->stream != NULL; + return poppler_media->stream.isStream(); } /** @@ -215,7 +212,7 @@ poppler_media_save (PopplerMedia *poppler_media, FILE *f; g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), FALSE); - g_return_val_if_fail (poppler_media->stream != NULL, FALSE); + g_return_val_if_fail (poppler_media->stream.isStream(), FALSE); f = g_fopen (filename, "wb"); @@ -281,9 +278,9 @@ poppler_media_save_to_callback (PopplerMedia *poppler_media, gboolean eof_reached = FALSE; g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), FALSE); - g_return_val_if_fail (poppler_media->stream != NULL, FALSE); + g_return_val_if_fail (poppler_media->stream.isStream(), FALSE); - stream = poppler_media->stream; + stream = poppler_media->stream.getStream(); stream->reset(); do diff --git a/poppler/FileSpec.h b/poppler/FileSpec.h index 8cdd73c1..6133117b 100644 --- a/poppler/FileSpec.h +++ b/poppler/FileSpec.h @@ -32,6 +32,7 @@ public: GooString *createDate() { return m_createDate; } GooString *checksum() { return m_checksum; } GooString *mimeType() { return m_mimetype; } + Object *streamObject() { return &m_objStr; } Stream *stream() { return isOk() ? m_objStr.getStream() : NULL; } GBool isOk() { return m_objStr.isStream(); } GBool save(const char *path); diff --git a/poppler/Rendition.cc b/poppler/Rendition.cc index 4e7727e8..89bf1a50 100644 --- a/poppler/Rendition.cc +++ b/poppler/Rendition.cc @@ -246,14 +246,8 @@ void MediaParameters::parseMediaScreenParameters(Object* obj) { } MediaRendition::~MediaRendition() { - if (fileName) - delete fileName; - if (contentType) - delete contentType; - - if (embeddedStream && (!embeddedStream->decRef())) { - delete embeddedStream; - } + delete fileName; + delete contentType; } MediaRendition::MediaRendition(Object* obj) { @@ -263,7 +257,6 @@ MediaRendition::MediaRendition(Object* obj) { fileName = NULL; contentType = NULL; isEmbedded = gFalse; - embeddedStream = NULL; // // Parse media clip data @@ -285,9 +278,7 @@ MediaRendition::MediaRendition(Object* obj) { Object embedded = obj2.dictLookup("F"); if (embedded.isStream()) { isEmbedded = gTrue; - embeddedStream = embedded.getStream(); - // "copy" stream - embeddedStream->incRef(); + embeddedStreamObject = embedded.copy(); } } @@ -346,14 +337,32 @@ MediaRendition::MediaRendition(Object* obj) { } } +MediaRendition::MediaRendition(const MediaRendition &other) { + ok = other.ok; + MH = other.MH; + BE = other.BE; + isEmbedded = other.isEmbedded; + embeddedStreamObject = other.embeddedStreamObject.copy(); + + if (other.contentType) + contentType = other.contentType->copy(); + else + contentType = nullptr; + + if (other.fileName) + fileName = other.fileName->copy(); + else + fileName = nullptr; +} + void MediaRendition::outputToFile(FILE* fp) { if (!isEmbedded) return; - embeddedStream->reset(); + embeddedStreamObject.streamReset(); while (1) { - int c = embeddedStream->getChar(); + int c = embeddedStreamObject.streamGetChar(); if (c == EOF) break; @@ -362,19 +371,9 @@ void MediaRendition::outputToFile(FILE* fp) { } -MediaRendition *MediaRendition::copy() { - // call default copy constructor - MediaRendition* new_media = new MediaRendition(*this); - - if (contentType) - new_media->contentType = contentType->copy(); - if (fileName) - new_media->fileName = fileName->copy(); - - if (new_media->embeddedStream) - new_media->embeddedStream->incRef(); - - return new_media; +MediaRendition* MediaRendition::copy() +{ + return new MediaRendition(*this); } // TODO: SelectorRendition diff --git a/poppler/Rendition.h b/poppler/Rendition.h index 75bfeff3..3b26cea7 100644 --- a/poppler/Rendition.h +++ b/poppler/Rendition.h @@ -118,6 +118,7 @@ struct MediaParameters { class MediaRendition { public: MediaRendition(Object *obj); + MediaRendition(const MediaRendition &other); ~MediaRendition(); GBool isOk () { return ok; } @@ -129,7 +130,8 @@ class MediaRendition { GooString* getFileName() { return fileName; } GBool getIsEmbedded() { return isEmbedded; } - Stream* getEmbbededStream() { return embeddedStream; } + Stream* getEmbbededStream() { return isEmbedded ? embeddedStreamObject.getStream() : nullptr; } + Object* getEmbbededStreamObject() { return isEmbedded ? &embeddedStreamObject : nullptr; } // write embedded stream to file void outputToFile(FILE*); @@ -148,7 +150,7 @@ class MediaRendition { GooString* contentType; // if it's embedded - Stream* embeddedStream; + Object embeddedStreamObject; // if it's not embedded GooString* fileName; diff --git a/poppler/Stream.cc b/poppler/Stream.cc index 7b87912b..03d15de3 100644 --- a/poppler/Stream.cc +++ b/poppler/Stream.cc @@ -343,7 +343,6 @@ Stream *Stream::makeFilter(char *name, Stream *str, Object *params, int recursio //------------------------------------------------------------------------ OutStream::OutStream () { - ref = 1; } OutStream::~OutStream () diff --git a/poppler/Stream.h b/poppler/Stream.h index 12f23dd6..9c53ea39 100644 --- a/poppler/Stream.h +++ b/poppler/Stream.h @@ -105,10 +105,6 @@ public: // Destructor. virtual ~Stream(); - // Reference counting. - int incRef(); - int decRef(); - // Get kind of stream. virtual StreamKind getKind() = 0; @@ -230,6 +226,12 @@ public: Stream *addFilters(Dict *dict, int recursion = 0); private: + friend class Object; // for incRef/decRef + + // Reference counting. + int incRef(); + int decRef(); + virtual GBool hasGetChars() { return false; } virtual int getChars(int nChars, Guchar *buffer); @@ -255,10 +257,6 @@ public: // Desctructor. virtual ~OutStream (); - // Reference counting. - int incRef() { return ++ref; } - int decRef() { return --ref; } - // Close the stream virtual void close() = 0; @@ -269,10 +267,6 @@ public: virtual void put (char c) = 0; virtual void printf (const char *format, ...) GCC_PRINTF_FORMAT(2,3) = 0; - -private: - int ref; // reference count - }; //------------------------------------------------------------------------ commit d34e5304a9094d505ffce8ec4069d4ddf2ee5950 Author: Albert Astals Cid <aa...@kde.org> Date: Fri May 12 22:41:03 2017 +0200 Get rid of another incRef() call diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 5d52b51a..7e1941c3 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -6157,10 +6157,7 @@ AnnotSound::AnnotSound(PDFDoc *docA, PDFRectangle *rect, Sound *soundA) : type = typeSound; annotObj.dictSet ("Subtype", Object(objName, "Sound")); - - Stream *str = soundA->getStream(); - str->incRef(); - annotObj.dictSet ("Sound", Object(str)); + annotObj.dictSet ("Sound", soundA->getObject()->copy()); initialize(docA, annotObj.getDict()); } _______________________________________________ poppler mailing list poppler@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/poppler