From: Daniel Elstner Date: Sat, 26 Sep 2015 22:03:21 +0000 (+0200) Subject: C++: Wrap resource access API X-Git-Tag: libsigrok-0.4.0~237 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=e2eaf8580aaa8869a694b3c6af4c7f832a752b31;p=libsigrok.git C++: Wrap resource access API Introduce a ResourceReader delegate class with virtual methods corresponding to the C callback functions. --- diff --git a/bindings/cxx/classes.cpp b/bindings/cxx/classes.cpp index 25ac45b6..a944faa2 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() { diff --git a/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp b/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp index f96901f3..b9e8a4f2 100644 --- a/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp +++ b/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp @@ -232,6 +232,29 @@ protected: /** Type of log callback */ typedef function LogCallbackFunction; +/** Resource reader delegate. */ +class SR_API ResourceReader +{ +public: + ResourceReader() {} + virtual ~ResourceReader(); +private: + /** Resource open hook. */ + virtual void open(struct sr_resource *res, string name) = 0; + /** Resource close hook. */ + virtual void close(struct sr_resource *res) = 0; + /** Resource read hook. */ + virtual size_t read(const struct sr_resource *res, void *buf, size_t count) = 0; + + static SR_PRIV int open_callback(struct sr_resource *res, + const char *name, void *cb_data); + static SR_PRIV int close_callback(struct sr_resource *res, + void *cb_data); + static SR_PRIV ssize_t read_callback(const struct sr_resource *res, + void *buf, size_t count, void *cb_data); + friend class Context; +}; + /** The global libsigrok context */ class SR_API Context : public UserOwned { @@ -258,6 +281,9 @@ public: void set_log_callback(LogCallbackFunction callback); /** Set the log callback to the default handler. */ void set_log_callback_default(); + /** Install a delegate for reading resource files. + * @param reader The resource reader delegate, or nullptr to unset. */ + void set_resource_reader(ResourceReader *reader); /** Create a new session. */ shared_ptr create_session(); /** Create a new user device. */