#include <xf86drm.h> #include <xf86drmMode.h> #include <kms++/kms++.h> using namespace std; namespace kms { Blob::Blob(Card& card, uint32_t blob_id) : DrmObject(card, blob_id, DRM_MODE_OBJECT_BLOB), m_created(false) { // XXX should we verify that the blob_id is a blob object? } Blob::Blob(Card& card, void* data, size_t len) : DrmObject(card, DRM_MODE_OBJECT_BLOB), m_created(true) { uint32_t id; int r = drmModeCreatePropertyBlob(card.fd(), data, len, &id); if (r) throw invalid_argument("FAILED TO CREATE PROP\n"); set_id(id); } Blob::~Blob() { if (m_created) drmModeDestroyPropertyBlob(card().fd(), id()); } vector<uint8_t> Blob::data() { drmModePropertyBlobPtr blob = drmModeGetPropertyBlob(card().fd(), id()); if (!blob) throw invalid_argument("Blob data not available"); uint8_t* data = (uint8_t*)blob->data; auto v = vector<uint8_t>(data, data + blob->length); drmModeFreePropertyBlob(blob); return v; } }