1 #include <xf86drm.h>
2 #include <xf86drmMode.h>
3
4 #include <kms++/kms++.h>
5
6 using namespace std;
7
8 namespace kms
9 {
Blob(Card & card,uint32_t blob_id)10 Blob::Blob(Card& card, uint32_t blob_id)
11 : DrmObject(card, blob_id, DRM_MODE_OBJECT_BLOB), m_created(false)
12 {
13 // XXX should we verify that the blob_id is a blob object?
14 }
15
Blob(Card & card,void * data,size_t len)16 Blob::Blob(Card& card, void* data, size_t len)
17 : DrmObject(card, DRM_MODE_OBJECT_BLOB), m_created(true)
18 {
19 uint32_t id;
20
21 int r = drmModeCreatePropertyBlob(card.fd(), data, len, &id);
22 if (r)
23 throw invalid_argument("FAILED TO CREATE PROP\n");
24
25 set_id(id);
26 }
27
~Blob()28 Blob::~Blob()
29 {
30 if (m_created)
31 drmModeDestroyPropertyBlob(card().fd(), id());
32 }
33
data()34 vector<uint8_t> Blob::data()
35 {
36 drmModePropertyBlobPtr blob = drmModeGetPropertyBlob(card().fd(), id());
37
38 if (!blob)
39 throw invalid_argument("Blob data not available");
40
41 uint8_t* data = (uint8_t*)blob->data;
42
43 auto v = vector<uint8_t>(data, data + blob->length);
44
45 drmModeFreePropertyBlob(blob);
46
47 return v;
48 }
49
50 } // namespace kms
51