+
+void VariantVisitor::visit(trace::Null *)
+{
+ m_variant = QVariant::fromValue(ApiPointer(0));
+}
+
+void VariantVisitor::visit(trace::Bool *node)
+{
+ m_variant = QVariant(node->value);
+}
+
+void VariantVisitor::visit(trace::SInt *node)
+{
+ m_variant = QVariant(node->value);
+}
+
+void VariantVisitor::visit(trace::UInt *node)
+{
+ m_variant = QVariant(node->value);
+}
+
+void VariantVisitor::visit(trace::Float *node)
+{
+ m_variant = QVariant(node->value);
+}
+
+void VariantVisitor::visit(trace::Double *node)
+{
+ m_variant = QVariant(node->value);
+}
+
+void VariantVisitor::visit(trace::String *node)
+{
+ m_variant = QVariant(QString::fromStdString(node->value));
+}
+
+void VariantVisitor::visit(trace::Enum *e)
+{
+ ApiTraceEnumSignature *sig = 0;
+
+ if (m_loader) {
+ sig = m_loader->enumSignature(e->sig->id);
+ }
+ if (!sig) {
+ sig = new ApiTraceEnumSignature(e->sig);
+ if (m_loader) {
+ m_loader->addEnumSignature(e->sig->id, sig);
+ }
+ }
+
+ m_variant = QVariant::fromValue(ApiEnum(sig, e->value));
+}
+
+void VariantVisitor::visit(trace::Bitmask *bitmask)
+{
+ m_variant = QVariant::fromValue(ApiBitmask(bitmask));
+}
+
+void VariantVisitor::visit(trace::Struct *str)
+{
+ m_variant = QVariant::fromValue(ApiStruct(str));
+}
+
+void VariantVisitor::visit(trace::Array *array)
+{
+ m_variant = QVariant::fromValue(ApiArray(array));
+}
+
+void VariantVisitor::visit(trace::Blob *blob)
+{
+ QByteArray barray = QByteArray(blob->buf, blob->size);
+ m_variant = QVariant(barray);
+}
+
+void VariantVisitor::visit(trace::Pointer *ptr)
+{
+ m_variant = QVariant::fromValue(ApiPointer(ptr->value));
+}
+
+void VariantVisitor::visit(trace::Repr *repr)
+{
+ /* TODO: Preserve both the human and machine value */
+ repr->humanValue->visit(*this);
+}
+
+ApiTraceEnumSignature::ApiTraceEnumSignature(const trace::EnumSig *sig)
+{
+ for (const trace::EnumValue *it = sig->values;
+ it != sig->values + sig->num_values; ++it) {
+ QPair<QString, signed long long> pair;
+
+ pair.first = QString::fromStdString(it->name);
+ pair.second = it->value;
+
+ m_names.append(pair);
+ }
+}
+
+QString ApiTraceEnumSignature::name(signed long long value) const
+{
+ for (ValueList::const_iterator it = m_names.begin();
+ it != m_names.end(); ++it) {
+ if (value == it->second) {
+ return it->first;
+ }
+ }
+ return QString::fromLatin1("%1").arg(value);
+}
+
+ApiEnum::ApiEnum(ApiTraceEnumSignature *sig, signed long long value)
+ : m_sig(sig), m_value(value)
+{
+}
+
+QString ApiEnum::toString() const
+{
+ if (m_sig) {
+ return m_sig->name(m_value);
+ }
+ Q_ASSERT(!"should never happen");
+ return QString();
+}
+
+QVariant ApiEnum::value() const
+{
+ if (m_sig) {
+ return QVariant::fromValue(m_value);
+ }
+ Q_ASSERT(!"should never happen");
+ return QVariant();
+}
+
+QString ApiEnum::name() const
+{
+ if (m_sig) {
+ return m_sig->name(m_value);
+ }
+ Q_ASSERT(!"should never happen");
+ return QString();
+}
+
+unsigned long long ApiBitmask::value() const
+{
+ return m_value;
+}
+
+ApiBitmask::Signature ApiBitmask::signature() const
+{
+ return m_sig;
+}
+
+ApiStruct::Signature ApiStruct::signature() const
+{
+ return m_sig;
+}
+
+QList<QVariant> ApiStruct::values() const
+{
+ return m_members;
+}
+
+ApiPointer::ApiPointer(unsigned long long val)
+ : m_value(val)
+{
+}
+
+
+unsigned long long ApiPointer::value() const
+{
+ return m_value;
+}
+
+QString ApiPointer::toString() const
+{
+ if (m_value)
+ return QString("0x%1").arg(m_value, 0, 16);
+ else
+ return QLatin1String("NULL");
+}
+
+ApiBitmask::ApiBitmask(const trace::Bitmask *bitmask)