[niepce] Remove xmpproperties as everything belong to libmetadata
- From: Hubert FiguiÃre <hub src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [niepce] Remove xmpproperties as everything belong to libmetadata
- Date: Sun, 13 Nov 2011 06:50:43 +0000 (UTC)
commit 340bbaa885ee840f6267293b1dece72ee8df9209
Author: Hub Figuiere <hub figuiere net>
Date: Sat Nov 12 20:38:51 2011 -0800
Remove xmpproperties as everything belong to libmetadata
src/engine/db/Makefile.am | 1 -
src/engine/db/libmetadata.cpp | 122 +++++++++++++++++++++++-
src/engine/db/libmetadata.hpp | 12 +++
src/engine/db/xmpproperties.cpp | 158 ------------------------------
src/engine/db/xmpproperties.hpp | 61 ------------
src/niepce/ui/gridviewmodule.cpp | 4 +-
src/niepce/ui/metadatapanecontroller.cpp | 5 +-
src/niepce/ui/metadatapanecontroller.hpp | 3 +-
8 files changed, 139 insertions(+), 227 deletions(-)
---
diff --git a/src/engine/db/Makefile.am b/src/engine/db/Makefile.am
index 3c5d776..5a31415 100644
--- a/src/engine/db/Makefile.am
+++ b/src/engine/db/Makefile.am
@@ -38,5 +38,4 @@ libniepcedb_a_SOURCES = library.hpp library.cpp \
filebundle.hpp filebundle.cpp \
metadata.hpp \
properties.hpp properties.cpp \
- xmpproperties.hpp xmpproperties.cpp \
properties-def.hpp
diff --git a/src/engine/db/libmetadata.cpp b/src/engine/db/libmetadata.cpp
index 145d632..e044567 100644
--- a/src/engine/db/libmetadata.cpp
+++ b/src/engine/db/libmetadata.cpp
@@ -23,11 +23,50 @@
#include <exempi/xmperrors.h>
#include "fwk/base/debug.hpp"
+#include "fwk/utils/stringutils.hpp"
#include "libmetadata.hpp"
-#include "xmpproperties.hpp"
+#include "properties.hpp"
namespace eng {
+typedef std::map<fwk::PropertyIndex, std::pair<const char*, const char *> > PropsToXmpMap;
+
+/** get the mapping of properties to XMP */
+const PropsToXmpMap & props_to_xmp_map();
+
+
+const PropsToXmpMap & props_to_xmp_map()
+{
+ static PropsToXmpMap s_props_map;
+ if(s_props_map.empty()) {
+
+#define DEFINE_PROPERTY(a,b,c,d,e) \
+ s_props_map.insert(std::make_pair(b, std::make_pair(c,d)));
+#include "engine/db/properties-def.hpp"
+#undef DEFINE_PROPERTY
+
+ }
+ return s_props_map;
+}
+
+bool LibMetadata::property_index_to_xmp(fwk::PropertyIndex index, const char * & ns, const char * & property)
+{
+ const PropsToXmpMap & propmap = props_to_xmp_map();
+ PropsToXmpMap::const_iterator iter = propmap.find(index);
+ if(iter == propmap.end()) {
+ // not found
+ return false;
+ }
+ if(iter->second.first == NULL || iter->second.second == NULL) {
+ // no XMP equivalent
+ return false;
+ }
+ ns = iter->second.first;
+ property = iter->second.second;
+ return true;
+}
+
+
LibMetadata::LibMetadata(library_id_t _id)
: XmpMeta(),
@@ -67,6 +106,87 @@ bool LibMetadata::setMetaData(fwk::PropertyIndex meta, const fwk::PropertyValue
return result;
}
+
+bool LibMetadata::getMetaData(fwk::PropertyIndex p, fwk::PropertyValue & value) const
+{
+ const PropsToXmpMap & propmap = props_to_xmp_map();
+ PropsToXmpMap::const_iterator iter = propmap.find(p);
+ if(iter == propmap.end()) {
+ // not found
+ return false;
+ }
+ if(iter->second.first == NULL || iter->second.second == NULL) {
+ // no XMP equivalent
+ return false;
+ }
+ xmp::ScopedPtr<XmpStringPtr> xmp_value(xmp_string_new());
+ uint32_t prop_bits = 0;
+ const char * ns = iter->second.first;
+ const char * xmp_prop = iter->second.second;
+ bool found = xmp_get_property(xmp(), ns, xmp_prop, xmp_value, &prop_bits);
+ if(found && XMP_IS_ARRAY_ALTTEXT(prop_bits)) {
+ found = xmp_get_localized_text(xmp(), ns, xmp_prop, "", "x-default",
+ NULL, xmp_value, NULL);
+ }
+ if(found) {
+ const char * v = NULL;
+ v = xmp_string_cstr(xmp_value);
+ if(v) {
+ value = fwk::PropertyValue(v);
+ return true;
+ }
+ }
+ // not found in XMP
+ return false;
+}
+
+void LibMetadata::to_properties(const fwk::PropertySet & propset,
+ fwk::PropertyBag & properties)
+{
+ fwk::PropertySet::const_iterator iter;
+ xmp::ScopedPtr<XmpStringPtr> value(xmp_string_new());
+ fwk::PropertyValue propval;
+ for(iter = propset.begin(); iter != propset.end(); ++iter) {
+ switch(*iter) {
+ case NpXmpRatingProp:
+ properties.set_value_for_property(NpXmpRatingProp,
+ fwk::PropertyValue(rating()));
+ break;
+ case NpXmpLabelProp:
+ properties.set_value_for_property(NpXmpLabelProp,
+ fwk::PropertyValue(label()));
+ break;
+ case NpTiffOrientationProp:
+ properties.set_value_for_property(NpTiffOrientationProp,
+ fwk::PropertyValue(orientation()));
+ break;
+ case NpIptcKeywordsProp:
+ {
+ xmp::ScopedPtr<XmpIteratorPtr>
+ iter(xmp_iterator_new(xmp(), NS_DC,
+ "subject", XMP_ITER_JUSTLEAFNODES));
+ std::vector<std::string> vec;
+ while(xmp_iterator_next(iter, NULL, NULL, value, NULL)) {
+ vec.push_back(xmp_string_cstr(value));
+ }
+ std::string v = fwk::join(vec, ", ");
+ properties.set_value_for_property(NpIptcKeywordsProp,
+ fwk::PropertyValue(v));
+ break;
+ }
+ default:
+ if(getMetaData(*iter, propval)) {
+ properties.set_value_for_property(*iter, propval);
+ }
+ else {
+ DBG_OUT("unknown prop %u", *iter);
+ }
+ break;
+ }
+ }
+}
+
+
bool LibMetadata::touch()
{
bool result = false;
diff --git a/src/engine/db/libmetadata.hpp b/src/engine/db/libmetadata.hpp
index 55b865f..4ac7dd1 100644
--- a/src/engine/db/libmetadata.hpp
+++ b/src/engine/db/libmetadata.hpp
@@ -43,12 +43,24 @@ public:
library_id_t id() const
{ return m_id; }
bool setMetaData(fwk::PropertyIndex meta, const fwk::PropertyValue & value);
+ bool getMetaData(fwk::PropertyIndex meta, fwk::PropertyValue & value) const;
+
+ /** convert XMP to a set of properties
+ * @param propset the property set requested
+ * @param props the output properties
+ */
+ void to_properties(const fwk::PropertySet & propset,
+ fwk::PropertyBag & properties);
/** do like the unix "touch". Update the MetadataDate
* to the current time, in UTC.
*/
bool touch();
private:
LibMetadata(const LibMetadata &);
+
+ static bool property_index_to_xmp(fwk::PropertyIndex index,
+ const char * & ns, const char * & property);
+
library_id_t m_id;
};
diff --git a/src/niepce/ui/gridviewmodule.cpp b/src/niepce/ui/gridviewmodule.cpp
index 37d720f..6a18379 100644
--- a/src/niepce/ui/gridviewmodule.cpp
+++ b/src/niepce/ui/gridviewmodule.cpp
@@ -55,7 +55,7 @@ GridViewModule::on_lib_notification(const eng::LibNotification &ln)
eng::LibMetadata::Ptr lm
= boost::any_cast<eng::LibMetadata::Ptr>(ln.param);
DBG_OUT("received metadata");
- m_metapanecontroller->display(lm->id(), lm.get());
+ m_metapanecontroller->display(lm->id(), lm);
break;
}
case eng::Library::NOTIFY_METADATA_CHANGED:
@@ -76,7 +76,7 @@ GridViewModule::on_lib_notification(const eng::LibNotification &ln)
void GridViewModule::display_none()
{
- m_metapanecontroller->display(0, NULL);
+ m_metapanecontroller->display(0, eng::LibMetadata::Ptr());
}
diff --git a/src/niepce/ui/metadatapanecontroller.cpp b/src/niepce/ui/metadatapanecontroller.cpp
index 9cba7db..9aa784e 100644
--- a/src/niepce/ui/metadatapanecontroller.cpp
+++ b/src/niepce/ui/metadatapanecontroller.cpp
@@ -27,7 +27,6 @@
#include "fwk/base/debug.hpp"
#include "fwk/toolkit/metadatawidget.hpp"
#include "engine/db/properties.hpp"
-#include "engine/db/xmpproperties.hpp"
#include "metadatapanecontroller.hpp"
namespace ui {
@@ -147,14 +146,14 @@ void MetaDataPaneController::on_metadata_changed(const fwk::PropertyBag & props,
}
-void MetaDataPaneController::display(eng::library_id_t file_id, const fwk::XmpMeta * meta)
+void MetaDataPaneController::display(eng::library_id_t file_id, const eng::LibMetadata::Ptr & meta)
{
m_fileid = file_id;
DBG_OUT("displaying metadata");
fwk::PropertyBag properties;
if(meta) {
const fwk::PropertySet & propset = get_property_set();
- eng::convert_xmp_to_properties(meta, propset, properties);
+ meta->to_properties(propset, properties);
}
std::for_each(m_widgets.begin(), m_widgets.end(),
boost::bind(&fwk::MetaDataWidget::set_data_source,
diff --git a/src/niepce/ui/metadatapanecontroller.hpp b/src/niepce/ui/metadatapanecontroller.hpp
index 3e58548..cae35e0 100644
--- a/src/niepce/ui/metadatapanecontroller.hpp
+++ b/src/niepce/ui/metadatapanecontroller.hpp
@@ -23,6 +23,7 @@
#include <gtkmm/box.h>
#include "engine/db/librarytypes.hpp"
+#include "engine/db/libmetadata.hpp"
#include "fwk/utils/exempi.hpp"
#include "fwk/toolkit/dockable.hpp"
@@ -43,7 +44,7 @@ public:
MetaDataPaneController();
~MetaDataPaneController();
virtual Gtk::Widget * buildWidget(const Glib::RefPtr<Gtk::UIManager> &);
- void display(eng::library_id_t file_id, const fwk::XmpMeta * meta);
+ void display(eng::library_id_t file_id, const eng::LibMetadata::Ptr & meta);
eng::library_id_t displayed_file() const
{ return m_fileid; }
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]