From 5ee4579755d346122b7eb818f6c5a30290e87be2 Mon Sep 17 00:00:00 2001 From: Olivier Tilloy Date: Thu, 5 Nov 2009 09:52:43 +0100 Subject: Renamed ExifTag's _value to _raw_value. Value and raw value setters. --- src/exiv2wrapper.cpp | 10 +++---- src/exiv2wrapper.hpp | 6 ++-- src/exiv2wrapper_python.cpp | 4 +-- src/pyexiv2/exif2.py | 68 +++++++++++++++++++++++++++++++++++---------- 4 files changed, 63 insertions(+), 25 deletions(-) diff --git a/src/exiv2wrapper.cpp b/src/exiv2wrapper.cpp index 96c840a..ce0c7fc 100644 --- a/src/exiv2wrapper.cpp +++ b/src/exiv2wrapper.cpp @@ -480,13 +480,13 @@ ExifTag::ExifTag(const std::string& key): _key(key), _datum(_key) _description = Exiv2::ExifTags::tagDesc(tag, ifd); _sectionName = Exiv2::ExifTags::sectionName(tag, ifd); _sectionDescription = Exiv2::ExifTags::sectionDesc(tag, ifd); - _value = _datum.toString(); + _raw_value = _datum.toString(); } -void ExifTag::setValue(const std::string& value) +void ExifTag::setRawValue(const std::string& value) { _datum.setValue(value); - _value = _datum.toString(); + _raw_value = _datum.toString(); } const std::string ExifTag::getKey() @@ -529,9 +529,9 @@ const std::string ExifTag::getSectionDescription() return _sectionDescription; } -const std::string ExifTag::getValue() +const std::string ExifTag::getRawValue() { - return _value; + return _raw_value; } diff --git a/src/exiv2wrapper.hpp b/src/exiv2wrapper.hpp index 8f593a8..9ea95e4 100644 --- a/src/exiv2wrapper.hpp +++ b/src/exiv2wrapper.hpp @@ -162,7 +162,7 @@ public: // Constructor ExifTag(const std::string& key); - void setValue(const std::string& value); + void setRawValue(const std::string& value); const std::string getKey(); const std::string getType(); @@ -172,7 +172,7 @@ public: const std::string getDescription(); const std::string getSectionName(); const std::string getSectionDescription(); - const std::string getValue(); + const std::string getRawValue(); private: Exiv2::ExifKey _key; @@ -184,7 +184,7 @@ private: std::string _description; std::string _sectionName; std::string _sectionDescription; - std::string _value; + std::string _raw_value; }; diff --git a/src/exiv2wrapper_python.cpp b/src/exiv2wrapper_python.cpp index 54967a5..88c1353 100644 --- a/src/exiv2wrapper_python.cpp +++ b/src/exiv2wrapper_python.cpp @@ -78,7 +78,7 @@ BOOST_PYTHON_MODULE(libexiv2python) class_("ExifTag", init()) - .def("_setValue", &ExifTag::setValue) + .def("_setRawValue", &ExifTag::setRawValue) .def("_getKey", &ExifTag::getKey) .def("_getType", &ExifTag::getType) @@ -88,7 +88,7 @@ BOOST_PYTHON_MODULE(libexiv2python) .def("_getDescription", &ExifTag::getDescription) .def("_getSectionName", &ExifTag::getSectionName) .def("_getSectionDescription", &ExifTag::getSectionDescription) - .def("_getValue", &ExifTag::getValue) + .def("_getRawValue", &ExifTag::getRawValue) ; class_("IptcTag", init()) diff --git a/src/pyexiv2/exif2.py b/src/pyexiv2/exif2.py index d73c072..cae290d 100644 --- a/src/pyexiv2/exif2.py +++ b/src/pyexiv2/exif2.py @@ -26,7 +26,7 @@ import libexiv2python -from pyexiv2.utils import Rational +from pyexiv2.utils import Rational, NotifyingList, ListenerInterface import time import datetime @@ -52,7 +52,7 @@ class ExifValueError(ValueError): (self.type, self.value) -class ExifTag(libexiv2python.ExifTag): +class ExifTag(libexiv2python.ExifTag, ListenerInterface): """ DOCME @@ -71,20 +71,13 @@ class ExifTag(libexiv2python.ExifTag): """ DOCME """ - #libexiv2python.ExifTag.__init__(key) super(ExifTag, self).__init__(key) if value is not None: self._set_value(value) else: self._raw_value = None self._value = None - - def _convert_to_string(self, value): - """ - DOCME - """ - # TODO: implement me - return str(value) + self.metadata = None @property def key(self): @@ -118,16 +111,59 @@ class ExifTag(libexiv2python.ExifTag): def section_description(self): return self._getSectionDescription() + def _get_raw_value(self): + return self._raw_value + + def _set_raw_value(self, value): + self._raw_value = value + if self.type in ('Short', 'Long', 'SLong', 'Rational', 'SRational'): + # May contain multiple values + values = value.split() + if len(values) > 1: + # Make values a notifying list + values = map(self._convert_to_python, values) + self._value = NotifyingList(values) + self._value.register_listener(self) + return + self._value = self._convert_to_python(value) + + raw_value = property(fget=_get_raw_value, fset=_set_raw_value, doc=None) + def _get_value(self): return self._value - def _set_value(self, new_value): - self._value = new_value - self._raw_value = self._convert_to_string(new_value) - self._setValue(self._raw_value) + def _set_value(self, value): + if isinstance(value, (list, tuple)): + raw_values = map(self._convert_to_string, value) + self._raw_value = ' '.join(raw_values) + else: + self._raw_value = self._convert_to_string(value) + self._setRawValue(self._raw_value) + + if self.metadata is not None: + self.metadata._set_exif_tag_value(self.key, self._raw_value) + + if isinstance(self._value, NotifyingList): + self._value.unregister_listener(self) + + if isinstance(value, NotifyingList): + # Already a notifying list + self._value = value + self._value.register_listener(self) + elif isinstance(value, (list, tuple)): + # Make the values a notifying list + self._value = NotifyingList(value) + self._value.register_listener(self) + else: + # Single value + self._value = value value = property(fget=_get_value, fset=_set_value, doc=None) + # Implement the ListenerInterface + def contents_changed(self): + raise NotImplementedError('TODO: implement me!') + def _convert_to_python(self, value): """ Convert one raw value to its corresponding python type. @@ -298,7 +334,9 @@ class ExifTag(libexiv2python.ExifTag): @rtype: C{str} """ left = '%s [%s]' % (self.key, self.type) - if self.type == 'Undefined' and len(self._value) > 100: + if self._value is None: + right = '(No value)' + elif self.type == 'Undefined' and len(self._value) > 100: right = '(Binary value suppressed)' else: #right = self.fvalue -- cgit