[libvirt] [PATCH] Spice: support auid, images and stream compression
Daniel P. Berrange
berrange at redhat.com
Wed Apr 13 18:20:31 UTC 2011
On Wed, Apr 13, 2011 at 04:37:00PM +0200, Michal Privoznik wrote:
> This extends the SPICE XML to allow variable compression settings for audio,
> images and streaming:
> <graphics type='spice' port='5901' tlsPort='-1' autoport='yes'>
> <image compression='auto_glz'/>
> <jpeg compression='auto'/>
> <zlib compression='auto'/>
> <playback compression='on'/>
> </graphics>
> +VIR_ENUM_IMPL(virDomainGraphicsSpiceImageCompression,
> + VIR_DOMAIN_GRAPHICS_SPICE_IMAGE_COMPRESSION_LAST,
> + "auto_glz",
> + "auto_lz",
> + "quic",
> + "glz",
> + "lz",
> + "off");
> +
> +VIR_ENUM_IMPL(virDomainGraphicsSpiceJpegCompression,
> + VIR_DOMAIN_GRAPHICS_SPICE_JPEG_COMPRESSION_LAST,
> + "auto",
> + "never",
> + "always");
> +
> +VIR_ENUM_IMPL(virDomainGraphicsSpiceZlibCompression,
> + VIR_DOMAIN_GRAPHICS_SPICE_ZLIB_COMPRESSION_LAST,
> + "auto",
> + "never",
> + "always");
> +
> +VIR_ENUM_IMPL(virDomainGraphicsSpicePlaybackCompression,
> + VIR_DOMAIN_GRAPHICS_SPICE_PLAYBACK_COMPRESSION_LAST,
> + "on",
> + "off");
> +
> @@ -3917,6 +3943,11 @@ virDomainGraphicsDefParseXML(xmlNodePtr node, int flags) {
> if (virDomainGraphicsAuthDefParseXML(node, &def->data.spice.auth) < 0)
> goto error;
>
> + def->data.spice.image = VIR_DOMAIN_GRAPHICS_SPICE_IMAGE_COMPRESSION_LAST;
> + def->data.spice.jpeg = VIR_DOMAIN_GRAPHICS_SPICE_JPEG_COMPRESSION_LAST;
> + def->data.spice.zlib = VIR_DOMAIN_GRAPHICS_SPICE_ZLIB_COMPRESSION_LAST;
> + def->data.spice.playback = VIR_DOMAIN_GRAPHICS_SPICE_PLAYBACK_COMPRESSION_LAST;
> +
Our normal coding practice is for the default setting to take the
value 0. Nothing should ever be assigned the value _LAST - that
only exists as a sentinal for the VIR_ENUM_IMPL() usage.
> @@ -3954,6 +3985,89 @@ virDomainGraphicsDefParseXML(xmlNodePtr node, int flags) {
> VIR_FREE(mode);
>
> def->data.spice.channels[nameval] = modeval;
> + } else if (xmlStrEqual(cur->name, BAD_CAST "image")) {
> + const char *compression = virXMLPropString(cur, "compression");
> + int compressionVal;
> +
> + if (!compression) {
> + virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("spice image missing compression"));
> + goto error;
> + }
> +
> + if ((compressionVal =
> + virDomainGraphicsSpiceImageCompressionTypeFromString(compression)) < 0) {
> + virDomainReportError(VIR_ERR_INTERNAL_ERROR,
> + _("unknown spice image compression %s"),
> + compression);
> + VIR_FREE(compression);
> + goto error;
> + }
> + VIR_FREE(compression);
> +
> + def->data.spice.image = compressionVal;
> + } else if (xmlStrEqual(cur->name, BAD_CAST "jpeg")) {
> + const char *compression = virXMLPropString(cur, "compression");
> + int compressionVal;
> +
> + if (!compression) {
> + virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("spice jpeg missing compression"));
> + goto error;
> + }
> +
> + if ((compressionVal =
> + virDomainGraphicsSpiceJpegCompressionTypeFromString(compression)) < 0) {
> + virDomainReportError(VIR_ERR_INTERNAL_ERROR,
> + _("unknown spice jpeg compression %s"),
> + compression);
> + VIR_FREE(compression);
> + goto error;
> + }
> + VIR_FREE(compression);
> +
> + def->data.spice.jpeg = compressionVal;
> + } else if (xmlStrEqual(cur->name, BAD_CAST "zlib")) {
> + const char *compression = virXMLPropString(cur, "compression");
> + int compressionVal;
> +
> + if (!compression) {
> + virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("spice zlib missing compression"));
> + goto error;
> + }
> +
> + if ((compressionVal =
> + virDomainGraphicsSpiceZlibCompressionTypeFromString(compression)) < 0) {
> + virDomainReportError(VIR_ERR_INTERNAL_ERROR,
> + _("unknown spice zlib compression %s"),
> + compression);
> + VIR_FREE(compression);
> + goto error;
> + }
> +
> + def->data.spice.zlib = compressionVal;
> + } else if (xmlStrEqual(cur->name, BAD_CAST "playback")) {
> + const char *compression = virXMLPropString(cur, "compression");
> + int compressionVal;
> +
> + if (!compression) {
> + virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("spice playback missing compression"));
> + goto error;
> + }
> +
> + if ((compressionVal =
> + virDomainGraphicsSpicePlaybackCompressionTypeFromString(compression)) < 0) {
> + virDomainReportError(VIR_ERR_INTERNAL_ERROR,
> + _("unknown spice playback compression"));
> + VIR_FREE(compression);
> + goto error;
> +
> + }
> + VIR_FREE(compression);
> +
> + def->data.spice.playback = compressionVal;
All the error cases where TypeFromString failed, ought to be using
VIR_ERR_CONFIG_UNSUPPORTED as the error code.
> @@ -7817,6 +7931,22 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
> virDomainGraphicsSpiceChannelNameTypeToString(i),
> virDomainGraphicsSpiceChannelModeTypeToString(mode));
> }
> + if (def->data.spice.image !=
> + VIR_DOMAIN_GRAPHICS_SPICE_IMAGE_COMPRESSION_LAST)
> + virBufferVSprintf(buf, " <image compression='%s'/>\n",
> + virDomainGraphicsSpiceImageCompressionTypeToString(def->data.spice.image));
> + if (def->data.spice.jpeg !=
> + VIR_DOMAIN_GRAPHICS_SPICE_JPEG_COMPRESSION_LAST)
> + virBufferVSprintf(buf, " <jpeg compression='%s'/>\n",
> + virDomainGraphicsSpiceJpegCompressionTypeToString(def->data.spice.jpeg));
> + if (def->data.spice.zlib !=
> + VIR_DOMAIN_GRAPHICS_SPICE_ZLIB_COMPRESSION_LAST)
> + virBufferVSprintf(buf, " <zlib compression='%s'/>\n",
> + virDomainGraphicsSpiceZlibCompressionTypeToString(def->data.spice.zlib));
> + if (def->data.spice.playback !=
> + VIR_DOMAIN_GRAPHICS_SPICE_PLAYBACK_COMPRESSION_LAST)
> + virBufferVSprintf(buf, " <playback compression='%s'/>\n",
> + virDomainGraphicsSpicePlaybackCompressionTypeToString(def->data.spice.playback));
This is related to the earlier note about default values being
zero. If we want to have these sub-elements skipped, then the
enums should likely get an additional entry '_DEFAULT' with
value zero, and then you can just do
if (def->data.spice.playback)
virBufferVSprintf(....)
Regards,
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