Merge remote-tracking branch 'qmp/for-anthony' into staging
authorAnthony Liguori <aliguori@us.ibm.com>
Wed, 8 Jun 2011 17:16:24 +0000 (12:16 -0500)
committerAnthony Liguori <aliguori@us.ibm.com>
Wed, 8 Jun 2011 17:16:24 +0000 (12:16 -0500)
1  2 
qerror.c
qerror.h

diff --combined qerror.c
+++ b/qerror.c
@@@ -201,6 -201,10 +201,10 @@@ static const QErrorStringTable qerror_t
          .desc      = "An undefined error has ocurred",
      },
      {
+         .error_fmt = QERR_UNSUPPORTED,
+         .desc      = "this feature or command is not currently supported",
+     },
+     {
          .error_fmt = QERR_UNKNOWN_BLOCK_FORMAT_FEATURE,
          .desc      = "'%(device)' uses a %(format) feature which is not "
                       "supported by this qemu version: %(feature)",
@@@ -326,14 -330,12 +330,14 @@@ QError *qerror_from_info(const char *fi
      return qerr;
  }
  
 -static void parse_error(const QError *qerror, int c)
 +static void parse_error(const QErrorStringTable *entry, int c)
  {
 -    qerror_abort(qerror, "expected '%c' in '%s'", c, qerror->entry->desc);
 +    fprintf(stderr, "expected '%c' in '%s'", c, entry->desc);
 +    abort();
  }
  
 -static const char *append_field(QString *outstr, const QError *qerror,
 +static const char *append_field(QDict *error, QString *outstr,
 +                                const QErrorStringTable *entry,
                                  const char *start)
  {
      QObject *obj;
      const char *end, *key;
  
      if (*start != '%')
 -        parse_error(qerror, '%');
 +        parse_error(entry, '%');
      start++;
      if (*start != '(')
 -        parse_error(qerror, '(');
 +        parse_error(entry, '(');
      start++;
  
      end = strchr(start, ')');
      if (!end)
 -        parse_error(qerror, ')');
 +        parse_error(entry, ')');
  
      key_qs = qstring_from_substr(start, 0, end - start - 1);
      key = qstring_get_str(key_qs);
  
 -    qdict = qobject_to_qdict(qdict_get(qerror->error, "data"));
 +    qdict = qobject_to_qdict(qdict_get(error, "data"));
      obj = qdict_get(qdict, key);
      if (!obj) {
 -        qerror_abort(qerror, "key '%s' not found in QDict", key);
 +        abort();
      }
  
      switch (qobject_type(obj)) {
              qstring_append_int(outstr, qdict_get_int(qdict, key));
              break;
          default:
 -            qerror_abort(qerror, "invalid type '%c'", qobject_type(obj));
 +            abort();
      }
  
      QDECREF(key_qs);
      return ++end;
  }
  
 -/**
 - * qerror_human(): Format QError data into human-readable string.
 - *
 - * Formats according to member 'desc' of the specified QError object.
 - */
 -QString *qerror_human(const QError *qerror)
 +static QString *qerror_format_desc(QDict *error,
 +                                   const QErrorStringTable *entry)
  {
 -    const char *p;
      QString *qstring;
 +    const char *p;
  
 -    assert(qerror->entry != NULL);
 +    assert(entry != NULL);
  
      qstring = qstring_new();
  
 -    for (p = qerror->entry->desc; *p != '\0';) {
 +    for (p = entry->desc; *p != '\0';) {
          if (*p != '%') {
              qstring_append_chr(qstring, *p++);
          } else if (*(p + 1) == '%') {
              qstring_append_chr(qstring, '%');
              p += 2;
          } else {
 -            p = append_field(qstring, qerror, p);
 +            p = append_field(error, qstring, entry, p);
          }
      }
  
      return qstring;
  }
  
 +QString *qerror_format(const char *fmt, QDict *error)
 +{
 +    const QErrorStringTable *entry = NULL;
 +    int i;
 +
 +    for (i = 0; qerror_table[i].error_fmt; i++) {
 +        if (strcmp(qerror_table[i].error_fmt, fmt) == 0) {
 +            entry = &qerror_table[i];
 +            break;
 +        }
 +    }
 +
 +    return qerror_format_desc(error, entry);
 +}
 +
 +/**
 + * qerror_human(): Format QError data into human-readable string.
 + */
 +QString *qerror_human(const QError *qerror)
 +{
 +    return qerror_format_desc(qerror->error, qerror->entry);
 +}
 +
  /**
   * qerror_print(): Print QError data
   *
diff --combined qerror.h
+++ b/qerror.h
@@@ -39,7 -39,6 +39,7 @@@ QString *qerror_human(const QError *qer
  void qerror_print(QError *qerror);
  void qerror_report_internal(const char *file, int linenr, const char *func,
                              const char *fmt, ...) GCC_FMT_ATTR(4, 5);
 +QString *qerror_format(const char *fmt, QDict *error);
  #define qerror_report(fmt, ...) \
      qerror_report_internal(__FILE__, __LINE__, __func__, fmt, ## __VA_ARGS__)
  QError *qobject_to_qerror(const QObject *obj);
  #define QERR_JSON_PARSING \
      "{ 'class': 'JSONParsing', 'data': {} }"
  
 +#define QERR_JSON_PARSE_ERROR \
 +    "{ 'class': 'JSONParseError', 'data': { 'message': %s } }"
 +
  #define QERR_KVM_MISSING_CAP \
      "{ 'class': 'KVMMissingCap', 'data': { 'capability': %s, 'feature': %s } }"
  
  #define QERR_UNDEFINED_ERROR \
      "{ 'class': 'UndefinedError', 'data': {} }"
  
+ #define QERR_UNSUPPORTED \
+     "{ 'class': 'Unsupported', 'data': {} }"
  #define QERR_UNKNOWN_BLOCK_FORMAT_FEATURE \
      "{ 'class': 'UnknownBlockFormatFeature', 'data': { 'device': %s, 'format': %s, 'feature': %s } }"