1 #include "apitracecall.h"
3 #include "trace_model.hpp"
7 ApiPointer::ApiPointer(int val)
12 QString ApiPointer::toString() const
15 return QString("0x%1").arg(m_value, 0, 16);
17 return QLatin1String("NULL");
20 QString apiVariantToString(const QVariant &variant)
22 if (variant.userType() == QVariant::Double) {
23 return QString::number(variant.toFloat());
26 if (variant.userType() < QVariant::UserType) {
27 return variant.toString();
30 if (variant.canConvert<ApiPointer>()) {
31 return variant.value<ApiPointer>().toString();
33 if (variant.canConvert<ApiBitmask>()) {
34 return variant.value<ApiBitmask>().toString();
36 if (variant.canConvert<ApiStruct>()) {
37 return variant.value<ApiStruct>().toString();
39 if (variant.canConvert<ApiArray>()) {
40 return variant.value<ApiArray>().toString();
46 ApiBitmask::ApiBitmask(const Trace::Bitmask *bitmask)
53 void ApiBitmask::init(const Trace::Bitmask *bitmask)
58 m_value = bitmask->value;
59 for (Trace::Bitmask::Signature::const_iterator it = bitmask->sig->begin();
60 it != bitmask->sig->end(); ++it) {
62 QPair<QString, unsigned long long> pair;
64 pair.first = QString::fromStdString(it->first);
65 pair.second = it->second;
71 QString ApiBitmask::toString() const
74 unsigned long long value = m_value;
76 for (Signature::const_iterator it = m_sig.begin();
77 value != 0 && it != m_sig.end(); ++it) {
79 if ((value & it->second) == it->second) {
81 str += QLatin1String(" | ");
90 str += QLatin1String(" | ");
92 str += QString::fromLatin1("0x%1").arg(value, 0, 16);
97 ApiStruct::ApiStruct(const Trace::Struct *s)
102 QString ApiStruct::toString() const
106 str += QLatin1String("{");
107 for (unsigned i = 0; i < m_members.count(); ++i) {
108 str += m_sig.memberNames[i];
109 str += QLatin1String(" = ");
110 str += apiVariantToString(m_members[i]);
111 if (i < m_members.count() - 1)
112 str += QLatin1String(", ");
114 str += QLatin1String("}");
119 void ApiStruct::init(const Trace::Struct *s)
124 m_sig.name = QString::fromStdString(s->sig->name);
125 for (unsigned i = 0; i < s->members.size(); ++i) {
127 m_sig.memberNames.append(
128 QString::fromStdString(s->sig->member_names[i]));
129 s->members[i]->visit(vis);
130 m_members.append(vis.variant());
134 void VariantVisitor::visit(Trace::Null *)
136 m_variant = QVariant(QLatin1String("NULL"));
139 void VariantVisitor::visit(Trace::Bool *node)
141 m_variant = QVariant(node->value);
144 void VariantVisitor::visit(Trace::SInt *node)
146 m_variant = QVariant(node->value);
149 void VariantVisitor::visit(Trace::UInt *node)
151 m_variant = QVariant(node->value);
154 void VariantVisitor::visit(Trace::Float *node)
156 m_variant = QVariant(node->value);
159 void VariantVisitor::visit(Trace::String *node)
161 m_variant = QVariant(QString::fromStdString(node->value));
164 void VariantVisitor::visit(Trace::Enum *e)
166 m_variant = QVariant(QString::fromStdString(e->sig->first));
169 void VariantVisitor::visit(Trace::Bitmask *bitmask)
171 m_variant = QVariant::fromValue(ApiBitmask(bitmask));
174 void VariantVisitor::visit(Trace::Struct *str)
176 m_variant = QVariant::fromValue(ApiStruct(str));
179 void VariantVisitor::visit(Trace::Array *array)
181 m_variant = QVariant::fromValue(ApiArray(array));
184 void VariantVisitor::visit(Trace::Blob *blob)
186 QByteArray barray = QByteArray::fromRawData(blob->buf, blob->size);
187 m_variant = QVariant(barray);
190 void VariantVisitor::visit(Trace::Pointer *ptr)
192 m_variant = QVariant::fromValue(ApiPointer(ptr->value));
195 ApiArray::ApiArray(const Trace::Array *arr)
200 QString ApiArray::toString() const
203 str += QLatin1String("[");
204 for(int i = 0; i < m_array.count(); ++i) {
205 const QVariant &var = m_array[i];
206 str += apiVariantToString(var);
207 if (i < m_array.count() - 1)
208 str += QLatin1String(", ");
210 str += QLatin1String("]");
215 void ApiArray::init(const Trace::Array *arr)
220 for (int i = 0; i < arr->values.size(); ++i) {
222 arr->values[i]->visit(vis);
224 m_array.append(vis.variant());
228 QStaticText ApiTraceCall::staticText() const
230 if (!m_staticText.text().isEmpty())
233 QString richText = QString::fromLatin1("<span style=\"font-weight:bold\">%1</span>(").arg(name);
234 for (int i = 0; i < argNames.count(); ++i) {
235 richText += QLatin1String("<span style=\"color:#0000ff\">");
236 richText += apiVariantToString(argValues[i]);
237 richText += QLatin1String("</span>");
238 if (i < argNames.count() - 1)
239 richText += QString::fromLatin1(", ");
241 richText += QLatin1String(")");
243 m_staticText.setText(richText);
245 opt.setWrapMode(QTextOption::NoWrap);
246 m_staticText.setTextOption(opt);
247 m_staticText.prepare();
252 QString ApiTraceCall::toHtml() const
254 if (!m_richText.isEmpty())
257 m_richText = QString::fromLatin1("<span style=\"font-weight:bold\">%1</span>(").arg(name);
258 for (int i = 0; i < argNames.count(); ++i) {
259 m_richText += argNames[i];
260 m_richText += QString::fromLatin1(" = ");
261 m_richText += QLatin1String("<span style=\"color:#0000ff\">");
262 m_richText += apiVariantToString(argValues[i]);
263 m_richText += QLatin1String("</span>");
264 if (i < argNames.count() - 1)
265 m_richText += QString::fromLatin1(", ");
267 m_richText += QLatin1String(")");
269 if (returnValue.isValid()) {
270 m_richText += QLatin1String(" = ");
271 m_richText += QLatin1String("<span style=\"color:#0000ff\">");
272 m_richText += apiVariantToString(returnValue);
273 m_richText += QLatin1String("</span>");
278 QString ApiTraceCall::filterText() const
280 if (!m_filterText.isEmpty())
284 for (int i = 0; i < argNames.count(); ++i) {
285 m_filterText += argNames[i];
286 m_filterText += QString::fromLatin1(" = ");
287 m_filterText += apiVariantToString(argValues[i]);
288 if (i < argNames.count() - 1)
289 m_filterText += QString::fromLatin1(", ");
291 m_filterText += QLatin1String(")");
293 if (returnValue.isValid()) {
294 m_filterText += QLatin1String(" = ");
295 m_filterText += apiVariantToString(returnValue);