X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=bindings%2Fcxx%2Fclasses.cpp;h=c90cac3f13ca69270457def55f71f06083448aee;hb=e8779db70cfe53db1d9f1f6ad00c4888ccf09b23;hp=ce458eeb6c61255b1904d4824b10cc491ddb4bd9;hpb=7f5a036750d30db466f23bb5fdaa28173bafe28d;p=libsigrok.git diff --git a/bindings/cxx/classes.cpp b/bindings/cxx/classes.cpp index ce458eeb..c90cac3f 100644 --- a/bindings/cxx/classes.cpp +++ b/bindings/cxx/classes.cpp @@ -44,8 +44,7 @@ static const char *valid_string(const char *input) static GHashTable *map_to_hash_variant(map input) { auto output = g_hash_table_new_full( - g_variant_hash, g_variant_equal, g_free, - (void (*)(void *))g_variant_unref); + g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref); for (auto entry : input) g_hash_table_insert(output, g_strdup(entry.first.c_str()), @@ -229,20 +228,21 @@ shared_ptr Context::create_trigger(string name) shared_ptr Context::open_file(string filename) { - auto input = sr_input_scan_file(filename.c_str()); - if (!input) - throw Error(SR_ERR_NA); + const struct sr_input *input; + + check( sr_input_scan_file(filename.c_str(), &input)); return shared_ptr( new Input(shared_from_this(), input), Input::Deleter()); } shared_ptr Context::open_stream(string header) { + const struct sr_input *input; + auto gstr = g_string_new(header.c_str()); - auto input = sr_input_scan_buffer(gstr); - g_string_free(gstr, false); - if (!input) - throw Error(SR_ERR_NA); + auto ret = sr_input_scan_buffer(gstr, &input); + g_string_free(gstr, true); + check(ret); return shared_ptr( new Input(shared_from_this(), input), Input::Deleter()); } @@ -418,14 +418,14 @@ vector> Device::get_channels() vector> result; for (auto entry : channels) result.push_back(static_pointer_cast( - entry.second->get_shared_pointer(this))); + entry.second->get_shared_pointer(get_shared_from_this()))); return result; } shared_ptr Device::get_channel(struct sr_channel *ptr) { return static_pointer_cast( - channels[ptr]->get_shared_pointer(this)); + channels[ptr]->get_shared_pointer(get_shared_from_this())); } map> @@ -437,7 +437,7 @@ Device::get_channel_groups() auto name = entry.first; auto channel_group = entry.second; result[name] = static_pointer_cast( - channel_group->get_shared_pointer(this)); + channel_group->get_shared_pointer(get_shared_from_this())); } return result; } @@ -463,6 +463,12 @@ HardwareDevice::~HardwareDevice() { } +shared_ptr HardwareDevice::get_shared_from_this() +{ + return static_pointer_cast( + static_pointer_cast(shared_from_this())); +} + shared_ptr HardwareDevice::get_driver() { return static_pointer_cast(driver->get_shared_pointer(parent)); @@ -734,9 +740,6 @@ vector> Session::get_devices() for (GSList *dev = dev_list; dev; dev = dev->next) { auto sdi = (struct sr_dev_inst *) dev->data; - if (devices.count(sdi) == 0) - devices[sdi] = shared_ptr( - new Device(sdi), Device::Deleter()); result.push_back(devices[sdi]); } return result; @@ -970,6 +973,9 @@ Packet::Packet(shared_ptr device, static_cast( structure->payload)); break; + default: + payload = nullptr; + break; } } @@ -986,7 +992,10 @@ const PacketType *Packet::get_type() shared_ptr Packet::get_payload() { - return payload->get_shared_pointer(this); + if (payload) + return payload->get_shared_pointer(this); + else + throw Error(SR_ERR_NA); } PacketPayload::PacketPayload() @@ -998,8 +1007,8 @@ PacketPayload::~PacketPayload() } Header::Header(const struct sr_datafeed_header *structure) : - PacketPayload(), - StructureWrapper(structure) + StructureWrapper(structure), + PacketPayload() { } @@ -1007,6 +1016,14 @@ Header::~Header() { } +shared_ptr Header::get_shared_pointer(Packet *parent) +{ + return static_pointer_cast( + static_pointer_cast
( + StructureWrapper:: + get_shared_pointer(parent))); +} + int Header::get_feed_version() { return structure->feed_version; @@ -1020,8 +1037,8 @@ Glib::TimeVal Header::get_start_time() } Meta::Meta(const struct sr_datafeed_meta *structure) : - PacketPayload(), - StructureWrapper(structure) + StructureWrapper(structure), + PacketPayload() { } @@ -1029,6 +1046,14 @@ Meta::~Meta() { } +shared_ptr Meta::get_shared_pointer(Packet *parent) +{ + return static_pointer_cast( + static_pointer_cast( + StructureWrapper:: + get_shared_pointer(parent))); +} + map Meta::get_config() { map result; @@ -1041,8 +1066,8 @@ map Meta::get_config() } Logic::Logic(const struct sr_datafeed_logic *structure) : - PacketPayload(), - StructureWrapper(structure) + StructureWrapper(structure), + PacketPayload() { } @@ -1050,6 +1075,14 @@ Logic::~Logic() { } +shared_ptr Logic::get_shared_pointer(Packet *parent) +{ + return static_pointer_cast( + static_pointer_cast( + StructureWrapper:: + get_shared_pointer(parent))); +} + void *Logic::get_data_pointer() { return structure->data; @@ -1066,8 +1099,8 @@ unsigned int Logic::get_unit_size() } Analog::Analog(const struct sr_datafeed_analog *structure) : - PacketPayload(), - StructureWrapper(structure) + StructureWrapper(structure), + PacketPayload() { } @@ -1075,6 +1108,14 @@ Analog::~Analog() { } +shared_ptr Analog::get_shared_pointer(Packet *parent) +{ + return static_pointer_cast( + static_pointer_cast( + StructureWrapper:: + get_shared_pointer(parent))); +} + float *Analog::get_data_pointer() { return structure->data; @@ -1198,6 +1239,12 @@ InputDevice::~InputDevice() { } +shared_ptr InputDevice::get_shared_from_this() +{ + return static_pointer_cast( + static_pointer_cast(shared_from_this())); +} + Option::Option(const struct sr_option *structure, shared_ptr structure_array) : structure(structure),