/* * 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; }