static int init(struct sr_input *in) { int num_probes, i; char name[SR_MAX_PROBENAME_LEN]; if (in->param && in->param[0]) { num_probes = strtoul(in->param, NULL, 10); if (num_probes < 1) { sr_warn("la8input: %s: strtoul failed", __func__); return SR_ERR; } } else { num_probes = DEFAULT_NUM_PROBES; } /* Create a virtual device. */ in->vdevice = sr_device_new(NULL, 0); for (i = 0; i < num_probes; i++) { snprintf(name, SR_MAX_PROBENAME_LEN, "%d", i); sr_device_probe_add(in->vdevice, name); /* TODO: Check return value. */ } return SR_OK; }
int sr_session_load(const char *filename) { GKeyFile *kf; GPtrArray *capturefiles; struct zip *archive; struct zip_file *zf; struct zip_stat zs; struct sr_session *session; struct sr_device *device; struct sr_probe *probe; int ret, err, probenum, devcnt, i, j; uint64_t tmp_u64, total_probes, enabled_probes, p; char **sections, **keys, *metafile, *val, c; if (!(archive = zip_open(filename, 0, &err))) { sr_dbg("Failed to open session file: zip error %d", err); return SR_ERR; } /* check "version" */ if (!(zf = zip_fopen(archive, "version", 0))) { sr_dbg("Not a sigrok session file."); return SR_ERR; } ret = zip_fread(zf, &c, 1); if (ret != 1 || c != '1') { sr_dbg("Not a valid sigrok session file."); return SR_ERR; } zip_fclose(zf); /* read "metadata" */ if (zip_stat(archive, "metadata", 0, &zs) == -1) { sr_dbg("Not a valid sigrok session file."); return SR_ERR; } if (!(metafile = g_try_malloc(zs.size))) { sr_err("session file: %s: metafile malloc failed", __func__); return SR_ERR_MALLOC; } zf = zip_fopen_index(archive, zs.index, 0); zip_fread(zf, metafile, zs.size); zip_fclose(zf); kf = g_key_file_new(); if (!g_key_file_load_from_data(kf, metafile, zs.size, 0, NULL)) { sr_dbg("Failed to parse metadata."); return SR_ERR; } session = sr_session_new(); devcnt = 0; capturefiles = g_ptr_array_new_with_free_func(g_free); sections = g_key_file_get_groups(kf, NULL); for (i = 0; sections[i]; i++) { if (!strcmp(sections[i], "global")) /* nothing really interesting in here yet */ continue; if (!strncmp(sections[i], "device ", 7)) { /* device section */ device = NULL; enabled_probes = 0; keys = g_key_file_get_keys(kf, sections[i], NULL, NULL); for (j = 0; keys[j]; j++) { val = g_key_file_get_string(kf, sections[i], keys[j], NULL); if (!strcmp(keys[j], "capturefile")) { device = sr_device_new(&session_driver, devcnt, 0); if (devcnt == 0) /* first device, init the plugin */ device->plugin->init((char *)filename); sr_session_device_add(device); device->plugin->set_configuration(devcnt, SR_HWCAP_CAPTUREFILE, val); g_ptr_array_add(capturefiles, val); } else if (!strcmp(keys[j], "samplerate")) { tmp_u64 = sr_parse_sizestring(val); device->plugin->set_configuration(devcnt, SR_HWCAP_SAMPLERATE, &tmp_u64); } else if (!strcmp(keys[j], "unitsize")) { tmp_u64 = strtoull(val, NULL, 10); device->plugin->set_configuration(devcnt, SR_HWCAP_CAPTURE_UNITSIZE, &tmp_u64); } else if (!strcmp(keys[j], "total probes")) { total_probes = strtoull(val, NULL, 10); device->plugin->set_configuration(devcnt, SR_HWCAP_CAPTURE_NUM_PROBES, &total_probes); for (p = 1; p <= total_probes; p++) sr_device_probe_add(device, NULL); } else if (!strncmp(keys[j], "probe", 5)) { if (!device) continue; enabled_probes++; tmp_u64 = strtoul(keys[j]+5, NULL, 10); sr_device_probe_name(device, tmp_u64, val); } else if (!strncmp(keys[j], "trigger", 7)) { probenum = strtoul(keys[j]+7, NULL, 10); sr_device_trigger_set(device, probenum, val); } } g_strfreev(keys); for (p = enabled_probes; p < total_probes; p++) { probe = g_slist_nth_data(device->probes, p); probe->enabled = FALSE; } } } g_strfreev(sections); g_key_file_free(kf); return SR_OK; }