[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=325671f
The following commit has been merged in the master branch:
commit 325671ff2a442c7561290f9edfb32a932561c713
Author: Andreas Huggel <ahuggel at gmx.net>
Date: Mon Jan 19 07:24:46 2004 +0000
More code...
---
src/exif.cpp | 120 +++++++++++++++++++++++++++-------
src/exif.hpp | 195 ++++++++++++++++++++++++++++++++++++++++++++++++-------
src/exiftest.cpp | 7 +-
src/tags.cpp | 23 +++++--
src/tags.hpp | 20 +++++-
src/utils.cpp | 21 ++++--
src/utils.hpp | 20 +++++-
7 files changed, 340 insertions(+), 66 deletions(-)
diff --git a/src/exif.cpp b/src/exif.cpp
index 4183ccc..cec8bed 100644
--- a/src/exif.cpp
+++ b/src/exif.cpp
@@ -1,18 +1,31 @@
// ***************************************************************** -*- C++ -*-
/*
- * Copyright (c) 2004 Andreas Huggel
- *
- * Todo: Insert license blabla here
+ * Copyright (C) 2004 Andreas Huggel <ahuggel at gmx.net>
+ *
+ * This program is part of the Exiv2 distribution.
*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
- Author(s): Andreas Huggel (ahu)
+ Author(s): Andreas Huggel (ahu) <ahuggel at gmx.net>
History:
13-Jan-04, ahu: created
RCS information
$Name: $
- $Revision: 1.4 $
+ $Revision: 1.5 $
*/
// *****************************************************************************
// included header files
@@ -216,8 +229,12 @@ namespace Exif {
void DataValue::read(const std::string& buf)
{
- // Todo: read from a string of bytes??
- value_ = buf;
+ std::istringstream is(buf);
+ int tmp;
+ value_.clear();
+ while (is >> tmp) {
+ value_ += (char)tmp;
+ }
}
long DataValue::copy(char* buf, ByteOrder byteOrder) const
@@ -278,11 +295,23 @@ namespace Exif {
}
Metadatum::Metadatum()
- : tag_(0), type_(0), count_(0), offset_(0), size_(0),
- ifdId_(IfdIdNotSet), ifdIdx_(-1), value_(0)
+ : tag_(0), type_(0), count_(0), offset_(0),
+ ifdId_(IfdIdNotSet), ifdIdx_(-1), value_(0), size_(0)
{
}
+ Metadatum::Metadatum(uint16 tag, uint16 type, uint32 count, uint32 offset,
+ IfdId ifdId, int ifdIdx, Value* value)
+ : tag_(tag), type_(type), count_(count), offset_(offset),
+ ifdId_(ifdId), ifdIdx_(ifdIdx), value_(value)
+ {
+ key_ = std::string(ifdItem())
+ + "." + std::string(sectionName())
+ + "." + std::string(tagName());
+
+ size_ = count_ * typeSize();
+ }
+
Metadatum::~Metadatum()
{
delete value_;
@@ -294,13 +323,15 @@ namespace Exif {
type_ = rhs.type_;
count_ = rhs.count_;
offset_ = rhs.offset_;
- size_ = rhs.size_;
ifdId_ = rhs.ifdId_;
ifdIdx_ = rhs.ifdIdx_;
value_ = 0;
if (rhs.value_ != 0) value_ = rhs.value_->clone(); // deep copy
+
+ key_ = rhs.key_;
+ size_ = rhs.size_;
}
Metadatum& Metadatum::operator=(const Metadatum& rhs)
@@ -311,7 +342,6 @@ namespace Exif {
type_ = rhs.type_;
count_ = rhs.count_;
offset_ = rhs.offset_;
- size_ = rhs.size_;
ifdId_ = rhs.ifdId_;
ifdIdx_ = rhs.ifdIdx_;
@@ -320,17 +350,12 @@ namespace Exif {
value_ = 0;
if (rhs.value_ != 0) value_ = rhs.value_->clone(); // deep copy
+ key_ = rhs.key_;
+ size_ = rhs.size_;
+
return *this;
} // Metadatum::operator=
- std::string Metadatum::key() const
- {
- std::string key = std::string(ifdItem())
- + "." + std::string(sectionName())
- + "." + std::string(tagName());
- return key;
- }
-
Ifd::Ifd(IfdId ifdId)
: ifdId_(ifdId), offset_(0), next_(0), size_(0)
{
@@ -380,7 +405,6 @@ namespace Exif {
// calculate offsets relative to the start of the IFD
for (i = eb; i != ee; ++i) {
delete i->value_;
- //! Todo: Create the correct type here, once we have them
i->value_ = Value::create(TypeId(i->type_));
if (i->size_ > 4) {
i->offset_ = i->offset_ - offset_;
@@ -392,18 +416,23 @@ namespace Exif {
i->value_->read(tmpbuf, i->size_, byteOrder);
}
}
+
return 0;
} // Ifd::read
+ Metadata::const_iterator Ifd::findTag(uint16 tag) const
+ {
+ return std::find_if(entries_.begin(), entries_.end(),
+ FindMetadatumByTag(tag));
+ }
+
int Ifd::readSubIfd(
Ifd& dest, const char* buf, ByteOrder byteOrder, uint16 tag
) const
{
int rc = 0;
- Metadata::const_iterator pos;
- Metadata::const_iterator end = entries_.end();
- pos = std::find_if(entries_.begin(), end, FindMetadatumByTag(tag));
- if (pos != end) {
+ Metadata::const_iterator pos = findTag(tag);
+ if (pos != entries_.end()) {
rc = dest.read(buf + pos->offset_, byteOrder, pos->offset_);
}
return rc;
@@ -529,6 +558,44 @@ namespace Exif {
} // Ifd::print
+ // Todo: implement this properly..
+ // - Tag values 0x0201 and 0x0202 may be long OR short types...
+ // - TIFF thumbnails
+ int Thumbnail::read(const char* buf, const Ifd& ifd1, ByteOrder byteOrder)
+ {
+ Metadata::const_iterator pos = ifd1.findTag(0x0103);
+ if (pos == ifd1.entries().end()) return 1;
+ const UShortValue& compression = dynamic_cast<const UShortValue&>(pos->value());
+ if (compression.value() == 6) {
+ pos = ifd1.findTag(0x0201);
+ if (pos == ifd1.entries().end()) return 2;
+ const ULongValue& offset = dynamic_cast<const ULongValue&>(pos->value());
+ pos = ifd1.findTag(0x0202);
+ if (pos == ifd1.entries().end()) return 3;
+ const ULongValue& size = dynamic_cast<const ULongValue&>(pos->value());
+
+ thumbnail_ = std::string(buf + offset.value(), size.value());
+ }
+ else if (compression.value() == 1) {
+ // Todo: to be continued...
+ return 4;
+ }
+ else {
+ // invalid compression value
+ return 5;
+ }
+ return 0;
+ }
+
+ int Thumbnail::write(const std::string& path) const
+ {
+ std::ofstream file(path.c_str(), std::ios::binary | std::ios::out);
+ if (!file) return 1;
+ file.write(thumbnail_.data(), thumbnail_.size());
+ if (!file.good()) return 2;
+ return 0;
+ }
+
int ExifData::read(const std::string& path)
{
JpegImage img;
@@ -587,7 +654,7 @@ namespace Exif {
rc = ifd1.readSubIfd(ifd1GpsIfd, buf, byteOrder(), 0x8825);
if (rc) return rc;
- // Finally, copy all metadata from the IFDs to the internal metadata
+ // Copy all metadata from the IFDs to the internal metadata
metadata_.clear();
add(ifd0.entries());
add(exifIfd.entries());
@@ -598,6 +665,9 @@ namespace Exif {
add(ifd1IopIfd.entries());
add(ifd1GpsIfd.entries());
+ // Read the thumbnail
+ thumbnail_.read(buf, ifd1, byteOrder());
+
return 0;
} // ExifData::read
diff --git a/src/exif.hpp b/src/exif.hpp
index 5150842..e4c3444 100644
--- a/src/exif.hpp
+++ b/src/exif.hpp
@@ -1,15 +1,29 @@
// ***************************************************************** -*- C++ -*-
/*
- * Copyright (c) 2004 Andreas Huggel. All rights reserved.
+ * Copyright (C) 2004 Andreas Huggel <ahuggel at gmx.net>
*
- * Todo: Insert license blabla here
+ * This program is part of the Exiv2 distribution.
*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*!
@file exif.hpp
@brief Encoding and decoding of %Exif data
- @version $Name: $ $Revision: 1.4 $
+ @version $Name: $ $Revision: 1.5 $
@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_
@@ -144,6 +158,7 @@ namespace Exif {
ByteOrder byteOrder_;
uint16 tag_;
uint32 offset_;
+
}; // class TiffHeader
/*!
@@ -188,7 +203,12 @@ namespace Exif {
The caller owns this copy and is responsible to delete it!
*/
virtual Value* clone() const =0;
- //! Write the value to an output stream, return the stream
+ /*!
+ @brief Write the value to an output stream. You do not usually have
+ to use this function; it is used for the implementation of
+ the output operator for %Value,
+ operator<<(std::ostream &os, const Value &value).
+ */
virtual std::ostream& write(std::ostream& os) const =0;
/*!
@@ -203,7 +223,7 @@ namespace Exif {
protected:
const TypeId typeId_; //!< Format type identifier
- };
+ }; // class Value
//! Output operator for Value types
inline std::ostream& operator<<(std::ostream& os, const Value& value)
@@ -216,8 +236,28 @@ namespace Exif {
public:
//! Default constructor.
DataValue(TypeId typeId =undefined) : Value(typeId) {}
+ /*!
+ @brief Read the value from a character buffer. The byte order is
+ required by the interface but not used by this method.
+
+ @param buf Pointer to the data buffer to read from
+ @param len Number of bytes in the data buffer
+ @param byteOrder Byte order. Not used.
+ */
virtual void read(const char* buf, long len, ByteOrder byteOrder);
+ //! Set the data from a string of integer values (e.g., "0 1 2 3")
virtual void read(const std::string& buf);
+ /*!
+ @brief Write value to a character data buffer. The byte order is
+ required by the interface but not used by this method.
+
+ The user must ensure that the buffer has enough memory. Otherwise
+ the call results in undefined behaviour.
+
+ @param buf Data buffer to write to.
+ @param byteOrder Byte order. Not used.
+ @return Number of characters written.
+ */
virtual long copy(char* buf, ByteOrder byteOrder) const;
virtual long size() const;
virtual Value* clone() const;
@@ -226,15 +266,35 @@ namespace Exif {
private:
std::string value_;
- };
+ }; // class DataValue
//! %Value for an Ascii string type.
class AsciiValue : public Value {
public:
//! Default constructor.
AsciiValue() : Value(asciiString) {}
+ /*!
+ @brief Read the value from a character buffer. The byte order is
+ required by the interface but not used by this method.
+
+ @param buf Pointer to the data buffer to read from
+ @param len Number of bytes in the data buffer
+ @param byteOrder Byte order. Not used.
+ */
virtual void read(const char* buf, long len, ByteOrder byteOrder);
+ //! Set the value to that of the supplied string
virtual void read(const std::string& buf);
+ /*!
+ @brief Write value to a character data buffer. The byte order is
+ required by the interface but not used by this method.
+
+ The user must ensure that the buffer has enough memory. Otherwise
+ the call results in undefined behaviour.
+
+ @param buf Data buffer to write to.
+ @param byteOrder Byte order. Not used.
+ @return Number of characters written.
+ */
virtual long copy(char* buf, ByteOrder byteOrder) const;
virtual long size() const;
virtual Value* clone() const;
@@ -243,7 +303,7 @@ namespace Exif {
private:
std::string value_;
- };
+ }; // class AsciiValue
/*!
@brief Template for a %Value for a basic Type. This is used for unsigned
@@ -255,27 +315,77 @@ namespace Exif {
//! Default constructor.
ValueType() : Value(getType<T>()) {}
virtual void read(const char* buf, long len, ByteOrder byteOrder);
+ /*!
+ @brief Set the data from a string of values of type T (e.g.,
+ "0 1 2 3" or "1/2 1/3 1/4" depending on what T is).
+ Generally, the accepted input format is the same as that
+ produced by the write() method.
+ */
virtual void read(const std::string& buf);
virtual long copy(char* buf, ByteOrder byteOrder) const;
virtual long size() const;
virtual Value* clone() const;
virtual std::ostream& write(std::ostream& os) const;
- private:
+ //! Container for values
typedef std::vector<T> ValueList;
+ //! @name Accessors
+ //@{
+ //! Read access to the list of values
+ const ValueList& valueList() const { return value_; }
+ /*!
+ @brief Get the first value. If there is no value in the container,
+ then the behaviour is undefined.
+ */
+ T value() const { return value_[0]; }
+ //@}
+
+ private:
ValueList value_;
- };
+ }; // class ValueType
+
+ //! Unsigned short value type
+ typedef ValueType<uint16> UShortValue;
+ //! Unsigned long value type
+ typedef ValueType<uint32> ULongValue;
+ //! Unsigned rational value type
+ typedef ValueType<URational> URationalValue;
+ //! Signed short value type
+ typedef ValueType<int16> ShortValue;
+ //! Signed long value type
+ typedef ValueType<int32> LongValue;
+ //! Signed rational value type
+ typedef ValueType<Rational> RationalValue;
/*!
@brief Information related to one %Exif tag.
*/
class Metadatum {
public:
- Metadatum(); //!< Constructor
- ~Metadatum(); //!< Destructor
- Metadatum(const Metadatum& rhs); //!< Copy constructor
- Metadatum& operator=(const Metadatum& rhs); //!< Assignment operator
+ //! Default Constructor
+ Metadatum();
+ /*!
+ @brief Constructor for tag data read from an IFD, when all
+ information is available. The Metadatum takes ownership
+ of the value pointer if one is provided, so the application
+ must not delete it!
+ */
+ Metadatum(uint16 tag, uint16 type, uint32 count, uint32 offset,
+ IfdId ifdId, int ifdIdx, Value* value =0);
+ /*!
+ @brief Constructor for new tags created by an application,
+ which doesn't know/care about the underlying IFD structure.
+ We'll figure out the details for it.
+ */
+ // Todo: implement me!
+ Metadatum(const std::string& key, TypeId typeId, Value* value =0);
+ //! Destructor
+ ~Metadatum();
+ //! Copy constructor
+ Metadatum(const Metadatum& rhs);
+ //! Assignment operator
+ Metadatum& operator=(const Metadatum& rhs);
//! Return the name of the type
const char* tagName() const { return ExifTags::tagName(tag_, ifdId_); }
@@ -290,28 +400,43 @@ namespace Exif {
//! Return the name of the section
const char* sectionName() const
{ return ExifTags::sectionName(tag_, ifdId_); }
- //! Return a unique key of the tag (ifdItem.sectionName.tagName)
- std::string key() const;
+ //! @name Accessors
+ //@{
+ //! Return the tag
+ uint16 tag() const { return tag_; }
+ //! Return the type
+ TypeId type() const { return TypeId(type_); }
+ //! Return the count
+ uint32 count() const { return count_; }
+ //! Return the IFD id
+ IfdId ifdId() const { return ifdId_; }
+ //! Return the position in the IFD (-1: not set)
+ int ifdIdx() const { return ifdIdx_; }
/*!
- @brief Return a reference the the value. The behaviour is undefined
- if the value has not been initialized.
- Todo: should we make sure there is a value?
+ @brief Return a constant reference to the value. Do not write to the
+ value through this reference. The behaviour is undefined if
+ value is not set.
*/
const Value& value() const { return *value_; }
+ //! Return a unique key of the tag (ifdItem.sectionName.tagName)
+ std::string key() const { return key_; }
+ //@}
public:
uint16 tag_; //!< Tag value
- uint16 type_; //!< Type of the data Todo: change to TypeId?
+ uint16 type_; //!< Type of the data
uint32 count_; //!< Number of components
uint32 offset_; //!< Offset of the data from start of IFD
- long size_; //!< Size of the data in bytes
IfdId ifdId_; //!< The IFD associated with this tag
int ifdIdx_; //!< Position in the IFD (-1: not set)
Value* value_; //!< Pointer to the value
- }; // struct Metadatum
+ std::string key_; //!< Unique key
+ long size_; //!< Size of the data in bytes
+
+ }; // class Metadatum
//! Container type to hold all metadata
typedef std::vector<Metadatum> Metadata;
@@ -330,7 +455,8 @@ namespace Exif {
private:
uint16 tag_;
- };
+
+ }; // class FindMetadatumByTag
/*!
@brief Models an IFD (Image File Directory)
@@ -399,6 +525,8 @@ namespace Exif {
long offset() const { return offset_; }
//! Get the IFD entries
const Metadata& entries() const { return entries_; }
+ //! Find an IFD entry by tag, return an iterator into the entries list
+ Metadata::const_iterator findTag(uint16 tag) const;
//! Get the offset to the next IFD from the start of the Tiff header
long next() const { return next_; }
//! Get the size of this IFD in bytes (IFD only, without data)
@@ -413,8 +541,22 @@ namespace Exif {
long next_; // offset of next IFD from the start of
// the Tiff header
long size_; // size of the IFD in bytes
+
}; // class Ifd
+ //! 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);
+
+ //! Write thumbnail to file path, return 0 if successful
+ int write(const std::string& path) const;
+
+ private:
+ std::string thumbnail_;
+ }; // class Thumbnail
+
/*!
@brief A container for %Exif data
@@ -422,8 +564,9 @@ namespace Exif {
- read and write access to all tags and data
- iterators to access the %Exif data
- decoding and encoding through the stream interface
- - human readable
+ - human readable output
- XML input and output
+ - access to thumbnail (write, delete, re-calculate)
Todo:
- A constructor which creates a minimal valid set of %Exif data
@@ -468,10 +611,16 @@ namespace Exif {
//! End of the metadata
const_iterator end() const { return metadata_.end(); }
+ //! Write the thumbnail image to a file
+ int writeThumbnail(const std::string& path) const
+ { return thumbnail_.write(path); }
+
private:
long offset_; // Original abs offset of the Exif data
TiffHeader tiffHeader_;
Metadata metadata_;
+ Thumbnail thumbnail_;
+
}; // class ExifData
// *****************************************************************************
diff --git a/src/exiftest.cpp b/src/exiftest.cpp
index 2bcb1ef..d271557 100644
--- a/src/exiftest.cpp
+++ b/src/exiftest.cpp
@@ -29,7 +29,7 @@ int main(int argc, char* const argv[])
<< i->typeName() << " "
<< std::dec << std::setw(3)
<< std::setfill(' ') << std::right
- << i->count_ << " "
+ << i->count_ << " "
<< std::dec << i->value() << "
";
}
}
@@ -49,11 +49,12 @@ int main(int argc, char* const argv[])
ValueType<Rational> vr;
ValueType<URational> vur;
- std::string str(" 4 / 5 x2 5/3");
+ std::string str("1/ 2 4 / 5 2 5/3");
vr.read(str);
std::cout << "ValueType<Rational> vr = " << vr
<< ", size is " << vr.size() << "
";
- return rc;
+ rc = exifData.writeThumbnail("thumb.jpg");
+ return rc;
}
diff --git a/src/tags.cpp b/src/tags.cpp
index 31441d3..1ffdc0a 100644
--- a/src/tags.cpp
+++ b/src/tags.cpp
@@ -1,18 +1,31 @@
// ***************************************************************** -*- C++ -*-
/*
- * Copyright (c) 2004 Andreas Huggel
- *
- * Todo: Insert license blabla here
+ * Copyright (C) 2004 Andreas Huggel <ahuggel at gmx.net>
+ *
+ * This program is part of the Exiv2 distribution.
*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
- Author(s): Andreas Huggel (ahu)
+ Author(s): Andreas Huggel (ahu) <ahuggel at gmx.net>
History:
15-Jan-04, ahu: created
RCS information
$Name: $
- $Revision: 1.4 $
+ $Revision: 1.5 $
*/
// *****************************************************************************
// included header files
diff --git a/src/tags.hpp b/src/tags.hpp
index 0eff1df..2ee2703 100644
--- a/src/tags.hpp
+++ b/src/tags.hpp
@@ -1,15 +1,29 @@
// ***************************************************************** -*- C++ -*-
/*
- * Copyright (c) 2004 Andreas Huggel. All rights reserved.
+ * Copyright (C) 2004 Andreas Huggel <ahuggel at gmx.net>
*
- * Todo: Insert license blabla here
+ * This program is part of the Exiv2 distribution.
*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*!
@file tags.hpp
@brief %Exif tag and type information
- @version $Name: $ $Revision: 1.4 $
+ @version $Name: $ $Revision: 1.5 $
@author Andreas Huggel (ahu)
+ <a href="mailto:ahuggel at gmx.net">ahuggel at gmx.net</a>
@date 15-Jan-03, ahu: created
*/
#ifndef _TAGS_HPP_
diff --git a/src/utils.cpp b/src/utils.cpp
index f1c5068..63238bf 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -1,18 +1,31 @@
// ********************************************************** -*- C++ -*-
/*
- * Copyright (c) 2004 Andreas Huggel. All rights reserved.
+ * Copyright (C) 2004 Andreas Huggel <ahuggel at gmx.net>
*
- * Todo: Insert license blabla here
+ * This program is part of the Exiv2 distribution.
*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
- Author(s): Andreas Huggel (ahu)
+ Author(s): Andreas Huggel (ahu) <ahuggel at gmx.net>
History:
08-Dec-03, ahu: created
RCS information
$Name: $
- $Revision: 1.2 $
+ $Revision: 1.3 $
*/
// *********************************************************************
diff --git a/src/utils.hpp b/src/utils.hpp
index e77a3b9..741d59d 100644
--- a/src/utils.hpp
+++ b/src/utils.hpp
@@ -1,15 +1,29 @@
// ********************************************************* -*- C++ -*-
/*
- * Copyright (c) 2004 Andreas Huggel. All rights reserved.
+ * Copyright (C) 2004 Andreas Huggel <ahuggel at gmx.net>
*
- * Todo: insert license blabla here.
+ * This program is part of the Exiv2 distribution.
*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*!
@file utils.hpp
@brief A collection of utility functions
- @version $Name: $ $Revision: 1.2 $
+ @version $Name: $ $Revision: 1.3 $
@author Andreas Huggel (ahu)
+ <a href="mailto:ahuggel at gmx.net">ahuggel at gmx.net</a>
@date 12-Dec-03, ahu: created
*/
#ifndef _UTILS_HPP_
--
exiv2 packaging
More information about the pkg-kde-commits
mailing list