X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=bindings%2Fcxx%2Fclasses.cpp;h=af10e8eaf7693e04b05206344c440ebb48e7809b;hb=2c3c9b999cd5c1130afeeee4094400592c9e1bde;hp=25ac45b6235d166eeb735b50e7b49ac399969e45;hpb=5e1fb33469841b194e606752b865fa0d08b99067;p=libsigrok.git diff --git a/bindings/cxx/classes.cpp b/bindings/cxx/classes.cpp index 25ac45b6..af10e8ea 100644 --- a/bindings/cxx/classes.cpp +++ b/bindings/cxx/classes.cpp @@ -72,6 +72,50 @@ Error::~Error() throw() { } +ResourceReader::~ResourceReader() +{ +} + +SR_PRIV int ResourceReader::open_callback(struct sr_resource *res, + const char *name, void *cb_data) +{ + try { + auto *const reader = static_cast(cb_data); + reader->open(res, name); + } catch (const Error &err) { + return err.result; + } catch (...) { + return SR_ERR; + } + return SR_OK; +} + +SR_PRIV int ResourceReader::close_callback(struct sr_resource *res, void *cb_data) +{ + try { + auto *const reader = static_cast(cb_data); + reader->close(res); + } catch (const Error &err) { + return err.result; + } catch (...) { + return SR_ERR; + } + return SR_OK; +} + +SR_PRIV ssize_t ResourceReader::read_callback(const struct sr_resource *res, + void *buf, size_t count, void *cb_data) +{ + try { + auto *const reader = static_cast(cb_data); + return reader->read(res, buf, count); + } catch (const Error &err) { + return err.result; + } catch (...) { + return SR_ERR; + } +} + shared_ptr Context::create() { return shared_ptr(new Context(), Context::Deleter()); @@ -196,13 +240,26 @@ void Context::set_log_callback(LogCallbackFunction callback) { _log_callback = callback; check(sr_log_callback_set(call_log_callback, &_log_callback)); -} +} void Context::set_log_callback_default() { check(sr_log_callback_set_default()); _log_callback = nullptr; -} +} + +void Context::set_resource_reader(ResourceReader *reader) +{ + if (reader) { + check(sr_resource_set_hooks(_structure, + &ResourceReader::open_callback, + &ResourceReader::close_callback, + &ResourceReader::read_callback, reader)); + } else { + check(sr_resource_set_hooks(_structure, + nullptr, nullptr, nullptr, nullptr)); + } +} shared_ptr Context::create_session() { @@ -815,55 +872,6 @@ void DatafeedCallbackData::run(const struct sr_dev_inst *sdi, _callback(device, packet); } -SourceCallbackData::SourceCallbackData(shared_ptr source) : - _source(source) -{ -} - -bool SourceCallbackData::run(int revents) -{ - return _source->_callback((Glib::IOCondition) revents); -} - -shared_ptr EventSource::create(int fd, Glib::IOCondition events, - int timeout, SourceCallbackFunction callback) -{ - auto result = new EventSource(timeout, callback); - result->_type = EventSource::SOURCE_FD; - result->_fd = fd; - result->_events = events; - return shared_ptr(result, EventSource::Deleter()); -} - -shared_ptr EventSource::create(Glib::PollFD pollfd, int timeout, - SourceCallbackFunction callback) -{ - auto result = new EventSource(timeout, callback); - result->_type = EventSource::SOURCE_POLLFD; - result->_pollfd = pollfd; - return shared_ptr(result, EventSource::Deleter()); -} - -shared_ptr EventSource::create(Glib::RefPtr channel, - Glib::IOCondition events, int timeout, SourceCallbackFunction callback) -{ - auto result = new EventSource(timeout, callback); - result->_type = EventSource::SOURCE_IOCHANNEL; - result->_channel = channel; - result->_events = events; - return shared_ptr(result, EventSource::Deleter()); -} - -EventSource::EventSource(int timeout, SourceCallbackFunction callback) : - _timeout(timeout), - _callback(callback) -{ -} - -EventSource::~EventSource() -{ -} - SessionDevice::SessionDevice(struct sr_dev_inst *structure) : ParentOwned(structure), Device(structure) @@ -910,9 +918,6 @@ Session::~Session() for (auto callback : _datafeed_callbacks) delete callback; - for (auto entry : _source_callbacks) - delete entry.second; - for (auto entry : _owned_devices) delete entry.second; } @@ -968,6 +973,31 @@ void Session::stop() check(sr_session_stop(_structure)); } +bool Session::is_running() const +{ + const int ret = sr_session_is_running(_structure); + if (ret < 0) + throw Error{ret}; + return (ret != 0); +} + +static void session_stopped_callback(void *data) +{ + auto *const callback = static_cast(data); + (*callback)(); +} + +void Session::set_stopped_callback(SessionStoppedCallback callback) +{ + _stopped_callback = move(callback); + if (_stopped_callback) + check(sr_session_stopped_callback_set(_structure, + &session_stopped_callback, &_stopped_callback)); + else + check(sr_session_stopped_callback_set(_structure, + nullptr, nullptr)); +} + static void datafeed_callback(const struct sr_dev_inst *sdi, const struct sr_datafeed_packet *pkt, void *cb_data) { @@ -991,66 +1021,6 @@ void Session::remove_datafeed_callbacks(void) _datafeed_callbacks.clear(); } -static int source_callback(int fd, int revents, void *cb_data) -{ - (void) fd; - auto callback = (SourceCallbackData *) cb_data; - return callback->run(revents); -} - -void Session::add_source(shared_ptr source) -{ - if (_source_callbacks.count(source) == 1) - throw Error(SR_ERR_ARG); - - auto cb_data = new SourceCallbackData(source); - - switch (source->_type) - { - case EventSource::SOURCE_FD: - check(sr_session_source_add(_structure, source->_fd, source->_events, - source->_timeout, source_callback, cb_data)); - break; - case EventSource::SOURCE_POLLFD: - check(sr_session_source_add_pollfd(_structure, - source->_pollfd.gobj(), source->_timeout, source_callback, - cb_data)); - break; - case EventSource::SOURCE_IOCHANNEL: - check(sr_session_source_add_channel(_structure, - source->_channel->gobj(), source->_events, source->_timeout, - source_callback, cb_data)); - break; - } - - _source_callbacks[source] = cb_data; -} - -void Session::remove_source(shared_ptr source) -{ - if (_source_callbacks.count(source) == 0) - throw Error(SR_ERR_ARG); - - switch (source->_type) - { - case EventSource::SOURCE_FD: - check(sr_session_source_remove(_structure, source->_fd)); - break; - case EventSource::SOURCE_POLLFD: - check(sr_session_source_remove_pollfd(_structure, - source->_pollfd.gobj())); - break; - case EventSource::SOURCE_IOCHANNEL: - check(sr_session_source_remove_channel(_structure, - source->_channel->gobj())); - break; - } - - delete _source_callbacks[source]; - - _source_callbacks.erase(source); -} - shared_ptr Session::trigger() { return _trigger;