QString PrivateStorage::saveData(const Jid &AStreamJid, const QDomElement &AElement) { if (FStanzaProcessor && isOpen(AStreamJid) && !AElement.tagName().isEmpty() && !AElement.namespaceURI().isEmpty()) { Stanza request(STANZA_KIND_IQ); request.setType(STANZA_TYPE_SET).setUniqueId(); QDomElement elem = request.addElement("query",NS_JABBER_PRIVATE); elem.appendChild(AElement.cloneNode(true)); if (FStanzaProcessor->sendStanzaRequest(this,AStreamJid,request,PRIVATE_STORAGE_TIMEOUT)) { LOG_STRM_INFO(AStreamJid,QString("Private data save request sent, ns=%1, id=%2").arg(AElement.namespaceURI(),request.id())); if (FPreClosedStreams.contains(AStreamJid)) notifyDataChanged(AStreamJid,AElement.tagName(),AElement.namespaceURI()); FSaveRequests.insert(request.id(),insertElement(AStreamJid,AElement)); return request.id(); } else { LOG_STRM_WARNING(AStreamJid,QString("Failed to send private data save request, ns=%1").arg(AElement.namespaceURI())); } } else if (!isOpen(AStreamJid)) { REPORT_ERROR("Failed to save private data: Storage is not opened"); } else if (AElement.tagName().isEmpty() || AElement.namespaceURI().isEmpty()) { REPORT_ERROR("Failed to save private data: Invalid data"); } return QString::null; }
void QgsMapStylingWidget::apply() { if ( mStackedWidget->currentIndex() == mVectorPage ) { QString undoName = "Style Change"; int currentPage = mMapStyleTabs->currentIndex(); if ( currentPage == mLabelTabIndex ) { mLabelingWidget->apply(); emit styleChanged( mCurrentLayer ); undoName = "Label Change"; } else if ( currentPage == mStyleTabIndex ) { mVectorStyleWidget->apply(); QgsProject::instance()->setDirty( true ); mMapCanvas->clearCache(); mMapCanvas->refresh(); emit styleChanged( mCurrentLayer ); QgsVectorLayer* layer = qobject_cast<QgsVectorLayer*>( mCurrentLayer ); QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( layer->rendererV2()->type() ); undoName = QString( "Style Change - %1" ).arg( m->visibleName() ); } QString errorMsg; QDomDocument doc( "style" ); QDomElement rootNode = doc.createElement( "qgis" ); doc.appendChild( rootNode ); mCurrentLayer->writeStyle( rootNode, doc, errorMsg ); mCurrentLayer->undoStackStyles()->beginMacro( undoName ); mCurrentLayer->undoStackStyles()->push( new QgsMapLayerStyleCommand( mCurrentLayer, rootNode, mLastStyleXml ) ); mCurrentLayer->undoStackStyles()->endMacro(); // Override the last style on the stack mLastStyleXml = rootNode.cloneNode(); } }
void KeyframeEdit::addParameter(const QDomElement &e, int activeKeyframe) { keyframe_list->blockSignals(true); m_params.append(e.cloneNode().toElement()); QDomElement na = e.firstChildElement(QStringLiteral("name")); QString paramName = i18n(na.text().toUtf8().data()); QDomElement commentElem = e.firstChildElement(QStringLiteral("comment")); QString comment; if (!commentElem.isNull()) comment = i18n(commentElem.text().toUtf8().data()); int columnId = keyframe_list->columnCount(); keyframe_list->insertColumn(columnId); keyframe_list->setHorizontalHeaderItem(columnId, new QTableWidgetItem(paramName)); DoubleParameterWidget *doubleparam = new DoubleParameterWidget(paramName, 0, m_params.at(columnId).attribute(QStringLiteral("min")).toDouble(), m_params.at(columnId).attribute(QStringLiteral("max")).toDouble(), m_params.at(columnId).attribute(QStringLiteral("default")).toDouble(), comment, columnId, m_params.at(columnId).attribute(QStringLiteral("suffix")), m_params.at(columnId).attribute(QStringLiteral("decimals")).toInt(), this); connect(doubleparam, SIGNAL(valueChanged(double)), this, SLOT(slotAdjustKeyframeValue(double))); connect(this, SIGNAL(showComments(bool)), doubleparam, SLOT(slotShowComment(bool))); connect(doubleparam, SIGNAL(setInTimeline(int)), this, SLOT(slotUpdateVisibleParameter(int))); m_slidersLayout->addWidget(doubleparam, columnId, 0); if (e.attribute(QStringLiteral("intimeline")) == QLatin1String("1")) { doubleparam->setInTimelineProperty(true); } QStringList frames = e.attribute(QStringLiteral("keyframes")).split(';', QString::SkipEmptyParts); for (int i = 0; i < frames.count(); ++i) { int frame = frames.at(i).section('=', 0, 0).toInt(); bool found = false; int j; for (j = 0; j < keyframe_list->rowCount(); ++j) { int currentPos = getPos(j); if (frame == currentPos) { keyframe_list->setItem(j, columnId, new QTableWidgetItem(frames.at(i).section('=', 1, 1))); found = true; break; } else if (currentPos > frame) { break; } } if (!found) { keyframe_list->insertRow(j); keyframe_list->setVerticalHeaderItem(j, new QTableWidgetItem(getPosString(frame))); keyframe_list->setItem(j, columnId, new QTableWidgetItem(frames.at(i).section('=', 1, 1))); keyframe_list->resizeRowToContents(j); } if ((activeKeyframe > -1) && (activeKeyframe == frame)) { keyframe_list->setCurrentCell(i, columnId); keyframe_list->selectRow(i); } } keyframe_list->resizeColumnsToContents(); keyframe_list->blockSignals(false); keyframe_list->horizontalHeader()->setFont(QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont)); keyframe_list->verticalHeader()->setFont(QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont)); slotAdjustKeyframeInfo(false); button_delete->setEnabled(keyframe_list->rowCount() > 1); }
// createRootXmlTags // // This function creates three QStrings, one being an <?xml .. ?> processing // instruction, and the others being the opening and closing tags of an // element, <foo> and </foo>. This basically allows us to get the raw XML // text needed to open/close an XML stream, without resorting to generating // the XML ourselves. This function uses QDom to do the generation, which // ensures proper encoding and entity output. static void createRootXmlTags(const QDomElement &root, QString *xmlHeader, QString *tagOpen, QString *tagClose) { QDomElement e = root.cloneNode(false).toElement(); // insert a dummy element to ensure open and closing tags are generated QDomElement dummy = e.ownerDocument().createElement("dummy"); e.appendChild(dummy); // convert to xml->text QString str; { QTextStream ts(&str, QIODevice::WriteOnly); e.save(ts, 0); } // parse the tags out int n = str.indexOf('<'); int n2 = str.indexOf('>', n); ++n2; *tagOpen = str.mid(n, n2-n); n2 = str.lastIndexOf('>'); n = str.lastIndexOf('<'); ++n2; *tagClose = str.mid(n, n2-n); // generate a nice xml processing header *xmlHeader = "<?xml version=\"1.0\"?>"; }
void QgsLayerStylingWidget::pushUndoItem( const QString &name ) { QString errorMsg; QDomDocument doc( QStringLiteral( "style" ) ); QDomElement rootNode = doc.createElement( QStringLiteral( "qgis" ) ); doc.appendChild( rootNode ); mCurrentLayer->writeStyle( rootNode, doc, errorMsg, QgsReadWriteContext() ); mCurrentLayer->undoStackStyles()->push( new QgsMapLayerStyleCommand( mCurrentLayer, name, rootNode, mLastStyleXml ) ); // Override the last style on the stack mLastStyleXml = rootNode.cloneNode(); }
QDomElement KWDWriter::setLayout(QDomElement paragraph, QDomElement layout) { QDomElement theLayout; if (layout.isNull()) theLayout=_doc->createElement("LAYOUT"); else theLayout=layout.cloneNode().toElement(); QDomElement oldLayout=currentLayout(paragraph); paragraph.removeChild(oldLayout); paragraph.appendChild(theLayout); return theLayout; }
bool plotsDialog::saveChanges() { #ifdef Q_OS_WIN32 QFile ofile(globalpara.caseName),file("plotTemp.xml"); #endif #ifdef Q_OS_MAC QDir dir = qApp->applicationDirPath(); /*dir.cdUp();*/ /*dir.cdUp();*/ /*dir.cdUp();*/ QString bundleDir(dir.absolutePath()); QFile ofile(globalpara.caseName),file(bundleDir+"/plotTemp.xml"); #endif QDomDocument odoc,doc; QDomElement oroot; QTextStream stream; stream.setDevice(&ofile); if(!ofile.open(QIODevice::ReadWrite|QIODevice::Text)) { globalpara.reportError("Fail to open case file to update plot data.",this); return false; } else if(!odoc.setContent(&ofile)) { globalpara.reportError("Fail to load xml document from case file to update plot data.",this); return false; } if(!file.open(QIODevice::ReadOnly|QIODevice::Text)) { globalpara.reportError("Fail to open plot temp file to update plot data.",this); return false; } else if(!doc.setContent(&file)) { globalpara.reportError("Fail to load xml document from plot temp file to update plot data..",this); return false; } else { QDomElement plotData = doc.elementsByTagName("plotData").at(0).toElement(); QDomNode copiedPlot = plotData.cloneNode(true); oroot = odoc.elementsByTagName("root").at(0).toElement(); oroot.replaceChild(copiedPlot,odoc.elementsByTagName("plotData").at(0)); ofile.resize(0); odoc.save(stream,4); file.close(); ofile.close(); stream.flush(); return true; } }
QWebdavUrlInfo::QWebdavUrlInfo(const QDomElement & dom) { QDomElement href = dom.namedItem( "href" ).toElement(); node_ = dom.cloneNode(); if ( !href.isNull() ) { QString urlStr = QUrl::fromPercentEncoding(href.text().toUtf8()); QDomNodeList propstats = dom.elementsByTagName( "propstat" ); davParsePropstats( urlStr, propstats ); } }
bool parseFeature(QDomElement& e, Layer* aLayer) { bool ret= false; QDomElement c = e.cloneNode().toElement(); while(!c.isNull()) { if (c.tagName() == "Placemark") ret = parsePlacemark(c, aLayer); else ret = parseContainer(c, aLayer); c = c.nextSiblingElement(); } return ret; }
EditTransitionCommand::EditTransitionCommand(CustomTrackView *view, const int track, GenTime pos, QDomElement oldeffect, QDomElement effect, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_track(track), m_oldeffect(oldeffect), m_pos(pos), m_doIt(doIt) { m_effect = effect.cloneNode().toElement(); QString effectName; QDomElement namenode = effect.firstChildElement("name"); if (!namenode.isNull()) effectName = i18n(namenode.text().toUtf8().data()); else effectName = i18n("effect"); setText(i18n("Edit transition %1", effectName)); }
bool SxeSession::processSxe(const QDomElement &sxe, const QString &id) { // Don't accept duplicates if(!id.isEmpty() && usedSxeIds_.contains(id)) { qDebug() << QString("Tried to process a duplicate %1 (received: %2).").arg(sxe.attribute("id")).arg(usedSxeIds_.size()).toLatin1(); return false; } if(!id.isEmpty()) usedSxeIds_ += id; // store incoming edits when queueing if(queueing_) { // Make sure the element is not already in the queue. foreach(IncomingEdit i, queuedIncomingEdits_) if(i.xml == sxe) return false; IncomingEdit incoming; incoming.id = id; incoming.xml = sxe.cloneNode(true).toElement(); queuedIncomingEdits_.append(incoming); return false; } // create an SxeEdit for each child of the <sxe/> QList<SxeEdit*> edits; for(QDomNode n = sxe.firstChild(); !n.isNull(); n = n.nextSibling()) { if(n.nodeName() == "new") edits.append(new SxeNewEdit(n.toElement())); else if(n.nodeName() == "set") edits.append(new SxeRecordEdit(n.toElement())); else if(n.nodeName() == "remove") edits.append(new SxeRemoveEdit(n.toElement())); } if (edits.size() == 0) return false; // process all the edits foreach(SxeEdit* e, edits) { SxeRecord* meta; if(e->type() == SxeEdit::New) meta = createRecord(e->rid()); else meta = record(e->rid()); if(meta) meta->apply(doc_, e); }
EditEffectCommand::EditEffectCommand(CustomTrackView *view, const int track, GenTime pos, QDomElement oldeffect, QDomElement effect, int stackPos, bool doIt) : QUndoCommand(), m_view(view), m_track(track), m_oldeffect(oldeffect), m_pos(pos), m_stackPos(stackPos), m_doIt(doIt) { m_effect = effect.cloneNode().toElement(); QString effectName; QDomNode namenode = effect.elementsByTagName("name").item(0); if (!namenode.isNull()) effectName = i18n(namenode.toElement().text().toUtf8().data()); else effectName = i18n("effect"); setText(i18n("Edit effect %1", effectName)); }
QDomElement KWDWriter::startFormat(QDomElement paragraph, QDomElement formatToClone) { QDomElement format=formatToClone.cloneNode().toElement(); if (format.isNull()) { kdWarning(30503) << "startFormat: null format cloned" << endl; } if (paragraph.isNull()) { kdWarning(30503) << "startFormat on empty paragraph" << endl; } format.removeAttribute("len"); format.removeAttribute("pos"); format.removeAttribute("id"); for (QDomElement a=format.firstChild().toElement();!a.isNull();a=a.nextSibling().toElement()) { if (a.tagName() == "ANCHOR") { format.removeChild(a); } } paragraph.elementsByTagName("FORMATS").item(0).appendChild(format); return format; }
//--------------------------------------------------------------------------------------------------------------------- DelTool::DelTool(VPattern *doc, quint32 id, QUndoCommand *parent) : QObject(), QUndoCommand(parent), xml(QDomElement()), parentNode(QDomNode()), doc(doc), toolId(id), cursor(doc->getCursor()) { setText(tr("Delete tool")); QDomElement domElement = doc->elementById(QString().setNum(id)); if (domElement.isElement()) { xml = domElement.cloneNode().toElement(); parentNode = domElement.parentNode(); } else { qDebug()<<"Can't get tool by id = "<<toolId<<Q_FUNC_INFO; return; } }
//--------------------------------------------------------------------------------------------------------------------- void VAbstractTool::SaveOption(QSharedPointer<VGObject> &obj) { QDomElement oldDomElement = doc->elementById(QString().setNum(id)); if (oldDomElement.isElement()) { QDomElement newDomElement = oldDomElement.cloneNode().toElement(); SaveOptions(newDomElement, obj); SaveToolOptions *saveOptions = new SaveToolOptions(oldDomElement, newDomElement, doc, id); connect(saveOptions, &SaveToolOptions::NeedLiteParsing, doc, &VPattern::LiteParseTree); qApp->getUndoStack()->push(saveOptions); } else { qDebug()<<"Can't find tool with id ="<< id << Q_FUNC_INFO; } }
void updateItemFromDocument( ProjectBaseItem *item, const QString &name ) { QDomElement child = findElementInDocument( item, name ); KUrl folder; if (item->folder()) folder = item->folder()->url(); if (item->file()) folder = item->file()->url(); QString relativeFileName = KUrl::relativePath( projectFile.directory(), folder.directory() ); relativeFileName.append(folder.fileName()); QDomElement newNode = child.cloneNode().toElement(); newNode.setAttribute("name",folder.fileName()); newNode.setAttribute("url",relativeFileName); child.parentNode().replaceChild( newNode, child ); }
// xmlToString // // This function converts a QDomElement into a QString, using stripExtraNS // to make it pretty. static QString xmlToString(const QDomElement &e, const QString &fakeNS, const QString &fakeQName, bool clip) { QDomElement i = e.cloneNode().toElement(); // It seems QDom can only have one namespace attribute at a time (see docElement 'HACK'). // Fortunately we only need one kind depending on the input, so it is specified here. QDomElement fake = e.ownerDocument().createElementNS(fakeNS, fakeQName); fake.appendChild(i); fake = stripExtraNS(fake); QString out; { QTextStream ts(&out, QIODevice::WriteOnly); fake.firstChild().save(ts, 0); } // 'clip' means to remove any unwanted (and unneeded) characters, such as a trailing newline if(clip) { int n = out.lastIndexOf('>'); out.truncate(n+1); } return out; }
QDomElement KWDWriter::addParagraph(QDomElement parent, QDomElement layoutToClone) { QDomElement paragraph=_doc->createElement("PARAGRAPH"); QDomElement formats=_doc->createElement("FORMATS"); QDomElement layout; if (layoutToClone.isNull()) { layout=_doc->createElement("LAYOUT"); } else { layout=layoutToClone.cloneNode().toElement(); } QDomElement text=_doc->createElement("TEXT"); QDomText t=_doc->createTextNode(QString("")); text.appendChild(t); paragraph.appendChild(formats); paragraph.appendChild(text); parent.appendChild(paragraph); paragraph.appendChild(layout); layoutAttribute(paragraph,"NAME","value","Standard"); return paragraph; }
void DomModel::addSite(const QModelIndex &index) { QString newUuid = QUuid::createUuid().toString(); // Clone current site or default site QString uuid; if (type(index) == Site || type(index) == Favorite) uuid = data(index, Qt::UserRole).toString(); else uuid = QUuid().toString(); QDomNodeList siteList = domDocument.elementsByTagName("site"); for (int i=0; i<siteList.count(); i++) { QDomElement site = siteList.item(i).toElement(); if (site.attribute("uuid") == uuid) { QDomElement newSite = site.cloneNode().toElement(); newSite.setAttribute("uuid", newUuid); QDomElement root = domDocument.documentElement(); root.appendChild(newSite); break; } } // Create site reference QDomElement newSiteRef = domDocument.createElement("addsite"); newSiteRef.setAttribute("uuid", newUuid); // New site reference is either child or sibyling QModelIndex parentIndex; int row; if (type(index) == Folder) { parentIndex = index; row = -1; } else { parentIndex = index.parent(); row = index.row(); } DomItem *item = new DomItem(newSiteRef); insertRow(row, parentIndex, item); }
QDomDocument QgsWCSServer::getCapabilities() { QgsDebugMsg( "Entering." ); QDomDocument doc; //wcs:WCS_Capabilities element QDomElement wcsCapabilitiesElement = doc.createElement( "WCS_Capabilities"/*wcs:WCS_Capabilities*/ ); wcsCapabilitiesElement.setAttribute( "xmlns", WCS_NAMESPACE ); wcsCapabilitiesElement.setAttribute( "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance" ); wcsCapabilitiesElement.setAttribute( "xsi:schemaLocation", WCS_NAMESPACE + " http://schemas.opengis.net/wcs/1.0.0/wcsCapabilities.xsd" ); wcsCapabilitiesElement.setAttribute( "xmlns:gml", GML_NAMESPACE ); wcsCapabilitiesElement.setAttribute( "xmlns:xlink", "http://www.w3.org/1999/xlink" ); wcsCapabilitiesElement.setAttribute( "version", "1.0.0" ); wcsCapabilitiesElement.setAttribute( "updateSequence", "0" ); doc.appendChild( wcsCapabilitiesElement ); if ( mConfigParser ) { mConfigParser->serviceCapabilities( wcsCapabilitiesElement, doc ); } //INSERT Service //wcs:Capability element QDomElement capabilityElement = doc.createElement( "Capability"/*wcs:Capability*/ ); wcsCapabilitiesElement.appendChild( capabilityElement ); //wcs:Request element QDomElement requestElement = doc.createElement( "Request"/*wcs:Request*/ ); capabilityElement.appendChild( requestElement ); //wcs:GetCapabilities QDomElement getCapabilitiesElement = doc.createElement( "GetCapabilities"/*wcs:GetCapabilities*/ ); requestElement.appendChild( getCapabilitiesElement ); QDomElement dcpTypeElement = doc.createElement( "DCPType"/*wcs:DCPType*/ ); getCapabilitiesElement.appendChild( dcpTypeElement ); QDomElement httpElement = doc.createElement( "HTTP"/*wcs:HTTP*/ ); dcpTypeElement.appendChild( httpElement ); //Prepare url QString hrefString = mConfigParser->wcsServiceUrl(); if ( hrefString.isEmpty() ) { hrefString = mConfigParser->serviceUrl(); } if ( hrefString.isEmpty() ) { hrefString = serviceUrl(); } QDomElement getElement = doc.createElement( "Get"/*wcs:Get*/ ); httpElement.appendChild( getElement ); QDomElement onlineResourceElement = doc.createElement( "OnlineResource"/*wcs:OnlineResource*/ ); onlineResourceElement.setAttribute( "xlink:type", "simple" ); onlineResourceElement.setAttribute( "xlink:href", hrefString ); getElement.appendChild( onlineResourceElement ); QDomElement getCapabilitiesDhcTypePostElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities' getCapabilitiesDhcTypePostElement.firstChild().firstChild().toElement().setTagName( "Post" ); getCapabilitiesElement.appendChild( getCapabilitiesDhcTypePostElement ); QDomElement describeCoverageElement = getCapabilitiesElement.cloneNode().toElement();//this is the same as 'GetCapabilities' describeCoverageElement.setTagName( "DescribeCoverage" ); requestElement.appendChild( describeCoverageElement ); QDomElement getCoverageElement = getCapabilitiesElement.cloneNode().toElement();//this is the same as 'GetCapabilities' getCoverageElement.setTagName( "GetCoverage" ); requestElement.appendChild( getCoverageElement ); /* * Adding layer list in ContentMetadata */ QDomElement contentMetadataElement = doc.createElement( "ContentMetadata"/*wcs:ContentMetadata*/ ); wcsCapabilitiesElement.appendChild( contentMetadataElement ); /* * Adding layer liste in contentMetadataElement */ if ( mConfigParser ) { mConfigParser->wcsContentMetadata( contentMetadataElement, doc ); } return doc; }
void MessageTreeWidget::importSms() { QString filename = QFileDialog::getOpenFileName(NULL, "Open File",".","Sms (*.xml)"); if(!filename.isEmpty()) { QFile file1(strMessagePathOpen); QFile file2(filename); QFile file3(strMessagePathOpen); if (!file1.open(QIODevice::ReadOnly)) return ; if (!file2.open(QIODevice::ReadOnly)) return ; QDomDocument doc1;//文档1 QDomDocument doc2;//文档2 if (!doc1.setContent(&file1)) { file1.close(); return; } if (!doc2.setContent(&file2)) { file2.close(); return ; } QDomElement docElem1 = doc1.documentElement(); QDomElement docElem2 = doc2.documentElement(); QDomNodeList list1 = doc1.elementsByTagName("SmsSum"); //以标签名进行查找 QDomElement firstElement; for(int i=0; i<list1.count(); i++) { QDomElement e = list1.at(i).toElement(); QString str= e.attribute("term"); if(str.compare("信息")==0) { firstElement = e; break; } } QDomNodeList list = doc2.elementsByTagName("Sms"); //以标签名进行查找 for(int j=0; j< list.count(); j++) { QDomElement e = list.at(j).toElement(); QDomElement tmp = e.cloneNode(true).toElement(); QString strContent = tmp.text(); bool key = keydetect(strContent); if(!key) firstElement.appendChild(tmp);//加入以后list 内已经删除了 } if(!file3.open(QIODevice::WriteOnly | QIODevice::Truncate)) return ; QTextStream out(&file3); doc1.save(out,4); //将文档保存到文件,4为子元素缩进字符数 file3.close(); emit updateTreeAllItem(); QMessageBox *message=new QMessageBox(QMessageBox::NoIcon, "导入短信", "导入成功"); message->show(); } }
QDomElement OOoReportBuilder::processDetail(const QDomElement &rowDetail) { QDomElement lastElement = rowDetail; if (rowDetail.isNull() || reportBand(rowDetail) != Detail) return QDomElement(); QString textCell = cellText(rowDetail.firstChild().toElement()); textCell.remove(QRegExp("\\{|\\}|detail")); int modelId = textCell.toInt() - 1; if (modelId < m_models.count() - 1) { rowDetail.parentNode().removeChild(rowDetail); return lastElement.previousSibling().toElement(); } QAbstractItemModel *model = m_models.at(modelId); for (int i = 0; i < model->rowCount(); i++) { QDomElement tmpRow = rowDetail.cloneNode(true).toElement(); QDomElement cell = tmpRow.firstChild().toElement(); cell = cell.nextSibling().toElement(); while (!cell.isNull()) { QString str = cellText(cell); if (!str.isEmpty()) { str.remove(QRegExp("\\{|\\}")); if (!QString::compare(str,"rowno",Qt::CaseInsensitive)) { setText(cell,QString::number(i)); } else if (str[0] == 'P') { QVariant var = processParams(str.mid(2)); if (var.type() == QVariant::Double) { setText(cell,var.toDouble()); } else { setText(cell,var.toString()); } } else { QRegExp rx("col\\d{1,2}"); if (rx.indexIn(str) == 0) { int colNo = str.remove(QRegExp("col")).toInt(); QVariant var = model->data(model->index(i,colNo)); if (colNo <= model->columnCount() - 1) { if (var.type() == QVariant::Double) { setText(cell, var.toDouble()); } else setText(cell, var.toString()); } else setText(cell,"Err"); } else setText(cell,str); } } if (cell.attributes().contains("table:formula")) { QString formula = processFormula(cell.attribute("table:formula"), i); cell.setAttribute("table:formula",formula); } cell = cell.nextSibling().toElement(); } lastElement = rowDetail.parentNode().insertBefore(tmpRow,rowDetail).toElement(); } rowDetail.parentNode().removeChild(rowDetail); return lastElement; }
QDomDocument QgsWFSServer::getCapabilities() { QgsDebugMsg( "Entering." ); QDomDocument doc; //wfs:WFS_Capabilities element QDomElement wfsCapabilitiesElement = doc.createElement( "WFS_Capabilities"/*wms:WFS_Capabilities*/ ); wfsCapabilitiesElement.setAttribute( "xmlns", "http://www.opengis.net/wfs" ); wfsCapabilitiesElement.setAttribute( "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance" ); wfsCapabilitiesElement.setAttribute( "xsi:schemaLocation", "http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/wfs.xsd" ); wfsCapabilitiesElement.setAttribute( "xmlns:ogc", "http://www.opengis.net/ogc" ); wfsCapabilitiesElement.setAttribute( "xmlns:gml", "http://www.opengis.net/gml" ); wfsCapabilitiesElement.setAttribute( "xmlns:ows", "http://www.opengis.net/ows" ); wfsCapabilitiesElement.setAttribute( "xmlns:xlink", "http://www.w3.org/1999/xlink" ); wfsCapabilitiesElement.setAttribute( "version", "1.0.0" ); wfsCapabilitiesElement.setAttribute( "updateSequence", "0" ); doc.appendChild( wfsCapabilitiesElement ); if ( mConfigParser ) { mConfigParser->serviceCapabilities( wfsCapabilitiesElement, doc ); } //wfs:Capability element QDomElement capabilityElement = doc.createElement( "Capability"/*wfs:Capability*/ ); wfsCapabilitiesElement.appendChild( capabilityElement ); //wfs:Request element QDomElement requestElement = doc.createElement( "Request"/*wfs:Request*/ ); capabilityElement.appendChild( requestElement ); //wfs:GetCapabilities QDomElement getCapabilitiesElement = doc.createElement( "GetCapabilities"/*wfs:GetCapabilities*/ ); requestElement.appendChild( getCapabilitiesElement ); QDomElement capabilitiesFormatElement = doc.createElement( "Format" );/*wfs:Format*/ getCapabilitiesElement.appendChild( capabilitiesFormatElement ); QDomText capabilitiesFormatText = doc.createTextNode( "text/xml" ); capabilitiesFormatElement.appendChild( capabilitiesFormatText ); QDomElement dcpTypeElement = doc.createElement( "DCPType"/*wfs:DCPType*/ ); getCapabilitiesElement.appendChild( dcpTypeElement ); QDomElement httpElement = doc.createElement( "HTTP"/*wfs:HTTP*/ ); dcpTypeElement.appendChild( httpElement ); //Prepare url //Some client requests already have http://<SERVER_NAME> in the REQUEST_URI variable QString hrefString; QString requestUrl = getenv( "REQUEST_URI" ); QUrl mapUrl( requestUrl ); mapUrl.setHost( QString( getenv( "SERVER_NAME" ) ) ); //Add non-default ports to url QString portString = getenv( "SERVER_PORT" ); if ( !portString.isEmpty() ) { bool portOk; int portNumber = portString.toInt( &portOk ); if ( portOk ) { if ( portNumber != 80 ) { mapUrl.setPort( portNumber ); } } } if ( QString( getenv( "HTTPS" ) ).compare( "on", Qt::CaseInsensitive ) == 0 ) { mapUrl.setScheme( "https" ); } else { mapUrl.setScheme( "http" ); } QList<QPair<QString, QString> > queryItems = mapUrl.queryItems(); QList<QPair<QString, QString> >::const_iterator queryIt = queryItems.constBegin(); for ( ; queryIt != queryItems.constEnd(); ++queryIt ) { if ( queryIt->first.compare( "REQUEST", Qt::CaseInsensitive ) == 0 ) { mapUrl.removeQueryItem( queryIt->first ); } else if ( queryIt->first.compare( "VERSION", Qt::CaseInsensitive ) == 0 ) { mapUrl.removeQueryItem( queryIt->first ); } else if ( queryIt->first.compare( "SERVICE", Qt::CaseInsensitive ) == 0 ) { mapUrl.removeQueryItem( queryIt->first ); } else if ( queryIt->first.compare( "_DC", Qt::CaseInsensitive ) == 0 ) { mapUrl.removeQueryItem( queryIt->first ); } } hrefString = mapUrl.toString(); //only Get supported for the moment QDomElement getElement = doc.createElement( "Get"/*wfs:Get*/ ); httpElement.appendChild( getElement ); QDomElement olResourceElement = doc.createElement( "OnlineResource"/*wfs:OnlineResource*/ ); olResourceElement.setAttribute( "xlink:type", "simple" ); requestUrl.truncate( requestUrl.indexOf( "?" ) + 1 ); olResourceElement.setAttribute( "xlink:href", hrefString ); getElement.appendChild( olResourceElement ); //wfs:DescribeFeatureType QDomElement describeFeatureTypeElement = doc.createElement( "DescribeFeatureType"/*wfs:DescribeFeatureType*/ ); requestElement.appendChild( describeFeatureTypeElement ); QDomElement schemaDescriptionLanguageElement = doc.createElement( "SchemaDescriptionLanguage"/*wfs:SchemaDescriptionLanguage*/ ); describeFeatureTypeElement.appendChild( schemaDescriptionLanguageElement ); QDomElement xmlSchemaElement = doc.createElement( "XMLSCHEMA"/*wfs:XMLSCHEMA*/ ); schemaDescriptionLanguageElement.appendChild( xmlSchemaElement ); QDomElement describeFeatureTypeDhcTypeElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities' describeFeatureTypeElement.appendChild( describeFeatureTypeDhcTypeElement ); //wfs:GetFeature QDomElement getFeatureElement = doc.createElement( "GetFeature"/*wfs:GetFeature*/ ); requestElement.appendChild( getFeatureElement ); QDomElement getFeatureFormatElement = doc.createElement( "ResultFormat" );/*wfs:ResultFormat*/ getFeatureElement.appendChild( getFeatureFormatElement ); QDomElement gmlFormatElement = doc.createElement( "GML2" );/*wfs:GML2*/ getFeatureFormatElement.appendChild( gmlFormatElement ); QDomElement geojsonFormatElement = doc.createElement( "GeoJSON" );/*wfs:GeoJSON*/ getFeatureFormatElement.appendChild( geojsonFormatElement ); QDomElement getFeatureDhcTypeElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities' getFeatureElement.appendChild( getFeatureDhcTypeElement ); //wfs:FeatureTypeList element QDomElement featureTypeListElement = doc.createElement( "FeatureTypeList"/*wfs:FeatureTypeList*/ ); wfsCapabilitiesElement.appendChild( featureTypeListElement ); //wfs:Operations element QDomElement operationsElement = doc.createElement( "Operations"/*wfs:Operations*/ ); featureTypeListElement.appendChild( operationsElement ); //wfs:Query element QDomElement queryElement = doc.createElement( "Query"/*wfs:Query*/ ); operationsElement.appendChild( queryElement ); /* * Adding layer liste in featureTypeListElement */ if ( mConfigParser ) { mConfigParser->featureTypeList( featureTypeListElement, doc ); } /* * Adding ogc:Filter_Capabilities in capabilityElement */ //ogc:Filter_Capabilities element QDomElement filterCapabilitiesElement = doc.createElement( "ogc:Filter_Capabilities"/*ogc:Filter_Capabilities*/ ); capabilityElement.appendChild( filterCapabilitiesElement ); QDomElement spatialCapabilitiesElement = doc.createElement( "ogc:Spatial_Capabilities"/*ogc:Spatial_Capabilities*/ ); filterCapabilitiesElement.appendChild( spatialCapabilitiesElement ); QDomElement spatialOperatorsElement = doc.createElement( "ogc:Spatial_Operators"/*ogc:Spatial_Operators*/ ); spatialCapabilitiesElement.appendChild( spatialOperatorsElement ); QDomElement ogcBboxElement = doc.createElement( "ogc:BBOX"/*ogc:BBOX*/ ); spatialOperatorsElement.appendChild( ogcBboxElement ); QDomElement scalarCapabilitiesElement = doc.createElement( "ogc:Scalar_Capabilities"/*ogc:Scalar_Capabilities*/ ); filterCapabilitiesElement.appendChild( scalarCapabilitiesElement ); QDomElement comparisonOperatorsElement = doc.createElement( "ogc:Comparison_Operators"/*ogc:Comparison_Operators*/ ); scalarCapabilitiesElement.appendChild( comparisonOperatorsElement ); QDomElement simpleComparisonsElement = doc.createElement( "ogc:Simple_Comparisons"/*ogc:Simple_Comparisons*/ ); comparisonOperatorsElement.appendChild( simpleComparisonsElement ); return doc; }
QDomDocument createGetCapabilitiesDocument( QgsServerInterface* serverIface, const QgsProject* project, const QString& version, const QgsServerRequest& request ) { Q_UNUSED( version ); QDomDocument doc; QgsWfsProjectParser* configParser = getConfigParser( serverIface ); //wfs:WFS_Capabilities element QDomElement wfsCapabilitiesElement = doc.createElement( QStringLiteral( "WFS_Capabilities" )/*wms:WFS_Capabilities*/ ); wfsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns" ), WFS_NAMESPACE ); wfsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:xsi" ), QStringLiteral( "http://www.w3.org/2001/XMLSchema-instance" ) ); wfsCapabilitiesElement.setAttribute( QStringLiteral( "xsi:schemaLocation" ), WFS_NAMESPACE + " http://schemas.opengis.net/wfs/1.0.0/WFS-capabilities.xsd" ); wfsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:ogc" ), OGC_NAMESPACE ); wfsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:gml" ), GML_NAMESPACE ); wfsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:ows" ), QStringLiteral( "http://www.opengis.net/ows" ) ); wfsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:xlink" ), QStringLiteral( "http://www.w3.org/1999/xlink" ) ); wfsCapabilitiesElement.setAttribute( QStringLiteral( "version" ), implementationVersion() ); wfsCapabilitiesElement.setAttribute( QStringLiteral( "updateSequence" ), QStringLiteral( "0" ) ); doc.appendChild( wfsCapabilitiesElement ); configParser->serviceCapabilities( wfsCapabilitiesElement, doc ); //wfs:Capability element QDomElement capabilityElement = doc.createElement( QStringLiteral( "Capability" )/*wfs:Capability*/ ); wfsCapabilitiesElement.appendChild( capabilityElement ); //wfs:Request element QDomElement requestElement = doc.createElement( QStringLiteral( "Request" )/*wfs:Request*/ ); capabilityElement.appendChild( requestElement ); //wfs:GetCapabilities QDomElement getCapabilitiesElement = doc.createElement( QStringLiteral( "GetCapabilities" )/*wfs:GetCapabilities*/ ); requestElement.appendChild( getCapabilitiesElement ); QDomElement dcpTypeElement = doc.createElement( QStringLiteral( "DCPType" )/*wfs:DCPType*/ ); getCapabilitiesElement.appendChild( dcpTypeElement ); QDomElement httpElement = doc.createElement( QStringLiteral( "HTTP" )/*wfs:HTTP*/ ); dcpTypeElement.appendChild( httpElement ); //Prepare url QString hrefString = serviceUrl( request, project ); //only Get supported for the moment QDomElement getElement = doc.createElement( QStringLiteral( "Get" )/*wfs:Get*/ ); httpElement.appendChild( getElement ); getElement.setAttribute( QStringLiteral( "onlineResource" ), hrefString ); QDomElement getCapabilitiesDhcTypePostElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities' getCapabilitiesDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral( "Post" ) ); getCapabilitiesElement.appendChild( getCapabilitiesDhcTypePostElement ); //wfs:DescribeFeatureType QDomElement describeFeatureTypeElement = doc.createElement( QStringLiteral( "DescribeFeatureType" )/*wfs:DescribeFeatureType*/ ); requestElement.appendChild( describeFeatureTypeElement ); QDomElement schemaDescriptionLanguageElement = doc.createElement( QStringLiteral( "SchemaDescriptionLanguage" )/*wfs:SchemaDescriptionLanguage*/ ); describeFeatureTypeElement.appendChild( schemaDescriptionLanguageElement ); QDomElement xmlSchemaElement = doc.createElement( QStringLiteral( "XMLSCHEMA" )/*wfs:XMLSCHEMA*/ ); schemaDescriptionLanguageElement.appendChild( xmlSchemaElement ); QDomElement describeFeatureTypeDhcTypeElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities' describeFeatureTypeElement.appendChild( describeFeatureTypeDhcTypeElement ); QDomElement describeFeatureTypeDhcTypePostElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities' describeFeatureTypeDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral( "Post" ) ); describeFeatureTypeElement.appendChild( describeFeatureTypeDhcTypePostElement ); //wfs:GetFeature QDomElement getFeatureElement = doc.createElement( QStringLiteral( "GetFeature" )/*wfs:GetFeature*/ ); requestElement.appendChild( getFeatureElement ); QDomElement getFeatureFormatElement = doc.createElement( QStringLiteral( "ResultFormat" ) );/*wfs:ResultFormat*/ getFeatureElement.appendChild( getFeatureFormatElement ); QDomElement gmlFormatElement = doc.createElement( QStringLiteral( "GML2" ) );/*wfs:GML2*/ getFeatureFormatElement.appendChild( gmlFormatElement ); QDomElement gml3FormatElement = doc.createElement( QStringLiteral( "GML3" ) );/*wfs:GML3*/ getFeatureFormatElement.appendChild( gml3FormatElement ); QDomElement geojsonFormatElement = doc.createElement( QStringLiteral( "GeoJSON" ) );/*wfs:GeoJSON*/ getFeatureFormatElement.appendChild( geojsonFormatElement ); QDomElement getFeatureDhcTypeGetElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities' getFeatureElement.appendChild( getFeatureDhcTypeGetElement ); QDomElement getFeatureDhcTypePostElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities' getFeatureDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral( "Post" ) ); getFeatureElement.appendChild( getFeatureDhcTypePostElement ); //wfs:Transaction QDomElement transactionElement = doc.createElement( QStringLiteral( "Transaction" )/*wfs:Transaction*/ ); requestElement.appendChild( transactionElement ); QDomElement transactionDhcTypeElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities' transactionDhcTypeElement.firstChild().firstChild().toElement().setTagName( QStringLiteral( "Post" ) ); transactionElement.appendChild( transactionDhcTypeElement ); //wfs:FeatureTypeList element QDomElement featureTypeListElement = doc.createElement( QStringLiteral( "FeatureTypeList" )/*wfs:FeatureTypeList*/ ); wfsCapabilitiesElement.appendChild( featureTypeListElement ); //wfs:Operations element QDomElement operationsElement = doc.createElement( QStringLiteral( "Operations" )/*wfs:Operations*/ ); featureTypeListElement.appendChild( operationsElement ); //wfs:Query element QDomElement queryElement = doc.createElement( QStringLiteral( "Query" )/*wfs:Query*/ ); operationsElement.appendChild( queryElement ); /* * Adding layer liste in featureTypeListElement */ configParser->featureTypeList( featureTypeListElement, doc ); /* * Adding ogc:Filter_Capabilities in capabilityElement */ //ogc:Filter_Capabilities element QDomElement filterCapabilitiesElement = doc.createElement( QStringLiteral( "ogc:Filter_Capabilities" )/*ogc:Filter_Capabilities*/ ); wfsCapabilitiesElement.appendChild( filterCapabilitiesElement ); QDomElement spatialCapabilitiesElement = doc.createElement( QStringLiteral( "ogc:Spatial_Capabilities" )/*ogc:Spatial_Capabilities*/ ); filterCapabilitiesElement.appendChild( spatialCapabilitiesElement ); QDomElement spatialOperatorsElement = doc.createElement( QStringLiteral( "ogc:Spatial_Operators" )/*ogc:Spatial_Operators*/ ); spatialCapabilitiesElement.appendChild( spatialOperatorsElement ); spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:BBOX" )/*ogc:BBOX*/ ) ); spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Disjoint" )/*ogc:Disjoint*/ ) ); spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Intersect" )/*ogc:Intersects*/ ) ); spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Touches" )/*ogc:Touches*/ ) ); spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Crosses" )/*ogc:Crosses*/ ) ); spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Contains" )/*ogc:Contains*/ ) ); spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Overlaps" )/*ogc:Overlaps*/ ) ); spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Within" )/*ogc:Within*/ ) ); QDomElement scalarCapabilitiesElement = doc.createElement( QStringLiteral( "ogc:Scalar_Capabilities" )/*ogc:Scalar_Capabilities*/ ); filterCapabilitiesElement.appendChild( scalarCapabilitiesElement ); QDomElement comparisonOperatorsElement = doc.createElement( QStringLiteral( "ogc:Comparison_Operators" )/*ogc:Comparison_Operators*/ ); scalarCapabilitiesElement.appendChild( comparisonOperatorsElement ); comparisonOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Simple_Comparisons" )/*ogc:Simple_Comparisons*/ ) ); comparisonOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Between" )/*ogc:Between*/ ) ); comparisonOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Like" )/*ogc:Like*/ ) ); return doc; }
QDomElement getCapabilityElement( QDomDocument &doc, const QgsProject *project, const QgsServerRequest &request ) { //wfs:Capability element QDomElement capabilityElement = doc.createElement( QStringLiteral( "Capability" )/*wfs:Capability*/ ); //wfs:Request element QDomElement requestElement = doc.createElement( QStringLiteral( "Request" )/*wfs:Request*/ ); capabilityElement.appendChild( requestElement ); //wfs:GetCapabilities QDomElement getCapabilitiesElement = doc.createElement( QStringLiteral( "GetCapabilities" )/*wfs:GetCapabilities*/ ); requestElement.appendChild( getCapabilitiesElement ); QDomElement dcpTypeElement = doc.createElement( QStringLiteral( "DCPType" )/*wfs:DCPType*/ ); getCapabilitiesElement.appendChild( dcpTypeElement ); QDomElement httpElement = doc.createElement( QStringLiteral( "HTTP" )/*wfs:HTTP*/ ); dcpTypeElement.appendChild( httpElement ); //Prepare url QString hrefString = serviceUrl( request, project ); //only Get supported for the moment QDomElement getElement = doc.createElement( QStringLiteral( "Get" )/*wfs:Get*/ ); httpElement.appendChild( getElement ); getElement.setAttribute( QStringLiteral( "onlineResource" ), hrefString ); QDomElement getCapabilitiesDhcTypePostElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities' getCapabilitiesDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral( "Post" ) ); getCapabilitiesElement.appendChild( getCapabilitiesDhcTypePostElement ); //wfs:DescribeFeatureType QDomElement describeFeatureTypeElement = doc.createElement( QStringLiteral( "DescribeFeatureType" )/*wfs:DescribeFeatureType*/ ); requestElement.appendChild( describeFeatureTypeElement ); QDomElement schemaDescriptionLanguageElement = doc.createElement( QStringLiteral( "SchemaDescriptionLanguage" )/*wfs:SchemaDescriptionLanguage*/ ); describeFeatureTypeElement.appendChild( schemaDescriptionLanguageElement ); QDomElement xmlSchemaElement = doc.createElement( QStringLiteral( "XMLSCHEMA" )/*wfs:XMLSCHEMA*/ ); schemaDescriptionLanguageElement.appendChild( xmlSchemaElement ); QDomElement describeFeatureTypeDhcTypeElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities' describeFeatureTypeElement.appendChild( describeFeatureTypeDhcTypeElement ); QDomElement describeFeatureTypeDhcTypePostElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities' describeFeatureTypeDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral( "Post" ) ); describeFeatureTypeElement.appendChild( describeFeatureTypeDhcTypePostElement ); //wfs:GetFeature QDomElement getFeatureElement = doc.createElement( QStringLiteral( "GetFeature" )/*wfs:GetFeature*/ ); requestElement.appendChild( getFeatureElement ); QDomElement getFeatureFormatElement = doc.createElement( QStringLiteral( "ResultFormat" ) );/*wfs:ResultFormat*/ getFeatureElement.appendChild( getFeatureFormatElement ); QDomElement gmlFormatElement = doc.createElement( QStringLiteral( "GML2" ) );/*wfs:GML2*/ getFeatureFormatElement.appendChild( gmlFormatElement ); QDomElement gml3FormatElement = doc.createElement( QStringLiteral( "GML3" ) );/*wfs:GML3*/ getFeatureFormatElement.appendChild( gml3FormatElement ); QDomElement geojsonFormatElement = doc.createElement( QStringLiteral( "GeoJSON" ) );/*wfs:GeoJSON*/ getFeatureFormatElement.appendChild( geojsonFormatElement ); QDomElement getFeatureDhcTypeGetElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities' getFeatureElement.appendChild( getFeatureDhcTypeGetElement ); QDomElement getFeatureDhcTypePostElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities' getFeatureDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral( "Post" ) ); getFeatureElement.appendChild( getFeatureDhcTypePostElement ); //wfs:Transaction QDomElement transactionElement = doc.createElement( QStringLiteral( "Transaction" )/*wfs:Transaction*/ ); requestElement.appendChild( transactionElement ); QDomElement transactionDhcTypeElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities' transactionDhcTypeElement.firstChild().firstChild().toElement().setTagName( QStringLiteral( "Post" ) ); transactionElement.appendChild( transactionDhcTypeElement ); return capabilityElement; }
QDomDocument createGetCapabilitiesDocument( QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request ) { Q_UNUSED( version ); QDomDocument doc; //wcs:WCS_Capabilities element QDomElement wcsCapabilitiesElement = doc.createElement( QStringLiteral( "WCS_Capabilities" )/*wcs:WCS_Capabilities*/ ); wcsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns" ), WCS_NAMESPACE ); wcsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:xsi" ), QStringLiteral( "http://www.w3.org/2001/XMLSchema-instance" ) ); wcsCapabilitiesElement.setAttribute( QStringLiteral( "xsi:schemaLocation" ), WCS_NAMESPACE + " http://schemas.opengis.net/wcs/1.0.0/wcsCapabilities.xsd" ); wcsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:gml" ), GML_NAMESPACE ); wcsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:xlink" ), QStringLiteral( "http://www.w3.org/1999/xlink" ) ); wcsCapabilitiesElement.setAttribute( QStringLiteral( "version" ), implementationVersion() ); wcsCapabilitiesElement.setAttribute( QStringLiteral( "updateSequence" ), QStringLiteral( "0" ) ); doc.appendChild( wcsCapabilitiesElement ); //INSERT Service wcsCapabilitiesElement.appendChild( getServiceElement( doc, project ) ); //wcs:Capability element QDomElement capabilityElement = doc.createElement( QStringLiteral( "Capability" )/*wcs:Capability*/ ); wcsCapabilitiesElement.appendChild( capabilityElement ); //wcs:Request element QDomElement requestElement = doc.createElement( QStringLiteral( "Request" )/*wcs:Request*/ ); capabilityElement.appendChild( requestElement ); //wcs:GetCapabilities QDomElement getCapabilitiesElement = doc.createElement( QStringLiteral( "GetCapabilities" )/*wcs:GetCapabilities*/ ); requestElement.appendChild( getCapabilitiesElement ); QDomElement dcpTypeElement = doc.createElement( QStringLiteral( "DCPType" )/*wcs:DCPType*/ ); getCapabilitiesElement.appendChild( dcpTypeElement ); QDomElement httpElement = doc.createElement( QStringLiteral( "HTTP" )/*wcs:HTTP*/ ); dcpTypeElement.appendChild( httpElement ); //Prepare url QString hrefString = serviceUrl( request, project ); QDomElement getElement = doc.createElement( QStringLiteral( "Get" )/*wcs:Get*/ ); httpElement.appendChild( getElement ); QDomElement onlineResourceElement = doc.createElement( QStringLiteral( "OnlineResource" )/*wcs:OnlineResource*/ ); onlineResourceElement.setAttribute( QStringLiteral( "xlink:type" ), QStringLiteral( "simple" ) ); onlineResourceElement.setAttribute( QStringLiteral( "xlink:href" ), hrefString ); getElement.appendChild( onlineResourceElement ); QDomElement getCapabilitiesDhcTypePostElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities' getCapabilitiesDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral( "Post" ) ); getCapabilitiesElement.appendChild( getCapabilitiesDhcTypePostElement ); QDomElement describeCoverageElement = getCapabilitiesElement.cloneNode().toElement();//this is the same as 'GetCapabilities' describeCoverageElement.setTagName( QStringLiteral( "DescribeCoverage" ) ); requestElement.appendChild( describeCoverageElement ); QDomElement getCoverageElement = getCapabilitiesElement.cloneNode().toElement();//this is the same as 'GetCapabilities' getCoverageElement.setTagName( QStringLiteral( "GetCoverage" ) ); requestElement.appendChild( getCoverageElement ); //INSERT ContentMetadata wcsCapabilitiesElement.appendChild( getContentMetadataElement( doc, serverIface, project ) ); return doc; }
QgsFeatureRequest parseFilterElement( const QString &typeName, QDomElement &filterElem, const QgsProject *project ) { QgsFeatureRequest request; QDomNodeList fidNodes = filterElem.elementsByTagName( QStringLiteral( "FeatureId" ) ); QDomNodeList goidNodes = filterElem.elementsByTagName( QStringLiteral( "GmlObjectId" ) ); if ( !fidNodes.isEmpty() ) { QgsFeatureIds fids; QDomElement fidElem; for ( int f = 0; f < fidNodes.size(); f++ ) { fidElem = fidNodes.at( f ).toElement(); if ( !fidElem.hasAttribute( QStringLiteral( "fid" ) ) ) { throw QgsRequestNotWellFormedException( "FeatureId element without fid attribute" ); } QString fid = fidElem.attribute( QStringLiteral( "fid" ) ); if ( fid.contains( QLatin1String( "." ) ) ) { if ( fid.section( QStringLiteral( "." ), 0, 0 ) != typeName ) continue; fid = fid.section( QStringLiteral( "." ), 1, 1 ); } fids.insert( fid.toInt() ); } if ( !fids.isEmpty() ) { request.setFilterFids( fids ); } else { throw QgsRequestNotWellFormedException( QStringLiteral( "No FeatureId element correctly parse against typeName '%1'" ).arg( typeName ) ); } request.setFlags( QgsFeatureRequest::NoFlags ); return request; } else if ( !goidNodes.isEmpty() ) { QgsFeatureIds fids; QDomElement goidElem; for ( int f = 0; f < goidNodes.size(); f++ ) { goidElem = goidNodes.at( f ).toElement(); if ( !goidElem.hasAttribute( QStringLiteral( "id" ) ) && !goidElem.hasAttribute( QStringLiteral( "gml:id" ) ) ) { throw QgsRequestNotWellFormedException( "GmlObjectId element without gml:id attribute" ); } QString fid = goidElem.attribute( QStringLiteral( "id" ) ); if ( fid.isEmpty() ) fid = goidElem.attribute( QStringLiteral( "gml:id" ) ); if ( fid.contains( QLatin1String( "." ) ) ) { if ( fid.section( QStringLiteral( "." ), 0, 0 ) != typeName ) continue; fid = fid.section( QStringLiteral( "." ), 1, 1 ); } fids.insert( fid.toInt() ); } if ( !fids.isEmpty() ) { request.setFilterFids( fids ); } else { throw QgsRequestNotWellFormedException( QStringLiteral( "No GmlObjectId element correctly parse against typeName '%1'" ).arg( typeName ) ); } request.setFlags( QgsFeatureRequest::NoFlags ); return request; } else if ( filterElem.firstChildElement().tagName() == QLatin1String( "BBOX" ) ) { QDomElement bboxElem = filterElem.firstChildElement(); QDomElement childElem = bboxElem.firstChildElement(); while ( !childElem.isNull() ) { if ( childElem.tagName() == QLatin1String( "Box" ) ) { request.setFilterRect( QgsOgcUtils::rectangleFromGMLBox( childElem ) ); } else if ( childElem.tagName() != QLatin1String( "PropertyName" ) ) { QgsGeometry geom = QgsOgcUtils::geometryFromGML( childElem ); request.setFilterRect( geom.boundingBox() ); } childElem = childElem.nextSiblingElement(); } request.setFlags( QgsFeatureRequest::ExactIntersect | QgsFeatureRequest::NoFlags ); return request; } // Apply BBOX through filterRect even inside an And to use spatial index else if ( filterElem.firstChildElement().tagName() == QLatin1String( "And" ) && !filterElem.firstChildElement().firstChildElement( QLatin1String( "BBOX" ) ).isNull() ) { QDomElement childElem = filterElem.firstChildElement().firstChildElement(); while ( !childElem.isNull() ) { QDomElement childFilterElement = filterElem.ownerDocument().createElement( QLatin1String( "Filter" ) ); childFilterElement.appendChild( childElem.cloneNode( true ) ); QgsFeatureRequest childRequest = parseFilterElement( typeName, childFilterElement ); if ( childElem.tagName() == QLatin1String( "BBOX" ) ) { if ( request.filterRect().isEmpty() ) { request.setFilterRect( childRequest.filterRect() ); } else { request.setFilterRect( request.filterRect().intersect( childRequest.filterRect() ) ); } } else { if ( !request.filterExpression() ) { request.setFilterExpression( childRequest.filterExpression()->expression() ); } else { QgsExpressionNode *opLeft = request.filterExpression()->rootNode()->clone(); QgsExpressionNode *opRight = childRequest.filterExpression()->rootNode()->clone(); std::unique_ptr<QgsExpressionNodeBinaryOperator> node = qgis::make_unique<QgsExpressionNodeBinaryOperator>( QgsExpressionNodeBinaryOperator::boAnd, opLeft, opRight ); QgsExpression expr( node->dump() ); request.setFilterExpression( expr ); } } childElem = childElem.nextSiblingElement(); } request.setFlags( QgsFeatureRequest::ExactIntersect | QgsFeatureRequest::NoFlags ); return request; } else { QgsVectorLayer *layer = nullptr; if ( project != nullptr ) { layer = layerByTypeName( project, typeName ); } std::shared_ptr<QgsExpression> filter( QgsOgcUtils::expressionFromOgcFilter( filterElem, layer ) ); if ( filter ) { if ( filter->hasParserError() ) { throw QgsRequestNotWellFormedException( filter->parserErrorString() ); } if ( filter->needsGeometry() ) { request.setFlags( QgsFeatureRequest::NoFlags ); } request.setFilterExpression( filter->expression() ); return request; } } return request; }
bool OMEMO::decryptMessage(int account, QDomElement &xml) { std::shared_ptr<Signal> signal = getSignal(account); bool isCarbon = false; QDomElement message = xml; if (message.firstChild().toElement().attribute("xmlns") == "urn:xmpp:carbons:2") { message = message.firstChild().firstChildElement("forwarded").firstChildElement("message"); isCarbon = true; } QDomElement encrypted = message.firstChildElement("encrypted"); if (encrypted.isNull() || encrypted.attribute("xmlns") != OMEMO_XMLNS) { return false; } QString messageId = message.attribute("id"); if (message.attribute("type") == "groupchat" && m_encryptedGroupMessages.contains(messageId)) { message.removeChild(encrypted); QDomElement body = message.ownerDocument().createElement("body"); body.appendChild(body.ownerDocument().createTextNode(m_encryptedGroupMessages.value(messageId))); m_encryptedGroupMessages.remove(messageId); message.appendChild(body); return true; } QDomElement header = encrypted.firstChildElement("header"); QDomElement keyElement = header.firstChildElement("key"); while (!keyElement.isNull() && keyElement.attribute("rid").toUInt() != signal->getDeviceId()) { keyElement = keyElement.nextSiblingElement("key"); } if (keyElement.isNull()) { xml = QDomElement(); return true; } QString preKeyAttr = keyElement.attribute("prekey"); bool isPreKey = preKeyAttr == "true" || preKeyAttr == "1"; uint32_t preKeyCount = isPreKey ? signal->preKeyCount() : 0; QByteArray encryptedKey = QByteArray::fromBase64(keyElement.firstChild().nodeValue().toUtf8()); uint deviceId = header.attribute("sid").toUInt(); QString from = message.attribute("from"); QString sender = m_contactInfoAccessor->realJid(account, from).split("/").first(); QPair<QByteArray, bool> decryptionResult = signal->decryptKey(sender, EncryptedKey(deviceId, isPreKey, encryptedKey)); QByteArray decryptedKey = decryptionResult.first; bool buildSessionWithPreKey = decryptionResult.second; if (buildSessionWithPreKey) { // remote has an invalid session, let's recover by overwriting it with a fresh one QDomElement emptyMessage = message.cloneNode(false).toElement(); QString to = message.attribute("to"); emptyMessage.setAttribute("from", to); emptyMessage.setAttribute("to", from); auto recipientInvalidSessions = QMap<QString, QVector<uint32_t>>({{to, QVector<uint32_t>({deviceId})}}); buildSessionsFromBundle(recipientInvalidSessions, QVector<uint32_t>(), to.split("/").first(), account, emptyMessage); xml = QDomElement(); return true; } QDomElement payloadElement = encrypted.firstChildElement("payload"); if (!decryptedKey.isNull()) { if (isPreKey && signal->preKeyCount() < preKeyCount) { publishOwnBundle(account); } if (!payloadElement.isNull()) { QByteArray payload(QByteArray::fromBase64(payloadElement.firstChild().nodeValue().toUtf8())); QByteArray iv(QByteArray::fromBase64(header.firstChildElement("iv").firstChild().nodeValue().toUtf8())); QByteArray tag(OMEMO_AES_GCM_TAG_LENGTH, Qt::Uninitialized); if (decryptedKey.size() > OMEMO_AES_128_KEY_LENGTH) { tag = decryptedKey.right(decryptedKey.size() - OMEMO_AES_128_KEY_LENGTH); decryptedKey = decryptedKey.left(OMEMO_AES_128_KEY_LENGTH); } else { tag = payload.right(OMEMO_AES_GCM_TAG_LENGTH); payload.chop(OMEMO_AES_GCM_TAG_LENGTH); } QPair<QByteArray, QByteArray> decryptedBody = Crypto::aes_gcm(Crypto::Decode, iv, decryptedKey, payload, tag); if (!decryptedBody.first.isNull()) { bool trusted = signal->isTrusted(sender, deviceId); message.removeChild(encrypted); QDomElement body = message.ownerDocument().createElement("body"); QString text = decryptedBody.first; if (!trusted) { bool res = !isCarbon && m_accountController->appendSysMsg(account, message.attribute("from"), "[OMEMO] The following message is from an untrusted device:"); if (!res) { text = "[UNTRUSTED]: " + text; } } body.appendChild(body.ownerDocument().createTextNode(text)); message.removeChild(message.firstChildElement("body")); message.appendChild(body); return true; } } } xml = QDomElement(); return true; }
void DataFile::upgrade() { projectVersion version = documentElement().attribute( "creatorversion" ). replace( "svn", "" ); if( version < "0.2.1-20070501" ) { QDomNodeList list = elementsByTagName( "arpandchords" ); for( int i = 0; !list.item( i ).isNull(); ++i ) { QDomElement el = list.item( i ).toElement(); if( el.hasAttribute( "arpdir" ) ) { int arpdir = el.attribute( "arpdir" ).toInt(); if( arpdir > 0 ) { el.setAttribute( "arpdir", arpdir - 1 ); } else { el.setAttribute( "arpdisabled", "1" ); } } } list = elementsByTagName( "sampletrack" ); for( int i = 0; !list.item( i ).isNull(); ++i ) { QDomElement el = list.item( i ).toElement(); if( el.attribute( "vol" ) != "" ) { el.setAttribute( "vol", el.attribute( "vol" ).toFloat() * 100.0f ); } else { QDomNode node = el.namedItem( "automation-pattern" ); if( !node.isElement() || !node.namedItem( "vol" ).isElement() ) { el.setAttribute( "vol", 100.0f ); } } } list = elementsByTagName( "ladspacontrols" ); for( int i = 0; !list.item( i ).isNull(); ++i ) { QDomElement el = list.item( i ).toElement(); QDomNode anode = el.namedItem( "automation-pattern" ); QDomNode node = anode.firstChild(); while( !node.isNull() ) { if( node.isElement() ) { QString name = node.nodeName(); if( name.endsWith( "link" ) ) { el.setAttribute( name, node.namedItem( "time" ) .toElement() .attribute( "value" ) ); QDomNode oldNode = node; node = node.nextSibling(); anode.removeChild( oldNode ); continue; } } node = node.nextSibling(); } } QDomNode node = m_head.firstChild(); while( !node.isNull() ) { if( node.isElement() ) { if( node.nodeName() == "bpm" ) { int value = node.toElement().attribute( "value" ).toInt(); if( value > 0 ) { m_head.setAttribute( "bpm", value ); QDomNode oldNode = node; node = node.nextSibling(); m_head.removeChild( oldNode ); continue; } } else if( node.nodeName() == "mastervol" ) { int value = node.toElement().attribute( "value" ).toInt(); if( value > 0 ) { m_head.setAttribute( "mastervol", value ); QDomNode oldNode = node; node = node.nextSibling(); m_head.removeChild( oldNode ); continue; } } else if( node.nodeName() == "masterpitch" ) { m_head.setAttribute( "masterpitch", -node.toElement().attribute( "value" ).toInt() ); QDomNode oldNode = node; node = node.nextSibling(); m_head.removeChild( oldNode ); continue; } } node = node.nextSibling(); } } if( version < "0.2.1-20070508" ) { QDomNodeList list = elementsByTagName( "arpandchords" ); for( int i = 0; !list.item( i ).isNull(); ++i ) { QDomElement el = list.item( i ).toElement(); if( el.hasAttribute( "chorddisabled" ) ) { el.setAttribute( "chord-enabled", !el.attribute( "chorddisabled" ) .toInt() ); el.setAttribute( "arp-enabled", !el.attribute( "arpdisabled" ) .toInt() ); } else if( !el.hasAttribute( "chord-enabled" ) ) { el.setAttribute( "chord-enabled", true ); el.setAttribute( "arp-enabled", el.attribute( "arpdir" ).toInt() != 0 ); } } while( !( list = elementsByTagName( "channeltrack" ) ).isEmpty() ) { QDomElement el = list.item( 0 ).toElement(); el.setTagName( "instrumenttrack" ); } list = elementsByTagName( "instrumenttrack" ); for( int i = 0; !list.item( i ).isNull(); ++i ) { QDomElement el = list.item( i ).toElement(); if( el.hasAttribute( "vol" ) ) { float value = el.attribute( "vol" ).toFloat(); value = roundf( value * 0.585786438f ); el.setAttribute( "vol", value ); } else { QDomNodeList vol_list = el.namedItem( "automation-pattern" ) .namedItem( "vol" ).toElement() .elementsByTagName( "time" ); for( int j = 0; !vol_list.item( j ).isNull(); ++j ) { QDomElement timeEl = list.item( j ) .toElement(); int value = timeEl.attribute( "value" ) .toInt(); value = (int)roundf( value * 0.585786438f ); timeEl.setAttribute( "value", value ); } } } } if( version < "0.3.0-rc2" ) { QDomNodeList list = elementsByTagName( "arpandchords" ); for( int i = 0; !list.item( i ).isNull(); ++i ) { QDomElement el = list.item( i ).toElement(); if( el.attribute( "arpdir" ).toInt() > 0 ) { el.setAttribute( "arpdir", el.attribute( "arpdir" ).toInt() - 1 ); } } } if( version < "0.3.0" ) { QDomNodeList list; while( !( list = elementsByTagName( "pluckedstringsynth" ) ).isEmpty() ) { QDomElement el = list.item( 0 ).toElement(); el.setTagName( "vibedstrings" ); el.setAttribute( "active0", 1 ); } while( !( list = elementsByTagName( "lb303" ) ).isEmpty() ) { QDomElement el = list.item( 0 ).toElement(); el.setTagName( "lb302" ); } while( !( list = elementsByTagName( "channelsettings" ) ). isEmpty() ) { QDomElement el = list.item( 0 ).toElement(); el.setTagName( "instrumenttracksettings" ); } } if( version < "0.4.0-20080104" ) { QDomNodeList list = elementsByTagName( "fx" ); for( int i = 0; !list.item( i ).isNull(); ++i ) { QDomElement el = list.item( i ).toElement(); if( el.hasAttribute( "fxdisabled" ) && el.attribute( "fxdisabled" ).toInt() == 0 ) { el.setAttribute( "enabled", 1 ); } } } if( version < "0.4.0-20080118" ) { QDomNodeList list; while( !( list = elementsByTagName( "fx" ) ).isEmpty() ) { QDomElement fxchain = list.item( 0 ).toElement(); fxchain.setTagName( "fxchain" ); QDomNode rack = list.item( 0 ).firstChild(); QDomNodeList effects = rack.childNodes(); // move items one level up while( effects.count() ) { fxchain.appendChild( effects.at( 0 ) ); } fxchain.setAttribute( "numofeffects", rack.toElement().attribute( "numofeffects" ) ); fxchain.removeChild( rack ); } } if( version < "0.4.0-20080129" ) { QDomNodeList list; while( !( list = elementsByTagName( "arpandchords" ) ).isEmpty() ) { QDomElement aac = list.item( 0 ).toElement(); aac.setTagName( "arpeggiator" ); QDomNode cloned = aac.cloneNode(); cloned.toElement().setTagName( "chordcreator" ); aac.parentNode().appendChild( cloned ); } } if( version < "0.4.0-20080409" ) { QStringList s; s << "note" << "pattern" << "bbtco" << "sampletco" << "time"; for( QStringList::iterator it = s.begin(); it < s.end(); ++it ) { QDomNodeList list = elementsByTagName( *it ); for( int i = 0; !list.item( i ).isNull(); ++i ) { QDomElement el = list.item( i ).toElement(); el.setAttribute( "pos", el.attribute( "pos" ).toInt()*3 ); el.setAttribute( "len", el.attribute( "len" ).toInt()*3 ); } } QDomNodeList list = elementsByTagName( "timeline" ); for( int i = 0; !list.item( i ).isNull(); ++i ) { QDomElement el = list.item( i ).toElement(); el.setAttribute( "lp0pos", el.attribute( "lp0pos" ).toInt()*3 ); el.setAttribute( "lp1pos", el.attribute( "lp1pos" ).toInt()*3 ); } } if( version < "0.4.0-20080607" ) { QDomNodeList list; while( !( list = elementsByTagName( "midi" ) ).isEmpty() ) { QDomElement el = list.item( 0 ).toElement(); el.setTagName( "midiport" ); } } if( version < "0.4.0-20080622" ) { QDomNodeList list; while( !( list = elementsByTagName( "automation-pattern" ) ).isEmpty() ) { QDomElement el = list.item( 0 ).toElement(); el.setTagName( "automationpattern" ); } list = elementsByTagName( "bbtrack" ); for( int i = 0; !list.item( i ).isNull(); ++i ) { QDomElement el = list.item( i ).toElement(); QString s = el.attribute( "name" ); s.replace( QRegExp( "^Beat/Baseline " ), "Beat/Bassline " ); el.setAttribute( "name", s ); } } if( version < "0.4.0-beta1" ) { // convert binary effect-key-blobs to XML QDomNodeList list; list = elementsByTagName( "effect" ); for( int i = 0; !list.item( i ).isNull(); ++i ) { QDomElement el = list.item( i ).toElement(); QString k = el.attribute( "key" ); if( !k.isEmpty() ) { const QList<QVariant> l = base64::decode( k, QVariant::List ).toList(); if( !l.isEmpty() ) { QString name = l[0].toString(); QVariant u = l[1]; EffectKey::AttributeMap m; // VST-effect? if( u.type() == QVariant::String ) { m["file"] = u.toString(); } // LADSPA-effect? else if( u.type() == QVariant::StringList ) { const QStringList sl = u.toStringList(); m["plugin"] = sl.value( 0 ); m["file"] = sl.value( 1 ); } EffectKey key( NULL, name, m ); el.appendChild( key.saveXML( *this ) ); } } } } if( version < "0.4.0-rc2" ) { QDomNodeList list = elementsByTagName( "audiofileprocessor" ); for( int i = 0; !list.item( i ).isNull(); ++i ) { QDomElement el = list.item( i ).toElement(); QString s = el.attribute( "src" ); s.replace( "drumsynth/misc ", "drumsynth/misc_" ); s.replace( "drumsynth/r&b", "drumsynth/r_n_b" ); s.replace( "drumsynth/r_b", "drumsynth/r_n_b" ); el.setAttribute( "src", s ); } list = elementsByTagName( "lb302" ); for( int i = 0; !list.item( i ).isNull(); ++i ) { QDomElement el = list.item( i ).toElement(); int s = el.attribute( "shape" ).toInt(); if( s >= 1 ) { s--; } el.setAttribute( "shape", QString("%1").arg(s) ); } } // new default colour for B&B tracks QDomNodeList list = elementsByTagName( "bbtco" ); for( int i = 0; !list.item( i ).isNull(); ++i ) { QDomElement el = list.item( i ).toElement(); unsigned int rgb = el.attribute( "color" ).toUInt(); if( rgb == qRgb( 64, 128, 255 ) ) { el.setAttribute( "color", bbTCO::defaultColor() ); } } // Time-signature if ( !m_head.hasAttribute( "timesig_numerator" ) ) { m_head.setAttribute( "timesig_numerator", 4 ); m_head.setAttribute( "timesig_denominator", 4 ); } if( !m_head.hasAttribute( "mastervol" ) ) { m_head.setAttribute( "mastervol", 100 ); } //printf("%s\n", toString( 2 ).toUtf8().constData()); }
QDomDocument getCapabilities( QgsServerInterface* serverIface, const QString& version, const QgsServerRequest& request, bool projectSettings ) { QDomDocument doc; QDomElement wmsCapabilitiesElement; QgsWmsConfigParser* configParser = getConfigParser( serverIface ); QgsServerRequest::Parameters parameters = request.parameters(); // Get service URL QUrl href = serviceUrl( request, configParser ); //href needs to be a prefix QString hrefString = href.toString( QUrl::FullyDecoded ); hrefString.append( href.hasQuery() ? "&" : "?" ); // XML declaration QDomProcessingInstruction xmlDeclaration = doc.createProcessingInstruction( QStringLiteral( "xml" ), QStringLiteral( "version=\"1.0\" encoding=\"utf-8\"" ) ); // Append format helper std::function < void ( QDomElement&, const QString& ) > appendFormat = [&doc]( QDomElement & elem, const QString & format ) { QDomElement formatElem = doc.createElement( QStringLiteral( "Format" )/*wms:Format*/ ); formatElem.appendChild( doc.createTextNode( format ) ); elem.appendChild( formatElem ); }; if ( version == QLatin1String( "1.1.1" ) ) { doc = QDomDocument( QStringLiteral( "WMT_MS_Capabilities SYSTEM 'http://schemas.opengis.net/wms/1.1.1/WMS_MS_Capabilities.dtd'" ) ); //WMS 1.1.1 needs DOCTYPE "SYSTEM http://schemas.opengis.net/wms/1.1.1/WMS_MS_Capabilities.dtd" doc.appendChild( xmlDeclaration ); wmsCapabilitiesElement = doc.createElement( QStringLiteral( "WMT_MS_Capabilities" )/*wms:WMS_Capabilities*/ ); } else // 1.3.0 as default { doc.appendChild( xmlDeclaration ); wmsCapabilitiesElement = doc.createElement( QStringLiteral( "WMS_Capabilities" )/*wms:WMS_Capabilities*/ ); wmsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns" ), QStringLiteral( "http://www.opengis.net/wms" ) ); wmsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:sld" ), QStringLiteral( "http://www.opengis.net/sld" ) ); wmsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:qgs" ), QStringLiteral( "http://www.qgis.org/wms" ) ); wmsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:xsi" ), QStringLiteral( "http://www.w3.org/2001/XMLSchema-instance" ) ); QString schemaLocation = QStringLiteral( "http://www.opengis.net/wms" ); schemaLocation += QLatin1String( " http://schemas.opengis.net/wms/1.3.0/capabilities_1_3_0.xsd" ); schemaLocation += QLatin1String( " http://www.opengis.net/sld" ); schemaLocation += QLatin1String( " http://schemas.opengis.net/sld/1.1.0/sld_capabilities.xsd" ); schemaLocation += QLatin1String( " http://www.qgis.org/wms" ); if ( configParser && configParser->wmsInspireActivated() ) { wmsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:inspire_common" ), QStringLiteral( "http://inspire.ec.europa.eu/schemas/common/1.0" ) ); wmsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:inspire_vs" ), QStringLiteral( "http://inspire.ec.europa.eu/schemas/inspire_vs/1.0" ) ); schemaLocation += QLatin1String( " http://inspire.ec.europa.eu/schemas/inspire_vs/1.0" ); schemaLocation += QLatin1String( " http://inspire.ec.europa.eu/schemas/inspire_vs/1.0/inspire_vs.xsd" ); } schemaLocation += " " + hrefString + "SERVICE=WMS&REQUEST=GetSchemaExtension"; wmsCapabilitiesElement.setAttribute( QStringLiteral( "xsi:schemaLocation" ), schemaLocation ); } wmsCapabilitiesElement.setAttribute( QStringLiteral( "version" ), version ); doc.appendChild( wmsCapabilitiesElement ); configParser->serviceCapabilities( wmsCapabilitiesElement, doc ); //wms:Capability element QDomElement capabilityElement = doc.createElement( QStringLiteral( "Capability" )/*wms:Capability*/ ); wmsCapabilitiesElement.appendChild( capabilityElement ); //wms:Request element QDomElement requestElement = doc.createElement( QStringLiteral( "Request" )/*wms:Request*/ ); capabilityElement.appendChild( requestElement ); QDomElement dcpTypeElement = doc.createElement( QStringLiteral( "DCPType" )/*wms:DCPType*/ ); QDomElement httpElement = doc.createElement( QStringLiteral( "HTTP" )/*wms:HTTP*/ ); dcpTypeElement.appendChild( httpElement ); QDomElement elem; //wms:GetCapabilities elem = doc.createElement( QStringLiteral( "GetCapabilities" )/*wms:GetCapabilities*/ ); appendFormat( elem, ( version == QLatin1String( "1.1.1" ) ? "application/vnd.ogc.wms_xml" : "text/xml" ) ); elem.appendChild( dcpTypeElement ); requestElement.appendChild( elem ); // SOAP platform //only give this information if it is not a WMS request to be in sync with the WMS capabilities schema // XXX Not even sure that cam be ever true if ( parameters.value( QStringLiteral( "SERVICE" ) ).compare( QLatin1String( "WMS" ), Qt::CaseInsensitive ) != 0 ) { QDomElement soapElement = doc.createElement( QStringLiteral( "SOAP" )/*wms:SOAP*/ ); httpElement.appendChild( soapElement ); QDomElement soapResourceElement = doc.createElement( QStringLiteral( "OnlineResource" )/*wms:OnlineResource*/ ); soapResourceElement.setAttribute( QStringLiteral( "xmlns:xlink" ), QStringLiteral( "http://www.w3.org/1999/xlink" ) ); soapResourceElement.setAttribute( QStringLiteral( "xlink:type" ), QStringLiteral( "simple" ) ); soapResourceElement.setAttribute( QStringLiteral( "xlink:href" ), hrefString ); soapElement.appendChild( soapResourceElement ); } //only Get supported for the moment QDomElement getElement = doc.createElement( QStringLiteral( "Get" )/*wms:Get*/ ); httpElement.appendChild( getElement ); QDomElement olResourceElement = doc.createElement( QStringLiteral( "OnlineResource" )/*wms:OnlineResource*/ ); olResourceElement.setAttribute( QStringLiteral( "xmlns:xlink" ), QStringLiteral( "http://www.w3.org/1999/xlink" ) ); olResourceElement.setAttribute( QStringLiteral( "xlink:type" ), QStringLiteral( "simple" ) ); olResourceElement.setAttribute( QStringLiteral( "xlink:href" ), hrefString ); getElement.appendChild( olResourceElement ); //wms:GetMap elem = doc.createElement( QStringLiteral( "GetMap" )/*wms:GetMap*/ ); appendFormat( elem, QStringLiteral( "image/jpeg" ) ); appendFormat( elem, QStringLiteral( "image/png" ) ); appendFormat( elem, QStringLiteral( "image/png; mode=16bit" ) ); appendFormat( elem, QStringLiteral( "image/png; mode=8bit" ) ); appendFormat( elem, QStringLiteral( "image/png; mode=1bit" ) ); appendFormat( elem, QStringLiteral( "application/dxf" ) ); elem.appendChild( dcpTypeElement.cloneNode().toElement() ); //this is the same as for 'GetCapabilities' requestElement.appendChild( elem ); //wms:GetFeatureInfo elem = doc.createElement( QStringLiteral( "GetFeatureInfo" ) ); appendFormat( elem, QStringLiteral( "text/plain" ) ); appendFormat( elem, QStringLiteral( "text/html" ) ); appendFormat( elem, QStringLiteral( "text/xml" ) ); appendFormat( elem, QStringLiteral( "application/vnd.ogc.gml" ) ); appendFormat( elem, QStringLiteral( "application/vnd.ogc.gml/3.1.1" ) ); elem.appendChild( dcpTypeElement.cloneNode().toElement() ); //this is the same as for 'GetCapabilities' requestElement.appendChild( elem ); //wms:GetLegendGraphic elem = doc.createElement(( version == QLatin1String( "1.1.1" ) ? "GetLegendGraphic" : "sld:GetLegendGraphic" )/*wms:GetLegendGraphic*/ ); appendFormat( elem, QStringLiteral( "image/jpeg" ) ); appendFormat( elem, QStringLiteral( "image/png" ) ); elem.appendChild( dcpTypeElement.cloneNode().toElement() ); // this is the same as for 'GetCapabilities' requestElement.appendChild( elem ); //wms:DescribeLayer elem = doc.createElement(( version == QLatin1String( "1.1.1" ) ? "DescribeLayer" : "sld:DescribeLayer" )/*wms:GetLegendGraphic*/ ); appendFormat( elem, QStringLiteral( "text/xml" ) ); elem.appendChild( dcpTypeElement.cloneNode().toElement() ); // this is the same as for 'GetCapabilities' requestElement.appendChild( elem ); //wms:GetStyles elem = doc.createElement(( version == QLatin1String( "1.1.1" ) ? "GetStyles" : "qgs:GetStyles" )/*wms:GetStyles*/ ); appendFormat( elem, QStringLiteral( "text/xml" ) ); elem.appendChild( dcpTypeElement.cloneNode().toElement() ); //this is the same as for 'GetCapabilities' requestElement.appendChild( elem ); if ( projectSettings ) //remove composer templates from GetCapabilities in the long term { //wms:GetPrint elem = doc.createElement( QStringLiteral( "GetPrint" ) /*wms:GetPrint*/ ); appendFormat( elem, QStringLiteral( "svg" ) ); appendFormat( elem, QStringLiteral( "png" ) ); appendFormat( elem, QStringLiteral( "pdf" ) ); elem.appendChild( dcpTypeElement.cloneNode().toElement() ); //this is the same as for 'GetCapabilities' requestElement.appendChild( elem ); } //Exception element is mandatory elem = doc.createElement( QStringLiteral( "Exception" ) ); appendFormat( elem, ( version == QLatin1String( "1.1.1" ) ? "application/vnd.ogc.se_xml" : "XML" ) ); capabilityElement.appendChild( elem ); //UserDefinedSymbolization element if ( version == QLatin1String( "1.3.0" ) ) { elem = doc.createElement( QStringLiteral( "sld:UserDefinedSymbolization" ) ); elem.setAttribute( QStringLiteral( "SupportSLD" ), QStringLiteral( "1" ) ); elem.setAttribute( QStringLiteral( "UserLayer" ), QStringLiteral( "0" ) ); elem.setAttribute( QStringLiteral( "UserStyle" ), QStringLiteral( "1" ) ); elem.setAttribute( QStringLiteral( "RemoteWFS" ), QStringLiteral( "0" ) ); elem.setAttribute( QStringLiteral( "InlineFeature" ), QStringLiteral( "0" ) ); elem.setAttribute( QStringLiteral( "RemoteWCS" ), QStringLiteral( "0" ) ); capabilityElement.appendChild( elem ); if ( configParser->wmsInspireActivated() ) { configParser->inspireCapabilities( capabilityElement, doc ); } } if ( projectSettings ) { //Insert <ComposerTemplate> elements derived from wms:_ExtendedCapabilities configParser->printCapabilities( capabilityElement, doc ); //WFS layers QStringList wfsLayers = configParser->wfsLayerNames(); if ( !wfsLayers.isEmpty() ) { QDomElement wfsLayersElem = doc.createElement( QStringLiteral( "WFSLayers" ) ); for ( auto wfsIt = wfsLayers.constBegin() ; wfsIt != wfsLayers.constEnd(); ++wfsIt ) { QDomElement wfsLayerElem = doc.createElement( QStringLiteral( "WFSLayer" ) ); wfsLayerElem.setAttribute( QStringLiteral( "name" ), *wfsIt ); wfsLayersElem.appendChild( wfsLayerElem ); } capabilityElement.appendChild( wfsLayersElem ); } } //add the xml content for the individual layers/styles configParser->layersAndStylesCapabilities( capabilityElement, doc, version, projectSettings ); return doc; }