C++: Wrap resource access API

Introduce a ResourceReader delegate class with virtual methods
corresponding to the C callback functions.
This commit is contained in:
Daniel Elstner 2015-09-27 00:03:21 +02:00
parent 8e2d6c9db7
commit e2eaf8580a
2 changed files with 85 additions and 2 deletions

View File

@ -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<ResourceReader*>(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<ResourceReader*>(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<ResourceReader*>(cb_data);
return reader->read(res, buf, count);
} catch (const Error &err) {
return err.result;
} catch (...) {
return SR_ERR;
}
}
shared_ptr<Context> Context::create()
{
return shared_ptr<Context>(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<Session> Context::create_session()
{

View File

@ -232,6 +232,29 @@ protected:
/** Type of log callback */
typedef function<void(const LogLevel *, string message)> 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<Context, struct sr_context>
{
@ -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<Session> create_session();
/** Create a new user device. */