void MainWindow::populateDevices()
{
    Q_D(MainWindow);

    // TODO: This shouldn't be done in the GUI thread
    QString path(QString::fromStdString(d->pc->dataDirectory())
            % QStringLiteral("/devices.json"));
    QFile file(path);

    if (file.open(QIODevice::ReadOnly)) {
        QByteArray contents = file.readAll();
        file.close();

        MbDeviceJsonError error;
        Device **devices =
                mb_device_new_list_from_json(contents.data(), &error);

        if (devices) {
            for (Device **iter = devices; *iter; ++iter) {
                if (mb_device_validate(*iter) == 0) {
                    d->deviceSel->addItem(QStringLiteral("%1 - %2")
                            .arg(QString::fromUtf8(mb_device_id(*iter)))
                            .arg(QString::fromUtf8(mb_device_name(*iter))));
                    d->devices.emplace_back(*iter, mb_device_free);
                } else {
                    // Clean up unusable devices
                    mb_device_free(*iter);
                }
            }
            // No need for array anymore
            free(devices);
        } else {
            qWarning("Failed to load devices");
        }
    } else {
        qWarning("%s: Failed to open file: %s",
                 path.toUtf8().data(), file.errorString().toUtf8().data());
    }
}
 ScopedDevices(const char *json)
 {
     devices = mb_device_new_list_from_json(json, &error);
 }