static GsfDocMetaData * get_meta_data (GsfInfile *infile, const char *filename) { GsfDocMetaData *meta_data = gsf_doc_meta_data_new (); if (GSF_IS_INFILE_MSOLE (infile)) { GsfInput *in; GError *err; in = gsf_infile_child_by_name (infile, "\05SummaryInformation"); if (NULL != in) { err = gsf_msole_metadata_read (in, meta_data); if (err != NULL) { g_warning ("'%s' error: %s", filename, err->message); g_error_free (err); err = NULL; } g_object_unref (G_OBJECT (in)); } in = gsf_infile_child_by_name (infile, "\05DocumentSummaryInformation"); if (NULL != in) { err = gsf_msole_metadata_read (in, meta_data); if (err != NULL) { g_warning ("'%s' error: %s", filename, err->message); g_error_free (err); err = NULL; } g_object_unref (G_OBJECT (in)); } } return meta_data; }
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 print_summary_stream (GsfInfile * msole, const char * file_name, const char * stream_name, GHashTable * human_readable_names) { GsfInput * stream = gsf_infile_child_by_name (msole, stream_name); if (stream != NULL) { GsfDocMetaData *meta_data = gsf_doc_meta_data_new (); GError *err = NULL; err = gsf_msole_metadata_read (stream, meta_data); if (err != NULL) { g_warning ("Error getting metadata for %s->%s: %s", file_name, stream_name, err->message); g_error_free (err); err = NULL; } else gsf_doc_meta_data_foreach (meta_data, (GHFunc) cb_print_property, human_readable_names); g_object_unref (meta_data); g_object_unref (G_OBJECT (stream)); } }
static int test (unsigned argc, char *argv[]) { static char const * const stream_names[] = { "Workbook", "WORKBOOK", "workbook", "Book", "BOOK", "book" }; GsfInput *input, *stream, *pcache_dir; GsfInfile *infile; GError *err = NULL; unsigned i, j; for (i = 1 ; i < argc ; i++) { fprintf( stderr, "%s\n",argv[i]); input = gsf_input_mmap_new (argv[i], NULL); if (input == NULL) /* Only report error if stdio fails too */ input = gsf_input_stdio_new (argv[i], &err); if (input == NULL) { g_return_val_if_fail (err != NULL, 1); g_warning ("'%s' error: %s", argv[i], err->message); g_error_free (err); err = NULL; continue; } input = gsf_input_uncompress (input); infile = gsf_infile_msole_new (input, &err); if (infile == NULL) { g_return_val_if_fail (err != NULL, 1); g_warning ("'%s' Not an OLE file: %s", argv[i], err->message); g_error_free (err); err = NULL; #ifdef DUMP_CONTENT dump_biff_stream (input); #endif g_object_unref (G_OBJECT (input)); continue; } #if 0 stream = gsf_infile_child_by_name (infile, "\01CompObj"); if (stream != NULL) { gsf_off_t len = gsf_input_size (stream); guint8 const *data = gsf_input_read (stream, len, NULL); if (data != NULL) gsf_mem_dump (data, len); g_object_unref (G_OBJECT (stream)); } return 0; #endif stream = gsf_infile_child_by_name (infile, "\05SummaryInformation"); if (stream != NULL) { GsfDocMetaData *meta_data = gsf_doc_meta_data_new (); puts ( "SummaryInfo"); err = gsf_doc_meta_data_read_from_msole (meta_data, stream); if (err != NULL) { g_warning ("'%s' error: %s", argv[i], err->message); g_error_free (err); err = NULL; } else gsf_doc_meta_dump (meta_data); g_object_unref (meta_data); g_object_unref (G_OBJECT (stream)); } stream = gsf_infile_child_by_name (infile, "\05DocumentSummaryInformation"); if (stream != NULL) { GsfDocMetaData *meta_data = gsf_doc_meta_data_new (); puts ( "DocSummaryInfo"); err = gsf_doc_meta_data_read_from_msole (meta_data, stream); if (err != NULL) { g_warning ("'%s' error: %s", argv[i], err->message); g_error_free (err); err = NULL; } else gsf_doc_meta_dump (meta_data); g_object_unref (meta_data); g_object_unref (G_OBJECT (stream)); } for (j = 0 ; j < G_N_ELEMENTS (stream_names) ; j++) { stream = gsf_infile_child_by_name (infile, stream_names[j]); if (stream != NULL) { puts (j < 3 ? "Excel97" : "Excel95"); #ifdef DUMP_CONTENT dump_biff_stream (stream); #endif g_object_unref (G_OBJECT (stream)); break; } } #ifdef DUMP_CONTENT pcache_dir = gsf_infile_child_by_name (infile, "_SX_DB_CUR"); /* Excel 97 */ if (NULL == pcache_dir) pcache_dir = gsf_infile_child_by_name (infile, "_SX_DB"); /* Excel 95 */ if (NULL != pcache_dir) { int i, n = gsf_infile_num_children (infile); for (i = 0 ; i < n ; i++) { stream = gsf_infile_child_by_index (GSF_INFILE (pcache_dir), i); if (stream != NULL) { printf ("=================================================\nPivot cache '%04hX'\n\n", i); dump_biff_stream (stream); g_object_unref (G_OBJECT (stream)); } } g_object_unref (G_OBJECT (pcache_dir)); } #endif g_object_unref (G_OBJECT (infile)); g_object_unref (G_OBJECT (input)); } return 0; }