xref: /aosp_15_r20/external/libkmsxx/kms++/src/blob.cpp (revision f0687c8a10b3e371dbe09214db6664e37c283cca)
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