[niepce] Remove xmpproperties as everything belong to libmetadata



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]