# -*- Mode: Python -*-
# vim: filetype=python
#

##
# = QMP monitor control
##

##
# @qmp_capabilities:
#
# Enable QMP capabilities.
#
# @enable: An optional list of QMPCapability values to enable.  The
#     client must not enable any capability that is not mentioned in
#     the QMP greeting message.  If the field is not provided, it
#     means no QMP capabilities will be enabled.  (since 2.12)
#
# .. qmp-example::
#
#     -> { "execute": "qmp_capabilities",
#          "arguments": { "enable": [ "oob" ] } }
#     <- { "return": {} }
#
# .. note:: This command is valid exactly when first connecting: it
#    must be issued before any other command will be accepted, and
#    will fail once the monitor is accepting other commands.  (see
#    :doc:`/interop/qmp-spec`)
#
# .. note:: The QMP client needs to explicitly enable QMP
#    capabilities, otherwise all the QMP capabilities will be turned
#    off by default.
#
# Since: 0.13
##
{ 'command': 'qmp_capabilities',
  'data': { '*enable': [ 'QMPCapability' ] },
  'allow-preconfig': true }

##
# @QMPCapability:
#
# Enumeration of capabilities to be advertised during initial client
# connection, used for agreeing on particular QMP extension behaviors.
#
# @oob: QMP ability to support out-of-band requests.  (Please refer to
#     qmp-spec.rst for more information on OOB)
#
# Since: 2.12
##
{ 'enum': 'QMPCapability',
  'data': [ 'oob' ] }

##
# @VersionTriple:
#
# A three-part version number.
#
# @major: The major version number.
#
# @minor: The minor version number.
#
# @micro: The micro version number.
#
# Since: 2.4
##
{ 'struct': 'VersionTriple',
  'data': {'major': 'int', 'minor': 'int', 'micro': 'int'} }

##
# @VersionInfo:
#
# A description of QEMU's version.
#
# @qemu: The version of QEMU.  By current convention, a micro version
#     of 50 signifies a development branch.  A micro version greater
#     than or equal to 90 signifies a release candidate for the next
#     minor version.  A micro version of less than 50 signifies a
#     stable release.
#
# @package: QEMU will always set this field to an empty string.
#     Downstream versions of QEMU should set this to a non-empty
#     string.  The exact format depends on the downstream however it
#     highly recommended that a unique name is used.
#
# Since: 0.14
##
{ 'struct': 'VersionInfo',
  'data': {'qemu': 'VersionTriple', 'package': 'str'} }

##
# @query-version:
#
# Returns the current version of QEMU.
#
# Returns: A @VersionInfo object describing the current version of
#     QEMU.
#
# Since: 0.14
#
# .. qmp-example::
#
#     -> { "execute": "query-version" }
#     <- {
#           "return":{
#              "qemu":{
#                 "major":0,
#                 "minor":11,
#                 "micro":5
#              },
#              "package":""
#           }
#        }
##
{ 'command': 'query-version', 'returns': 'VersionInfo',
  'allow-preconfig': true }

##
# @CommandInfo:
#
# Information about a QMP command
#
# @name: The command name
#
# Since: 0.14
##
{ 'struct': 'CommandInfo', 'data': {'name': 'str'} }

##
# @query-commands:
#
# Return a list of supported QMP commands by this server
#
# Returns: A list of @CommandInfo for all supported commands
#
# Since: 0.14
#
# .. qmp-example::
#
#     -> { "execute": "query-commands" }
#     <- {
#          "return":[
#             {
#                "name":"query-balloon"
#             },
#             {
#                "name":"system_powerdown"
#             },
#             ...
#          ]
#        }
#
# This example has been shortened as the real response is too long.
##
{ 'command': 'query-commands', 'returns': ['CommandInfo'],
  'allow-preconfig': true }

##
# @quit:
#
# This command will cause the QEMU process to exit gracefully.  While
# every attempt is made to send the QMP response before terminating,
# this is not guaranteed.  When using this interface, a premature EOF
# would not be unexpected.
#
# Since: 0.14
#
# .. qmp-example::
#
#     -> { "execute": "quit" }
#     <- { "return": {} }
##
{ 'command': 'quit',
  'allow-preconfig': true }

##
# @MonitorMode:
#
# An enumeration of monitor modes.
#
# @readline: HMP monitor (human-oriented command line interface)
#
# @control: QMP monitor (JSON-based machine interface)
#
# Since: 5.0
##
{ 'enum': 'MonitorMode', 'data': [ 'readline', 'control' ] }

##
# @MonitorOptions:
#
# Options to be used for adding a new monitor.
#
# @id: Name of the monitor
#
# @mode: Selects the monitor mode (default: readline in the system
#     emulator, control in qemu-storage-daemon)
#
# @pretty: Enables pretty printing (QMP only)
#
# @chardev: Name of a character device to expose the monitor on
#
# Since: 5.0
##
{ 'struct': 'MonitorOptions',
  'data': {
      '*id': 'str',
      '*mode': 'MonitorMode',
      '*pretty': 'bool',
      'chardev': 'str'
  } }
