static void attributesStartElementNsHandler(AttributeParseState* state, const QXmlStreamAttributes& attrs) { if (attrs.count() <= 0) return; state->gotAttributes = true; for (int i = 0; i < attrs.count(); i++) { const QXmlStreamAttribute& attr = attrs[i]; String attrLocalName = attr.name(); String attrValue = attr.value(); String attrURI = attr.namespaceUri(); String attrQName = attr.qualifiedName(); state->attributes.set(attrQName, attrValue); } }
static inline void handleElementAttributes(Element* newElement, const QXmlStreamAttributes &attrs, ExceptionCode& ec) { for (int i = 0; i < attrs.count(); ++i) { const QXmlStreamAttribute &attr = attrs[i]; String attrLocalName = attr.name(); String attrValue = attr.value(); String attrURI = attr.namespaceUri().isEmpty() ? String() : String(attr.namespaceUri()); String attrQName = attr.qualifiedName(); newElement->setAttributeNS(attrURI, attrQName, attrValue, ec); if (ec) // exception setting attributes return; } }
static inline void handleElementAttributes(Vector<Attribute, 8>& prefixedAttributes, const QXmlStreamAttributes &attrs, ExceptionCode& ec) { for (int i = 0; i < attrs.count(); ++i) { const QXmlStreamAttribute &attr = attrs[i]; String attrLocalName = attr.name(); String attrValue = attr.value(); String attrURI = attr.namespaceUri().isEmpty() ? String() : String(attr.namespaceUri()); String attrQName = attr.qualifiedName(); QualifiedName parsedName = anyName; if (!Element::parseAttributeName(parsedName, attrURI, attrQName, ec)) return; prefixedAttributes.append(Attribute(parsedName, attrValue)); } }
void XmlConsole::stackProcess(const QByteArray &data, bool incoming) { StackEnvironment *d = &(incoming ? m_stackIncoming : m_stackOutgoing); d->reader.addData(data); StackToken *token; // debug() << incoming << data; // debug() << "=================================================================="; while (d->reader.readNext() > QXmlStreamReader::Invalid) { // qDebug() << incoming << d->reader.tokenString(); switch(d->reader.tokenType()) { case QXmlStreamReader::StartElement: // dbg << d->reader.name().toString() << d->depth // << d->reader.attributes().value(QLatin1String("from")).toString(); d->depth++; if (d->depth > 1) { if (!d->tokens.isEmpty() && d->tokens.last()->type == QXmlStreamReader::Characters) delete d->tokens.takeLast(); d->tokens << new StackToken(d->reader); } break; case QXmlStreamReader::EndElement: // dbg << d->reader.name().toString() << d->depth; if (d->tokens.isEmpty()) break; token = d->tokens.last(); if (token->type == QXmlStreamReader::StartElement && !token->startTag.empty) token->startTag.empty = true; else if (d->depth > 1) d->tokens << new StackToken(d->reader); if (d->depth == 2) { QTextCursor cursor(m_ui->xmlBrowser->document()); cursor.movePosition(QTextCursor::End); cursor.beginEditBlock(); QTextCharFormat zeroFormat = cursor.charFormat(); zeroFormat.setForeground(QColor(Qt::white)); QTextCharFormat bodyFormat = zeroFormat; bodyFormat.setForeground(d->bodyColor); QTextCharFormat tagFormat = zeroFormat; tagFormat.setForeground(d->tagColor); QTextCharFormat attributeFormat = zeroFormat; attributeFormat.setForeground(d->attributeColor); QTextCharFormat paramsFormat = zeroFormat; paramsFormat.setForeground(d->paramColor); QTextCharFormat bracketFormat = zeroFormat; bracketFormat.setForeground(m_stackBracketsColor); QString singleSpace = QLatin1String(" "); cursor.insertBlock(); int depth = 0; QString currentXmlns; QXmlStreamReader::TokenType lastType = QXmlStreamReader::StartElement; for (int i = 0; i < d->tokens.size(); i++) { token = d->tokens.at(i); if (token->type == QXmlStreamReader::StartElement) { QString space = generate_stacked_space(depth); cursor.insertText(QLatin1String("\n")); cursor.insertText(space); cursor.insertText(QLatin1String("<"), bracketFormat); cursor.insertText(token->startTag.name->toString(), tagFormat); const QStringRef &xmlns = *token->startTag.xmlns; if (i == 0 || xmlns != currentXmlns) { currentXmlns = xmlns.toString(); cursor.insertText(singleSpace); cursor.insertText(QLatin1String("xmlns"), attributeFormat); cursor.insertText(QLatin1String("="), zeroFormat); cursor.insertText(QLatin1String("'"), paramsFormat); cursor.insertText(currentXmlns, paramsFormat); cursor.insertText(QLatin1String("'"), paramsFormat); } QXmlStreamAttributes *attributes = token->startTag.attributes; for (int j = 0; j < attributes->count(); j++) { const QXmlStreamAttribute &attr = attributes->at(j); cursor.insertText(singleSpace); cursor.insertText(attr.name().toString(), attributeFormat); cursor.insertText(QLatin1String("="), zeroFormat); cursor.insertText(QLatin1String("'"), paramsFormat); cursor.insertText(attr.value().toString(), paramsFormat); cursor.insertText(QLatin1String("'"), paramsFormat); } if (token->startTag.empty) { cursor.insertText(QLatin1String("/>"), bracketFormat); } else { cursor.insertText(QLatin1String(">"), bracketFormat); depth++; } } else if (token->type == QXmlStreamReader::EndElement) { if (lastType == QXmlStreamReader::EndElement) { QString space = generate_stacked_space(depth - 1); cursor.insertText(QLatin1String("\n")); cursor.insertText(space); } cursor.insertText(QLatin1String("</"), bracketFormat); cursor.insertText(token->endTag.name->toString(), tagFormat); cursor.insertText(QLatin1String(">"), bracketFormat); depth--; } else if (token->type == QXmlStreamReader::Characters) { cursor.setCharFormat(bodyFormat); QString text = token->charachters.text->toString(); if (text.contains(QLatin1Char('\n'))) { QString space = generate_stacked_space(depth); space.prepend(QLatin1Char('\n')); QStringList lines = text.split(QLatin1Char('\n')); for (int j = 0; j < lines.size(); j++) { cursor.insertText(space); cursor.insertText(lines.at(j)); } space.chop(1); cursor.insertText(space); } else { cursor.insertText(text); } } lastType = token->type; if (lastType == QXmlStreamReader::StartElement && token->startTag.empty) lastType = QXmlStreamReader::EndElement; delete token; } cursor.endEditBlock(); d->tokens.clear(); } d->depth--; break; case QXmlStreamReader::Characters: token = d->tokens.isEmpty() ? 0 : d->tokens.last(); if (token && token->type == QXmlStreamReader::StartElement && !token->startTag.empty) { if (*token->startTag.name == QLatin1String("auth") && *token->startTag.xmlns == QLatin1String("urn:ietf:params:xml:ns:xmpp-sasl")) { d->tokens << new StackToken(QLatin1String("<<Private data>>")); } else { d->tokens << new StackToken(d->reader); } } break; default: break; } } // qDebug() << d->reader.tokenString(); // if (d->reader.tokenType() == QXmlStreamReader::Invalid) // dbg << d->reader.error() << d->reader.errorString(); if (!incoming && d->depth > 1) { qFatal("outgoing depth %d on\n\"%s\"", d->depth, qPrintable(QString::fromUtf8(data, data.size()))); } }