+ if (m_captureState || m_captureThumbnails) {
+ if (m_captureState) {
+ bool ok = false;
+ output = m_process->readAllStandardOutput();
+ QVariantMap parsedJson = m_jsonParser->parse(output, &ok).toMap();
+ ApiTraceState *state = new ApiTraceState(parsedJson);
+ emit foundState(state);
+ msg = tr("State fetched.");
+ }
+ if (m_captureThumbnails) {
+ m_process->setReadChannel(QProcess::StandardOutput);
+
+ QList<QImage> thumbnails;
+
+ while (!m_process->atEnd()) {
+ unsigned channels = 0;
+ unsigned width = 0;
+ unsigned height = 0;
+
+ char header[512];
+ qint64 headerSize = 0;
+ int headerLines = 3; // assume no optional comment line
+
+ for (int headerLine = 0; headerLine < headerLines; ++headerLine) {
+ qint64 headerRead = m_process->readLine(&header[headerSize], sizeof(header) - headerSize);
+
+ // if header actually contains optional comment line, ...
+ if (headerLine == 1 && header[headerSize] == '#') {
+ ++headerLines;
+ }
+
+ headerSize += headerRead;
+ }
+
+ const char *headerEnd = image::readPNMHeader(header, headerSize, &channels, &width, &height);
+
+ // if invalid PNM header was encountered, ...
+ if (header == headerEnd) {
+ qDebug() << "error: invalid snapshot stream encountered\n";
+ break;
+ }
+
+ //qDebug() << "channels: " << channels << ", width: " << width << ", height: " << height << "\n";
+
+ QImage snapshot = QImage(width, height, channels == 1 ? QImage::Format_Mono : QImage::Format_RGB888);
+
+ int rowBytes = channels * width;
+ for (int y = 0; y < height; ++y) {
+ unsigned char *scanLine = snapshot.scanLine(y);
+ m_process->read((char *) scanLine, rowBytes);
+ }
+
+ QImage thumbnail = snapshot.scaled(16, 16, Qt::KeepAspectRatio, Qt::FastTransformation);
+ thumbnails.append(thumbnail);
+ }
+
+ emit foundThumbnails(thumbnails);
+ msg = tr("Thumbnails fetched.");
+ }