+#ifdef HAVE_SRD
+static int opts_to_gvar(struct srd_decoder *dec, GHashTable *hash,
+ GHashTable **options)
+{
+ struct srd_decoder_option *o;
+ GSList *optl;
+ GVariant *gvar;
+ gint64 val_int;
+ int ret;
+ char *val_str, *conv;
+
+ ret = TRUE;
+ *options = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
+ (GDestroyNotify)g_variant_unref);
+
+ for (optl = dec->options; optl; optl = optl->next) {
+ o = optl->data;
+ if (!(val_str = g_hash_table_lookup(hash, o->id)))
+ /* Not specified. */
+ continue;
+ if (g_variant_is_of_type(o->def, G_VARIANT_TYPE_STRING)) {
+ gvar = g_variant_new_string(val_str);
+ } else if (g_variant_is_of_type(o->def, G_VARIANT_TYPE_INT64)) {
+ val_int = strtoll(val_str, &conv, 0);
+ if (!conv || conv == val_str) {
+ g_critical("Protocol decoder '%s' option '%s' "
+ "requires a number.", dec->name, o->id);
+ ret = FALSE;
+ break;
+ }
+ gvar = g_variant_new_int64(val_int);
+ } else {
+ g_critical("Unsupported type for option '%s' (%s)",
+ o->id, g_variant_get_type_string(o->def));
+ ret = FALSE;
+ break;
+ }
+ g_variant_ref_sink(gvar);
+ g_hash_table_insert(*options, g_strdup(o->id), gvar);
+ g_hash_table_remove(hash, o->id);
+ }
+
+ return ret;
+}
+
+static int probes_to_gvar(struct srd_decoder *dec, GHashTable *hash,
+ GHashTable **probes)
+{
+ struct srd_probe *p;
+ GSList *all_probes, *l;
+ GVariant *gvar;
+ gint32 val_int;
+ int ret;
+ char *val_str, *conv;
+
+ ret = TRUE;
+ *probes = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
+ (GDestroyNotify)g_variant_unref);
+
+ all_probes = g_slist_copy(dec->probes);
+ all_probes = g_slist_concat(all_probes, g_slist_copy(dec->opt_probes));
+ for (l = all_probes; l; l = l->next) {
+ p = l->data;
+ if (!(val_str = g_hash_table_lookup(hash, p->id)))
+ /* Not specified. */
+ continue;
+ val_int = strtoll(val_str, &conv, 10);
+ if (!conv || conv == val_str) {
+ g_critical("Protocol decoder '%s' probes '%s' "
+ "is not a number.", dec->name, p->id);
+ ret = FALSE;
+ break;
+ }
+ gvar = g_variant_new_int32(val_int);
+ g_variant_ref_sink(gvar);
+ g_hash_table_insert(*probes, g_strdup(p->id), gvar);
+ g_hash_table_remove(hash, p->id);
+ }
+ g_slist_free(all_probes);
+
+ return ret;
+}
+