a
    Lg                     @   s   d Z ddlmZmZ ddlmZmZmZ ddlm	Z	m
Z
mZ ddlmZmZmZmZmZ ddlmZ ddlmZmZ eee eed	d
dZeee eed	ddZeedddZeee ee eeeedddZG dd de	ZeeeddddZdS )a$  
QAPI event generator

Copyright (c) 2014 Wenchao Xia
Copyright (c) 2015-2018 Red Hat Inc.

Authors:
 Wenchao Xia <wenchaoqemu@gmail.com>
 Markus Armbruster <armbru@redhat.com>

This work is licensed under the terms of the GNU GPL, version 2.
See the COPYING file in the top-level directory.
    )ListOptional   )c_enum_constc_namemcgen)QAPISchemaModularCVisitorbuild_params	ifcontext)
QAPISchemaQAPISchemaEnumMemberQAPISchemaFeatureQAPISchemaIfCondQAPISchemaObjectType)QAPISourceInfo)gen_enumgen_enum_lookup)namearg_typeboxedreturnc                 C   s   dt |  t||d S )Nz*void qapi_event_send_%(c_name)s(%(param)s))r   Zparam)r   lowerr	   r   r   r    r   >/home2/Puru_Virtio_Blk/virtio-demo/qemu/scripts/qapi/events.pybuild_event_send_proto   s    
r   c                 C   s   t dt| ||dS )Nz

%(proto)s;
proto)r   r   r   r   r   r   gen_event_send_decl&   s    
r   )typr   c                 C   s   | j r
J td|  d}d}| jD ]P}||7 }d}| rR|dt|j | 7 }|jjdkrf|d7 }|t|j7 }q$|td7 }|  s|td	|  d7 }|S )
z
    Generate a struct variable holding the event parameters.

    Initialize it with the function arguments defined in `gen_event_send`.
    z
    %(c_name)s param = {
)r   z        z, has_strz(char *)z	

    };
z
    %(c_name)s *arg = &param;
)branchesr   r   membersneed_hasr   typeis_implicit)r   retsepmembr   r   r   gen_param_var0   s&    

r*   )r   r   featuresr   event_enum_name
event_emitr   c           	      C   s  |p|o|   }tdt| ||d}|rR|d us6J |td7 }|sR|t|7 }|D ]}| rV|td|jd7 }qV|td| d7 }|r|d usJ |td7 }| s|td	| | d
7 }n|td| | d
7 }|td7 }|td|t|| d7 }|r|td7 }|td7 }|S )Nz

%(proto)s
{
    QDict *qmp;
r   z#
    QObject *obj;
    Visitor *v;
z^

    if (compat_policy.%(feat)s_output == COMPAT_POLICY_OUTPUT_HIDE) {
        return;
    }
)featz/

    qmp = qmp_event_build_dict("%(name)s");

)r   z/
    v = qobject_output_visitor_new_qmp(&obj);
z?
    visit_type_%(c_name)s(v, "%(name)s", &arg, &error_abort);
)r   r   z

    visit_start_struct(v, "%(name)s", NULL, 0, &error_abort);
    visit_type_%(c_name)s_members(v, &param, &error_abort);
    visit_check_struct(v, &error_abort);
    visit_end_struct(v, NULL);
z

    visit_complete(v, &obj);
    if (qdict_size(qobject_to(QDict, obj))) {
        qdict_put_obj(qmp, "data", obj);
    } else {
        qobject_unref(obj);
    }
z'
    %(event_emit)s(%(c_enum)s, qmp);

)r-   Zc_enumz
    visit_free(v);
z
    qobject_unref(qmp);
}
)	is_emptyr   r   r*   
is_specialr   r&   r   r   )	r   r   r+   r   r,   r-   	have_argsr'   fr   r   r   gen_event_sendQ   sH    



r3   c                       sf   e Zd Zed fddZeddddZddd	d
Zeee e	e
e ee eddddZ  ZS )QAPISchemaGenEventVisitorprefixc                    s>   t  |ddd t t|d dd| _g | _t|d | _d S )Nqapi-eventsz! * Schema-defined QAPI/QMP eventsZ	QAPIEventF)protectZqapi_event_emit)super__init____doc__r   _event_enum_name_event_enum_members_event_emit_name)selfr6   	__class__r   r   r:      s    z"QAPISchemaGenEventVisitor.__init__N)r   r   c                 C   sV   |  d|}|  d|}|  d|}| jtd||| jd | jtd|d d S )Nr7   z
qapi-typesz
qapi-visitz
#include "qemu/osdep.h"
#include "%(prefix)sqapi-emit-events.h"
#include "%(events)s.h"
#include "%(visit)s.h"
#include "qapi/compat-policy.h"
#include "qapi/error.h"
#include "qapi/qmp/qdict.h"
#include "qapi/qmp-event.h"
)eventsvisitr6   z/
#include "qapi/util.h"
#include "%(types)s.h"
)types)_module_basename_gencaddr   _prefix_genh)r?   r   rB   rD   rC   r   r   r   _begin_user_module   s    


z,QAPISchemaGenEventVisitor._begin_user_module)r   c                 C   s|   |  dd | jtd| jd | jtd | jt| j| j	 | jt
| j| j	 | jtd| j| jd d S )Nz./emitz * QAPI Events emissionzA
#include "qemu/osdep.h"
#include "%(prefix)sqapi-emit-events.h"
r5   z
#include "qapi/util.h"
z;

void %(event_emit)s(%(event_enum)s event, QDict *qdict);
)r-   Z
event_enum)_add_modulerF   preamble_addr   rH   rI   rG   r   r<   r=   r   r>   )r?   r   r   r   	visit_end   s    

z#QAPISchemaGenEventVisitor.visit_end)r   infoifcondr+   r   r   r   c              
   C   sx   t || j| jB | jt||| | jt||||| j| j W d    n1 sX0    Y  | j	t
|d  d S N)r
   rI   rF   rG   r   r3   r<   r>   r=   appendr   )r?   r   rN   rO   r+   r   r   r   r   r   visit_event   s    $z%QAPISchemaGenEventVisitor.visit_event)__name__
__module____qualname__r!   r:   rJ   rM   r   r   r   r   r   r   boolrR   __classcell__r   r   r@   r   r4      s   r4   N)schema
output_dirr6   r   c                 C   s    t |}| | || d S rP   )r4   rC   write)rX   rY   r6   visr   r   r   
gen_events   s    
r\   )r;   typingr   r   commonr   r   r   genr   r	   r
   rX   r   r   r   r   r   sourcer   rD   r   r   r!   rV   r   r   r*   r3   r4   r\   r   r   r   r   <module>   s6   
!_F