void pci_hostHlpThread::run() { if ( NULL==ptr_ConnPtr || NULL==*ptr_ConnPtr ) { emit ptrIsNull(); return; }; if ( virConnectRef(*ptr_ConnPtr)<0 ) { sendConnErrors(); return; }; QStringList devices; virNodeDevice **nodeDevices = NULL; unsigned int flags = VIR_CONNECT_LIST_NODE_DEVICES_CAP_PCI_DEV; int ret = virConnectListAllNodeDevices(*ptr_ConnPtr, &nodeDevices, flags); if ( ret<0 ) { sendConnErrors(); } else { // therefore correctly to use for() command, because networks[0] can not exist. for (int i = 0; i < ret; i++) { devices.append( QString("%1\n") // flags: extra flags; not used yet, // so callers should always pass 0 .arg(virNodeDeviceGetXMLDesc(nodeDevices[i], 0))); virNodeDeviceFree(nodeDevices[i]); }; if (nodeDevices) free(nodeDevices); }; //int devs = virNodeNumOfDevices(ptr_ConnPtr, NULL, 0); if ( virConnectClose(*ptr_ConnPtr)<0 ) sendConnErrors(); emit result(devices); }
/* private slots */ void USB_Host_Device::setAvailabledUSBDevices() { int i = 0; QStringList devices; virNodeDevice **nodeDevices = NULL; if ( currWorkConnect!=NULL ) { unsigned int flags = VIR_CONNECT_LIST_NODE_DEVICES_CAP_USB_DEV; int ret = virConnectListAllNodeDevices(currWorkConnect, &nodeDevices, flags); if ( ret<0 ) { sendConnErrors(); } else { while ( nodeDevices[i] != NULL ) { devices.append( QString("%1\n") // flags: extra flags; not used yet, // so callers should always pass 0 .arg(virNodeDeviceGetXMLDesc(nodeDevices[i], 0))); virNodeDeviceFree(nodeDevices[i]); i++; }; }; free(nodeDevices); }; //int devs = virNodeNumOfDevices(currWorkConnect, NULL, 0); //qDebug()<<"Devices("<<devs<<i<<"):\n"<<devices.join("\n"); // set unique device description to devList foreach (QString _dev, devices) { //qDebug()<<_dev; QString devName, devIdentity; QDomElement capability, product, vendor; QDomDocument doc = QDomDocument(); doc.setContent(_dev); // filter out **** Host Controllers if ( !doc. firstChildElement("device"). firstChildElement("parent"). firstChild().toText().data(). startsWith("usb") ) continue; // capability = doc.firstChildElement("device"). firstChildElement("capability"); product = capability.firstChildElement("product"); vendor = capability.firstChildElement("vendor"); // devIdentity format: <vendor:product> devIdentity.append(vendor.attribute("id")); devIdentity.append(":"); devIdentity.append(product.attribute("id")); // devName format: <vendor_product> devName.append(vendor.firstChild().toText().data()); devName.append("\n"); devName.append(product.firstChild().toText().data()); if ( devList->findItems(devName, Qt::MatchExactly | Qt::MatchCaseSensitive) .isEmpty() ) { devList->insertItem(0, devName); devList->item(0)->setData(Qt::UserRole, devIdentity); }; };
/** * gvir_node_device_get_config: * @device: the node_device * @flags: the flags * @err: Place-holder for possible errors * * Returns: (transfer full): the config. The returned object should be * unreffed with g_object_unref() when no longer needed. */ GVirConfigNodeDevice *gvir_node_device_get_config(GVirNodeDevice *device, guint flags, GError **err) { GVirNodeDevicePrivate *priv; gchar *xml; g_return_val_if_fail(GVIR_IS_NODE_DEVICE(device), NULL); g_return_val_if_fail(err == NULL || *err == NULL, NULL); priv = device->priv; if (!(xml = virNodeDeviceGetXMLDesc(priv->handle, flags))) { gvir_set_error_literal(err, GVIR_NODE_DEVICE_ERROR, 0, "Unable to get node_device XML config"); return NULL; } GVirConfigNodeDevice *conf = gvir_config_node_device_new_from_xml(xml, err); free(xml); return conf; }
/* private slots */ void PCI_Host_Device::setAvailabledPCIDevices() { int i = 0; QStringList devices; virNodeDevice **nodeDevices = NULL; if ( currWorkConnect!=NULL ) { unsigned int flags = VIR_CONNECT_LIST_NODE_DEVICES_CAP_PCI_DEV; int ret = virConnectListAllNodeDevices(currWorkConnect, &nodeDevices, flags); if ( ret<0 ) { sendConnErrors(); } else { while ( nodeDevices[i] != NULL ) { devices.append( QString("%1\n") // flags: extra flags; not used yet, // so callers should always pass 0 .arg(virNodeDeviceGetXMLDesc(nodeDevices[i], 0))); virNodeDeviceFree(nodeDevices[i]); i++; }; }; free(nodeDevices); }; //int devs = virNodeNumOfDevices(currWorkConnect, NULL, 0); //qDebug()<<"Devices("<<devs<<i<<"):\n"<<devices.join("\n"); // set unique device description to devList // WARNING: PCI devices can only be described by their address. foreach (QString _dev, devices) { //qDebug()<<_dev; QString devName, devIdentity; QDomElement capability, domain, bus, slot, function, vendor, product; QDomDocument doc = QDomDocument(); doc.setContent(_dev); capability = doc.firstChildElement("device"). firstChildElement("capability"); domain = capability.firstChildElement("domain"); bus = capability.firstChildElement("bus"); slot = capability.firstChildElement("slot"); function = capability.firstChildElement("function"); vendor = capability.firstChildElement("vendor"); product = capability.firstChildElement("product"); // devIdentity format: <domain:bus:slot:function> devIdentity.append(domain.firstChild().toText().data()); devIdentity.append(":"); devIdentity.append(bus.firstChild().toText().data()); devIdentity.append(":"); devIdentity.append(slot.firstChild().toText().data()); devIdentity.append(":"); devIdentity.append(function.firstChild().toText().data()); // devName format: <vendor_product> devName.append(vendor.firstChild().toText().data()); devName.append("\n"); devName.append(product.firstChild().toText().data()); if ( devList->findItems(devName, Qt::MatchExactly | Qt::MatchCaseSensitive) .isEmpty() ) { devList->insertItem(0, devName); devList->item(0)->setData(Qt::UserRole, devIdentity); }; };