#include "piintrospector.h" #include #include #include "pifile.h" #include "pitime.h" #include "pidir.h" #include "pichunkstream.h" #include "ccm_piintrospector.h" QPIIntrospector::QPIIntrospector(QWidget * parent): EMainWindow(parent), peer("__introspection_client__") { setupUi(this); request_timer = 0; session.setFile("qpiintrospector_session.conf"); #if QT_VERSION >= 0x050000 //treeContainers->header()->setSectionResizeMode(QHeaderView::ResizeToContents); #else //treeContainers->header()->setResizeMode(QHeaderView::ResizeToContents); #endif CONNECTU_QUEUED(&peer, peerConnectedEvent, this, peersChanged, this); CONNECTU_QUEUED(&peer, peerDisconnectedEvent, this, peersChanged, this); CONNECTU_QUEUED(&peer, dataReceivedEvent, this, peerReceived, this); CONNECTU(&peer, peerConnectedEvent, this, reqProcPIEvents); CONNECTU(&peer, peerDisconnectedEvent, this, reqProcPIEvents); CONNECTU(&peer, dataReceivedEvent, this, reqProcPIEvents); session.addEntry(this); session.addEntry(tabWidgetMain); PICodeInfo::EnumInfo * ei = PICodeInfo::enumsInfo->value("PIIntrospection::InfoTypes"); if (ei) { piForeachC (PICodeInfo::EnumeratorInfo & e, ei->members) { QCheckBox * cb = new QCheckBox(PI2QString(e.name.mid(2))); cb->setObjectName(QString("checkRequest%1").arg(e.value)); cb->setProperty("__value__", e.value); layoutRequestFlags->addWidget(cb); session.addEntry(cb); } } //startTimer(100); session.load(); peer.start(); } QPIIntrospector::~QPIIntrospector() { session.save(); peer.stop(); } void QPIIntrospector::changeEvent(QEvent * e) { EMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); break; default: break; } } void QPIIntrospector::timerEvent(QTimerEvent * e) { if (e->timerId() == request_timer) buttonRequest->click(); } void QPIIntrospector::buildTree(QByteArray d) { /*PIVector threads; PIByteArray pd = Q2PIByteArray(d); pd >> threads; treeContainers->clear(); piForeachC (PIIntrospectionThreads::ThreadInfo & t, threads) { QTreeWidgetItem * ti = new QTreeWidgetItem(); ti->setText(0, QString(PI2QString(t.name) + " (%1)").arg(t.id)); treeContainers->addTopLevelItem(ti); }*/ } void QPIIntrospector::procRequestTimer() { if (request_timer != 0) killTimer(request_timer); request_timer = 0; if (!checkRequestTimer->isChecked()) return; request_timer = startTimer(1000 / spinRequestTimerHz->value()); } void QPIIntrospector::buildDumpSection(QTreeWidgetItem * pi, PIString & str) { } #ifdef PIP_INTROSPECTION void QPIIntrospector::showInfo(const PIIntrospection::ProcessInfo & info) { PIString s; s << info.execCommand << "\n"; s << info.execDateTime.toString() << "\n"; s << info.OS_name << "(" << info.OS_version << ", " << info.architecture << ")\n"; s << info.user << "\n"; s << info.build_options.join(", "); labelInfo->setText(PI2QString(s)); } #endif void QPIIntrospector::on_listApp_currentRowChanged(int r) { PIString cs; if (r < 0) cs.clear(); else cs = Q2PIString(listApp->item(r)->text()); if (cur_server != cs) widgetContainers->clear(); cur_server = cs; } void QPIIntrospector::peerReceived(const PIString & from, const PIByteArray & data) { if (from != cur_server) return; //piCout << "rec" << data.size(); #ifdef PIP_INTROSPECTION PIByteArray ba(data); if (ba.size_s() < 4) return; uint sign(0); ba >> sign; if (sign != PIIntrospection::sign) return; PIChunkStream cs(ba); PIByteArray pba; while (!cs.atEnd()) { switch (cs.read()) { case PIIntrospection::itInfo: { cs.get(pba); PIIntrospection::ProcessInfo info; PIIntrospection::unpackInfo(pba, info); showInfo(info); } break; case PIIntrospection::itProcStat: { cs.get(pba); PIIntrospection::ProcessStat stat; PIIntrospection::unpackProcStat(pba, stat); //showInfo(info); } break; case PIIntrospection::itContainers: { cs.get(pba); PIMap data; PIMap typenames; PIIntrospection::unpackContainers(pba, data, typenames); widgetContainers->showContainers(data, typenames); } break; case PIIntrospection::itObjects: { cs.get(pba); PIVector objects; PIIntrospection::unpackObjects(pba, objects); widgetObjects->showObjects(objects); } break; case PIIntrospection::itThreads: { cs.get(pba); PIVector threads; PIIntrospection::unpackThreads(pba, threads); widgetThreads->showThreads(threads); } break; default: break; } } #endif } void QPIIntrospector::peersChanged(const PIString & name) { listApp->blockSignals(true); QString cs = listApp->currentItem() ? listApp->currentItem()->text() : ""; listApp->clear(); peer.lock(); piForeachC (PIPeer::PeerInfo & p, peer.allPeers()) { QString pn = PI2QString(p.name); listApp->addItem(pn); if (pn == cs) listApp->setCurrentRow(listApp->count() - 1); } peer.unlock(); listApp->blockSignals(false); } void QPIIntrospector::on_buttonRequest_clicked() { if (cur_server.isEmpty()) return; #ifdef PIP_INTROSPECTION PIIntrospection::RequiredInfo info; for (int i = 0; i < layoutRequestFlags->count(); ++i) { QCheckBox * cb = qobject_cast(layoutRequestFlags->itemAt(i)->widget()); if (!cb) continue; if (!cb->isChecked()) continue; info.types |= cb->property("__value__").toInt(); } PIByteArray ba; ba << PIIntrospection::sign << info; peer.send(cur_server, ba); #endif }