void XmlUtil::readServerConfig ( const QString& xml, ServerConfig& conf ) { QXmlStreamReader reader ( xml ); while ( !reader.atEnd() ) { if ( reader.readNext() == QXmlStreamReader::StartElement ) break; } if ( reader.name() != CONFIG_ROOT_TAG ) throw InvalidXmlException("No config root tag found.", reader.lineNumber(), reader.columnNumber(), reader.characterOffset()); while ( !reader.atEnd() ) { if ( reader.readNext() == QXmlStreamReader::StartElement ) { if ( reader.name() == "port" ) { bool ok; conf.port = reader.readElementText().toInt(&ok); if ( !ok || conf.port > (1 << 16 - 1) ) throw InvalidXmlException("Invalid server port specified.", reader.lineNumber(), reader.columnNumber(), reader.characterOffset()); } else if ( reader.name() == "db" ) { conf.db_path = reader.readElementText(); } else if ( reader.name() == "stage_file" ) { conf.stage_files.push_back(reader.readElementText()); } else { //barf? } } } if ( reader.hasError() ) throw IllFormedXmlException(reader.errorString(), reader); }
void MetaInfoParser::errorHandling(QXmlStreamReader &reader, QFile &file) { if (!reader.hasError()) return; qDebug() << QString("Error at %1, %2:%3: %4") .arg(file.fileName()) .arg(reader.lineNumber()) .arg(reader.columnNumber()) .arg(reader.errorString()); file.reset(); QString fileString = file.readAll(); QString snippetString; int lineCount = 0; int position = reader.characterOffset(); while (position >= 0) { if (fileString[position] == '\n') { if (lineCount > 3) break; lineCount++; } snippetString.prepend(fileString[position]); position--; } lineCount = 0; position = reader.characterOffset(); while (position >= 0) { position++; if (fileString[position] == '\n') { if (lineCount > 1) break; lineCount++; } snippetString.append(fileString[position]); } qDebug() << snippetString; }
StorageParserException::StorageParserException( const QString &s, const QXmlStreamReader &xml ) : StorageException( s ), m_element( xml.name().toString() ), m_line( xml.lineNumber() ), m_column( xml.columnNumber() ), m_characterOffset( xml.characterOffset() ) { }
void DirectParser::ParseSendfile (QXmlStreamReader & xread, DirectMessage & msg, qint64 & offset, bool & complete, bool & good, QXmlStreamAttributes & atts) { QString subop = atts.value("subop").toString().toLower(); msg.SetSubop (subop); bool valid (false); if (subop == "chunk-data") { ReadNext (xread); if (xread.isCharacters ()) { msg.SetData (xread.text().toString().toUtf8()); valid = true; ReadNext (xread); } offset = xread.characterOffset (); } else { valid= ( subop == "sendreq" || subop == "samreq" || subop == "goahead" || subop == "deny" || subop == "chunk-ack" || subop == "snd-done" || subop == "abort" ); ReadNext (xread); } if (valid) { for (int i=0; i< atts.size(); i++) { msg.SetAttribute (atts[i].name().toString().toLower(), atts[i].value().toString()); } good = true; complete = true; offset = xread.characterOffset (); } }
void DirectParser::ParseMessage (QXmlStreamReader & xread, DirectMessage & msg, qint64 & offset, bool & complete, bool & good) { QXmlStreamReader::TokenType tokt = NoWhite (xread); offset = xread.characterOffset (); QXmlStreamAttributes atts; QString op; QString tag; switch (tokt) { case QXmlStreamReader::StartElement: atts = xread.attributes(); tag = xread.name().toString(); op = atts.value ("op").toString().toLower(); msg.SetOp (op); if (tag == "cmd") { if (op == "xmpp") { ParseXmpp (xread, msg, offset, complete, good, atts); } else if (op == "ctl") { ParseCtl (xread, msg, offset, complete, good, atts); } else if (op == "sendfile") { ParseSendfile (xread, msg, offset, complete, good, atts); } offset = xread.characterOffset (); if (xread.tokenType() != QXmlStreamReader::EndElement || xread.name() != tag) { complete = false; good = false; } } break; default: complete = false; good = false; break; } }
void DirectParser::ParseOld (QXmlStreamReader & xread, DirectMessage & msg, qint64 & offset, bool & complete, bool & good) { QXmlStreamReader::TokenType tokt = ReadNext (xread); QXmlStreamAttributes atts; msg.SetOp ("xmpp"); msg.SetSubop ("msg"); ReadNext (xread); // eat the characters ReadNext (xread); // eat the end-element offset = xread.characterOffset (); QByteArray data = inbuf.buffer().left (offset); msg.SetData (data); complete = true; good = true; }
void DirectParser::ParseXmpp (QXmlStreamReader & xread, DirectMessage & msg, qint64 & offset, bool & complete, bool & good, QXmlStreamAttributes & atts) { QString subop = atts.value("subop").toString().toLower(); msg.SetSubop (subop); if (subop == "msg") { complete = true; good = true; } ReadNext (xread); if (xread.isCharacters()) { msg.SetData (xread.text().toString().toUtf8()); ReadNext (xread); } offset = xread.characterOffset (); if (xread.tokenType() != QXmlStreamReader::EndElement) { complete = false; good = false; } }
/*! * Read out a widget within a category. This can either be * enclosed in a <ui> element or a (legacy) <widget> element which may * contain nested <widget> elements. * * Examples: * * <ui language="c++"> * <widget class="MultiPageWidget" name="multipagewidget"> ... </widget> * <customwidgets>...</customwidgets> * <ui> * * or * * <widget> * <widget> ... </widget> * ... * <widget> * * Returns true on success, false if end was reached or an error has been encountered * in which case the reader has its error flag set. If successful, the current item * of the reader will be the closing element (</ui> or </widget>) */ bool WidgetBoxTreeWidget::readWidget(Widget *w, const QString &xml, QXmlStreamReader &r) { qint64 startTagPosition =0, endTagPosition = 0; int nesting = 0; bool endEncountered = false; bool parsedWidgetTag = false; QString outmostElement; while (!endEncountered) { const qint64 currentPosition = r.characterOffset(); switch(r.readNext()) { case QXmlStreamReader::StartElement: if (nesting++ == 0) { // First element must be <ui> or (legacy) <widget> const QStringRef name = r.name(); if (name == QLatin1String(uiElementC)) { startTagPosition = currentPosition; } else { if (name == QLatin1String(widgetElementC)) { startTagPosition = currentPosition; parsedWidgetTag = true; } else { r.raiseError(QDesignerWidgetBox::tr("Unexpected element <%1> encountered when parsing for <widget> or <ui>").arg(name.toString())); return false; } } } else { // We are within <ui> looking for the first <widget> tag if (!parsedWidgetTag && r.name() == QLatin1String(widgetElementC)) { parsedWidgetTag = true; } } break; case QXmlStreamReader::EndElement: // Reached end of widget? if (--nesting == 0) { endTagPosition = r.characterOffset(); endEncountered = true; } break; case QXmlStreamReader::EndDocument: r.raiseError(QDesignerWidgetBox::tr("Unexpected end of file encountered when parsing widgets.")); return false; case QXmlStreamReader::Invalid: return false; default: break; } } if (!parsedWidgetTag) { r.raiseError(QDesignerWidgetBox::tr("A widget element could not be found.")); return false; } // Oddity: Startposition is 1 off QString widgetXml = xml.mid(startTagPosition, endTagPosition - startTagPosition); const QChar lessThan = QLatin1Char('<'); if (!widgetXml.startsWith(lessThan)) widgetXml.prepend(lessThan); w->setDomXml(widgetXml); return true; }
bool DirectParser::Read (DirectMessage & msg) { msg.Clear (); if (!bufLock.tryLock (5000)) { qDebug () << "WARNING: Mutex locked 5 seconds, giving up"; return false; } QXmlStreamReader xread (&inbuf); QXmlStreamReader::TokenType tokt; bool finished (false); bool complete (false); bool good (false); bool badData (false); QString topname; QString bottomtag; QString version; qint64 offset (0); while (!finished) { tokt = ReadNext (xread); offset = xread.characterOffset (); qDebug () << " Direct token " << xread.tokenString(); switch (tokt) { case QXmlStreamReader::NoToken : qDebug () << " no token found"; finished = true; complete = false; good = false; lastErr = Proto_EmptyInput; break; case QXmlStreamReader::Invalid : qDebug () << " bad token"; qDebug () << " text until here: " << inbuf.buffer().left(offset); finished = true; complete = false; good = false; lastErr = Proto_BadTag; badData = true; break; case QXmlStreamReader::StartElement: topname = xread.name().toString().toLower(); if (topname == oldTopTag) { ParseOld (xread, msg, offset, complete, good); msg.SetAttribute ("version","0.1"); } else if (topname == topTag) { version = xread.documentVersion ().toString(); msg.SetAttribute ("version",version); ParseMessage (xread, msg, offset, complete, good); } else { qDebug () << " topname unknown: " << topname; finished = true; complete = false; good = false; lastErr = Proto_WrongProtocol; } break; case QXmlStreamReader::EndElement: bottomtag = xread.name().toString().toLower(); if (bottomtag == topname) { finished = true; } break; case QXmlStreamReader::EndDocument : finished = true; break; case QXmlStreamReader::Characters: break; case QXmlStreamReader::StartDocument: case QXmlStreamReader::Comment: case QXmlStreamReader::DTD: case QXmlStreamReader::EntityReference: case QXmlStreamReader::ProcessingInstruction: break; default: qDebug () << " unknown token type " << tokt; lastErr = Proto_Unknown; finished = true; complete = false; good = false; break; } } if (good && complete) { /// we have consumed a message, so get rid of the raw data /// so we can read the next message next time qDebug () << " trailing token " << xread.tokenString (); while (!xread.atEnd() && xread.tokenType() != QXmlStreamReader::EndDocument) { xread.readNext(); qDebug () << " consumed " << xread.tokenString (); } qDebug () << " remove " << offset << " bytes from buffer: "; qDebug () << inbuf.buffer().left(offset); inbuf.buffer().remove (0,offset+1); inbuf.seek (0); } else { msg.Clear (); } qDebug () << " after DirectParser::Read buffer has [[" << inbuf.buffer() << "]]"; qDebug () << " token " << xread.tokenString() << " error " << xread.error(); if (!good) { if (xread.error () == QXmlStreamReader::PrematureEndOfDocumentError) { complete = false; good = true; } } lastComplete = complete; lastGood = good; bufLock.unlock (); return good && complete; }