X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=bindings%2Fcxx%2Fclasses.cpp;h=7a6daa92df7c664c8251f18133fc69586a5aa740;hb=753793eff5f713e07a42f2c7a177502aeb764654;hp=42ef6e7d4019fde915a1d9f6f56e3567cbd908f6;hpb=35114c3394679a4da54b930328409b3223507bad;p=libsigrok.git diff --git a/bindings/cxx/classes.cpp b/bindings/cxx/classes.cpp index 42ef6e7d..7a6daa92 100644 --- a/bindings/cxx/classes.cpp +++ b/bindings/cxx/classes.cpp @@ -256,8 +256,6 @@ Driver::Driver(struct sr_dev_driver *structure) : Driver::~Driver() { - for (auto device : _devices) - delete device; } string Driver::name() @@ -280,11 +278,6 @@ vector> Driver::scan( _initialized = true; } - /* Clear all existing instances. */ - for (auto device : _devices) - delete device; - _devices.clear(); - /* Translate scan options to GSList of struct sr_config pointers. */ GSList *option_list = NULL; for (auto entry : options) @@ -303,20 +296,20 @@ vector> Driver::scan( /* Free option list. */ g_slist_free_full(option_list, g_free); + /* Create device objects. */ + vector> result; for (GSList *device = device_list; device; device = device->next) { auto sdi = (struct sr_dev_inst *) device->data; - _devices.push_back(new HardwareDevice(this, sdi)); + result.push_back(shared_ptr( + new HardwareDevice(shared_from_this(), sdi), + HardwareDevice::Deleter())); } /* Free GSList returned from scan. */ g_slist_free(device_list); - /* Create list of shared pointers to device instances for return. */ - vector> result; - for (auto device : _devices) - result.push_back(device->get_shared_pointer(_parent)); return result; } @@ -363,18 +356,18 @@ vector Configurable::config_keys(const ConfigKey *key) { GVariant *gvar_opts; gsize num_opts; - const int32_t *opts; + const uint32_t *opts; vector result; check(sr_config_list( config_driver, config_sdi, config_channel_group, key->id(), &gvar_opts)); - opts = (const int32_t *) g_variant_get_fixed_array( - gvar_opts, &num_opts, sizeof(int32_t)); + opts = (const uint32_t *) g_variant_get_fixed_array( + gvar_opts, &num_opts, sizeof(uint32_t)); for (gsize i = 0; i < num_opts; i++) - result.push_back(ConfigKey::get(opts[i])); + result.push_back(ConfigKey::get(opts[i] & SR_CONF_MASK)); g_variant_unref(gvar_opts); @@ -386,18 +379,18 @@ bool Configurable::config_check(const ConfigKey *key, { GVariant *gvar_opts; gsize num_opts; - const int32_t *opts; + const uint32_t *opts; if (sr_config_list(config_driver, config_sdi, config_channel_group, index_key->id(), &gvar_opts) != SR_OK) return false; - opts = (const int32_t *) g_variant_get_fixed_array( - gvar_opts, &num_opts, sizeof(int32_t)); + opts = (const uint32_t *) g_variant_get_fixed_array( + gvar_opts, &num_opts, sizeof(uint32_t)); for (gsize i = 0; i < num_opts; i++) { - if (opts[i] == key->id()) + if ((opts[i] & SR_CONF_MASK) == key->id()) { g_variant_unref(gvar_opts); return true; @@ -501,8 +494,9 @@ void Device::close() check(sr_dev_close(_structure)); } -HardwareDevice::HardwareDevice(Driver *driver, struct sr_dev_inst *structure) : - ParentOwned(structure), +HardwareDevice::HardwareDevice(shared_ptr driver, + struct sr_dev_inst *structure) : + UserOwned(structure), Device(structure), _driver(driver) { @@ -519,7 +513,7 @@ shared_ptr HardwareDevice::get_shared_from_this() shared_ptr HardwareDevice::driver() { - return _driver->get_shared_pointer(_parent); + return _driver; } Channel::Channel(struct sr_channel *structure) :