+ if (variant.canConvert<ApiEnum>()) {
+ return variant.value<ApiEnum>().toString();
+ }
+
+ return QString();
+}
+
+
+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::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(
+ QString::fromStdString(e->sig->name),
+ QVariant(e->sig->value));
+ if (m_loader) {
+ m_loader->addEnumSignature(e->sig->id, sig);
+ }
+ }
+
+ m_variant = QVariant::fromValue(ApiEnum(sig));
+}
+
+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)
+{
+ //XXX
+ //FIXME: this is a nasty hack. Trace::Blob's can't
+ // delete the contents in the destructor because
+ // the data is being used by other calls. We piggy back
+ // on that assumption and don't deep copy the data. If
+ // Blob's will start deleting the data we will need to
+ // start deep copying it or switch to using something like
+ // Boost's shared_ptr or Qt's QSharedPointer to handle it
+ blob->toPointer(true);
+ QByteArray barray = QByteArray::fromRawData(blob->buf, blob->size);
+ m_variant = QVariant(barray);
+}
+
+void VariantVisitor::visit(Trace::Pointer *ptr)
+{
+ m_variant = QVariant::fromValue(ApiPointer(ptr->value));
+}
+
+
+ApiEnum::ApiEnum(ApiTraceEnumSignature *sig)
+ : m_sig(sig)
+{
+}
+
+QString ApiEnum::toString() const
+{
+ if (m_sig) {
+ return m_sig->name();
+ }
+ Q_ASSERT(!"should never happen");
+ return QString();
+}
+
+QVariant ApiEnum::value() const
+{
+ if (m_sig) {
+ return m_sig->value();
+ }
+ Q_ASSERT(!"should never happen");
+ return QVariant();
+}