static void read_thumbnail_and_write (const char *in_filename, const char *out_filename, int thumb_size) { GsfInput *input; GsfInfile *infile; GError *error; input = gsf_input_mmap_new (in_filename, NULL); if (!input) { error = NULL; input = gsf_input_stdio_new (in_filename, &error); if (!input) show_error_and_exit (error); } input = gsf_input_uncompress (input); error = NULL; if (NULL != (infile = gsf_infile_msole_new (input, &error))) msole_thumbnail (infile, out_filename, thumb_size); else if (NULL != (infile = gsf_infile_zip_new (input, &error))) zip_thumbnail (infile, out_filename, thumb_size); else show_error_and_exit (error); g_object_unref (infile); g_object_unref (input); }
/* InitMemory: * Initialisation de la carte mémoire et chargement des ROMS. */ static int InitMemory(void) { register int i; /* 128 ko de RAM */ for (i=0; i<mem.ram.nbank; i++) if ((mem.ram.bank[i] = calloc(mem.ram.size, sizeof(uint8))) == NULL) return ErrorMessage(TO7_BAD_ALLOC, NULL); /* 8 ko de ROM moniteur */ for (i=0; i<mem.mon.nbank; i++) if ((mem.mon.bank[i] = malloc(mem.mon.size*sizeof(uint8))) == NULL) return ErrorMessage(TO7_BAD_ALLOC, NULL); for (i=0; i<mem.mon.nbank; i++) { if (mem.mon.filename_low[i][0]) /* ROM contrôleur de disquettes? */ { if (LoadFile(mem.mon.filename_low[i], mem.mon.bank[i], 0x800) == TO7_ERROR){ show_error_and_exit("Unable to load cd90-640.rom file"); return TO7_ERROR; } } if (LoadFile(mem.mon.filename_high[i], mem.mon.bank[i]+0x800, mem.mon.size-0x800) == TO7_ERROR){ show_error_and_exit("Unable to load to770.rom file"); return TO7_ERROR; } } LOCK_DATA(mem.ram.bank[0], sizeof(uint8)*mem.ram.size); LOCK_DATA(mem.mon.bank[0], sizeof(uint8)*mem.mon.size); return TO7_OK; }
static void msole_thumbnail (GsfInfile *infile, const char *out_filename, int thumb_size) { GsfInput *summary_stream; GsfDocMetaData *meta_data; GsfDocProp *thumb_doc_prop; GValue const *thumb_value; GsfClipData *clip_data; GsfClipFormat clip_format; gconstpointer data; gsize size; GError *error; summary_stream = gsf_infile_child_by_name (infile, "\05SummaryInformation"); if (!summary_stream) show_error_string_and_exit ("Could not find the SummaryInformation stream"); meta_data = gsf_doc_meta_data_new (); error = gsf_msole_metadata_read (summary_stream, meta_data); if (error) show_error_and_exit (error); thumb_doc_prop = gsf_doc_meta_data_lookup (meta_data, GSF_META_NAME_THUMBNAIL); if (!thumb_doc_prop) show_error_string_and_exit ("The metadata does not have a thumbnail property"); thumb_value = gsf_doc_prop_get_val (thumb_doc_prop); if (!thumb_value) show_error_string_and_exit ("We got the thumbnail property, but it didn't have a value!?"); clip_data = GSF_CLIP_DATA (g_value_get_object (thumb_value)); clip_format = gsf_clip_data_get_format (clip_data); if (clip_format == GSF_CLIP_FORMAT_WINDOWS_CLIPBOARD) { GsfClipFormatWindows win_format; error = NULL; win_format = gsf_clip_data_get_windows_clipboard_format (clip_data, &error); if (win_format == GSF_CLIP_FORMAT_WINDOWS_ERROR) show_error_and_exit (error); } error = NULL; data = gsf_clip_data_peek_real_data (clip_data, &size, &error); if (!data) show_error_and_exit (error); write_thumbnail (out_filename, data, size, thumb_size); g_object_unref (clip_data); g_object_unref (meta_data); g_object_unref (summary_stream); }
static void call_convert (const char *in_filename, const char *out_filename, int thumb_size) { char *in_quote; char *out_quote; char *cmd_line; GError *error; gint exit_status; #ifdef HAVE_GDK_PIXBUF GdkPixbuf* pixbuf; pixbuf = gdk_pixbuf_new_from_file_at_scale (in_filename, thumb_size, thumb_size, TRUE, NULL); if (pixbuf) { gboolean success = gdk_pixbuf_save (pixbuf, out_filename, "png", NULL, NULL); g_object_unref (pixbuf); if (success) return; } #endif in_quote = g_shell_quote (in_filename); out_quote = g_shell_quote (out_filename); cmd_line = g_strdup_printf ("convert %s +matte -thumbnail %dx%d png:%s", in_quote, thumb_size, thumb_size, out_quote); g_printerr ("calling %s\n", cmd_line); g_free (in_quote); g_free (out_quote); error = NULL; if (!g_spawn_command_line_sync (cmd_line, NULL, NULL, &exit_status, &error)) show_error_and_exit (error); g_free (cmd_line); }