+#endif
+
+class EditVisitor : public trace::Visitor
+{
+public:
+ EditVisitor(const QVariant &variant)
+ : m_variant(variant),
+ m_editedValue(0)
+ {}
+ virtual void visit(trace::Null *val)
+ {
+ m_editedValue = val;
+ }
+
+ virtual void visit(trace::Bool *node)
+ {
+// Q_ASSERT(m_variant.userType() == QVariant::Bool);
+ bool var = m_variant.toBool();
+ m_editedValue = new trace::Bool(var);
+ }
+
+ virtual void visit(trace::SInt *node)
+ {
+// Q_ASSERT(m_variant.userType() == QVariant::Int);
+ m_editedValue = new trace::SInt(m_variant.toInt());
+ }
+
+ virtual void visit(trace::UInt *node)
+ {
+// Q_ASSERT(m_variant.userType() == QVariant::UInt);
+ m_editedValue = new trace::SInt(m_variant.toUInt());
+ }
+
+ virtual void visit(trace::Float *node)
+ {
+ m_editedValue = new trace::Float(m_variant.toFloat());
+ }
+
+ virtual void visit(trace::Double *node)
+ {
+ m_editedValue = new trace::Double(m_variant.toDouble());
+ }
+
+ virtual void visit(trace::String *node)
+ {
+ QString str = m_variant.toString();
+ char *newString = new char[str.length() + 1];
+ QByteArray ba = str.toLocal8Bit();
+ strcpy(newString, ba.constData());
+ m_editedValue = new trace::String(newString);
+ }
+
+ virtual void visit(trace::Enum *e)
+ {
+ m_editedValue = e;
+ }
+
+ virtual void visit(trace::Bitmask *bitmask)
+ {
+ m_editedValue = bitmask;
+ }
+
+ virtual void visit(trace::Struct *str)
+ {
+ m_editedValue = str;
+ }
+
+ virtual void visit(trace::Array *array)
+ {
+ ApiArray apiArray = m_variant.value<ApiArray>();
+ QVector<QVariant> vals = apiArray.values();
+
+ trace::Array *newArray = new trace::Array(vals.count());
+ for (int i = 0; i < vals.count(); ++i) {
+ EditVisitor visitor(vals[i]);
+ array->values[i]->visit(visitor);
+ if (array->values[i] == visitor.value()) {
+ //non-editabled
+ delete newArray;
+ m_editedValue = array;
+ return;
+ }
+
+ newArray->values[i] = visitor.value();
+ }
+ m_editedValue = newArray;
+ }
+
+ virtual void visit(trace::Blob *blob)
+ {
+ m_editedValue = blob;
+ }
+
+ virtual void visit(trace::Pointer *ptr)
+ {
+ m_editedValue = ptr;
+ }
+
+ trace::Value *value() const
+ {
+ return m_editedValue;
+ }
+private:
+ QVariant m_variant;
+ trace::Value *m_editedValue;
+};
+
+static void
+overwriteValue(trace::Call *call, const QVariant &val, int index)
+{
+ EditVisitor visitor(val);
+ trace::Value *origValue = call->args[index].value;
+ origValue->visit(visitor);
+
+ if (visitor.value() && origValue != visitor.value()) {
+ delete origValue;
+ call->args[index].value = visitor.value();
+ }
+}