QList<Task*> DefaultConvertFileTask::onSubTaskFinished(Task *subTask) { QList<Task*> result; CHECK(!subTask->hasError() && !subTask->isCanceled(), result); CHECK(!hasError() && !isCanceled(), result); if (saveTask == subTask) { return result; } SAFE_POINT_EXT(loadTask == subTask, setError("Unknown subtask"), result); bool mainThread = false; Document *srcDoc = loadTask->getDocument(mainThread); SAFE_POINT_EXT(NULL != srcDoc, setError("NULL document"), result); DocumentFormatRegistry *dfr = AppContext::getDocumentFormatRegistry(); DocumentFormat *df = dfr->getFormatById(targetFormat); SAFE_POINT_EXT(NULL != df, setError("NULL document format"), result); QSet<GObjectType> selectedFormatObjectsTypes = df->getSupportedObjectTypes(); QSet<GObjectType> inputFormatObjectTypes; QListIterator<GObject*> objectsIterator(srcDoc->getObjects()); while (objectsIterator.hasNext()) { GObject *obj = objectsIterator.next(); inputFormatObjectTypes << obj->getGObjectType(); } inputFormatObjectTypes.intersect(selectedFormatObjectsTypes); if (inputFormatObjectTypes.empty()) { setError(tr("The formats are not compatible: %1 and %2").arg(srcDoc->getDocumentFormatId()).arg(targetFormat)); return result; } QString ext = targetFormat; if (!df->getSupportedDocumentFileExtensions().isEmpty()) { ext = df->getSupportedDocumentFileExtensions().first(); } if (targetUrl.isEmpty()) { QString fileName = srcDoc->getName() + "." + ext; targetUrl = GUrlUtils::rollFileName(workingDir + fileName, QSet<QString>()); } else { if (QFileInfo(targetFormat).suffix() != ext) { targetUrl += "." + ext; } targetUrl = GUrlUtils::rollFileName(targetUrl, QSet<QString>()); } IOAdapterFactory *iof = AppContext::getIOAdapterRegistry()->getIOAdapterFactoryById(IOAdapterUtils::url2io(srcDoc->getURL())); Document *dstDoc = srcDoc->getSimpleCopy(df, iof, srcDoc->getURL()); saveTask = new SaveDocumentTask(dstDoc, iof, targetUrl); result << saveTask; return result; }
QVariant FileExtensionRelation::getAffectResult(const QVariant &influencingValue, const QVariant &dependentValue, DelegateTags * /*infTags*/, DelegateTags *depTags) const { QString newFormatId = influencingValue.toString(); DocumentFormat *newFormat = AppContext::getDocumentFormatRegistry()->getFormatById(newFormatId); updateDelegateTags(influencingValue, depTags); QString urlStr = dependentValue.toString(); if (urlStr.isEmpty()) { return ""; } QString extension; if (NULL == newFormat) { extension = newFormatId; } else { extension = newFormat->getSupportedDocumentFileExtensions().first(); } QString lastSuffix = GUrl(urlStr).lastFileSuffix(); bool withGz = false; if ("gz" == lastSuffix) { int dotPos = urlStr.length() - lastSuffix.length() - 1; if ((dotPos >= 0) && (QChar('.') == urlStr[dotPos])) { withGz = true; urlStr = urlStr.left(dotPos); lastSuffix = GUrl(urlStr).lastFileSuffix(); } } DocumentFormat *currentFormat = AppContext::getDocumentFormatRegistry()->selectFormatByFileExtension(lastSuffix); QString currentFormatId(""); if(currentFormat){ currentFormatId = currentFormat->getFormatId(); } bool foundExt = false; if (0 == QString::compare(lastSuffix, "csv", Qt::CaseInsensitive)) { foundExt = true; }else if (NULL == currentFormat) { foundExt = (lastSuffix == currentFormatId); } else { QStringList extensions(currentFormat->getSupportedDocumentFileExtensions()); if (NULL == newFormat) { extensions << newFormatId; } else { extensions << newFormat->getSupportedDocumentFileExtensions(); } foreach (QString supExt, extensions) { if (lastSuffix == supExt) { foundExt = true; break; } } } if (foundExt) { int dotPos = urlStr.length() - lastSuffix.length() - 1; if ((dotPos >= 0) && (QChar('.') == urlStr[dotPos])) { //yes, lastSuffix is a correct extension with . urlStr = urlStr.left(dotPos); } } urlStr += "." + extension; if (withGz) { urlStr += ".gz"; } return urlStr; }