[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:10 UTC 2017
Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/exiv2.git;a=commitdiff;h=f297a65
The following commit has been merged in the master branch:
commit f297a651f97a95bf57f32dce1a42e147340119c3
Author: Andreas Huggel <ahuggel at gmx.net>
Date: Fri Mar 19 09:13:33 2004 +0000
More consistent / better defined handling of Entry::size_
---
src/ifd.cpp | 73 +++++++++++++++++++++++---------------------
src/ifd.hpp | 100 +++++++++++++++++++++++++++++++++++-------------------------
2 files changed, 97 insertions(+), 76 deletions(-)
diff --git a/src/ifd.cpp b/src/ifd.cpp
index e13cebe..94a03f7 100644
--- a/src/ifd.cpp
+++ b/src/ifd.cpp
@@ -20,14 +20,14 @@
*/
/*
File: ifd.cpp
- Version: $Name: $ $Revision: 1.10 $
+ Version: $Name: $ $Revision: 1.11 $
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.10 $ $RCSfile: ifd.cpp,v $")
+EXIV2_RCSID("@(#) $Name: $ $Revision: 1.11 $ $RCSfile: ifd.cpp,v $")
// *****************************************************************************
// included header files
@@ -104,51 +104,56 @@ namespace Exif {
void Entry::setValue(uint32 data, ByteOrder byteOrder)
{
- if (data_ == 0) {
+ if (data_ == 0 || size_ < 4) {
if (!alloc_) {
- throw Error("Invariant alloc violated in Entry::setValue");
+ throw Error("cannot allocate memory");
}
- data_ = new char[4];
+ size_ = 4;
+ delete[] data_;
+ data_ = new char[size_];
}
- // No need to resize previously allocated memory
ul2Data(data_, data, byteOrder);
- size_ = 4;
+ // do not change size_
type_ = unsignedLong;
count_ = 1;
}
void Entry::setValue(uint16 type, uint32 count, const char* data, long size)
{
- // Make sure size is always at least four bytes
- long newSize = std::max(long(4), size);
+ long dataSize = count * TypeInfo::typeSize(TypeId(type_));
+ // No minimum size requirement, but make sure the buffer can hold the data
+ if (size < dataSize) {
+ throw Error("Size too small");
+ }
if (alloc_) {
delete[] data_;
- data_ = new char[newSize];
- memset(data_, 0x0, 4);
- memcpy(data_, data, size);
+ data_ = new char[size];
+ memset(data_, 0x0, size);
+ memcpy(data_, data, dataSize);
+ size_ = size;
}
else {
if (size_ == 0) {
// Set the data pointer of a virgin entry
- if (size < 4) throw Error("Size too small");
data_ = const_cast<char*>(data);
+ size_ = size;
}
else {
// Overwrite existing data if it fits into the buffer
- if (newSize > size_) throw Error("Size too large");
- memset(data_, 0x0, std::max(long(4), size_));
- memcpy(data_, data, size);
+ if (dataSize > size_) throw Error("Value too large");
+ memset(data_, 0x0, size_);
+ memcpy(data_, data, dataSize);
+ // do not change size_
}
}
type_ = type;
count_ = count;
- size_ = newSize;
} // Entry::setValue
const char* Entry::component(uint32 n) const
{
if (n >= count()) return 0;
- return data_ + n * typeSize();
+ return data() + n * typeSize();
} // Entry::component
Ifd::Ifd(IfdId ifdId)
@@ -173,7 +178,7 @@ namespace Exif {
Ifd::PreEntries preEntries;
int n = getUShort(buf, byteOrder);
- long o = 2;
+ long o = 2;
for (int i = 0; i < n; ++i) {
Ifd::PreEntry pe;
@@ -217,6 +222,7 @@ namespace Exif {
e.setTag(i->tag_);
// Set the offset to the data, relative to start of IFD
e.setOffset(i->size_ > 4 ? i->offset_ - offset_ : i->offsetLoc_);
+ // Set the size to at least for bytes to accomodate offset-data
e.setValue(i->type_, i->count_, buf + e.offset(),
std::max(long(4), i->size_));
this->add(e);
@@ -281,24 +287,25 @@ namespace Exif {
const iterator e = entries_.end();
iterator i = b;
for (; i != e; ++i) {
- us2Data(buf+o, i->tag(), byteOrder);
- us2Data(buf+o+2, i->type(), byteOrder);
- ul2Data(buf+o+4, i->count(), byteOrder);
+ us2Data(buf + o, i->tag(), byteOrder);
+ us2Data(buf + o + 2, i->type(), byteOrder);
+ ul2Data(buf + o + 4, i->count(), byteOrder);
if (i->size() > 4) {
// Set the offset of the entry, data immediately follows the IFD
i->setOffset(size() + dataSize);
- ul2Data(buf+o+8, offset_ + i->offset(), byteOrder);
+ ul2Data(buf + o + 8, offset_ + i->offset(), byteOrder);
dataSize += i->size();
}
else {
// Copy data into the offset field
- memcpy(buf+o+8, i->data(), 4);
+ memset(buf + o + 8, 0x0, 4);
+ memcpy(buf + o + 8, i->data(), i->size());
}
o += 12;
}
// Add the offset to the next IFD to the data buffer
- o += ul2Data(buf+o, next_, byteOrder);
+ o += ul2Data(buf + o, next_, byteOrder);
// Add the data of all IFD entries to the data buffer
for (i = b; i != e; ++i) {
@@ -322,10 +329,10 @@ namespace Exif {
{
// Todo: Implement Assert (Stroustup 24.3.7.2)
if (alloc_ != entry.alloc()) {
- throw Error("Invariant alloc violated in Ifd::add");
+ throw Error("Ifd::add : alloc mismatch");
}
if (ifdId_ != entry.ifdId()) {
- throw Error("Invariant ifdId violated in Ifd::add");
+ throw Error("Ifd::add : ifdId mismatch");
}
// allow duplicates
entries_.push_back(entry);
@@ -387,14 +394,10 @@ namespace Exif {
}
else {
unsigned char* data = (unsigned char*)i->data();
- offset << std::setw(2) << std::setfill('0') << std::hex
- << (int)data[0] << " "
- << std::setw(2) << std::setfill('0') << std::hex
- << (int)data[1] << " "
- << std::setw(2) << std::setfill('0') << std::hex
- << (int)data[2] << " "
- << std::setw(2) << std::setfill('0') << std::hex
- << (int)data[3] << " ";
+ for (int k = 0; k < i->size(); ++k) {
+ offset << std::setw(2) << std::setfill('0') << std::hex
+ << (int)data[k] << " ";
+ }
}
os << prefix << std::setw(5) << std::setfill(' ') << std::dec
<< std::right << i - b
diff --git a/src/ifd.hpp b/src/ifd.hpp
index 9d264e4..883abce 100644
--- a/src/ifd.hpp
+++ b/src/ifd.hpp
@@ -21,7 +21,7 @@
/*!
@file ifd.hpp
@brief Encoding and decoding of IFD (Image File Directory) data
- @version $Name: $ $Revision: 1.10 $
+ @version $Name: $ $Revision: 1.11 $
@author Andreas Huggel (ahu)
<a href="mailto:ahuggel at gmx.net">ahuggel at gmx.net</a>
@date 09-Jan-04, ahu: created
@@ -89,37 +89,42 @@ namespace Exif {
/*!
@brief Set the value of the entry to a single unsigned long component,
i.e., set the type of the entry to unsigned long, number of
- components to one, size to four bytes and the value according
- to the data provided. This method can be used to set the value
- of a tag which contains a pointer (offset) to a location in the
- %Exif data (like e.g., ExifTag, 0x8769 in IFD0, which contains a
- pointer to the Exif IFD). This method cannot be used to set the
- value of a newly created %Entry in non-alloc mode.
+ components to one and the value according to the data provided.
+
+ The size of the data buffer is set to at least four bytes, but is left
+ unchanged if it can accomodate the pointer. This method can be used
+ to set the value of a tag which contains a pointer (offset) to a
+ location in the %Exif data (like e.g., ExifTag, 0x8769 in IFD0, which
+ contains a pointer to the %Exif IFD).
+ <BR>This method cannot be used to set the value of a newly created
+ %Entry in non-alloc mode.
*/
void setValue(uint32 data, ByteOrder byteOrder);
/*!
- @brief Set type, count, size and the data of the entry.
-
- Copies the provided buffer when called in memory allocation mode. In
- non-alloc mode, use this method to set the data of a newly created
- %Entry. The data buffer provided must be at least four bytes to
- initialise an %Entry in non-alloc mode. In this case, only the pointer
- to the buffer is copied, i.e., the buffer must remain valid throughout
- the life of the %Entry. Subsequent calls in non-alloc mode overwrite
- the data pointed to by this pointer with the data provided, i.e., the
- buffer provided in subsequent calls can be deleted after the call.
- <BR>Todo: This sounds too complicated: should I isolate the init
- functionality into a separate method?
-
+ @brief Set type, count, the data buffer and its size.
+
+ Copies the provided buffer when called in memory allocation mode.
+ <BR>In non-alloc mode, use this method to initialise the data of a
+ newly created %Entry. In this case, only the pointer to the buffer is
+ copied, i.e., the buffer must remain valid throughout the life of the
+ %Entry. Subsequent calls in non-alloc mode will overwrite the data
+ pointed to by this pointer with the data provided, i.e., the buffer
+ provided in subsequent calls can be deleted after the call.
+ <BR>In either memory allocation mode, the data buffer provided must be
+ large enough to hold count components of type. The size of the buffer
+ will be as indicated in the size argument. I.e., it is possible to
+ allocate (set) a data buffer larger than required to hold count
+ components of the given type.
+
@param type The type of the data.
@param count Number of components in the buffer.
- @param data Pointer to the data buffer.
- @param size Size of the data buffer in bytes.
- @throw Error ("Size too large") if no memory allocation is allowed and
- the size of the data in buf is greater than the existing size
- of the data of the entry.<BR>
- @throw Error ("Size too small") if an attempt is made to initialise an
- %Entry in non-alloc mode with a buffer with size less than four.
+ @param data Pointer to the data buffer.
+ @param size Size of the desired data buffer in bytes.
+ @throw Error ("Value too large") if no memory allocation is allowed
+ and the size of the data buffer is larger than the existing
+ data buffer of the entry.<BR>
+ @throw Error ("Size too small") if size is not large enough to hold
+ count components of the given type.
*/
void setValue(uint16 type, uint32 count, const char* data, long size);
//@}
@@ -145,8 +150,9 @@ namespace Exif {
//! Return the number of components in the value
uint32 count() const { return count_; }
/*!
- @brief Return the size of the value in bytes, it is at least four
- bytes unless it is 0.
+ @brief Return the size of the data buffer in bytes.
+ @note There is no minimum size for the data buffer, except that it
+ must be large enough to hold the data.
*/
long size() const { return size_; }
//! Return the offset from the start of the IFD to the data of the entry
@@ -167,20 +173,32 @@ namespace Exif {
private:
/*!
- @brief True: Requires memory allocation and deallocation,<BR>
- False: No memory management needed.
+ True: Requires memory allocation and deallocation,<BR>
+ False: No memory management needed.
*/
bool alloc_;
- IfdId ifdId_; // Redundant IFD id (it is also at the IFD)
- int idx_; // Unique id of an entry within an IFD (0 if not set)
- MakerNote* makerNote_; // Pointer to the associated MakerNote
- uint16 tag_; // Tag
- uint16 type_; // Type
- uint32 count_; // Number of components
- uint32 offset_; // Offset from the start of the IFD to the data
- long size_; // Size of the data in bytes, at least four bytes
- char* data_; // Pointer to the data buffer, which is always at
- // least four bytes big (or 0, if not allocated)
+ //! Redundant IFD id (it is also at the IFD)
+ IfdId ifdId_;
+ //! Unique id of an entry within an IFD (0 if not set)
+ int idx_;
+ //! Pointer to the associated MakerNote
+ MakerNote* makerNote_;
+ //! Tag
+ uint16 tag_;
+ //! Type
+ uint16 type_;
+ //! Number of components
+ uint32 count_;
+ //! Offset from the start of the IFD to the data
+ uint32 offset_;
+ /*!
+ Size of the data buffer holding the value in bytes, there is
+ no minimum size.
+ */
+ long size_;
+ //! Pointer to the data buffer
+ char* data_;
+
}; // class Entry
//! Container type to hold all IFD directory entries
--
exiv2 packaging
More information about the pkg-kde-commits
mailing list