UT_Error IE_Exp_EPUB::EPUB3_writeStructure() { m_oebpsDir = m_baseTempDir + G_DIR_SEPARATOR_S; m_oebpsDir += "OEBPS"; UT_go_directory_create(m_oebpsDir.c_str(), NULL); std::string indexPath = m_oebpsDir + G_DIR_SEPARATOR_S; indexPath += "index.xhtml"; // Exporting document to XHTML using HTML export plugin char *szIndexPath = (char*) g_malloc(strlen(indexPath.c_str()) + 1); strcpy(szIndexPath, indexPath.c_str()); IE_Exp_HTML_WriterFactory *pWriterFactory = new IE_Exp_EPUB_EPUB3WriterFactory(); m_pHmtlExporter = new IE_Exp_HTML(getDoc()); m_pHmtlExporter->setWriterFactory(pWriterFactory); m_pHmtlExporter->suppressDialog(true); m_pHmtlExporter->setProps( "embed-css:no;html4:no;use-awml:no;declare-xml:yes;add-identifiers:yes;"); m_pHmtlExporter->set_SplitDocument(m_exp_opt.bSplitDocument); m_pHmtlExporter->set_MathMLRenderPNG(m_exp_opt.bRenderMathMLToPNG); m_pHmtlExporter->writeFile(szIndexPath); g_free(szIndexPath); DELETEP(pWriterFactory); return UT_OK; }
UT_Error IE_Exp_EPUB::EPUB2_writeStructure() { m_oebpsDir = m_baseTempDir + G_DIR_SEPARATOR_S; m_oebpsDir += "OEBPS"; UT_go_directory_create(m_oebpsDir.c_str(), NULL); std::string indexPath = m_oebpsDir + G_DIR_SEPARATOR_S; indexPath += "index.xhtml"; // Exporting document to XHTML using HTML export plugin // We need to setup options for HTML exporter according to current settings of EPUB exporter std::string htmlProps = UT_std_string_sprintf("embed-css:no;html4:no;use-awml:no;declare-xml:yes;mathml-render-png:%s;split-document:%s;add-identifiers:yes;", m_exp_opt.bRenderMathMLToPNG ? "yes" : "no", m_exp_opt.bSplitDocument ? "yes" : "no"); m_pHmtlExporter = new IE_Exp_HTML(getDoc()); m_pHmtlExporter->suppressDialog(true); m_pHmtlExporter->setProps(htmlProps.c_str()); m_pHmtlExporter->writeFile(indexPath.c_str()); return UT_OK; }
void s_XSL_FO_Listener::_handleDataItems(void) { const char * szName = NULL; std::string mimeType; const UT_ByteBuf * pByteBuf; for (UT_uint32 k=0; (m_pDocument->enumDataItems(k, NULL, &szName, &pByteBuf, &mimeType)); k++) { UT_sint32 loc = -1; for (UT_sint32 i = 0; i < m_utvDataIDs.getItemCount(); i++) { if(strcmp(reinterpret_cast<const char*>(m_utvDataIDs[i]), szName) == 0) { loc = i; break; } } if(loc > -1) { UT_UTF8String fname; UT_UTF8String_sprintf(fname, "%s_data", m_pie->getFileName()); UT_go_directory_create(fname.utf8_str(), 0750, NULL); if (mimeType == "image/svg+xml") UT_UTF8String_sprintf(fname, "%s/%d.svg", fname.utf8_str(), loc); else if (mimeType == "application/mathml+xml") UT_UTF8String_sprintf(fname, "%s/%d.mathml", fname.utf8_str(), loc); else // raster Image { const char * extension = "png"; if(mimeType == "image/jpeg") { extension = "jpg"; } char * temp = _stripSuffix(UT_go_basename(szName), '_'); char * fstripped = _stripSuffix(temp, '.'); UT_UTF8String_sprintf(fname, "%s/%s.%s", fname.utf8_str(), fstripped, extension); FREEP(temp); FREEP(fstripped); } GsfOutput *fp = UT_go_file_create (fname.utf8_str(), NULL); if(!fp) continue; gsf_output_write(fp, pByteBuf->getLength(), (const guint8 *)pByteBuf->getPointer(0)); gsf_output_close(fp); g_object_unref(fp); } } return; }
UT_Error IE_Imp_EPUB::uncompress() { m_tmpDir = UT_go_filename_to_uri(g_get_tmp_dir()); m_tmpDir += G_DIR_SEPARATOR_S; m_tmpDir += getDoc()->getDocUUIDString(); if (!UT_go_directory_create(m_tmpDir.c_str(), 0644, NULL)) { UT_DEBUGMSG(("Can`t create temporary directory\n")); return UT_ERROR; } GsfInput *opsDirInput = gsf_infile_child_by_name(m_epub, m_opsDir.c_str()); UT_DEBUGMSG(("Child count : %d", gsf_infile_num_children(m_epub))); if (opsDirInput == NULL) { UT_DEBUGMSG(("Failed to open OPS dir\n")); return UT_ERROR; } for (std::map<std::string, std::string>::iterator i = m_manifestItems.begin(); i != m_manifestItems.end(); i++) { gchar *itemFileName = UT_go_filename_from_uri( (m_tmpDir + G_DIR_SEPARATOR_S + (*i).second).c_str()); gchar** aname = g_strsplit((*i).second.c_str(), G_DIR_SEPARATOR_S, 0); GsfInput* itemInput = gsf_infile_child_by_aname( GSF_INFILE(opsDirInput), (const char**) aname); GsfOutput* itemOutput = createFileByPath(itemFileName); gsf_input_seek(itemInput, 0, G_SEEK_SET); gsf_input_copy(itemInput, itemOutput); g_strfreev(aname); g_free(itemFileName); g_object_unref(G_OBJECT(itemInput)); gsf_output_close(itemOutput); } g_object_unref(G_OBJECT(opsDirInput)); return UT_OK; }
GsfOutput* IE_Imp_EPUB::createFileByPath(const char* path) { gchar** components = g_strsplit(path, G_DIR_SEPARATOR_S, 0); std::string curPath = ""; int current = 0; GsfOutput* output = NULL; while (components[current] != NULL) { curPath += components[current]; current++; char *uri = UT_go_filename_to_uri(curPath.c_str()); bool fileExists = UT_go_file_exists(uri); if (!fileExists && (components[current] != NULL)) { UT_go_directory_create(uri, 0644, NULL); } else { if (!fileExists) { output = UT_go_file_create(uri, NULL); break; } } g_free(uri); if (components[current] != NULL) { curPath += G_DIR_SEPARATOR_S; } } g_strfreev(components); return output; }
UT_Error IE_Exp_EPUB::_writeDocument() { UT_Error errOptions = doOptions(); if (errOptions == UT_SAVE_CANCELLED) //see Bug 10840 { return UT_SAVE_CANCELLED; } else if (errOptions != UT_OK) { return UT_ERROR; } m_root = gsf_outfile_zip_new(getFp(), NULL); if (m_root == NULL) { UT_DEBUGMSG(("ZIP output is null\n")); return UT_ERROR; } m_oebps = gsf_outfile_new_child(m_root, "OEBPS", TRUE); if (m_oebps == NULL) { UT_DEBUGMSG(("Can`t create oebps output object\n")); return UT_ERROR; } // mimetype must a first file in archive GsfOutput *mimetype = gsf_outfile_new_child_full(m_root, "mimetype", FALSE, "compression-level", 0, NULL); gsf_output_write(mimetype, strlen(EPUB_MIMETYPE), (const guint8*) EPUB_MIMETYPE); gsf_output_close(mimetype); // We need to create temporary directory to which // HTML plugin will export our document m_baseTempDir = UT_go_filename_to_uri(g_get_tmp_dir()); m_baseTempDir += G_DIR_SEPARATOR_S; // To generate unique directory name we`ll use document UUID m_baseTempDir += getDoc()->getDocUUIDString(); // We should delete any previous temporary data for this document to prevent // odd files appearing in the container UT_go_file_remove(m_baseTempDir.c_str(), NULL); UT_go_directory_create(m_baseTempDir.c_str(), NULL); if (writeContainer() != UT_OK) { UT_DEBUGMSG(("Failed to write container\n")); return UT_ERROR; } if (writeStructure() != UT_OK) { UT_DEBUGMSG(("Failed to write document structure\n")); return UT_ERROR; } if (writeNavigation() != UT_OK) { UT_DEBUGMSG(("Failed to write navigation\n")); return UT_ERROR; } if (package() != UT_OK) { UT_DEBUGMSG(("Failed to package document\n")); return UT_ERROR; } gsf_output_close(m_oebps); gsf_output_close(GSF_OUTPUT(m_root)); // After doing all job we should delete temporary files UT_go_file_remove(m_baseTempDir.c_str(), NULL); return UT_OK; }