#include "apitrace.h"
#include "loaderthread.h"
+#include "saverthread.h"
#include <QDir>
this, SIGNAL(startedLoadingTrace()));
connect(m_loader, SIGNAL(finished()),
this, SIGNAL(finishedLoadingTrace()));
+
+ m_saver = new SaverThread(this);
}
ApiTrace::~ApiTrace()
qDeleteAll(m_calls);
qDeleteAll(m_frames);
delete m_loader;
+ delete m_saver;
}
bool ApiTrace::isCallAFrameMarker(const ApiTraceCall *call,
QDir dir;
dir.mkpath(fi.absolutePath());
m_needsSaving = false;
+
+ m_saver->saveFile(m_tempFileName, m_calls);
}
#include "apitrace.moc"
sig->values = values;
int i = 0;
- for (itr != bsig.constBegin(); itr != bsig.constEnd(); ++itr, ++i) {
+ for (itr = bsig.constBegin(); itr != bsig.constEnd(); ++itr, ++i) {
values[i].name = qstrdup(itr->first.toLocal8Bit());
values[i].value = itr->second;
}
int enumType = QMetaType::type("ApiEnum");
int type = var.userType();
+ Trace::BeginArg(++id);
switch(type) {
case QVariant::Bool:
- case QVariant::ByteArray:
+ Trace::LiteralBool(var.toBool());
+ break;
+ case QVariant::ByteArray: {
+ QByteArray ba = var.toByteArray();
+ Trace::LiteralBlob((const void*)ba.constData(), ba.size());
+ }
+ break;
case QVariant::Double:
+ Trace::LiteralFloat(var.toDouble());
+ break;
+ case QMetaType::Float:
+ Trace::LiteralFloat(var.toFloat());
+ break;
case QVariant::Int:
+ Trace::LiteralSInt(var.toInt());
+ break;
case QVariant::LongLong:
- case QVariant::String:
+ Trace::LiteralSInt(var.toLongLong());
+ break;
+ case QVariant::String: {
+ QString str = var.toString();
+ Trace::LiteralString(str.toLocal8Bit().constData(), str.length());
+ }
+ break;
case QVariant::UInt:
+ Trace::LiteralUInt(var.toInt());
+ break;
case QVariant::ULongLong:
+ Trace::LiteralUInt(var.toLongLong());
+ break;
default:
if (type == arrayType) {
ApiArray array = var.value<ApiArray>();
Trace::EnumSig *sig = createEnumSig(apiEnum, ++id);
Trace::LiteralEnum(sig);
deleteEnumSig(sig);
- } else if (type == QVariant::ByteArray) {
- QByteArray ba = var.toByteArray();
- Trace::LiteralBlob((const void*)ba.constData(), ba.size());
} else {
qWarning()<<"Unsupported write variant : "
<< QMetaType::typeName(type);
}
}
+ Trace::EndArg();
}
void SaverThread::run()
{
-
- Trace::Open();
+ qputenv("TRACE_PATH", m_fileName.toLocal8Bit());
unsigned id = 0;
+ Trace::Open();
for (int i = 0; i < m_calls.count(); ++i) {
ApiTraceCall *call = m_calls[i];
Trace::FunctionSig *funcSig = createFunctionSig(call, ++id);
//args
QVariantList vars = call->arguments();
foreach(QVariant var, vars) {
- writeArgument(var, id);
+ writeArgument(var, ++id);
}
}
Trace::EndEnter();
QVariant ret = call->returnValue();
if (!ret.isNull()) {
Trace::BeginReturn();
- writeArgument(ret, id);
+ writeArgument(ret, ++id);
Trace::EndReturn();
}
}
deleteFunctionSig(funcSig);
}
-
Trace::Close();
emit traceSaved(m_fileName);