Removed SAX based PDML parser

This commit is contained in:
Srivats P. 2011-03-14 20:47:46 +05:30
parent 69d488d8a2
commit f0e2b1ca50
2 changed files with 0 additions and 280 deletions

View File

@ -103,255 +103,6 @@ void PdmlDefaultProtocol::unknownFieldHandler(QString name,
}
#if 0
// ---------------------------------------------------------- //
// PdmlParser
// ---------------------------------------------------------- //
PdmlParser::PdmlParser(OstProto::StreamConfigList *streams)
{
skipCount_ = 0;
currentPdmlProtocol_ = NULL;
streams_ = streams;
protocolMap_.insert("unknown", new PdmlUnknownProtocol());
protocolMap_.insert("geninfo", new PdmlGenInfoProtocol());
protocolMap_.insert("frame", new PdmlFrameProtocol());
#if 0
protocolMap_.insert("fake-field-wrapper",
new PdmlFakeFieldWrapperProtocol());
#endif
#if 0
protocolMap_.insert("eth", new PdmlEthProtocol());
protocolMap_.insert("ip", new PdmlIp4Protocol());
protocolMap_.insert("ipv6", new PdmlIp6Protocol());
protocolMap_.insert("tcp", new PdmlTcpProtocol());
#endif
}
PdmlParser::~PdmlParser()
{
// TODO: free protocolMap_.values()
}
bool PdmlParser::startElement(const QString & /* namespaceURI */,
const QString & /* localName */,
const QString &qName,
const QXmlAttributes &attributes)
{
qDebug("%s (%s)", __FUNCTION__, qName.toAscii().constData());
if (skipCount_)
{
skipCount_++;
goto _exit;
}
if (qName == "pdml")
{
packetCount_ = 0;
}
else if (qName == "packet")
{
// XXX: For now, each packet is converted to a stream
currentStream_ = streams_->add_stream();
currentStream_->mutable_stream_id()->set_id(packetCount_);
currentStream_->mutable_core()->set_is_enabled(true);
qDebug("packetCount_ = %d\n", packetCount_);
}
else if (qName == "proto")
{
QString protoName = attributes.value("name");
if (protoName.isEmpty()
|| (protoName == "expert"))
{
skipCount_++;
goto _exit;
}
// HACK HACK HACK
if (currentPdmlProtocol_ && (currentPdmlProtocol_->ostProtoId()
== OstProto::Protocol::kHexDumpFieldNumber))
currentPdmlProtocol_->postProtocolHandler(currentStream_);
if (!protocolMap_.contains(protoName))
protoName = "unknown"; // FIXME: change to Ost:Hexdump
currentPdmlProtocol_ = protocolMap_.value(protoName);
Q_ASSERT(currentPdmlProtocol_ != NULL);
int protoId = currentPdmlProtocol_->ostProtoId();
// PdmlDefaultProtocol =>
if (protoId <= 0)
goto _exit;
OstProto::Protocol *proto = currentStream_->add_protocol();
proto->mutable_protocol_id()->set_id(protoId);
const google::protobuf::Reflection *msgRefl =
proto->GetReflection();
const google::protobuf::FieldDescriptor *fDesc =
msgRefl->FindKnownExtensionByNumber(protoId);
// TODO: if !fDesc
// init default values of all fields in protocol
currentProtocolMsg_ = msgRefl->MutableMessage(proto, fDesc);
currentPdmlProtocol_->preProtocolHandler(protoName, attributes,
currentStream_);
}
else if (qName == "field")
{
// fields with "hide='yes'" are informational and should be skipped
if (attributes.value("hide") == "yes")
{
skipCount_++;
goto _exit;
}
QString name = attributes.value("name");
QString valueStr = attributes.value("value");
int pos = -1;
int size = -1;
if (!attributes.value("pos").isEmpty())
pos = attributes.value("pos").toInt();
if (!attributes.value("size").isEmpty())
size = attributes.value("size").toInt();
qDebug("\tname:%s, pos:%d, size:%d value:%s",
name.toAscii().constData(),
pos,
size,
valueStr.toAscii().constData());
if (!currentPdmlProtocol_->hasField(name))
{
currentPdmlProtocol_->unknownFieldHandler(name, pos, size,
attributes, currentStream_);
goto _exit;
}
// TODO
int fId = currentPdmlProtocol_->fieldId(name);
const google::protobuf::Descriptor *msgDesc =
currentProtocolMsg_->GetDescriptor();
const google::protobuf::FieldDescriptor *fDesc =
msgDesc->FindFieldByNumber(fId);
const google::protobuf::Reflection *msgRefl =
currentProtocolMsg_->GetReflection();
bool isOk;
switch(fDesc->cpp_type())
{
case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: // TODO
case google::protobuf::FieldDescriptor::CPPTYPE_UINT32:
msgRefl->SetUInt32(currentProtocolMsg_, fDesc,
valueStr.toUInt(&isOk, kBaseHex));
break;
case google::protobuf::FieldDescriptor::CPPTYPE_UINT64:
msgRefl->SetUInt64(currentProtocolMsg_, fDesc,
valueStr.toULongLong(&isOk, kBaseHex));
break;
case google::protobuf::FieldDescriptor::CPPTYPE_STRING:
{
QByteArray hexVal = QByteArray::fromHex(valueStr.toUtf8());
std::string str(hexVal.constData(), hexVal.size());
msgRefl->SetString(currentProtocolMsg_, fDesc, str);
break;
}
default:
qDebug("%s: unhandled cpptype = %d", __FUNCTION__,
fDesc->cpp_type());
}
}
_exit:
return true;
}
bool PdmlParser::characters(const QString &str)
{
//qDebug("%s (%s)", __FUNCTION__, str.toAscii().constData());
//_currentText += str;
return true;
}
bool PdmlParser::endElement(const QString & /* namespaceURI */,
const QString & /* localName */,
const QString &qName)
{
qDebug("%s (%s)", __FUNCTION__, qName.toAscii().constData());
if (qName == "packet")
{
if (currentStream_->core().name().size())
{
OstProto::Protocol *proto = currentStream_->add_protocol();
proto->mutable_protocol_id()->set_id(
OstProto::Protocol::kHexDumpFieldNumber);
OstProto::HexDump *hexDump = proto->MutableExtension(OstProto::hexDump);
hexDump->set_content(currentStream_->core().name());
hexDump->set_pad_until_end(false);
currentStream_->mutable_core()->set_name("");
}
packetCount_++;
currentPdmlProtocol_ = NULL;
goto _exit;
}
if (skipCount_)
{
skipCount_--;
goto _exit;
}
if (qName == "proto")
{
currentPdmlProtocol_->postProtocolHandler(currentStream_);
//currentPdmlProtocol_ = NULL;
}
else if (qName == "field")
{
}
_exit:
return true;
}
bool PdmlParser::fatalError(const QXmlParseException &exception)
{
QString extra;
qDebug("%s", __FUNCTION__);
#if 0
if (exception.message() == "tag mismatch" && lastElement == "fieldData")
extra = "\nAre you using an old version of Wireshark? If so, try using a newer version. Alternatively, view the packet dump decode in Wireshark by clicking the \"External\" button.";
#endif
QMessageBox::warning(0, QObject::tr("PDML Parser"),
QObject::tr("XML parse error for packet %1 "
"at line %2, column %3:\n %4\n%5")
.arg(packetCount_+1)
.arg(exception.lineNumber())
.arg(exception.columnNumber())
.arg(exception.message())
.arg(extra));
return false;
}
#endif
// ---------------------------------------------------------- //
// PdmlReader //
// ---------------------------------------------------------- //

View File

@ -60,37 +60,6 @@ protected:
QMap<QString, int> fieldMap_;
};
#if 0
class PdmlParser : public QXmlDefaultHandler
{
public:
PdmlParser(OstProto::StreamConfigList *streams);
~PdmlParser();
bool startElement(const QString &namespaceURI,
const QString &localName,
const QString &qName,
const QXmlAttributes &attributes);
bool endElement(const QString &namespaceURI,
const QString &localName,
const QString &qName);
bool characters(const QString &str);
bool fatalError(const QXmlParseException &exception);
private:
void initProtocolMaps();
QMap<QString, PdmlDefaultProtocol*> protocolMap_;
PdmlDefaultProtocol *currentPdmlProtocol_;
int skipCount_;
int packetCount_;
OstProto::StreamConfigList *streams_;
OstProto::Stream *currentStream_;
google::protobuf::Message *currentProtocolMsg_;
};
#endif
class PdmlUnknownProtocol;
class PcapFileFormat;
class PdmlReader : public QXmlStreamReader