| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | # | 
					
						
							|  |  |  | # QAPI command marshaller generator | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Copyright IBM, Corp. 2011 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Authors: | 
					
						
							|  |  |  | #  Anthony Liguori <aliguori@us.ibm.com> | 
					
						
							|  |  |  | #  Michael Roth    <mdroth@linux.vnet.ibm.com> | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This work is licensed under the terms of the GNU GPLv2. | 
					
						
							|  |  |  | # See the COPYING.LIB file in the top-level directory. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from ordereddict import OrderedDict | 
					
						
							|  |  |  | from qapi import * | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import getopt | 
					
						
							|  |  |  | import errno | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-14 14:30:00 -05:00
										 |  |  | def type_visitor(name): | 
					
						
							|  |  |  |     if type(name) == list: | 
					
						
							|  |  |  |         return 'visit_type_%sList' % name[0] | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         return 'visit_type_%s' % name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | def generate_decl_enum(name, members, genlist=True): | 
					
						
							|  |  |  |     return mcgen('''
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-14 14:30:00 -05:00
										 |  |  | void %(visitor)s(Visitor *m, %(name)s * obj, const char *name, Error **errp); | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | ''',
 | 
					
						
							| 
									
										
										
										
											2011-09-14 14:30:00 -05:00
										 |  |  |                  visitor=type_visitor(name)) | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | def generate_command_decl(name, args, ret_type): | 
					
						
							|  |  |  |     arglist="" | 
					
						
							|  |  |  |     for argname, argtype, optional, structured in parse_args(args): | 
					
						
							|  |  |  |         argtype = c_type(argtype) | 
					
						
							|  |  |  |         if argtype == "char *": | 
					
						
							|  |  |  |             argtype = "const char *" | 
					
						
							|  |  |  |         if optional: | 
					
						
							|  |  |  |             arglist += "bool has_%s, " % c_var(argname) | 
					
						
							|  |  |  |         arglist += "%s %s, " % (argtype, c_var(argname)) | 
					
						
							|  |  |  |     return mcgen('''
 | 
					
						
							|  |  |  | %(ret_type)s qmp_%(name)s(%(args)sError **errp); | 
					
						
							|  |  |  | ''',
 | 
					
						
							| 
									
										
										
										
											2012-03-20 13:54:35 +00:00
										 |  |  |                  ret_type=c_type(ret_type), name=c_fun(name), args=arglist).strip() | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | def gen_sync_call(name, args, ret_type, indent=0): | 
					
						
							|  |  |  |     ret = "" | 
					
						
							|  |  |  |     arglist="" | 
					
						
							|  |  |  |     retval="" | 
					
						
							|  |  |  |     if ret_type: | 
					
						
							|  |  |  |         retval = "retval = " | 
					
						
							|  |  |  |     for argname, argtype, optional, structured in parse_args(args): | 
					
						
							|  |  |  |         if optional: | 
					
						
							|  |  |  |             arglist += "has_%s, " % c_var(argname) | 
					
						
							|  |  |  |         arglist += "%s, " % (c_var(argname)) | 
					
						
							|  |  |  |     push_indent(indent) | 
					
						
							|  |  |  |     ret = mcgen('''
 | 
					
						
							|  |  |  | %(retval)sqmp_%(name)s(%(args)serrp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ''',
 | 
					
						
							| 
									
										
										
										
											2012-03-20 13:54:35 +00:00
										 |  |  |                 name=c_fun(name), args=arglist, retval=retval).rstrip() | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  |     if ret_type: | 
					
						
							|  |  |  |         ret += "\n" + mcgen(''''
 | 
					
						
							| 
									
										
										
										
											2011-10-19 14:51:14 -02:00
										 |  |  | if (!error_is_set(errp)) { | 
					
						
							|  |  |  |     %(marshal_output_call)s | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | ''',
 | 
					
						
							|  |  |  |                             marshal_output_call=gen_marshal_output_call(name, ret_type)).rstrip() | 
					
						
							|  |  |  |     pop_indent(indent) | 
					
						
							|  |  |  |     return ret.rstrip() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def gen_marshal_output_call(name, ret_type): | 
					
						
							|  |  |  |     if not ret_type: | 
					
						
							|  |  |  |         return "" | 
					
						
							| 
									
										
										
										
											2012-03-20 13:54:35 +00:00
										 |  |  |     return "qmp_marshal_output_%s(retval, ret, errp);" % c_fun(name) | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | def gen_visitor_output_containers_decl(ret_type): | 
					
						
							|  |  |  |     ret = "" | 
					
						
							|  |  |  |     push_indent() | 
					
						
							|  |  |  |     if ret_type: | 
					
						
							|  |  |  |         ret += mcgen('''
 | 
					
						
							|  |  |  | QmpOutputVisitor *mo; | 
					
						
							|  |  |  | QapiDeallocVisitor *md; | 
					
						
							|  |  |  | Visitor *v; | 
					
						
							|  |  |  | ''')
 | 
					
						
							|  |  |  |     pop_indent() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return ret | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def gen_visitor_input_containers_decl(args): | 
					
						
							|  |  |  |     ret = "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     push_indent() | 
					
						
							|  |  |  |     if len(args) > 0: | 
					
						
							|  |  |  |         ret += mcgen('''
 | 
					
						
							|  |  |  | QmpInputVisitor *mi; | 
					
						
							|  |  |  | QapiDeallocVisitor *md; | 
					
						
							|  |  |  | Visitor *v; | 
					
						
							|  |  |  | ''')
 | 
					
						
							|  |  |  |     pop_indent() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return ret.rstrip() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def gen_visitor_input_vars_decl(args): | 
					
						
							|  |  |  |     ret = "" | 
					
						
							|  |  |  |     push_indent() | 
					
						
							|  |  |  |     for argname, argtype, optional, structured in parse_args(args): | 
					
						
							|  |  |  |         if optional: | 
					
						
							|  |  |  |             ret += mcgen('''
 | 
					
						
							|  |  |  | bool has_%(argname)s = false; | 
					
						
							|  |  |  | ''',
 | 
					
						
							|  |  |  |                          argname=c_var(argname)) | 
					
						
							|  |  |  |         if c_type(argtype).endswith("*"): | 
					
						
							|  |  |  |             ret += mcgen('''
 | 
					
						
							|  |  |  | %(argtype)s %(argname)s = NULL; | 
					
						
							|  |  |  | ''',
 | 
					
						
							|  |  |  |                          argname=c_var(argname), argtype=c_type(argtype)) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             ret += mcgen('''
 | 
					
						
							|  |  |  | %(argtype)s %(argname)s; | 
					
						
							|  |  |  | ''',
 | 
					
						
							|  |  |  |                          argname=c_var(argname), argtype=c_type(argtype)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pop_indent() | 
					
						
							|  |  |  |     return ret.rstrip() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def gen_visitor_input_block(args, obj, dealloc=False): | 
					
						
							|  |  |  |     ret = "" | 
					
						
							|  |  |  |     if len(args) == 0: | 
					
						
							|  |  |  |         return ret | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     push_indent() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if dealloc: | 
					
						
							|  |  |  |         ret += mcgen('''
 | 
					
						
							|  |  |  | md = qapi_dealloc_visitor_new(); | 
					
						
							|  |  |  | v = qapi_dealloc_get_visitor(md); | 
					
						
							|  |  |  | ''')
 | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         ret += mcgen('''
 | 
					
						
							| 
									
										
										
										
											2012-03-22 12:51:12 +01:00
										 |  |  | mi = qmp_input_visitor_new_strict(%(obj)s); | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | v = qmp_input_get_visitor(mi); | 
					
						
							|  |  |  | ''',
 | 
					
						
							|  |  |  |                      obj=obj) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for argname, argtype, optional, structured in parse_args(args): | 
					
						
							|  |  |  |         if optional: | 
					
						
							|  |  |  |             ret += mcgen('''
 | 
					
						
							|  |  |  | visit_start_optional(v, &has_%(c_name)s, "%(name)s", errp); | 
					
						
							|  |  |  | if (has_%(c_name)s) { | 
					
						
							|  |  |  | ''',
 | 
					
						
							|  |  |  |                          c_name=c_var(argname), name=argname) | 
					
						
							|  |  |  |             push_indent() | 
					
						
							|  |  |  |         ret += mcgen('''
 | 
					
						
							| 
									
										
										
										
											2011-09-14 14:30:00 -05:00
										 |  |  | %(visitor)s(v, &%(c_name)s, "%(name)s", errp); | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | ''',
 | 
					
						
							| 
									
										
										
										
											2011-09-14 14:30:00 -05:00
										 |  |  |                      c_name=c_var(argname), name=argname, argtype=argtype, | 
					
						
							|  |  |  |                      visitor=type_visitor(argtype)) | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  |         if optional: | 
					
						
							|  |  |  |             pop_indent() | 
					
						
							|  |  |  |             ret += mcgen('''
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | visit_end_optional(v, errp); | 
					
						
							|  |  |  | ''')
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if dealloc: | 
					
						
							|  |  |  |         ret += mcgen('''
 | 
					
						
							|  |  |  | qapi_dealloc_visitor_cleanup(md); | 
					
						
							|  |  |  | ''')
 | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         ret += mcgen('''
 | 
					
						
							|  |  |  | qmp_input_visitor_cleanup(mi); | 
					
						
							|  |  |  | ''')
 | 
					
						
							|  |  |  |     pop_indent() | 
					
						
							|  |  |  |     return ret.rstrip() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  | def gen_marshal_output(name, args, ret_type, middle_mode): | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  |     if not ret_type: | 
					
						
							|  |  |  |         return "" | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  |     ret = mcgen('''
 | 
					
						
							|  |  |  | static void qmp_marshal_output_%(c_name)s(%(c_ret_type)s ret_in, QObject **ret_out, Error **errp) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QapiDeallocVisitor *md = qapi_dealloc_visitor_new(); | 
					
						
							|  |  |  |     QmpOutputVisitor *mo = qmp_output_visitor_new(); | 
					
						
							|  |  |  |     Visitor *v; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     v = qmp_output_get_visitor(mo); | 
					
						
							| 
									
										
										
										
											2011-09-14 14:30:00 -05:00
										 |  |  |     %(visitor)s(v, &ret_in, "unused", errp); | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  |     if (!error_is_set(errp)) { | 
					
						
							|  |  |  |         *ret_out = qmp_output_get_qobject(mo); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     qmp_output_visitor_cleanup(mo); | 
					
						
							|  |  |  |     v = qapi_dealloc_get_visitor(md); | 
					
						
							| 
									
										
										
										
											2011-09-14 14:30:00 -05:00
										 |  |  |     %(visitor)s(v, &ret_in, "unused", errp); | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  |     qapi_dealloc_visitor_cleanup(md); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ''',
 | 
					
						
							| 
									
										
										
										
											2012-03-20 13:54:35 +00:00
										 |  |  |                 c_ret_type=c_type(ret_type), c_name=c_fun(name), | 
					
						
							| 
									
										
										
										
											2011-09-14 14:30:00 -05:00
										 |  |  |                 visitor=type_visitor(ret_type)) | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ret | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  | def gen_marshal_input_decl(name, args, ret_type, middle_mode): | 
					
						
							|  |  |  |     if middle_mode: | 
					
						
							| 
									
										
										
										
											2012-03-20 13:54:35 +00:00
										 |  |  |         return 'int qmp_marshal_input_%s(Monitor *mon, const QDict *qdict, QObject **ret)' % c_fun(name) | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2012-03-20 13:54:35 +00:00
										 |  |  |         return 'static void qmp_marshal_input_%s(QDict *args, QObject **ret, Error **errp)' % c_fun(name) | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def gen_marshal_input(name, args, ret_type, middle_mode): | 
					
						
							|  |  |  |     hdr = gen_marshal_input_decl(name, args, ret_type, middle_mode) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  |     ret = mcgen('''
 | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  | %(header)s | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | { | 
					
						
							|  |  |  | ''',
 | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  |                 header=hdr) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if middle_mode: | 
					
						
							|  |  |  |         ret += mcgen('''
 | 
					
						
							|  |  |  |     Error *local_err = NULL; | 
					
						
							|  |  |  |     Error **errp = &local_err; | 
					
						
							|  |  |  |     QDict *args = (QDict *)qdict; | 
					
						
							|  |  |  | ''')
 | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if ret_type: | 
					
						
							|  |  |  |         if c_type(ret_type).endswith("*"): | 
					
						
							|  |  |  |             retval = "    %s retval = NULL;" % c_type(ret_type) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             retval = "    %s retval;" % c_type(ret_type) | 
					
						
							|  |  |  |         ret += mcgen('''
 | 
					
						
							|  |  |  | %(retval)s | 
					
						
							|  |  |  | ''',
 | 
					
						
							|  |  |  |                      retval=retval) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if len(args) > 0: | 
					
						
							|  |  |  |         ret += mcgen('''
 | 
					
						
							|  |  |  | %(visitor_input_containers_decl)s | 
					
						
							|  |  |  | %(visitor_input_vars_decl)s | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | %(visitor_input_block)s | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ''',
 | 
					
						
							|  |  |  |                      visitor_input_containers_decl=gen_visitor_input_containers_decl(args), | 
					
						
							|  |  |  |                      visitor_input_vars_decl=gen_visitor_input_vars_decl(args), | 
					
						
							|  |  |  |                      visitor_input_block=gen_visitor_input_block(args, "QOBJECT(args)")) | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  |     else: | 
					
						
							|  |  |  |         ret += mcgen('''
 | 
					
						
							|  |  |  |     (void)args; | 
					
						
							|  |  |  | ''')
 | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ret += mcgen('''
 | 
					
						
							|  |  |  |     if (error_is_set(errp)) { | 
					
						
							|  |  |  |         goto out; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | %(sync_call)s | 
					
						
							|  |  |  | ''',
 | 
					
						
							|  |  |  |                  sync_call=gen_sync_call(name, args, ret_type, indent=4)) | 
					
						
							|  |  |  |     ret += mcgen('''
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | out: | 
					
						
							|  |  |  | ''')
 | 
					
						
							|  |  |  |     ret += mcgen('''
 | 
					
						
							|  |  |  | %(visitor_input_block_cleanup)s | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  | ''',
 | 
					
						
							|  |  |  |                  visitor_input_block_cleanup=gen_visitor_input_block(args, None, | 
					
						
							|  |  |  |                                                                      dealloc=True)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if middle_mode: | 
					
						
							|  |  |  |         ret += mcgen('''
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (local_err) { | 
					
						
							|  |  |  |         qerror_report_err(local_err); | 
					
						
							|  |  |  |         error_free(local_err); | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | ''')
 | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         ret += mcgen('''
 | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  |     return; | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  | ''')
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ret += mcgen('''
 | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  | ''')
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  |     return ret | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-08 14:24:44 -03:00
										 |  |  | def option_value_matches(opt, val, cmd): | 
					
						
							|  |  |  |     if opt in cmd and cmd[opt] == val: | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  |     return False | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | def gen_registry(commands): | 
					
						
							|  |  |  |     registry="" | 
					
						
							|  |  |  |     push_indent() | 
					
						
							|  |  |  |     for cmd in commands: | 
					
						
							| 
									
										
										
										
											2012-05-08 14:24:44 -03:00
										 |  |  |         options = 'QCO_NO_OPTIONS' | 
					
						
							|  |  |  |         if option_value_matches('success-response', 'no', cmd): | 
					
						
							|  |  |  |             options = 'QCO_NO_SUCCESS_RESP' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  |         registry += mcgen('''
 | 
					
						
							| 
									
										
										
										
											2012-05-08 14:24:44 -03:00
										 |  |  | qmp_register_command("%(name)s", qmp_marshal_input_%(c_name)s, %(opts)s); | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | ''',
 | 
					
						
							| 
									
										
										
										
											2012-05-08 14:24:44 -03:00
										 |  |  |                      name=cmd['command'], c_name=c_fun(cmd['command']), | 
					
						
							|  |  |  |                      opts=options) | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  |     pop_indent() | 
					
						
							|  |  |  |     ret = mcgen('''
 | 
					
						
							|  |  |  | static void qmp_init_marshal(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | %(registry)s | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | qapi_init(qmp_init_marshal); | 
					
						
							|  |  |  | ''',
 | 
					
						
							|  |  |  |                 registry=registry.rstrip()) | 
					
						
							|  |  |  |     return ret | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def gen_command_decl_prologue(header, guard, prefix=""): | 
					
						
							|  |  |  |     ret = mcgen('''
 | 
					
						
							|  |  |  | /* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * schema-defined QAPI function prototypes | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright IBM, Corp. 2011 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Authors: | 
					
						
							|  |  |  |  *  Anthony Liguori   <aliguori@us.ibm.com> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. | 
					
						
							|  |  |  |  * See the COPYING.LIB file in the top-level directory. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef %(guard)s | 
					
						
							|  |  |  | #define %(guard)s | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "%(prefix)sqapi-types.h" | 
					
						
							| 
									
										
										
										
											2012-08-06 11:35:22 -03:00
										 |  |  | #include "qdict.h" | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | #include "error.h" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ''',
 | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  |                  header=basename(header), guard=guardname(header), prefix=prefix) | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  |     return ret | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def gen_command_def_prologue(prefix="", proxy=False): | 
					
						
							|  |  |  |     ret = mcgen('''
 | 
					
						
							|  |  |  | /* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * schema-defined QMP->QAPI command dispatch | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright IBM, Corp. 2011 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Authors: | 
					
						
							|  |  |  |  *  Anthony Liguori   <aliguori@us.ibm.com> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. | 
					
						
							|  |  |  |  * See the COPYING.LIB file in the top-level directory. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "qemu-objects.h" | 
					
						
							|  |  |  | #include "qapi/qmp-core.h" | 
					
						
							|  |  |  | #include "qapi/qapi-visit-core.h" | 
					
						
							|  |  |  | #include "qapi/qmp-output-visitor.h" | 
					
						
							|  |  |  | #include "qapi/qmp-input-visitor.h" | 
					
						
							|  |  |  | #include "qapi/qapi-dealloc-visitor.h" | 
					
						
							|  |  |  | #include "%(prefix)sqapi-types.h" | 
					
						
							|  |  |  | #include "%(prefix)sqapi-visit.h" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ''',
 | 
					
						
							|  |  |  |                 prefix=prefix) | 
					
						
							|  |  |  |     if not proxy: | 
					
						
							|  |  |  |         ret += '#include "%sqmp-commands.h"' % prefix | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  |     return ret + "\n\n" | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							| 
									
										
										
										
											2011-12-27 16:02:16 +02:00
										 |  |  |     opts, args = getopt.gnu_getopt(sys.argv[1:], "chp:o:m", | 
					
						
							|  |  |  |                                    ["source", "header", "prefix=", | 
					
						
							|  |  |  |                                     "output-dir=", "type=", "middle"]) | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | except getopt.GetoptError, err: | 
					
						
							|  |  |  |     print str(err) | 
					
						
							|  |  |  |     sys.exit(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | output_dir = "" | 
					
						
							|  |  |  | prefix = "" | 
					
						
							|  |  |  | dispatch_type = "sync" | 
					
						
							|  |  |  | c_file = 'qmp-marshal.c' | 
					
						
							|  |  |  | h_file = 'qmp-commands.h' | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  | middle_mode = False | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-27 16:02:16 +02:00
										 |  |  | do_c = False | 
					
						
							|  |  |  | do_h = False | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | for o, a in opts: | 
					
						
							|  |  |  |     if o in ("-p", "--prefix"): | 
					
						
							|  |  |  |         prefix = a | 
					
						
							|  |  |  |     elif o in ("-o", "--output-dir"): | 
					
						
							|  |  |  |         output_dir = a + "/" | 
					
						
							|  |  |  |     elif o in ("-t", "--type"): | 
					
						
							|  |  |  |         dispatch_type = a | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  |     elif o in ("-m", "--middle"): | 
					
						
							|  |  |  |         middle_mode = True | 
					
						
							| 
									
										
										
										
											2011-12-27 16:02:16 +02:00
										 |  |  |     elif o in ("-c", "--source"): | 
					
						
							|  |  |  |         do_c = True | 
					
						
							| 
									
										
										
										
											2011-12-28 12:26:58 +02:00
										 |  |  |     elif o in ("-h", "--header"): | 
					
						
							|  |  |  |         do_h = True | 
					
						
							| 
									
										
										
										
											2011-12-27 16:02:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | if not do_c and not do_h: | 
					
						
							|  |  |  |     do_c = True | 
					
						
							|  |  |  |     do_h = True | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | c_file = output_dir + prefix + c_file | 
					
						
							|  |  |  | h_file = output_dir + prefix + h_file | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-27 16:02:16 +02:00
										 |  |  | def maybe_open(really, name, opt): | 
					
						
							|  |  |  |     if really: | 
					
						
							|  |  |  |         return open(name, opt) | 
					
						
							|  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2011-12-28 12:26:58 +02:00
										 |  |  |         import StringIO | 
					
						
							|  |  |  |         return StringIO.StringIO() | 
					
						
							| 
									
										
										
										
											2011-12-27 16:02:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | try: | 
					
						
							|  |  |  |     os.makedirs(output_dir) | 
					
						
							|  |  |  | except os.error, e: | 
					
						
							|  |  |  |     if e.errno != errno.EEXIST: | 
					
						
							|  |  |  |         raise | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | exprs = parse_schema(sys.stdin) | 
					
						
							|  |  |  | commands = filter(lambda expr: expr.has_key('command'), exprs) | 
					
						
							| 
									
										
										
										
											2011-12-12 14:29:33 -06:00
										 |  |  | commands = filter(lambda expr: not expr.has_key('gen'), commands) | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | if dispatch_type == "sync": | 
					
						
							| 
									
										
										
										
											2011-12-27 16:02:16 +02:00
										 |  |  |     fdecl = maybe_open(do_h, h_file, 'w') | 
					
						
							|  |  |  |     fdef = maybe_open(do_c, c_file, 'w') | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  |     ret = gen_command_decl_prologue(header=basename(h_file), guard=guardname(h_file), prefix=prefix) | 
					
						
							|  |  |  |     fdecl.write(ret) | 
					
						
							|  |  |  |     ret = gen_command_def_prologue(prefix=prefix) | 
					
						
							|  |  |  |     fdef.write(ret) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for cmd in commands: | 
					
						
							|  |  |  |         arglist = [] | 
					
						
							|  |  |  |         ret_type = None | 
					
						
							|  |  |  |         if cmd.has_key('data'): | 
					
						
							|  |  |  |             arglist = cmd['data'] | 
					
						
							|  |  |  |         if cmd.has_key('returns'): | 
					
						
							|  |  |  |             ret_type = cmd['returns'] | 
					
						
							|  |  |  |         ret = generate_command_decl(cmd['command'], arglist, ret_type) + "\n" | 
					
						
							|  |  |  |         fdecl.write(ret) | 
					
						
							|  |  |  |         if ret_type: | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  |             ret = gen_marshal_output(cmd['command'], arglist, ret_type, middle_mode) + "\n" | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  |             fdef.write(ret) | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if middle_mode: | 
					
						
							|  |  |  |             fdecl.write('%s;\n' % gen_marshal_input_decl(cmd['command'], arglist, ret_type, middle_mode)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ret = gen_marshal_input(cmd['command'], arglist, ret_type, middle_mode) + "\n" | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  |         fdef.write(ret) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-10 13:10:51 -05:00
										 |  |  |     fdecl.write("\n#endif\n"); | 
					
						
							| 
									
										
										
										
											2011-09-02 12:34:46 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if not middle_mode: | 
					
						
							|  |  |  |         ret = gen_registry(commands) | 
					
						
							|  |  |  |         fdef.write(ret) | 
					
						
							| 
									
										
										
										
											2011-07-19 14:50:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     fdef.flush() | 
					
						
							|  |  |  |     fdef.close() | 
					
						
							|  |  |  |     fdecl.flush() | 
					
						
							|  |  |  |     fdecl.close() |