KoShape* StencilShapeFactory:: createFromOdf(KoStore* store, KoDocumentResourceManager* documentRes) const { KoOdfReadStore odfStore(store); QString errorMessage; if (! odfStore.loadAndParse(errorMessage)) { kError() << "loading and parsing failed:" << errorMessage << endl; return 0; } KoXmlElement content = odfStore.contentDoc().documentElement(); KoXmlElement realBody(KoXml::namedItemNS(content, KoXmlNS::office, "body")); if (realBody.isNull()) { kError() << "No body tag found!" << endl; return 0; } KoXmlElement body = KoXml::namedItemNS(realBody, KoXmlNS::office, "drawing"); if (body.isNull()) { kError() << "No office:drawing tag found!" << endl; return 0; } KoXmlElement page = KoXml::namedItemNS(body, KoXmlNS::draw, "page"); if (page.isNull()) { kError() << "No page found!" << endl; return 0; } KoXmlElement shapeElement = KoXml::namedItemNS(page, KoXmlNS::draw, "g"); if (shapeElement.isNull()) { shapeElement = KoXml::namedItemNS(page, KoXmlNS::draw, "custom-shape"); if (shapeElement.isNull()) { kError() << "draw:g or draw:custom-shape element not found!" << endl; return 0; } } KoOdfLoadingContext loadingContext(odfStore.styles(), odfStore.store()); KoShapeLoadingContext context(loadingContext, documentRes); KoShapeRegistry* registry = KoShapeRegistry::instance(); foreach (const QString & id, registry->keys()) { KoShapeFactoryBase* shapeFactory = registry->value(id); shapeFactory->newDocumentResourceManager(documentRes); } return KoShapeRegistry::instance()->createShapeFromOdf(shapeElement, context); }
bool KoOdfPaste::paste(KoOdf::DocumentType documentType, const QByteArray &bytes) { if (bytes.isEmpty()) return false; QBuffer buffer; buffer.setData(bytes); KoStore * store = KoStore::createStore(&buffer, KoStore::Read); store->disallowNameExpansion(); KoOdfReadStore odfStore(store); // KoOdfReadStore does not delete the store on destruction QString errorMessage; if (! odfStore.loadAndParse(errorMessage)) { kWarning(30002) << "loading and parsing failed:" << errorMessage; delete store; return false; } KoXmlElement content = odfStore.contentDoc().documentElement(); KoXmlElement realBody(KoXml::namedItemNS(content, KoXmlNS::office, "body")); if (realBody.isNull()) { kWarning(30002) << "No body tag found"; delete store; return false; } KoXmlElement body = KoXml::namedItemNS(realBody, KoXmlNS::office, KoOdf::bodyContentElement(documentType, false)); if (body.isNull()) { kWarning(30002) << "No" << KoOdf::bodyContentElement(documentType, true) << "tag found"; delete store; return false; } bool retval = process(body, odfStore); delete store; return retval; }
//1.6: KWDocument::loadOasis bool KWOdfLoader::load(KoOdfReadStore &odfStore) { //debugWords << "========================> KWOdfLoader::load START"; QPointer<KoUpdater> updater; QPointer<KoUpdater> loadUpdater; if (m_document->progressUpdater()) { updater = m_document->progressUpdater()->startSubtask(1, "KWOdfLoader::load"); loadUpdater = m_document->progressUpdater()->startSubtask(5, "KWOdfLoader::loadOdf"); updater->setProgress(0); loadUpdater->setProgress(0); } KoXmlElement content = odfStore.contentDoc().documentElement(); KoXmlElement realBody(KoXml::namedItemNS(content, KoXmlNS::office, "body")); if (realBody.isNull()) { errorWords << "No office:body found!" << endl; m_document->setErrorMessage(i18n("Invalid OASIS OpenDocument file. No office:body tag found.")); return false; } KoXmlElement body = KoXml::namedItemNS(realBody, KoXmlNS::office, "text"); if (body.isNull()) { errorWords << "No office:text found!" << endl; KoXmlElement childElem; QString localName; forEachElement(childElem, realBody) localName = childElem.localName(); if (localName.isEmpty()) m_document->setErrorMessage(i18n("Invalid OASIS OpenDocument file. No tag found inside office:body.")); else m_document->setErrorMessage(i18n("This is not a word processing document, but %1. Please try opening it with the appropriate application.", KoDocument::tagNameToDocumentType(localName))); return false; } // Load attributes from the office:text. These are text:global and text:use-soft-page-breaks. QString textGlobal = body.attributeNS(KoXmlNS::text, "global"); bool isTextGlobal = (textGlobal == "true"); if (isTextGlobal) { m_document->setIsMasterDocument(true); } // FIXME: text:use-soft-page-breaks if (updater) updater->setProgress(20); KoOdfLoadingContext odfContext(odfStore.styles(), odfStore.store(), QLatin1String("calligrawords/styles/")); KoShapeLoadingContext sc(odfContext, m_document->resourceManager()); sc.setDocumentRdf(m_document->documentRdf()); // Load user defined variable declarations if (KoVariableManager *variableManager = m_document->inlineTextObjectManager()->variableManager()) { variableManager->loadOdf(body); } // Load all styles before the corresponding paragraphs try to use them! KWOdfSharedLoadingData *sharedData = new KWOdfSharedLoadingData(this); sc.addSharedData(KOTEXT_SHARED_LOADING_ID, sharedData); KoStyleManager *styleManager = m_document->resourceManager()->resource(KoText::StyleManager).value<KoStyleManager*>(); Q_ASSERT(styleManager); sharedData->loadOdfStyles(sc, styleManager); if (updater) updater->setProgress(40); loadMasterPageStyles(sc); // add page background frame set KWFrameSet *pageBackgroundFrameSet = new KWFrameSet(Words::BackgroundFrameSet); m_document->addFrameSet(pageBackgroundFrameSet); #if 0 //1.6: KWOasisLoader oasisLoader(this); // <text:page-sequence> oasis extension for DTP (2003-10-27 post by Daniel) m_processingType = (!KoXml::namedItemNS(body, KoXmlNS::text, "page-sequence").isNull()) ? DTP : WP; m_hasTOC = false; m_tabStop = MM_TO_POINT(15); const KoXmlElement *defaultParagStyle = styles.defaultStyle("paragraph"); if (defaultParagStyle) { KoStyleStack stack; stack.push(*defaultParagStyle); stack.setTypeProperties("paragraph"); QString tabStopVal = stack.property(KoXmlNS::style, "tab-stop-distance"); if (!tabStopVal.isEmpty()) m_tabStop = KoUnit::parseValue(tabStopVal); } m_initialEditing = 0; // TODO MAILMERGE // Variable settings // By default display real variable value if (!isReadWrite()) m_varColl->variableSetting()->setDisplayFieldCode(false); #endif // Load all styles before the corresponding paragraphs try to use them! #if 0 //1.6: if (m_frameStyleColl->loadOasisStyles(context) == 0) { // no styles loaded -> load default styles loadDefaultFrameStyleTemplates(); } if (m_tableStyleColl->loadOasisStyles(context, *m_styleColl, *m_frameStyleColl) == 0) { // no styles loaded -> load default styles loadDefaultTableStyleTemplates(); } static_cast<KWVariableSettings *>(m_varColl->variableSetting())->loadNoteConfiguration(styles.officeStyle()); loadDefaultTableTemplates(); //#else /* // We always needs at least one valid default paragraph style KoParagraphStyle *defaultParagraphStyle = m_document->styleManager()->defaultParagraphStyle(); //const KoXmlElement *defaultParagraphStyle = context.stylesReader().defaultStyle("paragraph"); //if(! defaultParagraphStyle) { KoParagraphStyle *parastyle = new KoParagraphStyle(); parastyle->setName("Standard"); m_document->styleManager()->add(parastyle); context.styleStack().setTypeProperties("paragraph"); // load all style attributes from "style:paragraph-properties" parastyle->loadOasis(context.styleStack()); // load the KoParagraphStyle from the stylestack KoCharacterStyle *charstyle = parastyle->characterStyle(); context.styleStack().setTypeProperties("text"); // load all style attributes from "style:text-properties" charstyle->loadOasis(context.styleStack()); // load the KoCharacterStyle from the stylestack //} */ #endif // load text:page-sequence KoXmlElement pageSequence = KoXml::namedItemNS(body, KoXmlNS::text, "page-sequence"); if (! pageSequence.isNull()) { KWPageManager *pageManager = m_document->pageManager(); KoXmlElement page; forEachElement(page, pageSequence) { if (page.namespaceURI() == KoXmlNS::text && page.localName() == "page") { QString master = page.attributeNS(KoXmlNS::text, "master-page-name", QString()); pageManager->appendPage(pageManager->pageStyle(master)); } } }
//1.6: KWDocument::loadOasis bool KWOdfLoader::load(KoOdfReadStore & odfStore) { emit sigProgress(0); //kDebug(32001) << "========================> KWOdfLoader::load START"; KoXmlElement content = odfStore.contentDoc().documentElement(); KoXmlElement realBody(KoXml::namedItemNS(content, KoXmlNS::office, "body")); if (realBody.isNull()) { kError(32001) << "No office:body found!" << endl; m_document->setErrorMessage(i18n("Invalid OASIS OpenDocument file. No office:body tag found.")); return false; } KoXmlElement body = KoXml::namedItemNS(realBody, KoXmlNS::office, "text"); if (body.isNull()) { kError(32001) << "No office:text found!" << endl; KoXmlElement childElem; QString localName; forEachElement(childElem, realBody) localName = childElem.localName(); if (localName.isEmpty()) m_document->setErrorMessage(i18n("Invalid OASIS OpenDocument file. No tag found inside office:body.")); else m_document->setErrorMessage(i18n("This is not a word processing document, but %1. Please try opening it with the appropriate application.", KoDocument::tagNameToDocumentType(localName))); return false; } // TODO check versions and mimetypes etc. bool hasMainText = false; KoXmlElement childElem; forEachElement(childElem, body) { if (childElem.namespaceURI() == KoXmlNS::text) { hasMainText = true; break; } } KoOdfLoadingContext odfContext(odfStore.styles(), odfStore.store(), m_document->componentData()); KoShapeLoadingContext sc(odfContext, m_document->dataCenterMap()); // Load all styles before the corresponding paragraphs try to use them! KWOdfSharedLoadingData * sharedData = new KWOdfSharedLoadingData(this); KoStyleManager *styleManager = dynamic_cast<KoStyleManager *>(m_document->dataCenterMap()["StyleManager"]); Q_ASSERT(styleManager); sharedData->loadOdfStyles(odfContext, styleManager); sc.addSharedData(KOTEXT_SHARED_LOADING_ID, sharedData); KoTextLoader * loader = new KoTextLoader(sc); Q_UNUSED(loader); KoOdfLoadingContext context(odfStore.styles(), odfStore.store(), m_document->componentData()); loadMasterPageStyles(context, hasMainText); #if 0 //1.6: KWOasisLoader oasisLoader(this); // <text:page-sequence> oasis extension for DTP (2003-10-27 post by Daniel) m_processingType = (!KoXml::namedItemNS(body, KoXmlNS::text, "page-sequence").isNull()) ? DTP : WP; m_hasTOC = false; m_tabStop = MM_TO_POINT(15); const KoXmlElement* defaultParagStyle = styles.defaultStyle("paragraph"); if (defaultParagStyle) { KoStyleStack stack; stack.push(*defaultParagStyle); stack.setTypeProperties("paragraph"); QString tabStopVal = stack.property(KoXmlNS::style, "tab-stop-distance"); if (!tabStopVal.isEmpty()) m_tabStop = KoUnit::parseValue(tabStopVal); } m_initialEditing = 0; // TODO MAILMERGE // Variable settings // By default display real variable value if (!isReadWrite()) m_varColl->variableSetting()->setDisplayFieldCode(false); #endif // Load all styles before the corresponding paragraphs try to use them! #if 0 //1.6: if (m_frameStyleColl->loadOasisStyles(context) == 0) { // no styles loaded -> load default styles loadDefaultFrameStyleTemplates(); } if (m_tableStyleColl->loadOasisStyles(context, *m_styleColl, *m_frameStyleColl) == 0) { // no styles loaded -> load default styles loadDefaultTableStyleTemplates(); } static_cast<KWVariableSettings *>(m_varColl->variableSetting())->loadNoteConfiguration(styles.officeStyle()); loadDefaultTableTemplates(); //#else /* // We always needs at least one valid default paragraph style KoParagraphStyle *defaultParagraphStyle = m_document->styleManager()->defaultParagraphStyle(); //const KoXmlElement* defaultParagraphStyle = context.stylesReader().defaultStyle("paragraph"); //if( ! defaultParagraphStyle ) { KoParagraphStyle *parastyle = new KoParagraphStyle(); parastyle->setName("Standard"); m_document->styleManager()->add(parastyle); context.styleStack().setTypeProperties( "paragraph" ); // load all style attributes from "style:paragraph-properties" parastyle->loadOasis(context.styleStack()); // load the KoParagraphStyle from the stylestack KoCharacterStyle *charstyle = parastyle->characterStyle(); context.styleStack().setTypeProperties( "text" ); // load all style attributes from "style:text-properties" charstyle->loadOasis(context.styleStack()); // load the KoCharacterStyle from the stylestack //} */ #endif // load text:page-sequence KoXmlElement pageSequence = KoXml::namedItemNS(body, KoXmlNS::text, "page-sequence"); if (! pageSequence.isNull()) { KWPageManager *pageManager = m_document->pageManager(); KoXmlElement page; forEachElement(page, pageSequence) { if (page.namespaceURI() == KoXmlNS::text && page.localName() == "page") { QString master = page.attributeNS(KoXmlNS::text, "master-page-name", QString()); pageManager->appendPage(pageManager->pageStyle(master)); } } }
KoFilter::ConversionStatus Odp2Kpr::convert( const QByteArray& from, const QByteArray& to ) { if ( to != "application/x-kpresenter" || from != "application/vnd.oasis.opendocument.presentation" ) return KoFilter::NotImplemented; KoStoreDevice* inpdev = m_chain->storageFile( "content.xml", KoStore::Read ); if ( !inpdev ) { kError(31000) << "Unable to open input stream"; return KoFilter::StorageCreationError; } // Parse presentation content.xml QXmlInputSource source( inpdev ); QXmlSimpleReader reader; KoOdfReadStore::setupXmlReader( reader, true /*namespaceProcessing*/ ); QString errorMsg; int errorLine, errorColumn; bool ok = doc.setContent( &source, &reader, &errorMsg, &errorLine, &errorColumn ); if ( !ok ) { kError(31000) << "Parsing error! Aborting!" << endl << " In line: " << errorLine << ", column: " << errorColumn << endl << " Error message: " << errorMsg; return KoFilter::ParsingError; } QDomElement docElem = doc.documentElement(); QDomElement realBody( KoDom::namedItemNS( docElem, KoXmlNS::office, "body" ) ); if ( realBody.isNull() ) { kError(31000) << "No office:body found!"; //setErrorMessage( i18n( "Invalid OASIS OpenDocument file. No office:body tag found." ) ); return KoFilter::WrongFormat; } QDomElement body = KoDom::namedItemNS( realBody, KoXmlNS::office, "presentation" ); if ( body.isNull() ) { kError(32001) << "No office:text found!"; return KoFilter::WrongFormat; } //now we can transform it. //Parse meta.xml directly inpdev = m_chain->storageFile( "meta.xml", KoStore::Read ); KoXmlDocument metaDoc; QString errorMessage; KoDocumentInfo info; if ( KoOdfReadStore::loadAndParse( inpdev, metaDoc, errorMessage, "meta.xml" /*just for debug message*/ ) ) { info.loadOasis( metaDoc ); } // Write output file KoStoreDevice* out = m_chain->storageFile( "root", KoStore::Write ); if(!out) { kError(30502) << "Unable to open output file!"; return KoFilter::StorageCreationError; } QByteArray cstring = outdoc.toByteArray(); // utf-8 already out->write( cstring.data(), cstring.length() ); out->close(); //Write documentinfo.xml out = m_chain->storageFile( "documentinfo.xml", KoStore::Write ); if(!out) { kError(30502) << "Unable to open output file!"; return KoFilter::StorageCreationError; } QDomDocument doc = info.save(); QByteArray s = doc.toByteArray(); // this is already Utf8! out->write( cstring.data(), cstring.length() ); out->close(); return KoFilter::OK; }