Property: add getters
authorTomi Valkeinen <tomi.valkeinen@ti.com>
Fri, 3 Jun 2016 13:37:17 +0000 (16:37 +0300)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Sat, 4 Jun 2016 19:33:53 +0000 (22:33 +0300)
libkms++/property.cpp
libkms++/property.h

index 5ec6bfa36096fcf3f1bcd31e12b36119bef84b79..d4d03b62dbbd9bbfac89906089ecaac05158b091 100644 (file)
@@ -19,6 +19,25 @@ Property::Property(Card& card, uint32_t id)
        m_priv = new PropertyPriv();
        m_priv->drm_prop = drmModeGetProperty(card.fd(), id);
        m_name = m_priv->drm_prop->name;
+
+       PropertyType t;
+       drmModePropertyPtr p = m_priv->drm_prop;
+       if (drm_property_type_is(p, DRM_MODE_PROP_BITMASK))
+               t = PropertyType::Bitmask;
+       else if (drm_property_type_is(p, DRM_MODE_PROP_BLOB))
+               t = PropertyType::Blob;
+       else if (drm_property_type_is(p, DRM_MODE_PROP_ENUM))
+               t = PropertyType::Enum;
+       else if (drm_property_type_is(p, DRM_MODE_PROP_OBJECT))
+               t = PropertyType::Object;
+       else if (drm_property_type_is(p, DRM_MODE_PROP_RANGE))
+               t = PropertyType::Range;
+       else if (drm_property_type_is(p, DRM_MODE_PROP_SIGNED_RANGE))
+               t = PropertyType::SignedRange;
+       else
+               throw invalid_argument("Invalid property type");
+
+       m_type = t;
 }
 
 Property::~Property()
@@ -32,6 +51,40 @@ const string& Property::name() const
        return m_name;
 }
 
+bool Property::is_immutable() const
+{
+       return m_priv->drm_prop->flags & DRM_MODE_PROP_IMMUTABLE;
+}
+
+bool Property::is_pending() const
+{
+       return m_priv->drm_prop->flags & DRM_MODE_PROP_PENDING;
+}
+
+vector<uint64_t> Property::get_values() const
+{
+       drmModePropertyPtr p = m_priv->drm_prop;
+       return vector<uint64_t>(p->values, p->values + p->count_values);
+}
+
+map<uint64_t, string> Property::get_enums() const
+{
+       drmModePropertyPtr p = m_priv->drm_prop;
+
+       map<uint64_t, string> map;
+
+       for (int i = 0; i < p->count_enums; ++i)
+               map[p->enums[i].value] = string(p->enums[i].name);
+
+       return map;
+}
+
+vector<uint32_t> Property::get_blob_ids() const
+{
+       drmModePropertyPtr p = m_priv->drm_prop;
+       return vector<uint32_t>(p->blob_ids, p->blob_ids + p->count_blobs);
+}
+
 const std::string Property::to_str(uint64_t val) const
 {
        drmModePropertyPtr p = m_priv->drm_prop;
index 148e325c1bb08e2c6200ff457045861c2ba5aec4..147496e37fd48617077fc142b68540a981f12251 100644 (file)
@@ -1,12 +1,24 @@
 #pragma once
 
 #include "drmobject.h"
+#include <map>
+#include <vector>
 
 namespace kms
 {
 
 struct PropertyPriv;
 
+enum class PropertyType
+{
+       Range,
+       Enum,
+       Blob,
+       Bitmask,
+       Object,
+       SignedRange,
+};
+
 class Property : public DrmObject
 {
        friend class Card;
@@ -14,10 +26,20 @@ public:
        const std::string& name() const;
 
        const std::string to_str(uint64_t val) const;
+
+       bool is_immutable() const;
+       bool is_pending() const;
+
+       PropertyType type() const { return m_type; }
+       std::map<uint64_t, std::string> get_enums() const;
+       std::vector<uint64_t> get_values() const;
+       std::vector<uint32_t> get_blob_ids() const;
 private:
        Property(Card& card, uint32_t id);
        ~Property();
 
+       PropertyType m_type;
+
        PropertyPriv* m_priv;
        std::string m_name;
 };