aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libpyexiv2.cpp110
-rw-r--r--src/libpyexiv2.hpp9
-rw-r--r--src/pyexiv2.py6
-rw-r--r--todo2
4 files changed, 48 insertions, 79 deletions
diff --git a/src/libpyexiv2.cpp b/src/libpyexiv2.cpp
index 1206b2a..f77b6c7 100644
--- a/src/libpyexiv2.cpp
+++ b/src/libpyexiv2.cpp
@@ -26,7 +26,11 @@
#include "libpyexiv2.hpp"
-#define METADATA_NOT_READ_CODE 101
+// Custom error codes for Exiv2 exceptions
+#define METADATA_NOT_READ 101
+#define KEY_NOT_FOUND 102
+#define THUMB_ACCESS 103
+#define NO_THUMBNAIL 104
namespace LibPyExiv2
{
@@ -66,7 +70,7 @@ namespace LibPyExiv2
_image->writeMetadata();
}
else
- throw Exiv2::Error(METADATA_NOT_READ_CODE);
+ throw Exiv2::Error(METADATA_NOT_READ);
}
boost::python::list Image::getAvailableExifTags()
@@ -81,7 +85,7 @@ namespace LibPyExiv2
return list;
}
else
- throw Exiv2::Error(METADATA_NOT_READ_CODE);
+ throw Exiv2::Error(METADATA_NOT_READ);
}
boost::python::tuple Image::getExifTag(std::string key)
@@ -96,14 +100,10 @@ namespace LibPyExiv2
return boost::python::make_tuple(exifDatum.typeName(), exifDatum.toString());
}
else
- {
- // The key was not found
- std::cerr << ">>> Image::getExifTag(): tag '" << key << "' not found" << std::endl;
- return boost::python::make_tuple(std::string(""), std::string(""));
- }
+ throw Exiv2::Error(KEY_NOT_FOUND, key);
}
else
- throw Exiv2::Error(METADATA_NOT_READ_CODE);
+ throw Exiv2::Error(METADATA_NOT_READ);
}
std::string Image::getExifTagToString(std::string key)
@@ -120,14 +120,10 @@ namespace LibPyExiv2
return buffer.str();
}
else
- {
- // The key was not found
- std::cerr << ">>> Image::getExifTagToString(): tag '" << key << "' not found" << std::endl;
- return std::string("");
- }
+ throw Exiv2::Error(KEY_NOT_FOUND, key);
}
else
- throw Exiv2::Error(METADATA_NOT_READ_CODE);
+ throw Exiv2::Error(METADATA_NOT_READ);
}
boost::python::tuple Image::setExifTag(std::string key, std::string value)
@@ -149,14 +145,13 @@ namespace LibPyExiv2
else
{
// The key was not found
- std::cerr << ">>> Image::setExifTag(): tag '" << key << "' not found" << std::endl;
returnValue = boost::python::make_tuple(std::string(""), std::string(""));
}
_exifData[key] = value;
return returnValue;
}
else
- throw Exiv2::Error(METADATA_NOT_READ_CODE);
+ throw Exiv2::Error(METADATA_NOT_READ);
}
boost::python::tuple Image::deleteExifTag(std::string key)
@@ -171,17 +166,13 @@ namespace LibPyExiv2
Exiv2::Exifdatum exifDatum = _exifData[key];
returnValue = boost::python::make_tuple(exifDatum.typeName(), exifDatum.toString());
_exifData.erase(i);
+ return returnValue;
}
else
- {
- // The key was not found
- std::cerr << ">>> Image::deleteExifTag(): tag '" << key << "' not found" << std::endl;
- returnValue = boost::python::make_tuple(std::string(""), std::string(""));
- }
- return returnValue;
+ throw Exiv2::Error(KEY_NOT_FOUND, key);
}
else
- throw Exiv2::Error(METADATA_NOT_READ_CODE);
+ throw Exiv2::Error(METADATA_NOT_READ);
}
// returns a list containing the keys of all the IPTC tags available in
@@ -198,7 +189,7 @@ namespace LibPyExiv2
return list;
}
else
- throw Exiv2::Error(METADATA_NOT_READ_CODE);
+ throw Exiv2::Error(METADATA_NOT_READ);
}
boost::python::tuple Image::getIptcTag(std::string key)
@@ -213,14 +204,10 @@ namespace LibPyExiv2
return boost::python::make_tuple(iptcDatum.typeName(), iptcDatum.toString());
}
else
- {
- // The key was not found
- std::cerr << ">>> Image::getIptcTag(): tag '" << key << "' not found" << std::endl;
- return boost::python::make_tuple(std::string(""), std::string(""));
- }
+ throw Exiv2::Error(KEY_NOT_FOUND, key);
}
else
- throw Exiv2::Error(METADATA_NOT_READ_CODE);
+ throw Exiv2::Error(METADATA_NOT_READ);
}
boost::python::tuple Image::setIptcTag(std::string key, std::string value)
@@ -240,14 +227,13 @@ namespace LibPyExiv2
else
{
// The key was not found
- std::cerr << ">>> Image::setIptcTag(): tag '" << key << "' not found" << std::endl;
returnValue = boost::python::make_tuple(std::string(""), std::string(""));
}
_iptcData[key] = value;
return returnValue;
}
else
- throw Exiv2::Error(METADATA_NOT_READ_CODE);
+ throw Exiv2::Error(METADATA_NOT_READ);
}
boost::python::tuple Image::deleteIptcTag(std::string key)
@@ -262,17 +248,13 @@ namespace LibPyExiv2
Exiv2::Iptcdatum iptcDatum = _iptcData[key];
returnValue = boost::python::make_tuple(iptcDatum.typeName(), iptcDatum.toString());
_iptcData.erase(i);
+ return returnValue;
}
else
- {
- // The key was not found
- std::cerr << ">>> Image::deleteIptcTag(): tag '" << key << "' not found" << std::endl;
- returnValue = boost::python::make_tuple(std::string(""), std::string(""));
- }
- return returnValue;
+ throw Exiv2::Error(KEY_NOT_FOUND, key);
}
else
- throw Exiv2::Error(METADATA_NOT_READ_CODE);
+ throw Exiv2::Error(METADATA_NOT_READ);
}
boost::python::tuple Image::getThumbnailData()
@@ -302,24 +284,21 @@ namespace LibPyExiv2
return boost::python::make_tuple(format, data);
}
else
- {
- std::cerr << ">>> Image::getThumbnailData(): cannot access thumbnail" << std::endl;
- return boost::python::make_tuple(std::string(""), std::string(""));
- }
+ throw Exiv2::Error(THUMB_ACCESS);
}
- throw Exiv2::Error(METADATA_NOT_READ_CODE);
+ else
+ throw Exiv2::Error(METADATA_NOT_READ);
}
- bool Image::setThumbnailData(std::string data)
+ void Image::setThumbnailData(std::string data)
{
if(_dataRead)
{
const Exiv2::byte* dataBuf = (const Exiv2::byte*) data.c_str();
_exifData.setJpegThumbnail(dataBuf, data.size());
- return true;
}
else
- throw Exiv2::Error(METADATA_NOT_READ_CODE);
+ throw Exiv2::Error(METADATA_NOT_READ);
}
void Image::deleteThumbnail()
@@ -327,37 +306,29 @@ namespace LibPyExiv2
if(_dataRead)
_exifData.eraseThumbnail();
else
- throw Exiv2::Error(METADATA_NOT_READ_CODE);
+ throw Exiv2::Error(METADATA_NOT_READ);
}
- bool Image::dumpThumbnailToFile(const std::string path)
+ void Image::dumpThumbnailToFile(const std::string path)
{
if(_dataRead)
{
int result = _exifData.writeThumbnail(path);
- if (result == 0)
- {
- return true;
- }
- else if (result == 8)
- {
- std::cerr << ">>> Image::dumpThumbnailToFile(): the EXIF data does not contain a thumbnail";
- return false;
- }
+ if (result == 8)
+ throw Exiv2::Error(NO_THUMBNAIL);
}
else
- throw Exiv2::Error(METADATA_NOT_READ_CODE);
+ throw Exiv2::Error(METADATA_NOT_READ);
}
- bool Image::setThumbnailFromJpegFile(const std::string path)
+ void Image::setThumbnailFromJpegFile(const std::string path)
{
if(_dataRead)
{
_exifData.setJpegThumbnail(path);
- return true;
}
else
- throw Exiv2::Error(METADATA_NOT_READ_CODE);
+ throw Exiv2::Error(METADATA_NOT_READ);
}
void translateExiv2Error(Exiv2::Error const& e)
@@ -419,10 +390,19 @@ namespace LibPyExiv2
PyErr_SetString(PyExc_MemoryError, message);
break;
- // custom defined error codes
- case METADATA_NOT_READ_CODE:
+ // custom error codes
+ case METADATA_NOT_READ:
PyErr_SetString(PyExc_IOError, "Image metadata has not been read yet");
break;
+ case KEY_NOT_FOUND:
+ PyErr_SetString(PyExc_ValueError, "Tag not set");
+ break;
+ case THUMB_ACCESS:
+ PyErr_SetString(PyExc_IOError, "Cannot access image thumbnail");
+ break;
+ case NO_THUMBNAIL:
+ PyErr_SetString(PyExc_IOError, "The EXIF data does not contain a thumbnail");
+ break;
default:
PyErr_SetString(PyExc_RuntimeError, message);
diff --git a/src/libpyexiv2.hpp b/src/libpyexiv2.hpp
index dff97ce..53cf532 100644
--- a/src/libpyexiv2.hpp
+++ b/src/libpyexiv2.hpp
@@ -104,8 +104,7 @@ namespace LibPyExiv2
// Sets the thumbnail of the image. The parameter is the thumbnail raw
// jpeg data as a string buffer.
- // Returns true if successful, false otherwise.
- bool setThumbnailData(std::string data);
+ void setThumbnailData(std::string data);
// Deletes the thumbnail embedded in the image.
void deleteThumbnail();
@@ -113,13 +112,11 @@ namespace LibPyExiv2
// Writes the thumbnail to an image file.
// A filename extension is appended to the given path according to the
// image type of the thumbnail, so it should not include an extension.
- // Returns true if successful, false otherwise.
- bool dumpThumbnailToFile(const std::string path);
+ void dumpThumbnailToFile(const std::string path);
// Sets the image contained in the jpeg file passed as a parameter as
// the thumbnail of the image.
- // Returns true if successful, false otherwise.
- bool setThumbnailFromJpegFile(const std::string path);
+ void setThumbnailFromJpegFile(const std::string path);
private:
std::string _filename;
diff --git a/src/pyexiv2.py b/src/pyexiv2.py
index a7280e4..9f61a69 100644
--- a/src/pyexiv2.py
+++ b/src/pyexiv2.py
@@ -334,9 +334,6 @@ class Image(libpyexiv2.Image):
# call method getExifTagToString() to obtain directly the value as a
# human-readable string.
return UndefinedToString(tagValue)
- else:
- # empty type and value
- return
def setExifTagValue(self, key, value):
"""
@@ -392,9 +389,6 @@ class Image(libpyexiv2.Image):
return StringToTime(tagValue)
elif tagType == 'Undefined':
return tagValue
- else:
- # empty type and value
- return
def setIptcTagValue(self, key, value):
"""
diff --git a/todo b/todo
index 4b2c21f..5b51520 100644
--- a/todo
+++ b/todo
@@ -1,6 +1,4 @@
todo list
-- Convert exiv2 C++ exceptions to python exceptions (if that is possible?)
- instead of returning empty strings.
- Write unit tests.
- Write a complete documentation for the binding and it uses.