void SnapshotActionDialog::showSnapsotXMLDesc() { if ( snapshotTree->currentIndex().isValid() ) { TreeItem *item = static_cast<TreeItem*>( snapshotTree->currentIndex().internalPointer()); if ( NULL!=item ) { // flags: extra flags; not used yet, so callers should always pass 0 virDomainSnapshotPtr snapShot = virDomainSnapshotLookupByName( domain, item->data(0).toByteArray().data(), 0); char *xmlDesc = virDomainSnapshotGetXMLDesc(snapShot, 0); if ( NULL!=xmlDesc ) { QTemporaryFile f; f.setAutoRemove(false); f.setFileTemplate( QString("%1%2XML_Desc-XXXXXX.xml") .arg(QDir::tempPath()) .arg(QDir::separator())); bool read = f.open(); if (read) f.write(xmlDesc); QString xml = f.fileName(); f.close(); free(xmlDesc); QDesktopServices::openUrl(QUrl(xml)); }; }; }; }
void SnapshotActionDialog::addSnapshotChild(int row, const QModelIndex &parent, char *name) { // flags: extra flags; not used yet, so callers should always pass 0 virDomainSnapshotPtr snapShot = virDomainSnapshotLookupByName(domain, name, 0); char *xmlDesc = virDomainSnapshotGetXMLDesc(snapShot, 0); QString _desc; QString _data(" -- "); if ( NULL!=xmlDesc ) { QDomDocument doc; doc.setContent(QString(xmlDesc)); free(xmlDesc); QDomElement _el = doc .firstChildElement("domainsnapshot") .firstChildElement("creationTime"); if ( !_el.isNull() ) { _data.clear(); _data.append( QDateTime::fromMSecsSinceEpoch( _el.text().toULongLong()*1000) .toString("yyyy-MM-dd_HH:mm:ss")); }; _el = doc .firstChildElement("domainsnapshot") .firstChildElement("description"); if ( !_el.isNull() ) { _desc.clear(); _desc.append(_el.text()); }; }; // flags: extra flags; not used yet, so callers should always pass 0 int current = virDomainSnapshotIsCurrent(snapShot, 0); if ( NULL!=snapShot ) { model->insertRow(row, parent); model->setData(model->index(row, 0, parent), name, Qt::DisplayRole); model->setData(model->index(row, 0, parent), (current>0), Qt::DecorationRole); model->setData(model->index(row, 0, parent), _desc, Qt::ToolTipRole); model->setData(model->index(row, 1, parent), _data, Qt::DisplayRole); // By default, this command covers only direct children; use flag=0 int namesLen = virDomainSnapshotNumChildren(snapShot, 0); if ( namesLen>0 ) { char *names; int ret = virDomainSnapshotListChildrenNames( snapShot, &names, namesLen, 0); if ( ret>0 ) { for (int i = 0; i<ret; i++) { addSnapshotChild(i, model->index(row, 0, parent), (&names)[i]); }; }; }; virDomainSnapshotFree(snapShot); }; }
/** * gvir_domain_snapshot_get_config: * @snapshot: the domain_snapshot * @flags: the flags * * Returns: (transfer full): the config. The returned object should be * unreffed with g_object_unref() when no longer needed. */ GVirConfigDomainSnapshot *gvir_domain_snapshot_get_config (GVirDomainSnapshot *snapshot, guint flags, GError **err) { GVirDomainSnapshotPrivate *priv; gchar *xml; g_return_val_if_fail(GVIR_IS_DOMAIN_SNAPSHOT(snapshot), NULL); g_return_val_if_fail(err == NULL || *err == NULL, NULL); priv = snapshot->priv; if (!(xml = virDomainSnapshotGetXMLDesc(priv->handle, flags))) { gvir_set_error_literal(err, GVIR_DOMAIN_SNAPSHOT_ERROR, 0, "Unable to get domain_snapshot XML config"); return NULL; } GVirConfigDomainSnapshot *conf = gvir_config_domain_snapshot_new_from_xml(xml, err); free(xml); return conf; }