3b8a0b805ec1d8a774aa4cf34246ba59762bd60a
[android/external-libkmsxx.git] / libkms++ / property.cpp
1 #include <xf86drm.h>
2 #include <xf86drmMode.h>
4 #include "kms++.h"
6 using namespace std;
8 namespace kms
9 {
11 struct PropertyPriv
12 {
13         drmModePropertyPtr drm_prop;
14 };
16 Property::Property(Card& card, uint32_t id)
17         : DrmObject(card, id, DRM_MODE_OBJECT_PROPERTY)
18 {
19         m_priv = new PropertyPriv();
20         m_priv->drm_prop = drmModeGetProperty(card.fd(), id);
21         m_name = m_priv->drm_prop->name;
22 }
24 Property::~Property()
25 {
26         drmModeFreeProperty(m_priv->drm_prop);
27         delete m_priv;
28 }
30 void Property::print_short() const
31 {
32         printf("Property %d, %s\n", id(), name().c_str());
33 }
35 const string& Property::name() const
36 {
37         return m_name;
38 }
40 const std::string Property::to_str(uint64_t val) const
41 {
42         drmModePropertyPtr p = m_priv->drm_prop;
43         string ret;
45         if (p->flags & DRM_MODE_PROP_ENUM) {
46                 for (int i = 0; i < p->count_enums; i++) {
47                         if (p->enums[i].value == val) {
48                                 ret += string("\"") + p->enums[i].name + "\"";
49                                 break;
50                         }
51                 }
52                 ret += " (enum: " + to_string(val) + ")";
53         } else if (p->flags & DRM_MODE_PROP_RANGE) {
54                 ret += to_string(val);
55                 if (p->count_values == 2)
56                         ret += " [" + to_string(p->values[0]) + "-" +
57                                 to_string(p->values[1]) + "]";
58                 else
59                         ret += " <broken range>";
60         } else if (p->flags & DRM_MODE_PROP_BLOB) {
61                 ret += "Blob id: " + to_string(val);
63                 auto blob = drmModeGetPropertyBlob(card().fd(), (uint32_t) val);
64                 if (blob) {
65                         ret += " length: " + to_string(blob->length);
66                         drmModeFreePropertyBlob(blob);
67                 }
68         } else {
69                 ret += to_string(val);
70         }
72         if (p->flags & DRM_MODE_PROP_PENDING)
73                 ret += " (pendig)";
74         if (p->flags & DRM_MODE_PROP_IMMUTABLE)
75                 ret += " (immutable)";
77         return ret;
78 }
79 }