Beispiel #1
0
/*
 * Dispaly the up-to-date status of the software. If a new release is available
 * display information about it.
 */
static gboolean version_info_show(gpointer data)
{
    Dialogs *_dialogs = (data) ? (Dialogs *)data : &dialogs;
    GtkBuilder *builder = _dialogs->builder;
    GtkWidget *r_name, *r_link, *r_dld_link;
    GtkWidget *internal_vbox;
    gchar *buf;

    /* don't bother showing the dialog if version check failed (applies only at startup) */
    if (!release && !data)
        return false;

    gdk_threads_enter();
    internal_vbox = GTK_WIDGET(gtk_builder_get_object(builder,
                               "msg_dialog_vbox"));

    if (!release) {
        g_object_set(G_OBJECT(_dialogs->latest_version), "text",
                     "Failed to get the latest version."
                     "Make sure you have an internet connection.",
                     NULL);
        gtk_widget_hide(internal_vbox);
    } else if (strncmp(GIT_VERSION, release->commit, 7)) {

        if (date_compare_against_build_date(release->build_date) > 0) {
            g_object_set(G_OBJECT(_dialogs->latest_version), "text",
                         "A new version is available", NULL);
        } else {
            /* No data means that a silent version checking has been
               requested. The progress bar has already been hidden
               and so should the message dialog be. */
            if (!data)
                goto end;
            g_object_set(G_OBJECT(_dialogs->latest_version), "text",
                         "This software is newer than the latest release",
                         NULL);
        }

        r_name = GTK_WIDGET(gtk_builder_get_object(builder,
                            "latest_version_name"));
        r_link = GTK_WIDGET(gtk_builder_get_object(builder,
                            "latest_version_link"));
        r_dld_link = GTK_WIDGET(gtk_builder_get_object(builder,
                                "latest_version_donwnload_link"));

        buf = g_strdup_printf("<b>%s</b>", release->name);
        gtk_label_set_markup(GTK_LABEL(r_name), buf);
        g_free(buf);
        gtk_link_button_set_uri(GTK_LINK_BUTTON(r_link), release->url);
        gtk_link_button_set_uri(GTK_LINK_BUTTON(r_dld_link),
                                release->windows_dld_url);
#ifndef __MINGW32__
        gtk_widget_hide(r_dld_link);
#endif

        gtk_widget_show(internal_vbox);
    } else {
        /* No data means that a silent version checking has been
           requested. The progress bar has already been hidden and so
           should the message dialog be. */
        if (!data)
            goto end;
        g_object_set(G_OBJECT(_dialogs->latest_version), "text",
                     "This software is up to date", NULL);
        gtk_widget_hide(internal_vbox);
    }

    release_dispose(release);
    release = NULL;


    gtk_widget_set_visible(GTK_WIDGET(gtk_builder_get_object(builder,
                                      "version_check_dont_show_again")), !data);

    gtk_dialog_run(GTK_DIALOG(_dialogs->latest_version));
    gtk_widget_hide(_dialogs->latest_version);

end:
    gdk_threads_leave();

    return false;
}
Release * release_get_latest(void)
{
	Release *release = NULL;
	const char *SERVER_URL = "https://api.github.com/repos/analogdevicesinc/iio-oscilloscope/releases";
	json_t *j_root, *j_release;
	bool release_abort = false;

	j_root = decode_url_feedback(SERVER_URL);
	if (!j_root) {
		printf("Could not decode data about git releases\n");
		goto cleanup_and_fail;
	}

	j_release = get_latest_release(j_root);
	if (!j_release) {
		printf("No release found\n");
		goto cleanup_and_fail;
	}

	release = release_new();
	if (!release) {
		printf("%s\n", strerror(errno));
		goto cleanup_and_fail;
	}

	release->name = strdup(json_string_value(json_object_get(j_release, "name")));
	release->build_date = strdup(json_string_value(json_object_get(j_release, "created_at")));
	release->url = strdup(json_string_value(json_object_get(j_release, "html_url")));

	/* Get the release SHA commit */
	json_t *j_tags, *tag, *name, *commit;
	const char *tag_name;
	size_t i;

	tag_name = json_string_value(json_object_get(j_release, "tag_name"));
	j_tags = decode_url_feedback("https://api.github.com/repos/analogdevicesinc/iio-oscilloscope/tags");
	if (!j_tags) {
		printf("Could not decode data about git tags\n");
		release_abort = true;
		goto cleanup_and_fail;
	}

	for (i = 0; i < json_array_size(j_tags); i++) {
		tag = json_array_get(j_tags, i);
		if (!json_is_object(tag))
			break;
		name = json_object_get(tag, "name");
		if (!json_is_string(name))
			break;
		if (tag_name && !strcmp(json_string_value(name), tag_name)) {
			commit = json_object_get(tag, "commit");
			if (!json_is_object(commit))
				break;
			release->commit = strdup(json_string_value(
					json_object_get(commit, "sha")));
		}
	}
	if (!release->commit) {
		printf("Could not find release SHA commit\n");
		release_abort = true;
		goto cleanup_and_fail;
	}

	/* Get download link for the windows build */
	json_t *assets, *w_build;
	assets = json_object_get(j_release, "assets");
	if (!assets) {
		release_abort = true;
		goto cleanup_and_fail;
	}
	w_build = json_array_get(assets, 0);
	if (!w_build) {
		release_abort = true;
		goto cleanup_and_fail;
	}
	release->windows_dld_url = strdup(json_string_value(json_object_get(w_build, "browser_download_url")));

cleanup_and_fail:
	if (release_abort) {
		release_dispose(release);
		release = NULL;
	}
	json_decref(j_root);

	return release;
}