sr_config_get() provides a GVariant owned by the caller, so it must be
released with g_variant_unref() when done.
sr_config_set() takes a GVariant from the caller which may be floating;
it will be properly sunk and release after use by this function. Thus
the output of g_variant_new_*() may be used as an argument.
sr_config_list() also provides a GVariant owned by the caller, to be
unreferenced when done.
sr_config_make() can take a floating reference.
-SR_PRIV struct sr_config *sr_config_new(int key, const void *value)
+/** A floating reference can be passed in for data. */
+SR_PRIV struct sr_config *sr_config_new(int key, GVariant *data)
{
struct sr_config *src;
if (!(src = g_try_malloc(sizeof(struct sr_config))))
return NULL;
src->key = key;
{
struct sr_config *src;
if (!(src = g_try_malloc(sizeof(struct sr_config))))
return NULL;
src->key = key;
+ src->data = g_variant_ref_sink(data);
*
* @param driver The sr_dev_driver struct to query.
* @param key The configuration key (SR_CONF_*).
*
* @param driver The sr_dev_driver struct to query.
* @param key The configuration key (SR_CONF_*).
- * @param data Pointer where the value will be stored. Must not be NULL.
- * @param sdi If the key is specific to a device, this must contain a
- * pointer to the struct sr_dev_inst to be checked.
+ * @param data Pointer to a GVariant where the value will be stored. Must
+ * not be NULL. The caller is given ownership of the GVariant
+ * and must thus decrease the refcount after use. However if
+ * this function returns an error code, the field should be
+ * considered unused, and should not be unreferenced.
+ * @param sdi (optional) If the key is specific to a device, this must
+ * contain a pointer to the struct sr_dev_inst to be checked.
+ * Otherwise it must be NULL.
*
* @return SR_OK upon success or SR_ERR in case of error. Note SR_ERR_ARG
* may be returned by the driver indicating it doesn't know that key,
*
* @return SR_OK upon success or SR_ERR in case of error. Note SR_ERR_ARG
* may be returned by the driver indicating it doesn't know that key,
* as an indication that it's not applicable.
*/
SR_API int sr_config_get(const struct sr_dev_driver *driver, int key,
* as an indication that it's not applicable.
*/
SR_API int sr_config_get(const struct sr_dev_driver *driver, int key,
- const void **data, const struct sr_dev_inst *sdi)
+ GVariant **data, const struct sr_dev_inst *sdi)
{
int ret;
if (!driver || !data)
return SR_ERR;
{
int ret;
if (!driver || !data)
return SR_ERR;
- ret = driver->config_get(key, data, sdi);
+ if ((ret = driver->config_get(key, data, sdi)) == SR_OK) {
+ /* Got a floating reference from the driver. Sink it here,
+ * caller will need to unref when done with it. */
+ g_variant_ref_sink(*data);
+ }
*
* @param sdi The device instance.
* @param key The configuration key (SR_CONF_*).
*
* @param sdi The device instance.
* @param key The configuration key (SR_CONF_*).
- * @param value The new value for the key, as a pointer to whatever type
- * is appropriate for that key.
+ * @param data The new value for the key, as a GVariant with GVariantType
+ * appropriate to that key. A floating reference can be passed
+ * in; its refcount will be sunk and unreferenced after use.
*
* @return SR_OK upon success or SR_ERR in case of error. Note SR_ERR_ARG
* may be returned by the driver indicating it doesn't know that key,
* but this is not to be flagged as an error by the caller; merely
* as an indication that it's not applicable.
*/
*
* @return SR_OK upon success or SR_ERR in case of error. Note SR_ERR_ARG
* may be returned by the driver indicating it doesn't know that key,
* but this is not to be flagged as an error by the caller; merely
* as an indication that it's not applicable.
*/
-SR_API int sr_config_set(const struct sr_dev_inst *sdi, int key,
- const void *value)
+SR_API int sr_config_set(const struct sr_dev_inst *sdi, int key, GVariant *data)
- if (!sdi || !sdi->driver || !value)
- return SR_ERR;
+ g_variant_ref_sink(data);
- if (!sdi->driver->config_set)
- return SR_ERR_ARG;
+ if (!sdi || !sdi->driver || !data)
+ ret = SR_ERR;
+ else if (!sdi->driver->config_set)
+ ret = SR_ERR_ARG;
+ else
+ ret = sdi->driver->config_set(key, data, sdi);
- ret = sdi->driver->config_set(key, value, sdi);
*
* @param driver The sr_dev_driver struct to query.
* @param key The configuration key (SR_CONF_*).
*
* @param driver The sr_dev_driver struct to query.
* @param key The configuration key (SR_CONF_*).
- * @param data A pointer to a list of values, in whatever format is
- * appropriate for that key.
- * @param sdi If the key is specific to a device, this must contain a
- * pointer to the struct sr_dev_inst to be checked.
+ * @param data A pointer to a GVariant where the list will be stored. The
+ * caller is given ownership of the GVariant and must thus
+ * unref the GVariant after use. However if this function
+ * returns an error code, the field should be considered
+ * unused, and should not be unreferenced.
+ * @param sdi (optional) If the key is specific to a device, this must
+ * contain a pointer to the struct sr_dev_inst to be checked.
*
* @return SR_OK upon success or SR_ERR in case of error. Note SR_ERR_ARG
* may be returned by the driver indicating it doesn't know that key,
*
* @return SR_OK upon success or SR_ERR in case of error. Note SR_ERR_ARG
* may be returned by the driver indicating it doesn't know that key,
* as an indication that it's not applicable.
*/
SR_API int sr_config_list(const struct sr_dev_driver *driver, int key,
* as an indication that it's not applicable.
*/
SR_API int sr_config_list(const struct sr_dev_driver *driver, int key,
- const void **data, const struct sr_dev_inst *sdi)
+ GVariant **data, const struct sr_dev_inst *sdi)
- if (!driver || !data)
- return SR_ERR;
-
- ret = driver->config_list(key, data, sdi);
+ if (!driver || !data || !driver->config_list)
+ ret = SR_ERR;
+ else if ((ret = driver->config_list(key, data, sdi)) == SR_OK)
+ g_variant_ref_sink(*data);
/*--- hwdriver.c ------------------------------------------------------------*/
SR_PRIV void sr_hw_cleanup_all(void);
/*--- hwdriver.c ------------------------------------------------------------*/
SR_PRIV void sr_hw_cleanup_all(void);
-SR_PRIV struct sr_config *sr_config_new(int key, const void *value);
+SR_PRIV struct sr_config *sr_config_new(int key, GVariant *data);
SR_PRIV int sr_source_remove(int fd);
SR_PRIV int sr_source_add(int fd, int events, int timeout,
sr_receive_data_callback_t cb, void *cb_data);
SR_PRIV int sr_source_remove(int fd);
SR_PRIV int sr_source_add(int fd, int events, int timeout,
sr_receive_data_callback_t cb, void *cb_data);
struct sr_config {
int key;
struct sr_config {
int key;
};
struct sr_config_info {
};
struct sr_config_info {
GSList *(*scan) (GSList *options);
GSList *(*dev_list) (void);
int (*dev_clear) (void);
GSList *(*scan) (GSList *options);
GSList *(*dev_list) (void);
int (*dev_clear) (void);
- int (*config_get) (int id, const void **value,
+ int (*config_get) (int id, GVariant **data,
const struct sr_dev_inst *sdi);
const struct sr_dev_inst *sdi);
- int (*config_set) (int id, const void *value,
+ int (*config_set) (int id, GVariant *data,
const struct sr_dev_inst *sdi);
const struct sr_dev_inst *sdi);
- int (*config_list) (int info_id, const void **data,
+ int (*config_list) (int info_id, GVariant **data,
const struct sr_dev_inst *sdi);
/* Device-specific */
const struct sr_dev_inst *sdi);
/* Device-specific */
struct sr_dev_driver *driver);
SR_API GSList *sr_driver_scan(struct sr_dev_driver *driver, GSList *options);
SR_API int sr_config_get(const struct sr_dev_driver *driver, int key,
struct sr_dev_driver *driver);
SR_API GSList *sr_driver_scan(struct sr_dev_driver *driver, GSList *options);
SR_API int sr_config_get(const struct sr_dev_driver *driver, int key,
- const void **data, const struct sr_dev_inst *sdi);
+ GVariant **data, const struct sr_dev_inst *sdi);
SR_API int sr_config_set(const struct sr_dev_inst *sdi, int key,
SR_API int sr_config_set(const struct sr_dev_inst *sdi, int key,
SR_API int sr_config_list(const struct sr_dev_driver *driver, int key,
SR_API int sr_config_list(const struct sr_dev_driver *driver, int key,
- const void **data, const struct sr_dev_inst *sdi);
+ GVariant **data, const struct sr_dev_inst *sdi);
SR_API const struct sr_config_info *sr_config_info_get(int key);
SR_API const struct sr_config_info *sr_config_info_name_get(const char *optname);
SR_API const struct sr_config_info *sr_config_info_get(int key);
SR_API const struct sr_config_info *sr_config_info_name_get(const char *optname);