/** * gsf_open_pkg_open_rel: * @opkg: #GsfInput * @rel: #GsfOpenPkgRel * @err: #GError. * * Returns: (transfer full): a new #GsfInput which the called needs to unref, or %NULL and sets @err **/ GsfInput * gsf_open_pkg_open_rel (GsfInput *opkg, GsfOpenPkgRel const *rel, G_GNUC_UNUSED GError **err /* just in case we need it one day */ ) { GsfInput *res = NULL; GsfInfile *parent, *prev_parent; gchar **elems; unsigned i; g_return_val_if_fail (rel != NULL, NULL); g_return_val_if_fail (opkg != NULL, NULL); /* References from the root use children of opkg * References from a child are relative to siblings of opkg */ parent = gsf_input_name (opkg) ? gsf_input_container (opkg) : GSF_INFILE (opkg); g_object_ref (parent); elems = g_strsplit (rel->target, "/", 0); for (i = 0 ; elems[i] && NULL != parent ; i++) { if (0 == strcmp (elems[i], ".") || '\0' == *elems[i]) continue; /* ignore '.' and empty */ prev_parent = parent; if (0 == strcmp (elems[i], "..")) { parent = gsf_input_container (GSF_INPUT (parent)); res = NULL; /* only return newly created children */ if (NULL != parent) { /* check for attempt to gain access outside the zip file */ if (G_OBJECT_TYPE (parent) == G_OBJECT_TYPE (prev_parent)) g_object_ref (parent); else parent = NULL; } } else { res = gsf_infile_child_by_name (parent, elems[i]); if (NULL != elems[i+1]) { g_return_val_if_fail (GSF_IS_INFILE (res), NULL); parent = GSF_INFILE (res); } } g_object_unref (prev_parent); } g_strfreev (elems); return res; }
UT_Error IE_Imp_EPUB::readPackage() { gchar **aname = g_strsplit(m_rootfilePath.c_str(), G_DIR_SEPARATOR_S, 0); GsfInput* opf = gsf_infile_child_by_aname(m_epub, (const char**) aname); UT_DEBUGMSG(("Getting parent\n")); GsfInfile* opfParent = gsf_input_container(opf); m_opsDir = std::string(gsf_input_name(GSF_INPUT(opfParent))); UT_DEBUGMSG(("OPS dir: %s\n", m_opsDir.c_str())); if (opf == NULL) { UT_DEBUGMSG(("Can`t open .opf file\n")); return UT_ERROR; } size_t opfSize = gsf_input_size(opf); gchar* opfXml = (gchar*) gsf_input_read(opf, opfSize, NULL); UT_XML opfParser; OpfListener opfListener; opfParser.setListener(&opfListener); if (opfParser.sniff(opfXml, opfSize, "package")) { UT_DEBUGMSG(("Parsing opf file\n")); opfParser.parse(opfXml, opfSize); } else { UT_DEBUGMSG(("Incorrect opf file found \n")); return UT_ERROR; } g_strfreev(aname); g_object_unref(G_OBJECT(opf)); //g_object_unref(G_OBJECT(opfParent)); m_spine = opfListener.getSpine(); m_manifestItems = opfListener.getManifestItems(); return UT_OK; }
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; }