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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list