static void gvir_domain_snapshot_finalize(GObject *object)
{
    GVirDomainSnapshot *snapshot = GVIR_DOMAIN_SNAPSHOT(object);
    GVirDomainSnapshotPrivate *priv = snapshot->priv;

    virDomainSnapshotFree(priv->handle);

    G_OBJECT_CLASS(gvir_domain_snapshot_parent_class)->finalize(object);
}
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);
    };
}
static void gvir_domain_snapshot_set_property(GObject *object,
                                              guint prop_id,
                                              const GValue *value,
                                              GParamSpec *pspec)
{
    GVirDomainSnapshot *snapshot = GVIR_DOMAIN_SNAPSHOT(object);
    GVirDomainSnapshotPrivate *priv = snapshot->priv;

    switch (prop_id) {
    case PROP_HANDLE:
        if (priv->handle)
            virDomainSnapshotFree(priv->handle);
        priv->handle = g_value_dup_boxed(value);
        break;

    default:
        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
    }
}
static void
gvir_domain_snapshot_handle_free(GVirDomainSnapshotHandle *src)
{
    virDomainSnapshotFree((virDomainSnapshotPtr)src);
}