[SCM] exiv2 packaging branch, master, updated. debian/0.25-3.1-3734-gdcbc29a

Maximiliano Curia maxy at moszumanska.debian.org
Thu Jul 13 17:47:22 UTC 2017


Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/exiv2.git;a=commitdiff;h=2ebacb6

The following commit has been merged in the master branch:
commit 2ebacb6b0bf8eccac062ffd80a30aa78385eee60
Author: Robin Mills <robin at clanmills.com>
Date:   Sun Mar 5 17:42:12 2017 +0000

    #1272 Use in-memory temporary files.
---
 config/configure.ac       |   5 ++-
 include/exiv2/basicio.hpp |  47 ---------------------
 src/actions.cpp           |  50 +++++++++++++++++++++-
 src/basicio.cpp           | 104 ----------------------------------------------
 src/crwimage.cpp          |   2 +-
 src/epsimage.cpp          |   2 +-
 src/jp2image.cpp          |   2 +-
 src/jpgimage.cpp          |   4 +-
 src/pgfimage.cpp          |   2 +-
 src/pngimage.cpp          |   2 +-
 src/psdimage.cpp          |   2 +-
 src/tiffimage.cpp         |   2 +-
 src/webpimage.cpp         |   2 +-
 src/xmpsidecar.cpp        |   2 +-
 test/Makefile             |   1 -
 15 files changed, 62 insertions(+), 167 deletions(-)

diff --git a/config/configure.ac b/config/configure.ac
index 2dab6d3..a4d279f 100644
--- a/config/configure.ac
+++ b/config/configure.ac
@@ -365,8 +365,9 @@ case "$host_os" in
         CPPFLAGS="$CPPFLAGS"               # mingw doesn't link pthreads if you specify -std !!
     ;;
     *)
-        if [ $GCC_VERSION -le 5 ]; then CPPFLAGS="$CPPFLAGS -std=c++98"    # // most others use c++98
-        else                            CPPFLAGS="$CPPFLAGS -std=gnu++98"  # // but not GCC 6
+        CPPFLAGS="$CPPFLAGS -std=c++98"
+        if [[ ! -z "$GCC_VERSION" ]]; then
+            if [[ "$GCC_VERSION" -ge 6 ]]; then CPPFLAGS="$CPPFLAGS -std=gnu++98" ; fi  # // not GCC 6
         fi
     ;;
 esac
diff --git a/include/exiv2/basicio.hpp b/include/exiv2/basicio.hpp
index 39a14bc..fb9ec04 100644
--- a/include/exiv2/basicio.hpp
+++ b/include/exiv2/basicio.hpp
@@ -242,20 +242,6 @@ namespace Exiv2 {
          */
         virtual std::wstring wpath() const =0;
 #endif
-        /*!
-          @brief Returns a temporary data storage location. This is often
-              needed to rewrite an IO source.
-
-          For example, data may be read from the original IO source, modified
-          in some way, and then saved to the temporary instance. After the
-          operation is complete, the BasicIo::transfer method can be used to
-          replace the original IO source with the modified version. Subclasses
-          are free to return any class that derives from BasicIo.
-
-          @return An instance of BasicIo on success
-          @throw Error In case of failure
-         */
-        virtual BasicIo::AutoPtr temporary() const = 0;
 
         /*!
           @brief Mark all the bNone blocks to bKnow. This avoids allocating memory
@@ -527,16 +513,6 @@ namespace Exiv2 {
          */
         virtual std::wstring wpath() const;
 #endif
-        /*!
-          @brief Returns a temporary data storage location. The actual type
-              returned depends upon the size of the file represented a FileIo
-              object. For small files, a MemIo is returned while for large files
-              a FileIo is returned. Callers should not rely on this behavior,
-              however, since it may change.
-          @return An instance of BasicIo on success
-          @throw Error If opening the temporary file fails
-         */
-        virtual BasicIo::AutoPtr temporary() const;
 
         /*!
           @brief Mark all the bNone blocks to bKnow. This avoids allocating memory
@@ -548,15 +524,6 @@ namespace Exiv2 {
         virtual void populateFakeData();
         //@}
 
-        /*!
-          @brief Returns the path to a temporary data storage location.
-         */
-#ifdef EXV_UNICODE_PATH
-        static std::wstring temporaryPath();
-#else
-        static std::string  temporaryPath();
-#endif
-
     private:
         // NOT IMPLEMENTED
         //! Copy constructor
@@ -745,13 +712,6 @@ namespace Exiv2 {
          */
         virtual std::wstring wpath() const;
 #endif
-        /*!
-          @brief Returns a temporary data storage location. Currently returns
-              an empty MemIo object, but callers should not rely on this
-              behavior since it may change.
-          @return An instance of BasicIo
-         */
-        virtual BasicIo::AutoPtr temporary() const;
 
         /*!
           @brief Mark all the bNone blocks to bKnow. This avoids allocating memory
@@ -1090,13 +1050,6 @@ namespace Exiv2 {
         */
        virtual std::wstring wpath() const;
 #endif
-       /*!
-         @brief Returns a temporary data storage location. Currently returns
-             an empty MemIo object, but callers should not rely on this
-             behavior since it may change.
-         @return An instance of BasicIo
-        */
-       virtual BasicIo::AutoPtr temporary() const;
 
         /*!
           @brief Mark all the bNone blocks to bKnow. This avoids allocating memory
diff --git a/src/actions.cpp b/src/actions.cpp
index c999dd7..4bf8cf5 100644
--- a/src/actions.cpp
+++ b/src/actions.cpp
@@ -2039,6 +2039,52 @@ namespace {
         return os.str();
     } // tm2Str
 
+// use static CS/MUTEX to make temporaryPath() thread safe
+#if defined(_MSC_VER) || defined(__MINGW__)
+ static CRITICAL_SECTION cs;
+#else
+ /* Unix/Linux/Cygwin/MacOSX */
+ #include <pthread.h>
+ #if defined(__APPLE__)
+  /* This is the critical section object (statically allocated). */
+  static pthread_mutex_t cs =  PTHREAD_RECURSIVE_MUTEX_INITIALIZER;
+ #else
+  static pthread_mutex_t cs =  PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
+ #endif
+#endif
+
+    static std::string temporaryPath()
+    {
+        static int  count = 0 ;
+
+#if defined(_MSC_VER) || defined(__MINGW__)
+        EnterCriticalSection(&cs);
+        char lpTempPathBuffer[MAX_PATH];
+        GetTempPath(MAX_PATH,lpTempPathBuffer);
+        std::string tmp(lpTempPathBuffer);
+        tmp += "\";
+        HANDLE process=0;
+        DWORD  pid = ::GetProcessId(process);
+#else
+        pid_t  pid = ::getpid();
+        pthread_mutex_lock( &cs );
+        std::string tmp = "/tmp/";
+#endif
+        char        sCount[12];
+        sprintf(sCount,"_%d",++count);
+
+        std::string result = tmp + Exiv2::toString(pid) + sCount ;
+        if ( Exiv2::fileExists(result) ) std::remove(result.c_str());
+
+#if defined(_MSC_VER) || defined(__MINGW__)
+        LeaveCriticalSection(&cs);
+#else
+        pthread_mutex_unlock( &cs );
+#endif
+
+        return result;
+    }
+
     int metacopy(const std::string& source,
                  const std::string& tgt,
                  int targetType,
@@ -2072,9 +2118,9 @@ namespace {
 
         // Open or create the target file
 #ifdef EXV_UNICODE_PATH
-        std::string target = bStdout ? Exiv2::ws2s(Exiv2::FileIo::temporaryPath()) : tgt;
+        std::string target = bStdout ? Exiv2::ws2s(temporaryPath()) : tgt;
 #else
-        std::string target = bStdout ?             Exiv2::FileIo::temporaryPath()  : tgt;
+        std::string target = bStdout ?             temporaryPath()  : tgt;
 #endif
 
         Exiv2::Image::AutoPtr targetImage;
diff --git a/src/basicio.cpp b/src/basicio.cpp
index d2fadec..c13097d 100644
--- a/src/basicio.cpp
+++ b/src/basicio.cpp
@@ -566,100 +566,6 @@ namespace Exiv2 {
     }
 #endif
 
-    BasicIo::AutoPtr FileIo::temporary() const
-    {
-        BasicIo::AutoPtr basicIo;
-
-        Impl::StructStat buf;
-        int ret = p_->stat(buf);
-#if defined WIN32 && !defined __CYGWIN__
-        DWORD nlink = p_->winNumberOfLinks();
-#else
-        nlink_t nlink = buf.st_nlink;
-#endif
-#ifdef EXV_UNICODE_PATH
-        std::wstring tmpname;
-#else
-        std::string tmpname;
-#endif
-        // If file is > 1MB and doesn't have hard links then use a file, otherwise
-        // use a memory buffer. I.e., files with hard links always use a memory
-        // buffer, which is a workaround to ensure that the links don't get broken.
-        if (ret != 0 || (buf.st_size > 1048576 && nlink == 1))
-		{
-            pid_t pid = ::getpid();
-            std::auto_ptr<FileIo> fileIo;
-#ifdef EXV_UNICODE_PATH
-            tmpname = temporaryPath() + s2ws(toString(pid));
-            fileIo = std::auto_ptr<FileIo>(new FileIo(tmpname));
-#else
-            tmpname = temporaryPath() + toString(pid);
-            fileIo = std::auto_ptr<FileIo>(new FileIo(tmpname));
-#endif
-            if (fileIo->open("w+b") != 0) {
-#ifdef EXV_UNICODE_PATH
-#if    defined(_MSC_VER)
-                if( !DeleteFileW( tmpname.c_str()) )
-                {
-                    perror("Error deleting file");
-                    throw WError(10, ws2s(tmpname).c_str(), "w+b", strError().c_str());
-                }
-#endif
-#else
-#if defined(_MSC_VER) || defined(__MINGW__)
-                if( !DeleteFile( tmpname.c_str() ) )
-#else
-                if( remove( tmpname.c_str() ) != 0 )
-#endif
-#endif
-                {
-                        perror("Error deleting file");
-                }
-                throw Error(10, tmpname.c_str(), "w+b", strError());
-            }
-            fileIo->p_->copyXattrFrom(*this);
-            basicIo = fileIo;
-        } else {
-            basicIo.reset(new MemIo);
-        }
-
-        return basicIo;
-    }
-
-    static std::string tempPath()
-    {
-        static int  count = 0 ;
-        char       sCount[12];
-        sprintf(sCount,"_%d",count++);
-
-#if defined(_MSC_VER) || defined(__MINGW__)
-        char lpTempPathBuffer[MAX_PATH];
-        GetTempPath(MAX_PATH,lpTempPathBuffer);
-        std::string tmp(lpTempPathBuffer);
-        tmp += "\";
-#else
-        std::string tmp = "/tmp/";
-#endif
-
-        pid_t  pid = ::getpid();
-        std::string result = tmp + toString(pid) + sCount ;
-        if ( Exiv2::fileExists(result) ) std::remove(result.c_str());
-
-        return result;
-    }
-
-#ifdef EXV_UNICODE_PATH
-    std::wstring FileIo::temporaryPath()
-    {
-		return s2ws(tempPath());
-    }
-#else
-    std::string FileIo::temporaryPath()
-    {
-		return tempPath();
-    }
-#endif
-
     long FileIo::write(const byte* data, long wcount)
     {
         assert(p_->fp_ != 0);
@@ -1218,11 +1124,6 @@ namespace Exiv2 {
         delete p_;
     }
 
-    BasicIo::AutoPtr MemIo::temporary() const
-    {
-        return BasicIo::AutoPtr(new MemIo);
-    }
-
     long MemIo::write(const byte* data, long wcount)
     {
         p_->reserve(wcount);
@@ -1991,11 +1892,6 @@ namespace Exiv2 {
     }
 #endif
 
-    BasicIo::AutoPtr RemoteIo::temporary() const
-    {
-        return BasicIo::AutoPtr(new MemIo);
-    }
-
     void RemoteIo::populateFakeData()
     {
         assert(p_->isMalloced_);
diff --git a/src/crwimage.cpp b/src/crwimage.cpp
index dfee119..285b345 100644
--- a/src/crwimage.cpp
+++ b/src/crwimage.cpp
@@ -169,7 +169,7 @@ namespace Exiv2 {
         CrwParser::encode(blob, buf.pData_, buf.size_, this);
 
         // Write new buffer to file
-        BasicIo::AutoPtr tempIo(io_->temporary()); // may throw
+        MemIo::AutoPtr tempIo(new MemIo);
         assert(tempIo.get() != 0);
         tempIo->write((blob.size() > 0 ? &blob[0] : 0), static_cast<long>(blob.size()));
         io_->close();
diff --git a/src/epsimage.cpp b/src/epsimage.cpp
index 6e277e8..4e7dde5 100644
--- a/src/epsimage.cpp
+++ b/src/epsimage.cpp
@@ -809,7 +809,7 @@ namespace {
             }
 
             // create temporary output file
-            BasicIo::AutoPtr tempIo(io.temporary());
+            BasicIo::AutoPtr tempIo(new MemIo);
             assert (tempIo.get() != 0);
             if (!tempIo->isopen()) {
                 #ifndef SUPPRESS_WARNINGS
diff --git a/src/jp2image.cpp b/src/jp2image.cpp
index 0b1ed49..01099d7 100644
--- a/src/jp2image.cpp
+++ b/src/jp2image.cpp
@@ -589,7 +589,7 @@ namespace Exiv2
             throw Error(9, io_->path(), strError());
         }
         IoCloser closer(*io_);
-        BasicIo::AutoPtr tempIo(io_->temporary()); // may throw
+        BasicIo::AutoPtr tempIo(new MemIo);
         assert (tempIo.get() != 0);
 
         doWriteMetadata(*tempIo); // may throw
diff --git a/src/jpgimage.cpp b/src/jpgimage.cpp
index cd07d17..82bd01d 100644
--- a/src/jpgimage.cpp
+++ b/src/jpgimage.cpp
@@ -834,7 +834,7 @@ namespace Exiv2 {
             // exiv2 -pS E.jpg
 
             // binary copy io_ to a temporary file
-            BasicIo::AutoPtr tempIo(io_->temporary()); // may throw
+            BasicIo::AutoPtr tempIo(new MemIo);
 
             assert (tempIo.get() != 0);
             for ( uint64_t i = 0 ; i < (count/2)+1 ; i++ ) {
@@ -866,7 +866,7 @@ namespace Exiv2 {
             throw Error(9, io_->path(), strError());
         }
         IoCloser closer(*io_);
-        BasicIo::AutoPtr tempIo(io_->temporary()); // may throw
+        BasicIo::AutoPtr tempIo(new MemIo);
         assert (tempIo.get() != 0);
 
         doWriteMetadata(*tempIo); // may throw
diff --git a/src/pgfimage.cpp b/src/pgfimage.cpp
index 8b399d9..ab205a5 100644
--- a/src/pgfimage.cpp
+++ b/src/pgfimage.cpp
@@ -163,7 +163,7 @@ namespace Exiv2 {
             throw Error(9, io_->path(), strError());
         }
         IoCloser closer(*io_);
-        BasicIo::AutoPtr tempIo(io_->temporary()); // may throw
+        BasicIo::AutoPtr tempIo(new MemIo);
         assert (tempIo.get() != 0);
 
         doWriteMetadata(*tempIo); // may throw
diff --git a/src/pngimage.cpp b/src/pngimage.cpp
index b0a288e..33bed6c 100644
--- a/src/pngimage.cpp
+++ b/src/pngimage.cpp
@@ -494,7 +494,7 @@ namespace Exiv2 {
             throw Error(9, io_->path(), strError());
         }
         IoCloser closer(*io_);
-        BasicIo::AutoPtr tempIo(io_->temporary()); // may throw
+        BasicIo::AutoPtr tempIo(new MemIo);
         assert (tempIo.get() != 0);
 
         doWriteMetadata(*tempIo); // may throw
diff --git a/src/psdimage.cpp b/src/psdimage.cpp
index 9b361b9..afa8644 100644
--- a/src/psdimage.cpp
+++ b/src/psdimage.cpp
@@ -348,7 +348,7 @@ namespace Exiv2 {
             throw Error(9, io_->path(), strError());
         }
         IoCloser closer(*io_);
-        BasicIo::AutoPtr tempIo(io_->temporary()); // may throw
+        BasicIo::AutoPtr tempIo(new MemIo);
         assert (tempIo.get() != 0);
 
         doWriteMetadata(*tempIo); // may throw
diff --git a/src/tiffimage.cpp b/src/tiffimage.cpp
index 79c27ff..abcecd4 100644
--- a/src/tiffimage.cpp
+++ b/src/tiffimage.cpp
@@ -1968,7 +1968,7 @@ namespace Exiv2 {
             encoder.add(createdTree.get(), parsedTree.get(), root);
             // Write binary representation from the composite tree
             DataBuf header = pHeader->write();
-            BasicIo::AutoPtr tempIo(io.temporary()); // may throw
+            BasicIo::AutoPtr tempIo(new MemIo);
             assert(tempIo.get() != 0);
             IoWrapper ioWrapper(*tempIo, header.pData_, header.size_, pOffsetWriter);
             uint32_t imageIdx(uint32_t(-1));
diff --git a/src/webpimage.cpp b/src/webpimage.cpp
index 86cc94b..5e852bf 100644
--- a/src/webpimage.cpp
+++ b/src/webpimage.cpp
@@ -120,7 +120,7 @@ namespace Exiv2 {
             throw Error(9, io_->path(), strError());
         }
         IoCloser closer(*io_);
-        BasicIo::AutoPtr tempIo(io_->temporary()); // may throw
+        BasicIo::AutoPtr tempIo(new MemIo);
         assert (tempIo.get() != 0);
 
         doWriteMetadata(*tempIo); // may throw
diff --git a/src/xmpsidecar.cpp b/src/xmpsidecar.cpp
index a61370e..0092422 100644
--- a/src/xmpsidecar.cpp
+++ b/src/xmpsidecar.cpp
@@ -159,7 +159,7 @@ namespace Exiv2 {
             if (xmpPacket_.substr(0, 5)  != "<?xml") {
                 xmpPacket_ = xmlHeader + xmpPacket_ + xmlFooter;
             }
-            BasicIo::AutoPtr tempIo(io_->temporary()); // may throw
+            BasicIo::AutoPtr tempIo(new MemIo);
             assert(tempIo.get() != 0);
             // Write XMP packet
             if (   tempIo->write(reinterpret_cast<const byte*>(xmpPacket_.data()),
diff --git a/test/Makefile b/test/Makefile
index eaaac42..d9201a7 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -76,7 +76,6 @@ TESTS  = addmoddel.sh         \
          modify-test.sh       \
          path-test.sh         \
          preview-test.sh      \
-         stdin-test.sh        \
          stringto-test.sh     \
          tiff-test.sh         \
          webp-test.sh         \

-- 
exiv2 packaging



More information about the pkg-kde-commits mailing list