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

Maximiliano Curia maxy at moszumanska.debian.org
Thu Jul 13 17:36:39 UTC 2017


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

The following commit has been merged in the master branch:
commit f40fba88bf70516b4a75a7355631c021d1142ec3
Author: Andreas Huggel <ahuggel at gmx.net>
Date:   Tue Oct 12 16:23:08 2004 +0000

    Added Image::AutoPtr and related updates
    Changed some local buffers to DataBuf
---
 src/Todo         |  4 +---
 src/actions.cpp  | 54 +++++++++++++++++++++---------------------
 src/exif.cpp     | 72 +++++++++++++++++++++++++++-----------------------------
 src/image.cpp    | 58 +++++++++++++++++++++------------------------
 src/image.hpp    | 38 +++++++++++++++---------------
 src/iptc.cpp     | 58 ++++++++++++++++++++++-----------------------
 src/metacopy.cpp | 14 +++++------
 src/types.cpp    | 21 +++++++++++++++--
 src/types.hpp    | 12 ++++++----
 9 files changed, 171 insertions(+), 160 deletions(-)

diff --git a/src/Todo b/src/Todo
index 5183d80..619ed92 100644
--- a/src/Todo
+++ b/src/Todo
@@ -3,7 +3,7 @@ Library Features:
 + add ExifData::erase(tag)
 + Thumbnail support: set (re-calculate)
 + operator>> for Value, since we already have read()?
-+ Use auto_ptr where applicable
++ Use auto_ptr and DataBuf where applicable
 + Use size_t where appropriate
 + Support TIFF type ids
 + Support for broken IFD makernotes (which have corrupted IFD offsets)
@@ -13,9 +13,7 @@ Library Features:
 + Write an example using low level IFD classes to print summary Exif info
 + Implement proper error handling
 + Complete support to create Exif data from scratch:
-  + set makernote, write makernote tags
   + set thumbnail, write thumbnail tags
-  + read and write unknown tags 
 + Make it possible to force write from metadata (just an optional arg to write?)
 
 + Get rid of Image::detach and make Image open files on-demand 
diff --git a/src/actions.cpp b/src/actions.cpp
index 99dac67..498928b 100644
--- a/src/actions.cpp
+++ b/src/actions.cpp
@@ -20,13 +20,13 @@
  */
 /*
   File:      actions.cpp
-  Version:   $Name:  $ $Revision: 1.37 $
+  Version:   $Name:  $ $Revision: 1.38 $
   Author(s): Andreas Huggel (ahu) <ahuggel at gmx.net>
   History:   08-Dec-03, ahu: created
  */
 // *****************************************************************************
 #include "rcsid.hpp"
-EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.37 $ $RCSfile: actions.cpp,v $");
+EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.38 $ $RCSfile: actions.cpp,v $");
 
 // *****************************************************************************
 // included header files
@@ -559,14 +559,14 @@ namespace Action {
                       << ": Failed to open the file
";
             return -1;
         }
-        Exiv2::Image* pImage = Exiv2::ImageFactory::instance().open(path_);
-        if (!pImage) {
+        Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::instance().open(path_);
+        if (image.get() == 0) {
             std::cerr << path_
                       << ": The file contains data of an unknown image type
";
             return -2;
         }
-        int rc = pImage->readMetadata();
-        pImage->detach();
+        int rc = image->readMetadata();
+        image->detach();
         if (rc) {
             std::cerr << path_
                       << ": Could not read metadata
";
@@ -575,8 +575,7 @@ namespace Action {
         if (Params::instance().verbose_) {
             std::cout << "Jpeg comment: ";
         }
-        std::cout << pImage->comment() << "
";
-        delete pImage;
+        std::cout << image->comment() << "
";
         return 0;
     } // Print::printComment
 
@@ -968,61 +967,62 @@ namespace {
                       << ": Failed to open the file
";
             return -1;
         }
-        Exiv2::Image* pSource = Exiv2::ImageFactory::instance().open(source);
-        if (!pSource) {
+        Exiv2::Image::AutoPtr sourceImage 
+            = Exiv2::ImageFactory::instance().open(source);
+        if (sourceImage.get() == 0) {
             std::cerr << source
                       << ": The file contains data of an unknown image type
";
             return -2;
         }
-        int rc = pSource->readMetadata();
-        pSource->detach();
+        int rc = sourceImage->readMetadata();
+        sourceImage->detach();
         if (rc) {
             std::cerr << source
                       << ": Could not read metadata
";
             return 1;
         }
-        Exiv2::Image* pTarget = Exiv2::ImageFactory::instance().open(target);
-        if (!pTarget) {
-            pTarget = Exiv2::ImageFactory::instance().create(Exiv2::Image::exv, 
-                                                             target);
+        Exiv2::Image::AutoPtr targetImage 
+            = Exiv2::ImageFactory::instance().open(target);
+        if (targetImage.get() == 0) {
+            targetImage 
+                = Exiv2::ImageFactory::instance().create(Exiv2::Image::exv, target);
         }
-        if (!pTarget) {
+        if (targetImage.get() == 0) {
             std::cerr << target 
                       << ": Could not open nor create the file
";
             return 2;
         }
         if (   Params::instance().target_ & Params::ctExif
-            && pSource->sizeExifData() > 0) {
+            && sourceImage->sizeExifData() > 0) {
             if (Params::instance().verbose_) {
                 std::cout << "Writing Exif data from " << source 
                           << " to " << target << "
";
             }
-            pTarget->setExifData(pSource->exifData(), pSource->sizeExifData());
+            targetImage->setExifData(sourceImage->exifData(), 
+                                     sourceImage->sizeExifData());
         }
         if (   Params::instance().target_ & Params::ctIptc
-            && pSource->sizeIptcData() > 0) {
+            && sourceImage->sizeIptcData() > 0) {
             if (Params::instance().verbose_) {
                 std::cout << "Writing Iptc data from " << source 
                           << " to " << target << "
";
             }
-            pTarget->setIptcData(pSource->iptcData(), pSource->sizeIptcData());
+            targetImage->setIptcData(sourceImage->iptcData(), 
+                                     sourceImage->sizeIptcData());
         }
         if (   Params::instance().target_ & Params::ctComment
-            && !pSource->comment().empty()) {
+            && !sourceImage->comment().empty()) {
             if (Params::instance().verbose_) {
                 std::cout << "Writing Jpeg comment from " << source 
                           << " to " << target << "
";
             }
-            pTarget->setComment(pSource->comment());
+            targetImage->setComment(sourceImage->comment());
         }
-        rc = pTarget->writeMetadata();
+        rc = targetImage->writeMetadata();
         if (rc) {
             std::cerr << target <<
                 ": Could not write metadata to file, rc = " << rc << "
";
         }
-        delete pSource;
-        delete pTarget;
         return rc;
-
     } // metacopy
 }
diff --git a/src/exif.cpp b/src/exif.cpp
index 1e0f41e..5ce5bcd 100644
--- a/src/exif.cpp
+++ b/src/exif.cpp
@@ -20,14 +20,14 @@
  */
 /*
   File:      exif.cpp
-  Version:   $Name:  $ $Revision: 1.63 $
+  Version:   $Name:  $ $Revision: 1.64 $
   Author(s): Andreas Huggel (ahu) <ahuggel at gmx.net>
   History:   26-Jan-04, ahu: created
              11-Feb-04, ahu: isolated as a component
  */
 // *****************************************************************************
 #include "rcsid.hpp"
-EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.63 $ $RCSfile: exif.cpp,v $");
+EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.64 $ $RCSfile: exif.cpp,v $");
 
 // Define DEBUG_MAKERNOTE to output debug information to std::cerr
 #undef DEBUG_MAKERNOTE
@@ -160,19 +160,19 @@ namespace Exiv2 {
 
     TiffThumbnail& TiffThumbnail::operator=(const TiffThumbnail& rhs)
     {
-        byte* pNewImage = 0;
+        DataBuf newImage;
         if (rhs.pImage_ && rhs.size_ > 0) {
-            pNewImage = new byte[rhs.size_];
-            memcpy(pNewImage, rhs.pImage_, rhs.size_);
+            newImage.alloc(rhs.size_);
+            memcpy(newImage.pData_, rhs.pImage_, rhs.size_);
             tiffHeader_.read(rhs.pImage_);
-            ifd_.read(pNewImage + tiffHeader_.offset(), 
+            ifd_.read(newImage.pData_ + tiffHeader_.offset(), 
                       rhs.size_ - tiffHeader_.offset(), 
                       tiffHeader_.byteOrder(), tiffHeader_.offset());
         }
         offset_ = rhs.offset_;
         size_ = rhs.size_;
         delete[] pImage_;
-        pImage_ = pNewImage;
+        pImage_ = newImage.release();
         return *this;
     }
 
@@ -385,15 +385,15 @@ namespace Exiv2 {
 
     JpegThumbnail& JpegThumbnail::operator=(const JpegThumbnail& rhs)
     {
-        byte* pNewImage = 0;
+        DataBuf newImage;
         if (rhs.pImage_ && rhs.size_ > 0) {
-            pNewImage = new byte[rhs.size_];
-            memcpy(pNewImage, rhs.pImage_, rhs.size_);
+            newImage.alloc(rhs.size_);
+            memcpy(newImage.pData_, rhs.pImage_, rhs.size_);
         }
         offset_ = rhs.offset_;
         size_ = rhs.size_;
         delete[] pImage_;
-        pImage_ = pNewImage;
+        pImage_ = newImage.release();
         return *this;
     }
 
@@ -511,22 +511,22 @@ namespace Exiv2 {
     int ExifData::read(const std::string& path)
     {
         if (!fileExists(path, true)) return -1;
-        Image* pImage = ImageFactory::instance().open(path);
-        if (pImage) {
-            int rc = pImage->readMetadata();
-            if (rc == 0) {
-                if (pImage->sizeExifData() > 0) {
-                    rc = read(pImage->exifData(), pImage->sizeExifData());
-                }
-                else {
-                    rc = 3;
-                }
+        Image::AutoPtr image = ImageFactory::instance().open(path);
+        if (image.get() == 0) {
+            // We don't know this type of file
+            return -2;
+        }
+
+        int rc = image->readMetadata();
+        if (rc == 0) {
+            if (image->sizeExifData() > 0) {
+                rc = read(image->exifData(), image->sizeExifData());
+            }
+            else {
+                rc = 3;
             }
-            delete pImage;
-            return rc;
         }
-        // We don't know this type of file
-        return -2;
+        return rc;
     }
 
     int ExifData::read(const byte* buf, long len)
@@ -633,16 +633,15 @@ namespace Exiv2 {
     int ExifData::erase(const std::string& path) const
     {
         if (!fileExists(path, true)) return -1;
-        Image* pImage = ImageFactory::instance().open(path);
-        if (pImage == 0) return -2;
+        Image::AutoPtr image = ImageFactory::instance().open(path);
+        if (image.get() == 0) return -2;
 
         // Read all metadata then erase only Exif data
-        int rc = pImage->readMetadata();
+        int rc = image->readMetadata();
         if (rc == 0) {
-            pImage->clearExifData();
-            rc = pImage->writeMetadata();
+            image->clearExifData();
+            rc = image->writeMetadata();
         }
-        delete pImage;
         return rc;
     } // ExifData::erase
 
@@ -652,20 +651,19 @@ namespace Exiv2 {
         if (count() == 0 && !pThumbnail_) return erase(path);
 
         if (!fileExists(path, true)) return -1;
-        Image* pImage = ImageFactory::instance().open(path);
-        if (pImage == 0) return -2;
+        Image::AutoPtr image = ImageFactory::instance().open(path);
+        if (image.get() == 0) return -2;
 
         DataBuf buf(size());
         long actualSize = copy(buf.pData_);
         assert(actualSize <= buf.size_);
 
         // Read all metadata to preserve non-Exif data
-        int rc = pImage->readMetadata();
+        int rc = image->readMetadata();
         if (rc == 0) {
-            pImage->setExifData(buf.pData_, actualSize);
-            rc = pImage->writeMetadata();
+            image->setExifData(buf.pData_, actualSize);
+            rc = image->writeMetadata();
         }
-        delete pImage;
         return rc;
     } // ExifData::write
 
diff --git a/src/image.cpp b/src/image.cpp
index d5739c8..979f580 100644
--- a/src/image.cpp
+++ b/src/image.cpp
@@ -20,7 +20,7 @@
  */
 /*
   File:      image.cpp
-  Version:   $Name:  $ $Revision: 1.26 $
+  Version:   $Name:  $ $Revision: 1.27 $
   Author(s): Andreas Huggel (ahu) <ahuggel at gmx.net>
              Brad Schick (brad) <schick at robotbattle.com>
   History:   26-Jan-04, ahu: created
@@ -29,7 +29,7 @@
  */
 // *****************************************************************************
 #include "rcsid.hpp"
-EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.26 $ $RCSfile: image.cpp,v $");
+EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.27 $ $RCSfile: image.cpp,v $");
 
 // *****************************************************************************
 // included header files
@@ -71,14 +71,14 @@ namespace Exiv2 {
       @brief Create a new ExvImage instance and return a pointer to it. Caller
              is responsible to delete the object when it is no longer needed.
      */
-    Image* newExvInstance(const std::string& path, FILE* fp);
+    Image::AutoPtr newExvInstance(const std::string& path, FILE* fp);
     //! Check if the file ifp is an EXV file.
     bool isExvType(FILE* ifp, bool advance);
     /*!
-      @brief Create a new JpegImage instance and return a pointer to it. Caller
-             is responsible to delete the object when it is no longer needed.
+      @brief Create a new JpegImage instance and return an auto-pointer to it.
+             Caller owns the returned object.
      */
-    Image* newJpegInstance(const std::string& path, FILE* fp);
+    Image::AutoPtr newJpegInstance(const std::string& path, FILE* fp);
     //! Check if the file ifp is a JPEG image.
     bool isJpegType(FILE* ifp, bool advance);
 
@@ -125,31 +125,33 @@ namespace Exiv2 {
         return type;
     } // ImageFactory::getType
 
-    Image* ImageFactory::open(const std::string& path) const
+    Image::AutoPtr ImageFactory::open(const std::string& path) const
     {
+        Image::AutoPtr image;
         FILE* ifp = fopen(path.c_str(), "rb");
-        if (!ifp) return 0;
+        if (!ifp) return image;
 
-        Image* pImage = 0;
         Registry::const_iterator b = registry_.begin();
         Registry::const_iterator e = registry_.end();
         for (Registry::const_iterator i = b; i != e; ++i)
         {
             if (i->second.isThisType(ifp, false)) {
-                pImage = i->second.newInstance(path, ifp);
+                image = Image::AutoPtr(i->second.newInstance(path, ifp));
                 break;
             }
         }
-        return pImage;
+        return image;
     } // ImageFactory::open
 
-    Image* ImageFactory::create(Image::Type type, const std::string& path) const
+    Image::AutoPtr ImageFactory::create(Image::Type type, 
+                                        const std::string& path) const
     {
         Registry::const_iterator i = registry_.find(type);
         if (i != registry_.end()) {
             return i->second.newInstance(path, 0);
         }
-        return 0;
+        Image::AutoPtr p;
+        return p;
     } // ImageFactory::create
 
 
@@ -709,20 +711,17 @@ namespace Exiv2 {
         return isJpegType(ifp, advance);
     }
 
-    Image* newJpegInstance(const std::string& path, FILE* fp)
+    Image::AutoPtr newJpegInstance(const std::string& path, FILE* fp)
     {
-        Image* pImage = 0;
+        Image::AutoPtr image;
         if (fp == 0) {
-            pImage = new JpegImage(path, true);
-            if (!pImage->good()) {
-                delete pImage;
-                pImage = 0;
-            }
+            image = Image::AutoPtr(new JpegImage(path, true));
+            if (!image->good()) delete image.release();
         }
         else {
-            pImage = new JpegImage(path, fp);
+            image = Image::AutoPtr(new JpegImage(path, fp));
         }
-        return pImage;
+        return image;
     }
 
     bool isJpegType(FILE* ifp, bool advance)
@@ -765,20 +764,17 @@ namespace Exiv2 {
         return isExvType(ifp, advance);
     }
 
-    Image* newExvInstance(const std::string& path, FILE* fp)
+    Image::AutoPtr newExvInstance(const std::string& path, FILE* fp)
     {
-        Image* pImage = 0;
+        Image::AutoPtr image;
         if (fp == 0) {
-            pImage = new ExvImage(path, true);
-            if (!pImage->good()) {
-                delete pImage;
-                pImage = 0;
-            }
+            image = Image::AutoPtr(new ExvImage(path, true));
+            if (!image->good()) delete image.release();
         }
         else {
-            pImage = new ExvImage(path, fp);
+            image = Image::AutoPtr(new ExvImage(path, fp));
         }
-        return pImage;
+        return image;
     }
 
     bool isExvType(FILE* ifp, bool advance)
diff --git a/src/image.hpp b/src/image.hpp
index 1eeb19f..06f8169 100644
--- a/src/image.hpp
+++ b/src/image.hpp
@@ -21,7 +21,7 @@
 /*!
   @file    image.hpp
   @brief   Class JpegImage to access JPEG images
-  @version $Name:  $ $Revision: 1.20 $
+  @version $Name:  $ $Revision: 1.21 $
   @author  Andreas Huggel (ahu)
            <a href="mailto:ahuggel at gmx.net">ahuggel at gmx.net</a>
   @author  Brad Schick (brad) 
@@ -40,19 +40,12 @@
 // + standard includes
 #include <string>
 #include <map>
-
+#include <memory>
 
 // *****************************************************************************
 // namespace extensions
 namespace Exiv2 {
-
-    //! Type for function pointer that creates new Image instances
-    typedef class Image* (*NewInstanceFct)(const std::string& path, FILE* ifp);
-
-    //! Type for function pointer that checks image types
-    typedef bool (*IsThisTypeFct)(FILE* ifp, bool advance);
-
-
+ 
 // *****************************************************************************
 // class definitions
 
@@ -61,6 +54,9 @@ namespace Exiv2 {
      */
     class Image {
     public:
+        //! Image auto_ptr type
+        typedef std::auto_ptr<Image> AutoPtr;
+
         //! Supported image formats
         enum Type { none, jpeg, exv };
 
@@ -181,6 +177,12 @@ namespace Exiv2 {
 
     }; // class Image
 
+    //! Type for function pointer that creates new Image instances
+    typedef Image::AutoPtr (*NewInstanceFct)(const std::string& path, 
+                                                   FILE* ifp);
+    //! Type for function pointer that checks image types
+    typedef bool (*IsThisTypeFct)(FILE* ifp, bool advance);
+
     /*!
       @brief Image factory.
 
@@ -218,21 +220,19 @@ namespace Exiv2 {
           @param  path %Image file. The contents of the file are tested to
                   determine the image type to open. File extension is ignored.
           @return A pointer that owns an %Image of the type derived from the
-                  file. Caller must delete the returned object. If no image type
-                  could be determined, the pointer is 0.
+                  file. If no image type could be determined, the pointer is 0.
          */
-        Image* open(const std::string& path) const;
+        Image::AutoPtr open(const std::string& path) const;
         /*!
           @brief  Create an %Image of the requested type by creating a new
                   file. If the file already exists, it will be overwritten.
           @param  type Type of the image to be created.
           @param  path %Image file. The contents of the file are tested to
                   determine the image type to open. File extension is ignored.
-          @return A pointer that owns an %Image of the requested type. Caller
-                  must delete the returned object.  If the image type is not
-                  supported, the pointer is 0.
+          @return An auto-pointer that owns an %Image of the requested type. 
+                  If the image type is not supported, the pointer is 0.
          */
-        Image* create(Image::Type type, const std::string& path) const;
+        Image::AutoPtr create(Image::Type type, const std::string& path) const;
         /*!
           @brief  Returns the image type of the provided file. 
           @param  path %Image file. The contents of the file are tested to
@@ -481,7 +481,7 @@ namespace Exiv2 {
       @brief Helper class to access JPEG images
      */
     class JpegImage : public JpegBase {
-        friend Image* newJpegInstance(const std::string& path, FILE* fp);
+        friend Image::AutoPtr newJpegInstance(const std::string& path, FILE* fp);
         friend bool isJpegType(FILE* ifp, bool advance);
     public:
         //! @name Creators
@@ -550,7 +550,7 @@ namespace Exiv2 {
 
     //! Helper class to access %Exiv2 files
     class ExvImage : public JpegBase {
-        friend Image* newExvInstance(const std::string& path, FILE* fp);
+        friend Image::AutoPtr newExvInstance(const std::string& path, FILE* fp);
         friend bool isExvType(FILE* ifp, bool advance);
     public:
         //! @name Creators
diff --git a/src/iptc.cpp b/src/iptc.cpp
index e68a0c9..e17801d 100644
--- a/src/iptc.cpp
+++ b/src/iptc.cpp
@@ -20,13 +20,13 @@
  */
 /*
   File:      iptc.cpp
-  Version:   $Name:  $ $Revision: 1.6 $
+  Version:   $Name:  $ $Revision: 1.7 $
   Author(s): Brad Schick (brad) <schick at robotbattle.com>
   History:   31-July-04, brad: created
  */
 // *****************************************************************************
 #include "rcsid.hpp"
-EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.6 $ $RCSfile: iptc.cpp,v $");
+EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.7 $ $RCSfile: iptc.cpp,v $");
 
 // Define DEBUG_MAKERNOTE to output debug information to std::cerr
 #undef DEBUG_MAKERNOTE
@@ -114,22 +114,22 @@ namespace Exiv2 {
     int IptcData::read(const std::string& path)
     {
         if (!fileExists(path, true)) return -1;
-        Image* pImage = ImageFactory::instance().open(path);
-        if (pImage) {
-            int rc = pImage->readMetadata();
-            if (rc == 0) {
-                if (pImage->sizeIptcData() > 0) {
-                    rc = read(pImage->iptcData(), pImage->sizeIptcData());
-                }
-                else {
-                    rc = 3;
-                }
+        Image::AutoPtr image = ImageFactory::instance().open(path);
+        if (image.get() == 0) {
+            // We don't know this type of file
+            return -2;
+        }
+        
+        int rc = image->readMetadata();
+        if (rc == 0) {
+            if (image->sizeIptcData() > 0) {
+                rc = read(image->iptcData(), image->sizeIptcData());
+            }
+            else {
+                rc = 3;
             }
-            delete pImage;
-            return rc;
         }
-        // We don't know this type of file
-        return -2;
+        return rc;
     }
 
     int IptcData::read(const byte* buf, long len)
@@ -204,16 +204,15 @@ namespace Exiv2 {
     int IptcData::erase(const std::string& path) const
     {
         if (!fileExists(path, true)) return -1;
-        Image* pImage = ImageFactory::instance().open(path);
-        if (pImage == 0) return -2;
+        Image::AutoPtr image = ImageFactory::instance().open(path);
+        if (image.get() == 0) return -2;
 
         // Read all metadata then erase only Iptc data
-        int rc = pImage->readMetadata();
-        if( rc == 0 ) {
-            pImage->clearIptcData();
-            rc = pImage->writeMetadata();
+        int rc = image->readMetadata();
+        if (rc == 0) {
+            image->clearIptcData();
+            rc = image->writeMetadata();
         }
-        delete pImage;
         return rc;
     } // IptcData::erase
 
@@ -223,18 +222,17 @@ namespace Exiv2 {
         if (count() == 0) return erase(path);
 
         if (!fileExists(path, true)) return -1;
-        Image* pImage = ImageFactory::instance().open(path);
-        if (pImage == 0) return -2;
+        Image::AutoPtr image = ImageFactory::instance().open(path);
+        if (image.get() == 0) return -2;
 
         updateBuffer();
 
         // Read all metadata to preserve non-Iptc data
-        int rc = pImage->readMetadata();
-        if( rc == 0 ) {
-            pImage->setIptcData(pData_, size_);
-            rc = pImage->writeMetadata();
+        int rc = image->readMetadata();
+        if (rc == 0) {
+            image->setIptcData(pData_, size_);
+            rc = image->writeMetadata();
         }
-        delete pImage;
         return rc;
     } // IptcData::write
 
diff --git a/src/metacopy.cpp b/src/metacopy.cpp
index e5b23d9..595b432 100644
--- a/src/metacopy.cpp
+++ b/src/metacopy.cpp
@@ -22,7 +22,7 @@
   Abstract : Tester application for image file handling
 
   File     : metacopy.cpp
-  Version  : $Name:  $ $Revision: 1.1 $
+  Version  : $Name:  $ $Revision: 1.2 $
   Author(s): Brad Schick (brad) <schick at robotbattle.com>
   History  : 13-Jul-04, brad: created
  */
@@ -50,8 +50,9 @@ try {
         return 2;
     }
 
-    Exiv2::Image* readImg = Exiv2::ImageFactory::instance().open(params.read_);
-    if (!readImg) {
+    Exiv2::Image::AutoPtr readImg 
+        = Exiv2::ImageFactory::instance().open(params.read_);
+    if (readImg.get() == 0) {
         std::cerr << params.progname() << 
             ": Could not read file (" << params.read_ << ")
";
         return 4;
@@ -63,8 +64,9 @@ try {
     }
     readImg->detach();
 
-    Exiv2::Image* writeImg = Exiv2::ImageFactory::instance().open(params.write_);
-    if (!writeImg) {
+    Exiv2::Image::AutoPtr writeImg 
+        = Exiv2::ImageFactory::instance().open(params.write_);
+    if (writeImg.get() == 0) {
         std::cerr << params.progname() << 
             ": Could not read file (" << params.write_ << ")
";
         return 6;
@@ -93,8 +95,6 @@ try {
         return 8;
     }
 
-    delete readImg;
-    delete writeImg;
     return 0;
 }
 catch (Exiv2::Error& e) {
diff --git a/src/types.cpp b/src/types.cpp
index 1845be6..cd4011b 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -20,14 +20,14 @@
  */
 /*
   File:      types.cpp
-  Version:   $Name:  $ $Revision: 1.13 $
+  Version:   $Name:  $ $Revision: 1.14 $
   Author(s): Andreas Huggel (ahu) <ahuggel at gmx.net>
   History:   26-Jan-04, ahu: created
              11-Feb-04, ahu: isolated as a component
  */
 // *****************************************************************************
 #include "rcsid.hpp"
-EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.13 $ $RCSfile: types.cpp,v $");
+EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.14 $ $RCSfile: types.cpp,v $");
 
 // *****************************************************************************
 // included header files
@@ -76,6 +76,23 @@ namespace Exiv2 {
     {
         return typeInfoTable_[ typeId < lastTypeId ? typeId : 0 ].size_;
     }
+    
+    void DataBuf::alloc(long size)
+    { 
+        if (size > size_) {
+            delete[] pData_; 
+            size_ = size; 
+            pData_ = new byte[size];
+        } 
+    }
+
+    byte* DataBuf::release()
+    {
+        byte* p = pData_;
+        pData_ = 0;
+        size_ = 0;
+        return p;
+    }
 
     // *************************************************************************
     // free functions
diff --git a/src/types.hpp b/src/types.hpp
index b1469f5..6e8065f 100644
--- a/src/types.hpp
+++ b/src/types.hpp
@@ -21,7 +21,7 @@
 /*!
   @file    types.hpp
   @brief   Type definitions for %Exiv2 and related functionality
-  @version $Name:  $ $Revision: 1.21 $
+  @version $Name:  $ $Revision: 1.22 $
   @author  Andreas Huggel (ahu)
            <a href="mailto:ahuggel at gmx.net">ahuggel at gmx.net</a>
   @date    09-Jan-04, ahu: created<BR>
@@ -123,7 +123,7 @@ namespace Exiv2 {
              care of memory allocation and deletion. Its primary use is meant to
              be as a stack variable in functions that need a temporary data
              buffer. Todo: this should be some sort of smart pointer,
-             essentially an std:auto_ptr for a character array. But it isn't.
+             essentially an std::auto_ptr for a character array. But it isn't...
      */
     class DataBuf {
         // Not implemented
@@ -139,8 +139,12 @@ namespace Exiv2 {
         //! Destructor, deletes the allocated buffer
         ~DataBuf() { delete[] pData_; }
         //! Allocate a data buffer of the given size
-        void alloc(long size)
-            { if( size > size_ ){delete[] pData_; size_ = size; pData_ = new byte[size];} }
+        void alloc(long size);
+        /*!
+          @brief Release ownership of the buffer to the caller. Returns pointer
+                 value, resets pData_ and size_ to 0.
+         */
+        byte* release();
         //! The current size of the buffer
         long size_; 
         //! Pointer to the buffer, 0 if none has been allocated

-- 
exiv2 packaging



More information about the pkg-kde-commits mailing list