static void add_metadata(gpointer hkey, gpointer hvalue, gpointer user_data) { gchar *key = (gchar*)hkey; NanoscopeValue *val = (NanoscopeValue*)hvalue; gchar *v, *w; if (gwy_strequal(key, "#self") || !val->hard_value_str || !val->hard_value_str[0]) return; if (key[0] == '@') key++; v = g_strdup(val->hard_value_str); if (strchr(v, '\272')) { w = gwy_strreplace(v, "\272", "deg", -1); g_free(v); v = w; } if (strchr(v, '~')) { w = gwy_strreplace(v, "~", "µ", -1); g_free(v); v = w; } gwy_container_set_string_by_name(GWY_CONTAINER(user_data), key, v); }
/** * gwy_save_auxiliary_with_callback: * @title: File chooser dialog title. * @parent: Parent window for the file chooser dialog (may be %NULL). * @create: Function to create the data (it will not be called if the user * cancels the saving). * @destroy: Function to destroy the data (if will be called iff @create will * be called), it may be %NULL. * @user_data: User data passed to @create and @destroy. * * Saves a report or other auxiliary data to a user specified file. * * Returns: %TRUE if the data was save, %FALSE if it was not saved for any * reason (I/O error, cancellation, overwrite cancellation, etc.). * * Since: 2.3 **/ gboolean gwy_save_auxiliary_with_callback(const gchar *title, GtkWindow *parent, GwySaveAuxiliaryCreate create, GwySaveAuxiliaryDestroy destroy, gpointer user_data) { gchar *data; gchar *filename_sys, *filename_utf8; gssize data_len; gint myerrno; GtkWidget *dialog, *chooser; gint response; FILE *fh; g_return_val_if_fail(!parent || GTK_IS_WINDOW(parent), FALSE); g_return_val_if_fail(create, FALSE); chooser = gtk_file_chooser_dialog_new(title, parent, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response(GTK_DIALOG(chooser), GTK_RESPONSE_OK); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(chooser), gwy_app_get_current_directory()); response = gtk_dialog_run(GTK_DIALOG(chooser)); filename_sys = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); if (!gwy_app_file_confirm_overwrite(chooser)) response = GTK_RESPONSE_CANCEL; gtk_widget_destroy(chooser); if (!filename_sys || response != GTK_RESPONSE_OK) { g_free(filename_sys); return FALSE; } data_len = -1; data = create(user_data, &data_len); g_return_val_if_fail(data, FALSE); if ((fh = g_fopen(filename_sys, "wb"))) { gchar *mydata = NULL; /* Write everything in binary and just convert the EOLs by manually. * This seems to actually work as we want. */ if (data_len <= 0) { #ifdef G_OS_WIN32 mydata = gwy_strreplace(data, "\n", "\r\n", (gsize)-1); data_len = strlen(mydata); #else data_len = strlen(data); #endif } if (fwrite(mydata ? mydata : data, data_len, 1, fh) != 1) { myerrno = errno; /* This is just best-effort clean-up */ fclose(fh); g_unlink(filename_sys); fh = NULL; } else myerrno = 0; /* GCC */ g_free(mydata); } else myerrno = errno; if (destroy) destroy(data, user_data); if (fh) { /* Everything went all right. */ fclose(fh); gwy_app_set_current_directory(filename_sys); g_free(filename_sys); return TRUE; } filename_utf8 = g_filename_to_utf8(filename_sys, -1, NULL, NULL, NULL); dialog = gtk_message_dialog_new(parent, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Saving of `%s' failed"), filename_utf8); g_free(filename_sys); g_free(filename_utf8); gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), _("Cannot write to file: %s."), g_strerror(myerrno)); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); return FALSE; }