C++: Wrap resource access API
Introduce a ResourceReader delegate class with virtual methods corresponding to the C callback functions.
This commit is contained in:
parent
8e2d6c9db7
commit
e2eaf8580a
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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. */
|
||||
|
|
Loading…
Reference in New Issue