From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=53417 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OCzQV-0006y2-5d for qemu-devel@nongnu.org; Fri, 14 May 2010 14:16:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OCzQT-0001yx-5g for qemu-devel@nongnu.org; Fri, 14 May 2010 14:15:59 -0400 Received: from mail-yw0-f198.google.com ([209.85.211.198]:45273) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OCzQS-0001ys-UI for qemu-devel@nongnu.org; Fri, 14 May 2010 14:15:57 -0400 Received: by ywh36 with SMTP id 36so1359972ywh.4 for ; Fri, 14 May 2010 11:15:56 -0700 (PDT) Message-ID: <4BED9358.1000106@codemonkey.ws> Date: Fri, 14 May 2010 13:15:52 -0500 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH 3/8] Add QBuffer References: <6e14cbfe3764b46d9bd6d2db61d41fd9c85dd54e.1273843151.git.jan.kiszka@siemens.com> In-Reply-To: <6e14cbfe3764b46d9bd6d2db61d41fd9c85dd54e.1273843151.git.jan.kiszka@siemens.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jan Kiszka Cc: Anthony Liguori , Juan Quintela , qemu-devel@nongnu.org, Markus Armbruster , Luiz Capitulino , Avi Kivity On 05/14/2010 08:20 AM, Jan Kiszka wrote: > diff --git a/qjson.c b/qjson.c > index 483c667..4d1c21a 100644 > --- a/qjson.c > +++ b/qjson.c > @@ -19,7 +19,9 @@ > #include "qlist.h" > #include "qbool.h" > #include "qfloat.h" > +#include "qbuffer.h" > #include "qdict.h" > +#include "base64.h" > > typedef struct JSONParsingState > { > @@ -235,6 +237,20 @@ static void to_json(const QObject *obj, QString *str) > } > break; > } > + case QTYPE_QBUFFER: { > + QBuffer *val = qobject_to_qbuffer(obj); > + size_t data_size = qbuffer_get_size(val); > + size_t str_len = ((data_size + 2) / 3) * 4; > + char *buffer = qemu_malloc(str_len + 3); > + > + buffer[0] = '"'; > + base64_encode(qbuffer_get_data(val), data_size, buffer + 1); > + buffer[str_len + 1] = '"'; > + buffer[str_len + 2] = 0; > + qstring_append(str, buffer); > + qemu_free(buffer); > + break; > + } > Instead of encoding just as a string, it would be a good idea to encode it as something like: {'__class__': 'base64', 'data': ...} We've discussed using hidden properties to describe special things like abstract classes and since we already have this namespace reserved, I think it's a good time to use it. The advantage is that in a dynamic language like Python, the parser can convert base64 to binary strings automatically without having to understand the QMP protocol. Regards, Anthony Liguori > case QTYPE_QERROR: > /* XXX: should QError be emitted? */ > case QTYPE_NONE: > diff --git a/qobject.h b/qobject.h > index 07de211..45c4fa0 100644 > --- a/qobject.h > +++ b/qobject.h > @@ -44,6 +44,7 @@ typedef enum { > QTYPE_QFLOAT, > QTYPE_QBOOL, > QTYPE_QERROR, > + QTYPE_QBUFFER, > } qtype_code; > > struct QObject; >