[SCM] exiv2 packaging branch, master, updated. debian/0.25-3.1-3734-gdcbc29a
Maximiliano Curia
maxy at moszumanska.debian.org
Thu Jul 13 17:35:56 UTC 2017
Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/exiv2.git;a=commitdiff;h=d4d9490
The following commit has been merged in the master branch:
commit d4d94908ccb9c04a7fbf42cba24de427b56dec95
Author: Andreas Huggel <ahuggel at gmx.net>
Date: Sun Jan 25 16:56:59 2004 +0000
Interface and docu cleanup, added Value::toLong()
---
src/exif.hpp | 254 +++++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 167 insertions(+), 87 deletions(-)
diff --git a/src/exif.hpp b/src/exif.hpp
index bfe6cf9..0043517 100644
--- a/src/exif.hpp
+++ b/src/exif.hpp
@@ -21,13 +21,13 @@
/*!
@file exif.hpp
@brief Encoding and decoding of %Exif data
- @version $Name: $ $Revision: 1.7 $
+ @version $Name: $ $Revision: 1.8 $
@author Andreas Huggel (ahu)
<a href="mailto:ahuggel at gmx.net">ahuggel at gmx.net</a>
@date 09-Jan-03, ahu: created
*/
-#ifndef _EXIF_HPP_
-#define _EXIF_HPP_
+#ifndef EXIF_HPP_
+#define EXIF_HPP_
// *****************************************************************************
// included header files
@@ -44,6 +44,8 @@
//! Provides classes and functions to encode and decode %Exif data.
namespace Exif {
+ class ExifData;
+
// *****************************************************************************
// type definitions
@@ -163,16 +165,16 @@ namespace Exif {
/*!
@brief Common interface for all values. The interface provides a uniform
- way to access values independent from their actual C++ type for
- simple tasks like reading the values. For other tasks, like modifying
- values you need to downcast it to the actual subclass of Value so
- that you can access the subclass specific interface (e.g., assignment
- operator for a vector of unsigned longs).
+ way to access values independent from their actual C++ type for
+ simple tasks like reading the values from a string or data buffer.
+ For other tasks, like modifying values you may need to downcast it
+ to the actual subclass of Value so that you can access the subclass
+ specific interface.
*/
class Value {
public:
//! Constructor, taking a type id to initialize the base class with
- explicit Value(TypeId typeId) : typeId_(typeId) {}
+ explicit Value(TypeId typeId) : type_(typeId) {}
//! Virtual destructor.
virtual ~Value() {}
/*!
@@ -183,7 +185,14 @@ namespace Exif {
@param byteOrder Applicable byte order (little or big endian).
*/
virtual void read(const char* buf, long len, ByteOrder byteOrder) =0;
- //! Set the value from a string buffer
+ /*!
+ @brief Set the value from a string buffer. The format of the string
+ corresponds to that of the write() method, i.e., a string
+ obtained through the write() method can be read by this
+ function.
+
+ @param buf The string to read from.
+ */
virtual void read(const std::string& buf) =0;
/*!
@brief Write value to a character data buffer.
@@ -212,6 +221,17 @@ namespace Exif {
operator<<(std::ostream &os, const Value &value).
*/
virtual std::ostream& write(std::ostream& os) const =0;
+ /*!
+ @brief Convert the n-th component of the value to a long. The
+ behaviour of this method may be undefined if there is no
+ n-th component.
+
+ @return The converted value.
+ */
+ virtual long toLong(long n =0) const =0;
+
+ //! Return the type identifier (Exif data format type).
+ TypeId typeId() const { return TypeId(type_); }
/*!
@brief A (simple) factory to create a Value type.
@@ -222,8 +242,8 @@ namespace Exif {
*/
static Value* create(TypeId typeId);
- protected:
- const TypeId typeId_; //!< Format type identifier
+ private:
+ const uint16 type_; //!< Type of the data
}; // class Value
@@ -265,6 +285,7 @@ namespace Exif {
virtual long size() const;
virtual Value* clone() const;
virtual std::ostream& write(std::ostream& os) const;
+ virtual long toLong(long n =0) const { return value_[n]; }
private:
std::string value_;
@@ -303,6 +324,7 @@ namespace Exif {
virtual long size() const;
virtual Value* clone() const;
virtual std::ostream& write(std::ostream& os) const;
+ virtual long toLong(long n =0) const { return value_[n]; }
private:
std::string value_;
@@ -310,8 +332,8 @@ namespace Exif {
}; // class AsciiValue
/*!
- @brief Template for a %Value for a basic Type. This is used for unsigned
- and signed short, long and rational.
+ @brief Template for a %Value of a basic type. This is used for unsigned
+ and signed short, long and rationals.
*/
template<typename T>
class ValueType : public Value {
@@ -331,21 +353,21 @@ namespace Exif {
virtual long size() const;
virtual Value* clone() const;
virtual std::ostream& write(std::ostream& os) const;
+ virtual long toLong(long n =0) const;
//! Container for values
typedef std::vector<T> ValueList;
- //! @name Accessors
- //@{
- //! Read access to the list of values
- const ValueList& valueList() const { return value_; }
+ //! Iterator type defined for convenience.
+ typedef typename std::vector<T>::iterator ValueIter;
+ //! Const iterator type defined for convenience.
+ typedef typename std::vector<T>::const_iterator ValueCIter;
+
/*!
- @brief Get the first value. If there is no value in the container,
- then the behaviour is undefined.
+ @brief The container for all values. In your application, if you know
+ what subclass of Value you're dealing with (and possibly the T)
+ then you can access this STL container through the usual
+ standard library functions.
*/
- T value() const { return value_[0]; }
- //@}
-
- private:
ValueList value_;
}; // class ValueType
@@ -384,7 +406,7 @@ namespace Exif {
We'll figure out the details for it.
*/
// Todo: implement me!
- Metadatum(const std::string& key, TypeId typeId, Value* value =0);
+ Metadatum(const std::string& key, Value* value =0);
//! Destructor
~Metadatum();
//! Copy constructor
@@ -401,9 +423,9 @@ namespace Exif {
//! Return the name of the tag
const char* tagName() const { return ExifTags::tagName(tag_, ifdId_); }
//! Return the name of the type
- const char* typeName() const { return ExifTags::typeName(TypeId(type_)); }
- //! Return the size in bytes of one element of this type
- long typeSize() const { return ExifTags::typeSize(TypeId(type_)); }
+ const char* typeName() const { return ExifTags::typeName(typeId()); }
+ //! Return the size in bytes of one component of this type
+ long typeSize() const { return ExifTags::typeSize(typeId()); }
//! Return the name of the IFD
const char* ifdName() const { return ExifTags::ifdName(ifdId_); }
//! Return the related image item (image or thumbnail)
@@ -415,12 +437,19 @@ namespace Exif {
//@{
//! Return the tag
uint16 tag() const { return tag_; }
- //! Return the type
- TypeId type() const { return TypeId(type_); }
+ //! Return the type id.
+ TypeId typeId() const { return value_ == 0 ? invalid : value_->typeId(); }
//! Return the number of components in the value
long count() const { return value_ == 0 ? 0 : value_->count(); }
//! Return the size of the value in bytes
long size() const { return value_ == 0 ? 0 : value_->size(); }
+ /*!
+ @brief Return the n-th component of the value. The return value is
+ -1 if the value of the Metadatum is not set and the behaviour
+ of the method is undefined if there is no n-th component.
+ */
+ long toLong(long n =0) const
+ { return value_ == 0 ? -1 : value_->toLong(n); }
//! Return the IFD id
IfdId ifdId() const { return ifdId_; }
//! Return the position in the IFD (-1: not set)
@@ -431,13 +460,15 @@ namespace Exif {
value is not set.
*/
const Value& value() const { return *value_; }
- //! Return a unique key of the tag (ifdItem.sectionName.tagName)
+ /*!
+ @brief Return a unique key for the tag. The key is of the form
+ 'ifdItem.sectionName.tagName'.
+ */
std::string key() const { return key_; }
//@}
private:
uint16 tag_; //!< Tag value
- uint16 type_; //!< Type of the data
IfdId ifdId_; //!< The IFD associated with this tag
int ifdIdx_; //!< Position in the IFD (-1: not set)
Value* value_; //!< Pointer to the value
@@ -448,6 +479,23 @@ namespace Exif {
//! Container type to hold all metadata
typedef std::vector<Metadatum> Metadata;
+ //! Unary predicate that matches a Metadatum with a given key
+ class FindMetadatumByKey {
+ public:
+ //! Constructor, initializes the object with the tag to look for
+ FindMetadatumByKey(const std::string& key) : key_(key) {}
+ /*!
+ @brief Returns true if the key of the argument metadatum is equal
+ to that of the object.
+ */
+ bool operator()(const Metadatum& metadatum) const
+ { return key_ == metadatum.key(); }
+
+ private:
+ std::string key_;
+
+ }; // class FindEntryByTag
+
/*!
@brief Models an IFD (Image File Directory)
@@ -505,7 +553,7 @@ namespace Exif {
//! Constructor, initializes the object with the tag to look for
FindEntryByTag(uint16 tag) : tag_(tag) {}
/*!
- @brief Returns true if the tag of the argument metadatum is equal
+ @brief Returns true if the tag of the argument entry is equal
to that of the object.
*/
bool operator()(const Ifd::Entry& entry) const
@@ -594,8 +642,8 @@ namespace Exif {
//! Thumbnail data Todo: implement this properly
class Thumbnail {
public:
- //! Read the thumbnail from the data buffer, return 0 if succesfull
- int read(const char* buf, const Ifd& ifd1, ByteOrder byteOrder);
+ //! Read the thumbnail from the data buffer, return 0 if successfull
+ int read(const char* buf, const ExifData& exifData, ByteOrder byteOrder);
//! Write thumbnail to file path, return 0 if successful
int write(const std::string& path) const;
@@ -658,6 +706,8 @@ namespace Exif {
//! End of the metadata
const_iterator end() const { return metadata_.end(); }
+ const_iterator findKey(const std::string& key) const;
+
//! Write the thumbnail image to a file
int writeThumbnail(const std::string& path) const
{ return thumbnail_.write(path); }
@@ -687,6 +737,43 @@ namespace Exif {
Rational getRational(const char* buf, ByteOrder byteOrder);
/*!
+ @brief Convert an unsigned short to data, write the data to the buffer,
+ return number of bytes written.
+ */
+ long us2Data(char* buf, uint16 s, ByteOrder byteOrder);
+ /*!
+ @brief Convert an unsigned long to data, write the data to the buffer,
+ return number of bytes written.
+ */
+ long ul2Data(char* buf, uint32 l, ByteOrder byteOrder);
+ /*!
+ @brief Convert an unsigned rational to data, write the data to the buffer,
+ return number of bytes written.
+ */
+ long ur2Data(char* buf, URational l, ByteOrder byteOrder);
+ /*!
+ @brief Convert a signed short to data, write the data to the buffer,
+ return number of bytes written.
+ */
+ long s2Data(char* buf, int16 s, ByteOrder byteOrder);
+ /*!
+ @brief Convert a signed long to data, write the data to the buffer,
+ return number of bytes written.
+ */
+ long l2Data(char* buf, int32 l, ByteOrder byteOrder);
+ /*!
+ @brief Convert a signed rational to data, write the data to the buffer,
+ return number of bytes written.
+ */
+ long r2Data(char* buf, Rational l, ByteOrder byteOrder);
+
+ //! Print len bytes from buf in hex and ASCII format to the given stream
+ void hexdump(std::ostream& os, const char* buf, long len);
+
+// *****************************************************************************
+// template and inline definitions
+
+ /*!
@brief Read a value of type T from the data buffer.
We need this template function for the ValueType template classes.
@@ -699,68 +786,43 @@ namespace Exif {
*/
template<typename T> T getValue(const char* buf, ByteOrder byteOrder);
// Specialization for a 2 byte unsigned short value.
- template<> inline uint16 getValue(const char* buf, ByteOrder byteOrder)
+ template<>
+ inline uint16 getValue(const char* buf, ByteOrder byteOrder)
{
return getUShort(buf, byteOrder);
}
// Specialization for a 4 byte unsigned long value.
- template<> inline uint32 getValue(const char* buf, ByteOrder byteOrder)
+ template<>
+ inline uint32 getValue(const char* buf, ByteOrder byteOrder)
{
return getULong(buf, byteOrder);
}
// Specialization for an 8 byte unsigned rational value.
- template<> inline URational getValue(const char* buf, ByteOrder byteOrder)
+ template<>
+ inline URational getValue(const char* buf, ByteOrder byteOrder)
{
return getURational(buf, byteOrder);
}
// Specialization for a 2 byte signed short value.
- template<> inline int16 getValue(const char* buf, ByteOrder byteOrder)
+ template<>
+ inline int16 getValue(const char* buf, ByteOrder byteOrder)
{
return getShort(buf, byteOrder);
}
// Specialization for a 4 byte signed long value.
- template<> inline int32 getValue(const char* buf, ByteOrder byteOrder)
+ template<>
+ inline int32 getValue(const char* buf, ByteOrder byteOrder)
{
return getLong(buf, byteOrder);
}
// Specialization for an 8 byte signed rational value.
- template<> inline Rational getValue(const char* buf, ByteOrder byteOrder)
+ template<>
+ inline Rational getValue(const char* buf, ByteOrder byteOrder)
{
return getRational(buf, byteOrder);
}
/*!
- @brief Convert an unsigned short to data, write the data to the buffer,
- return number of bytes written.
- */
- long us2Data(char* buf, uint16 s, ByteOrder byteOrder);
- /*!
- @brief Convert an unsigned long to data, write the data to the buffer,
- return number of bytes written.
- */
- long ul2Data(char* buf, uint32 l, ByteOrder byteOrder);
- /*!
- @brief Convert an unsigned rational to data, write the data to the buffer,
- return number of bytes written.
- */
- long ur2Data(char* buf, URational l, ByteOrder byteOrder);
- /*!
- @brief Convert a signed short to data, write the data to the buffer,
- return number of bytes written.
- */
- long s2Data(char* buf, int16 s, ByteOrder byteOrder);
- /*!
- @brief Convert a signed long to data, write the data to the buffer,
- return number of bytes written.
- */
- long l2Data(char* buf, int32 l, ByteOrder byteOrder);
- /*!
- @brief Convert a signed rational to data, write the data to the buffer,
- return number of bytes written.
- */
- long r2Data(char* buf, Rational l, ByteOrder byteOrder);
-
- /*!
@brief Convert a value of type T to data, write the data to the data buffer.
We need this template function for the ValueType template classes.
@@ -777,7 +839,8 @@ namespace Exif {
@brief Specialization to write an unsigned short to the data buffer.
Return the number of bytes written.
*/
- template<> inline long toData(char* buf, uint16 t, ByteOrder byteOrder)
+ template<>
+ inline long toData(char* buf, uint16 t, ByteOrder byteOrder)
{
return us2Data(buf, t, byteOrder);
}
@@ -785,7 +848,8 @@ namespace Exif {
@brief Specialization to write an unsigned long to the data buffer.
Return the number of bytes written.
*/
- template<> inline long toData(char* buf, uint32 t, ByteOrder byteOrder)
+ template<>
+ inline long toData(char* buf, uint32 t, ByteOrder byteOrder)
{
return ul2Data(buf, t, byteOrder);
}
@@ -793,7 +857,8 @@ namespace Exif {
@brief Specialization to write an unsigned rational to the data buffer.
Return the number of bytes written.
*/
- template<> inline long toData(char* buf, URational t, ByteOrder byteOrder)
+ template<>
+ inline long toData(char* buf, URational t, ByteOrder byteOrder)
{
return ur2Data(buf, t, byteOrder);
}
@@ -801,7 +866,8 @@ namespace Exif {
@brief Specialization to write a signed short to the data buffer.
Return the number of bytes written.
*/
- template<> inline long toData(char* buf, int16 t, ByteOrder byteOrder)
+ template<>
+ inline long toData(char* buf, int16 t, ByteOrder byteOrder)
{
return s2Data(buf, t, byteOrder);
}
@@ -809,7 +875,8 @@ namespace Exif {
@brief Specialization to write a signed long to the data buffer.
Return the number of bytes written.
*/
- template<> inline long toData(char* buf, int32 t, ByteOrder byteOrder)
+ template<>
+ inline long toData(char* buf, int32 t, ByteOrder byteOrder)
{
return l2Data(buf, t, byteOrder);
}
@@ -817,22 +884,17 @@ namespace Exif {
@brief Specialization to write a signed rational to the data buffer.
Return the number of bytes written.
*/
- template<> inline long toData(char* buf, Rational t, ByteOrder byteOrder)
+ template<>
+ inline long toData(char* buf, Rational t, ByteOrder byteOrder)
{
return r2Data(buf, t, byteOrder);
}
- //! Print len bytes from buf in hex and ASCII format to the given stream
- void hexdump(std::ostream& os, const char* buf, long len);
-
-// *****************************************************************************
-// template definitions
-
template<typename T>
void ValueType<T>::read(const char* buf, long len, ByteOrder byteOrder)
{
value_.clear();
- for (long i = 0; i < len; i += ExifTags::typeSize(typeId_)) {
+ for (long i = 0; i < len; i += ExifTags::typeSize(typeId())) {
value_.push_back(getValue<T>(buf + i, byteOrder));
}
}
@@ -862,7 +924,7 @@ namespace Exif {
template<typename T>
long ValueType<T>::size() const
{
- return ExifTags::typeSize(typeId_) * value_.size();
+ return ExifTags::typeSize(typeId()) * value_.size();
}
template<typename T>
@@ -882,7 +944,25 @@ namespace Exif {
}
return os;
}
+ // Default implementation
+ template<typename T>
+ inline long ValueType<T>::toLong(long n) const
+ {
+ return value_[n];
+ }
+ // Specialization for rational
+ template<>
+ inline long ValueType<Rational>::toLong(long n) const
+ {
+ return value_[n].first / value_[n].second;
+ }
+ // Specialization for unsigned rational
+ template<>
+ inline long ValueType<URational>::toLong(long n) const
+ {
+ return value_[n].first / value_[n].second;
+ }
} // namespace Exif
-#endif // #ifndef _EXIF_HPP_
+#endif // #ifndef EXIF_HPP_
--
exiv2 packaging
More information about the pkg-kde-commits
mailing list