static GsfOpenPkgRels * gsf_open_pkg_get_rels (GsfInput *opkg) { GsfOpenPkgRels *rels = NULL; g_return_val_if_fail (opkg != NULL, NULL); if (NULL == (rels = g_object_get_data (G_OBJECT (opkg), "OpenPkgRels"))) { char const *part_name = gsf_input_name (opkg); GsfXMLInDoc *rel_doc; GsfInput *rel_stream; if (NULL != part_name) { GsfInfile *container = gsf_input_container (opkg); char *rel_name; g_return_val_if_fail (container != NULL, NULL); rel_name = g_strconcat (part_name, ".rels", NULL); rel_stream = gsf_infile_child_by_vname (container, "_rels", rel_name, NULL); g_free (rel_name); } else /* the root */ rel_stream = gsf_infile_child_by_vname (GSF_INFILE (opkg), "_rels", ".rels", NULL); if (NULL != rel_stream) { rels = g_new (GsfOpenPkgRels, 1); rels->by_id = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify)gsf_open_pkg_rel_free); rels->by_type = g_hash_table_new (g_str_hash, g_str_equal); rel_doc = gsf_xml_in_doc_new (open_pkg_rel_dtd, open_pkg_ns); (void) gsf_xml_in_doc_parse (rel_doc, rel_stream, rels); gsf_xml_in_doc_free (rel_doc); g_object_unref (rel_stream); } g_object_set_data_full (G_OBJECT (opkg), "OpenPkgRels", rels, (GDestroyNotify) gsf_open_pkg_rels_free); } return rels; }
/** * gsf_input_find_vba: * @input: #GsfInput * @err: #GError, optionally %NULL. * * A utility routine that attempts to find the VBA file withint a stream. * * Returns: (transfer full): a GsfInfile **/ GsfInfileMSVBA * gsf_input_find_vba (GsfInput *input, GError **err) { GsfInput *vba = NULL; GsfInfile *infile; if (NULL != (infile = gsf_infile_msole_new (input, NULL))) { /* 1) Try XLS */ vba = gsf_infile_child_by_vname (infile, "_VBA_PROJECT_CUR", "VBA", NULL); /* 2) DOC */ if (NULL == vba) vba = gsf_infile_child_by_vname (infile, "Macros", "VBA", NULL); /* TODO : PPT is more complex */ g_object_unref (infile); } else if (NULL != (infile = gsf_infile_zip_new (input, NULL))) { GsfInput *main_part = gsf_open_pkg_open_rel_by_type (GSF_INPUT (infile), "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", NULL); if (NULL != main_part) { GsfInput *vba_stream = gsf_open_pkg_open_rel_by_type (main_part, "http://schemas.microsoft.com/office/2006/relationships/vbaProject", NULL); if (NULL != vba_stream) { GsfInfile *ole = gsf_infile_msole_new (vba_stream, err); if (NULL != ole) { vba = gsf_infile_child_by_vname (ole, "VBA", NULL); g_object_unref (ole); } g_object_unref (vba_stream); } g_object_unref (main_part); } g_object_unref (infile); } if (NULL != vba) return (GsfInfileMSVBA *) gsf_infile_msvba_new (GSF_INFILE (vba), err); return NULL; }
static void zip_thumbnail (GsfInfile *infile, const char *out_filename, int thumb_size) { GsfInput *thumbnail; /* Office Document thumbnail */ if (NULL != (thumbnail = gsf_infile_child_by_vname (infile, "Thumbnails", "thumbnail.png", NULL))) { gsf_off_t len = gsf_input_remaining (thumbnail); guint8 const *data = gsf_input_read (thumbnail, len, NULL); write_thumbnail (out_filename, data, len, thumb_size); g_object_unref (thumbnail); /* Check MS Office Open thumbnail */ } else if (NULL != (thumbnail = gsf_open_pkg_open_rel_by_type (GSF_INPUT(infile), "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail", NULL))) { gsf_off_t len = gsf_input_remaining (thumbnail); guint8 const *data = gsf_input_read (thumbnail, len, NULL); write_thumbnail (out_filename, data, len, thumb_size); g_object_unref (thumbnail); } else show_error_string_and_exit ("Could not find thumbnail in zip file"); }