[libvirt] [PATCH v4 3/8] screenshot: Implementing the public API

Daniel P. Berrange berrange at redhat.com
Fri May 13 09:14:08 UTC 2011


On Thu, May 12, 2011 at 06:29:10PM +0200, Michal Privoznik wrote:
> * src/libvirt.c: new function virDomainScreenshot
> ---
>  src/libvirt.c |   60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 60 insertions(+), 0 deletions(-)
> 
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 7564db0..914618d 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -2444,6 +2444,66 @@ error:
>  }
>  
>  /**
> + * virDomainScreenshot:
> + * @domain: a domain object
> + * @stream: stream to use as output
> + * @screen: monitor ID to take screenshot from
> + * @flags: extra flags, currently unused
> + *
> + * Take a screenshot of current domain console as a stream. The image format
> + * is hypervisor specific. Moreover, some hypervisors supports multiple
> + * displays per domain. These can be distinguished by @screen argument.

Need to document the semantics of 'screen' wrt to multiple devices
and multiple outputs.

> + *
> + * This call sets up a stream; subsequent use of stream API is necessary
> + * to transfer actual data, determine how much data is successfully
> + * transfered, and detect any errors.
> + *
> + * Returns a string representing the mime-type of the image format, or
> + * NULL upon error. The caller must free() the returned value.
> + */
> +char *
> +virDomainScreenshot(virDomainPtr domain,
> +                    virStreamPtr stream,
> +                    unsigned int screen,
> +                    unsigned int flags)
> +{
> +    VIR_DOMAIN_DEBUG(domain, "stream=%p flags=%u", stream, flags);
> +
> +    virResetLastError();
> +
> +    if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
> +        virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
> +        virDispatchError(NULL);
> +        return NULL;
> +    }
> +    if (!VIR_IS_STREAM(stream)) {
> +        virLibConnError(VIR_ERR_INVALID_STREAM, __FUNCTION__);
> +        return NULL;
> +    }
> +    if (domain->conn->flags & VIR_CONNECT_RO ||
> +        stream->conn->flags & VIR_CONNECT_RO) {
> +        virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
> +        goto error;
> +    }
> +
> +    if (domain->conn->driver->domainScreenshot) {
> +        char * ret;
> +        ret = domain->conn->driver->domainScreenshot(domain, stream,
> +                                                     screen, flags);
> +
> +        if (ret == NULL)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +
> +error:
> +    virDispatchError(domain->conn);
> +    return NULL;
> +}


ACK

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list