KoOdfLoadingContext::KoOdfLoadingContext(KoOdfStylesReader &stylesReader, KoStore* store, const KComponentData &componentData) : d(new Private(stylesReader, store)) { // Ideally this should be done by KoDocument and passed as argument here... KoOdfReadStore oasisStore(store); QString dummy; (void)oasisStore.loadAndParse("tar:/META-INF/manifest.xml", d->manifestDoc, dummy); if (componentData.isValid()) { QString fileName( KStandardDirs::locate( "styles", "defaultstyles.xml", componentData ) ); if ( ! fileName.isEmpty() ) { QFile file( fileName ); QString errorMessage; if ( KoOdfReadStore::loadAndParse( &file, d->doc, errorMessage, fileName ) ) { d->defaultStylesReader.createStyleMap( d->doc, true ); } else { kWarning(30010) << "reading of defaultstyles.xml failed:" << errorMessage; } } else { kWarning(30010) << "defaultstyles.xml not found"; } } if (!parseManifest(d->manifestDoc)) { kWarning(30010) << "could not parse manifest document"; } }
void KoOdfLoadingContext::setManifestFile(const QString& fileName) { KoOdfReadStore oasisStore(d->store); QString dummy; (void)oasisStore.loadAndParse(fileName, d->manifestDoc, dummy); if (!parseManifest(d->manifestDoc)) { kWarning(30010) << "could not parse manifest document"; } }
KoOasisLoadingContext::KoOasisLoadingContext( KoDocument* doc, KoOasisStyles& styles, KoStore* store ) : m_doc( doc ), m_store( store ), m_styles( styles ), m_metaXmlParsed( false ), m_useStylesAutoStyles( false ) { // Ideally this should be done by KoDocument and passed as argument here... KoOasisStore oasisStore( store ); QString dummy; (void)oasisStore.loadAndParse( "tar:/META-INF/manifest.xml", m_manifestDoc, dummy ); }
void KoOdfLoadingContext::parseGenerator() const { // Regardless of whether we cd into the parent directory // or not to find a meta.xml, restore the directory that // we were in afterwards. d->store->pushDirectory(); // Some embedded documents to not contain their own meta.xml // Use the parent directory's instead. if (!d->store->hasFile("meta.xml")) // Only has an effect if there is a parent directory d->store->leaveDirectory(); if (d->store->hasFile("meta.xml")) { KoXmlDocument metaDoc; KoOdfReadStore oasisStore(d->store); QString errorMsg; if (oasisStore.loadAndParse("meta.xml", metaDoc, errorMsg)) { KoXmlNode meta = KoXml::namedItemNS(metaDoc, KoXmlNS::office, "document-meta"); KoXmlNode office = KoXml::namedItemNS(meta, KoXmlNS::office, "meta"); KoXmlElement generator = KoXml::namedItemNS(office, KoXmlNS::meta, "generator"); if (!generator.isNull()) { d->generator = generator.text(); if (d->generator.startsWith("Calligra")) { d->generatorType = Calligra; } // NeoOffice is a port of OpenOffice to Mac OS X else if (d->generator.startsWith("OpenOffice.org") || d->generator.startsWith("NeoOffice") || d->generator.startsWith("LibreOffice") || d->generator.startsWith("StarOffice") || d->generator.startsWith("Lotus Symphony")) { d->generatorType = OpenOffice; } else if (d->generator.startsWith("MicrosoftOffice")) { d->generatorType = MicrosoftOffice; } } } } d->metaXmlParsed = true; d->store->popDirectory(); }
void KoOasisLoadingContext::parseMeta() const { if ( !m_metaXmlParsed && m_store ) { if ( m_store->hasFile( "meta.xml" ) ) { QDomDocument metaDoc; KoOasisStore oasisStore( m_store ); QString errorMsg; if ( oasisStore.loadAndParse( "meta.xml", metaDoc, errorMsg ) ) { QDomNode meta = KoDom::namedItemNS( metaDoc, KoXmlNS::office, "document-meta" ); QDomNode office = KoDom::namedItemNS( meta, KoXmlNS::office, "meta" ); QDomElement generator = KoDom::namedItemNS( office, KoXmlNS::meta, "generator" ); if ( !generator.isNull() ) m_generator = generator.text(); } } m_metaXmlParsed = true; } }
KoFilter::ConversionStatus KoOdfExporter::convert(const QByteArray& from, const QByteArray& to) { // check for proper conversion if (!acceptsSourceMimeType(from)) { kWarning(30003) << "Invalid source mimetype" << from; return KoFilter::NotImplemented; } if (!acceptsDestinationMimeType(to)) { kWarning(30003) << "Invalid destination mimetype" << to; return KoFilter::NotImplemented; } //create output files KoStore *outputStore = KoStore::createStore(m_chain->outputFile(), KoStore::Write, to, KoStore::Zip); if (!outputStore || outputStore->bad()) { kWarning(30003) << "Unable to open output file!"; delete outputStore; return KoFilter::FileNotFound; } outputStore->disallowNameExpansion(); kDebug(30003) << "created outputStore."; KoOdfWriteStore oasisStore(outputStore); kDebug(30003) << "created oasisStore."; // KoGenStyles for writing styles while we're parsing KoGenStyles mainStyles; KoOdfWriters writers; writers.mainStyles = &mainStyles; // create a writer for meta.xml QBuffer buf; buf.open(QIODevice::WriteOnly); KoXmlWriter metaWriter(&buf); writers.meta = &metaWriter; // create a writer for manifest.xml QBuffer manifestBuf; manifestBuf.open(QIODevice::WriteOnly); KoXmlWriter manifestWriter(&manifestBuf); writers.manifest = &manifestWriter; //open contentWriter & bodyWriter *temp* writers //so we can write picture files while we parse QBuffer contentBuf; KoXmlWriter contentWriter(&contentBuf); writers.content = &contentWriter; QBuffer bodyBuf; KoXmlWriter bodyWriter(&bodyBuf); writers.body = &bodyWriter; // open main tags bodyWriter.startElement("office:body"); bodyWriter.startElement(d->bodyContentElement.constData()); RETURN_IF_ERROR( createDocument(outputStore, &writers) ) //save the office:automatic-styles & and fonts in content.xml mainStyles.saveOdfStyles(KoGenStyles::FontFaceDecls, &contentWriter); mainStyles.saveOdfStyles(KoGenStyles::DocumentAutomaticStyles, &contentWriter); //close tags in body bodyWriter.endElement();//office:* bodyWriter.endElement();//office:body //now create real content/body writers & dump the information there KoXmlWriter* realContentWriter = oasisStore.contentWriter(); if (!realContentWriter) { kWarning(30003) << "Error creating the content writer."; delete outputStore; return KoFilter::CreationError; } realContentWriter->addCompleteElement(&contentBuf); KoXmlWriter* realBodyWriter = oasisStore.bodyWriter(); if (!realBodyWriter) { kWarning(30003) << "Error creating the body writer."; delete outputStore; return KoFilter::CreationError; } realBodyWriter->addCompleteElement(&bodyBuf); //now close content & body writers if (!oasisStore.closeContentWriter()) { kWarning(30003) << "Error closing content."; delete outputStore; return KoFilter::CreationError; } kDebug(30003) << "closed content & body writers."; //create the manifest file KoXmlWriter* realManifestWriter = oasisStore.manifestWriter(to); //create the styles.xml file mainStyles.saveOdfStylesDotXml(outputStore, realManifestWriter); realManifestWriter->addManifestEntry("content.xml", "text/xml"); realManifestWriter->addCompleteElement(&manifestBuf); kDebug(30003) << "created manifest and styles.xml"; // create settings.xml, apparently it is used to note calligra that msoffice files should // have different behavior with some things if (!outputStore->open("settings.xml")) { delete outputStore; return KoFilter::CreationError; } KoStoreDevice settingsDev(outputStore); KoXmlWriter* settings = KoOdfWriteStore::createOasisXmlWriter(&settingsDev, "office:document-settings"); settings->startElement("office:settings"); settings->startElement("config:config-item-set"); settings->addAttribute("config:name", "ooo:configuration-settings"); writeConfigurationSettings(settings); settings->endElement(); // config:config-item-set settings->endElement(); // office:settings settings->endElement(); // office:document-settings settings->endDocument(); delete settings; realManifestWriter->addManifestEntry("settings.xml", "text/xml"); if (!outputStore->close()) { delete outputStore; return KoFilter::CreationError; } //create meta.xml if (!outputStore->open("meta.xml")) { delete outputStore; return KoFilter::CreationError; } KoStoreDevice metaDev(outputStore); KoXmlWriter* meta = KoOdfWriteStore::createOasisXmlWriter(&metaDev, "office:document-meta"); meta->startElement("office:meta"); meta->addCompleteElement(&buf); meta->endElement(); //office:meta meta->endElement(); //office:document-meta meta->endDocument(); delete meta; if (!outputStore->close()) { delete outputStore; return KoFilter::CreationError; } realManifestWriter->addManifestEntry("meta.xml", "text/xml"); oasisStore.closeManifestWriter(); delete outputStore; return KoFilter::OK; }
void KoOdfLoadingContext::setManifestFile(const QString& fileName) { KoOdfReadStore oasisStore(d->store); QString dummy; (void)oasisStore.loadAndParse(fileName, d->manifestDoc, dummy); }