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