2011-04-08 22:57:31 +02:00
# -*- Mode: Python -*-
import sys
import argparse
2011-04-12 22:17:28 +02:00
import distutils . version
2011-04-08 22:57:31 +02:00
import config
import utils
import dbustypes
# ----------------------------------------------------------------------------------------------------
class CodeGenerator :
2011-04-12 17:50:34 +02:00
def __init__ ( self , ifaces , namespace , interface_prefix , generate_objmanager , h , c ) :
self . generate_objmanager = generate_objmanager
2011-04-08 22:57:31 +02:00
self . ifaces = ifaces
self . h = h
self . c = c
self . namespace = namespace
if len ( namespace ) > 1 :
self . ns_upper = utils . camel_case_to_uscore ( namespace ) . upper ( ) + ' _ '
self . ns_lower = utils . camel_case_to_uscore ( namespace ) . lower ( ) + ' _ '
else :
self . ns_upper = ' '
self . ns_lower = ' '
self . interface_prefix = interface_prefix
self . header_guard = self . h . name . upper ( ) . replace ( ' . ' , ' _ ' ) . replace ( ' - ' , ' _ ' )
# ----------------------------------------------------------------------------------------------------
def generate_intro ( self ) :
self . c . write ( ' /* \n '
' * Generated by gdbus-codegen.py %s . DO NOT EDIT. \n '
' */ \n '
' \n '
% ( config . VERSION ) )
self . c . write ( ' #ifdef HAVE_CONFIG_H \n '
' # include " config.h " \n '
' #endif \n '
' \n '
' #include " %s " \n '
' \n ' % ( self . h . name ) )
self . c . write ( ' typedef struct \n '
' { \n '
' GDBusArgInfo parent_struct; \n '
' gboolean use_gvariant; \n '
' } _ExtendedGDBusArgInfo; \n '
' \n ' )
self . c . write ( ' typedef struct \n '
' { \n '
' GDBusMethodInfo parent_struct; \n '
' const gchar *signal_name; \n '
' } _ExtendedGDBusMethodInfo; \n '
' \n ' )
self . c . write ( ' typedef struct \n '
' { \n '
' GDBusSignalInfo parent_struct; \n '
' const gchar *signal_name; \n '
' } _ExtendedGDBusSignalInfo; \n '
' \n ' )
self . c . write ( ' typedef struct \n '
' { \n '
' GDBusPropertyInfo parent_struct; \n '
' const gchar *hyphen_name; \n '
' gboolean use_gvariant; \n '
' } _ExtendedGDBusPropertyInfo; \n '
' \n ' )
self . c . write ( ' typedef struct \n '
' { \n '
' const _ExtendedGDBusPropertyInfo *info; \n '
' GParamSpec *pspec; \n '
' GValue value; \n '
' } ChangedProperty; \n '
' \n '
' static void \n '
' _changed_property_free (ChangedProperty *data) \n '
' { \n '
' g_value_unset (&data->value); \n '
' g_free (data); \n '
' } \n '
' \n ' )
self . c . write ( ' static gboolean \n '
' _g_strv_equal0 (gchar **a, gchar **b) \n '
' { \n '
' gboolean ret = FALSE; \n '
' guint n; \n '
' if (a == NULL && b == NULL) \n '
' { \n '
' ret = TRUE; \n '
' goto out; \n '
' } \n '
' if (a == NULL || b == NULL) \n '
' goto out; \n '
' if (g_strv_length (a) != g_strv_length (b)) \n '
' goto out; \n '
' for (n = 0; a[n] != NULL; n++) \n '
' if (g_strcmp0 (a[n], b[n]) != 0) \n '
' goto out; \n '
' ret = TRUE; \n '
' out: \n '
' return ret; \n '
' } \n '
' \n ' )
self . c . write ( ' static gboolean \n '
' _g_variant_equal0 (GVariant *a, GVariant *b) \n '
' { \n '
' gboolean ret = FALSE; \n '
' if (a == NULL && b == NULL) \n '
' goto out; \n '
' if (a == NULL || b == NULL) \n '
' goto out; \n '
' ret = g_variant_equal (a, b); \n '
' out: \n '
' return ret; \n '
' } \n '
' \n ' )
# simplified - only supports the types we use
self . c . write ( ' static gboolean \n '
' _g_value_equal (const GValue *a, const GValue *b) \n '
' { \n '
' gboolean ret = FALSE; \n '
' g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b)); \n '
' switch (G_VALUE_TYPE (a)) \n '
' { \n '
' case G_TYPE_BOOLEAN: \n '
' ret = (g_value_get_boolean (a) == g_value_get_boolean (b)); \n '
' break; \n '
' case G_TYPE_UCHAR: \n '
' ret = (g_value_get_uchar (a) == g_value_get_uchar (b)); \n '
' break; \n '
' case G_TYPE_INT: \n '
' ret = (g_value_get_int (a) == g_value_get_int (b)); \n '
' break; \n '
' case G_TYPE_UINT: \n '
' ret = (g_value_get_uint (a) == g_value_get_uint (b)); \n '
' break; \n '
' case G_TYPE_INT64: \n '
' ret = (g_value_get_int64 (a) == g_value_get_int64 (b)); \n '
' break; \n '
' case G_TYPE_UINT64: \n '
' ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b)); \n '
' break; \n '
' case G_TYPE_DOUBLE: \n '
' ret = (g_value_get_double (a) == g_value_get_double (b)); \n '
' break; \n '
' case G_TYPE_STRING: \n '
' ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0); \n '
' break; \n '
' case G_TYPE_VARIANT: \n '
' ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b)); \n '
' break; \n '
' default: \n '
' if (G_VALUE_TYPE (a) == G_TYPE_STRV) \n '
' ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b)); \n '
' else \n '
' g_critical ( " _g_value_equal() does not handle type %s " , g_type_name (G_VALUE_TYPE (a))); \n '
' break; \n '
' } \n '
' return ret; \n '
' } \n '
' \n ' )
self . h . write ( ' /* \n '
' * Generated by gdbus-codegen.py %s . DO NOT EDIT. \n '
' */ \n '
' \n '
' #ifndef __ %s __ \n '
' #define __ %s __ \n '
' \n ' % ( config . VERSION , self . header_guard , self . header_guard ) )
self . h . write ( ' #include <gio/gio.h> \n '
' \n '
' G_BEGIN_DECLS \n '
' \n ' )
# ----------------------------------------------------------------------------------------------------
def declare_types ( self ) :
for i in self . ifaces :
self . h . write ( ' \n ' )
self . h . write ( ' /* ------------------------------------------------------------------------ */ \n ' )
self . h . write ( ' /* Declarations for %s */ \n ' % i . name )
self . h . write ( ' \n ' )
# First the GInterface
self . h . write ( ' #define %s TYPE_ %s ( %s _get_gtype ()) \n ' % ( i . ns_upper , i . name_upper , i . name_lower ) )
self . h . write ( ' #define %s %s (o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %s TYPE_ %s , %s )) \n ' % ( i . ns_upper , i . name_upper , i . ns_upper , i . name_upper , i . camel_name ) )
self . h . write ( ' #define %s IS_ %s (o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %s TYPE_ %s )) \n ' % ( i . ns_upper , i . name_upper , i . ns_upper , i . name_upper ) )
self . h . write ( ' #define %s %s _GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), %s TYPE_ %s , %s )) \n ' % ( i . ns_upper , i . name_upper , i . ns_upper , i . name_upper , i . camel_name ) )
self . h . write ( ' \n ' )
self . h . write ( ' struct _ %s ; \n ' % ( i . camel_name ) )
self . h . write ( ' typedef struct _ %s %s ; \n ' % ( i . camel_name , i . camel_name ) )
self . h . write ( ' typedef struct _ %s Iface %s Iface; \n ' % ( i . camel_name , i . camel_name ) )
self . h . write ( ' \n ' )
self . h . write ( ' struct _ %s Iface \n ' % ( i . camel_name ) )
self . h . write ( ' { \n ' )
self . h . write ( ' GTypeInterface parent_iface; \n ' )
2011-04-12 22:17:28 +02:00
function_pointers = { }
2011-04-08 22:57:31 +02:00
if len ( i . methods ) > 0 :
self . h . write ( ' \n ' )
for m in i . methods :
2011-04-12 22:17:28 +02:00
key = ( m . since , ' _method_ %s ' % m . name_lower )
value = ' gboolean (*handle_ %s ) ( \n ' % ( m . name_lower )
value + = ' %s *object, \n ' % ( i . camel_name )
value + = ' GDBusMethodInvocation *invocation ' % ( )
2011-04-08 22:57:31 +02:00
for a in m . in_args :
2011-04-12 22:17:28 +02:00
value + = ' , \n %s %s ' % ( a . ctype_in , a . name )
value + = ' ); \n \n '
function_pointers [ key ] = value
2011-04-08 22:57:31 +02:00
if len ( i . signals ) > 0 :
self . h . write ( ' \n ' )
for s in i . signals :
2011-04-12 22:17:28 +02:00
key = ( s . since , ' _signal_ %s ' % s . name_lower )
value = ' void (* %s ) ( \n ' % ( s . name_lower )
value + = ' %s *object ' % ( i . camel_name )
2011-04-08 22:57:31 +02:00
for a in s . args :
2011-04-12 22:17:28 +02:00
value + = ' , \n %s %s ' % ( a . ctype_in , a . name )
value + = ' ); \n \n '
function_pointers [ key ] = value
# Sort according to @since tag, then name.. this ensures
# that the function pointers don't change order assuming
# judicious use of @since
#
# Also use a proper version comparison function so e.g.
# 10.0 comes after 2.0.
#
# See https://bugzilla.gnome.org/show_bug.cgi?id=647577#c5
# for discussion
# I'm sure this could be a lot more elegant if I was
# more fluent in python...
def my_version_cmp ( a , b ) :
if len ( a [ 0 ] ) > 0 and len ( b [ 0 ] ) > 0 :
va = distutils . version . LooseVersion ( a [ 0 ] )
vb = distutils . version . LooseVersion ( b [ 0 ] )
ret = va . __cmp__ ( vb )
else :
ret = cmp ( a [ 0 ] , b [ 0 ] )
if ret != 0 :
return ret
return cmp ( a [ 1 ] , b [ 1 ] )
keys = function_pointers . keys ( )
if len ( keys ) > 0 :
keys . sort ( cmp = my_version_cmp )
for key in keys :
self . h . write ( ' %s ' % function_pointers [ key ] )
2011-04-08 22:57:31 +02:00
self . h . write ( ' }; \n ' )
self . h . write ( ' \n ' )
self . h . write ( ' GType %s _get_gtype (void) G_GNUC_CONST; \n ' % ( i . name_lower ) )
self . h . write ( ' \n ' )
self . h . write ( ' GDBusInterfaceInfo * %s _interface_info (void); \n ' % ( i . name_lower ) )
if len ( i . properties ) > 0 :
self . h . write ( ' guint %s _override_properties (GObjectClass *klass, guint property_id_begin); \n ' % ( i . name_lower ) )
self . h . write ( ' \n ' )
# Then method call completion functions
if len ( i . methods ) > 0 :
self . h . write ( ' \n ' )
self . h . write ( ' /* D-Bus method call completion functions: */ \n ' )
for m in i . methods :
self . h . write ( ' void %s _complete_ %s ( \n '
' %s *object, \n '
' GDBusMethodInvocation *invocation ' % ( i . name_lower , m . name_lower , i . camel_name ) )
for a in m . out_args :
self . h . write ( ' , \n %s %s ' % ( a . ctype_in , a . name ) )
self . h . write ( ' ); \n ' )
self . h . write ( ' \n ' )
self . h . write ( ' \n ' )
# Then signal emission functions
if len ( i . signals ) > 0 :
self . h . write ( ' \n ' )
self . h . write ( ' /* D-Bus signal emissions functions: */ \n ' )
for s in i . signals :
self . h . write ( ' void %s _emit_ %s ( \n '
' %s *object ' % ( i . name_lower , s . name_lower , i . camel_name ) )
for a in s . args :
self . h . write ( ' , \n %s %s ' % ( a . ctype_in , a . name ) )
self . h . write ( ' ); \n ' )
self . h . write ( ' \n ' )
self . h . write ( ' \n ' )
# Then method call declarations
if len ( i . methods ) > 0 :
self . h . write ( ' \n ' )
self . h . write ( ' /* D-Bus method calls: */ \n ' )
for m in i . methods :
# async begin
self . h . write ( ' void %s _call_ %s ( \n '
' %s *proxy ' % ( i . name_lower , m . name_lower , i . camel_name ) )
for a in m . in_args :
self . h . write ( ' , \n %s %s ' % ( a . ctype_in , a . name ) )
self . h . write ( ' , \n '
' GCancellable *cancellable, \n '
' GAsyncReadyCallback callback, \n '
' gpointer user_data); \n ' )
self . h . write ( ' \n ' )
# async finish
self . h . write ( ' gboolean %s _call_ %s _finish ( \n '
' %s *proxy ' % ( i . name_lower , m . name_lower , i . camel_name ) )
for a in m . out_args :
self . h . write ( ' , \n %s out_ %s ' % ( a . ctype_out , a . name ) )
self . h . write ( ' , \n '
' GAsyncResult *res, \n '
' GError **error); \n ' )
self . h . write ( ' \n ' )
# sync
self . h . write ( ' gboolean %s _call_ %s _sync ( \n '
' %s *proxy ' % ( i . name_lower , m . name_lower , i . camel_name ) )
for a in m . in_args :
self . h . write ( ' , \n %s %s ' % ( a . ctype_in , a . name ) )
for a in m . out_args :
self . h . write ( ' , \n %s out_ %s ' % ( a . ctype_out , a . name ) )
self . h . write ( ' , \n '
' GCancellable *cancellable, \n '
' GError **error); \n ' )
self . h . write ( ' \n ' )
self . h . write ( ' \n ' )
# Then the property accessor declarations
if len ( i . properties ) > 0 :
self . h . write ( ' \n ' )
self . h . write ( ' /* D-Bus property accessors: */ \n ' )
for p in i . properties :
# getter
self . h . write ( ' %s %s _get_ %s ( %s *object); \n ' % ( p . arg . ctype_in , i . name_lower , p . name_lower , i . camel_name ) )
# setter
self . h . write ( ' void %s _set_ %s ( %s *object, %s value); \n ' % ( i . name_lower , p . name_lower , i . camel_name , p . arg . ctype_in , ) )
self . h . write ( ' \n ' )
# Then the proxy
self . h . write ( ' \n ' )
self . h . write ( ' /* ---- */ \n ' )
self . h . write ( ' \n ' )
self . h . write ( ' #define %s TYPE_ %s _PROXY ( %s _proxy_get_gtype ()) \n ' % ( i . ns_upper , i . name_upper , i . name_lower ) )
self . h . write ( ' #define %s %s _PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %s TYPE_ %s _PROXY, %s Proxy)) \n ' % ( i . ns_upper , i . name_upper , i . ns_upper , i . name_upper , i . camel_name ) )
self . h . write ( ' #define %s %s _PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %s TYPE_ %s _PROXY, %s ProxyClass)) \n ' % ( i . ns_upper , i . name_upper , i . ns_upper , i . name_upper , i . camel_name ) )
self . h . write ( ' #define %s %s _PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %s TYPE_ %s _PROXY, %s ProxyClass)) \n ' % ( i . ns_upper , i . name_upper , i . ns_upper , i . name_upper , i . camel_name ) )
self . h . write ( ' #define %s IS_ %s _PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %s TYPE_ %s _PROXY)) \n ' % ( i . ns_upper , i . name_upper , i . ns_upper , i . name_upper ) )
self . h . write ( ' #define %s IS_ %s _PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %s TYPE_ %s _PROXY)) \n ' % ( i . ns_upper , i . name_upper , i . ns_upper , i . name_upper ) )
self . h . write ( ' \n ' )
self . h . write ( ' typedef struct _ %s Proxy %s Proxy; \n ' % ( i . camel_name , i . camel_name ) )
self . h . write ( ' typedef struct _ %s ProxyClass %s ProxyClass; \n ' % ( i . camel_name , i . camel_name ) )
self . h . write ( ' typedef struct _ %s ProxyPrivate %s ProxyPrivate; \n ' % ( i . camel_name , i . camel_name ) )
self . h . write ( ' \n ' )
self . h . write ( ' struct _ %s Proxy \n ' % ( i . camel_name ) )
self . h . write ( ' { \n ' )
self . h . write ( ' GDBusProxy parent_instance; \n ' )
self . h . write ( ' %s ProxyPrivate *priv; \n ' % ( i . camel_name ) )
self . h . write ( ' }; \n ' )
self . h . write ( ' \n ' )
self . h . write ( ' struct _ %s ProxyClass \n ' % ( i . camel_name ) )
self . h . write ( ' { \n ' )
self . h . write ( ' GDBusProxyClass parent_class; \n ' )
self . h . write ( ' }; \n ' )
self . h . write ( ' \n ' )
self . h . write ( ' GType %s _proxy_get_gtype (void) G_GNUC_CONST; \n ' % ( i . name_lower ) )
self . h . write ( ' \n ' )
self . h . write ( ' void %s _proxy_new ( \n '
' GDBusConnection *connection, \n '
' GDBusProxyFlags flags, \n '
' const gchar *name, \n '
' const gchar *object_path, \n '
' GCancellable *cancellable, \n '
' GAsyncReadyCallback callback, \n '
' gpointer user_data); \n '
% ( i . name_lower ) )
self . h . write ( ' %s * %s _proxy_new_finish ( \n '
' GAsyncResult *res, \n '
' GError **error); \n '
% ( i . camel_name , i . name_lower ) )
self . h . write ( ' %s * %s _proxy_new_sync ( \n '
' GDBusConnection *connection, \n '
' GDBusProxyFlags flags, \n '
' const gchar *name, \n '
' const gchar *object_path, \n '
' GCancellable *cancellable, \n '
' GError **error); \n '
% ( i . camel_name , i . name_lower ) )
self . h . write ( ' \n ' )
self . h . write ( ' void %s _proxy_new_for_bus ( \n '
' GBusType bus_type, \n '
' GDBusProxyFlags flags, \n '
' const gchar *name, \n '
' const gchar *object_path, \n '
' GCancellable *cancellable, \n '
' GAsyncReadyCallback callback, \n '
' gpointer user_data); \n '
% ( i . name_lower ) )
self . h . write ( ' %s * %s _proxy_new_for_bus_finish ( \n '
' GAsyncResult *res, \n '
' GError **error); \n '
% ( i . camel_name , i . name_lower ) )
self . h . write ( ' %s * %s _proxy_new_for_bus_sync ( \n '
' GBusType bus_type, \n '
' GDBusProxyFlags flags, \n '
' const gchar *name, \n '
' const gchar *object_path, \n '
' GCancellable *cancellable, \n '
' GError **error); \n '
% ( i . camel_name , i . name_lower ) )
self . h . write ( ' \n ' )
# Interface proxy accessors
self . h . write ( ' #define %s GET_ %s (object) (g_dbus_object_lookup_with_typecheck (G_DBUS_OBJECT (object), " %s " , %s TYPE_ %s )) \n ' % ( i . ns_upper , i . name_upper , i . name , i . ns_upper , i . name_upper ) )
self . h . write ( ' #define %s PEEK_ %s (object) (g_dbus_object_peek_with_typecheck (G_DBUS_OBJECT (object), " %s " , %s TYPE_ %s )) \n ' % ( i . ns_upper , i . name_upper , i . name , i . ns_upper , i . name_upper ) )
self . h . write ( ' \n ' )
# Then the stub
self . h . write ( ' \n ' )
self . h . write ( ' /* ---- */ \n ' )
self . h . write ( ' \n ' )
self . h . write ( ' #define %s TYPE_ %s _STUB ( %s _stub_get_gtype ()) \n ' % ( i . ns_upper , i . name_upper , i . name_lower ) )
self . h . write ( ' #define %s %s _STUB(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %s TYPE_ %s _STUB, %s Stub)) \n ' % ( i . ns_upper , i . name_upper , i . ns_upper , i . name_upper , i . camel_name ) )
self . h . write ( ' #define %s %s _STUB_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %s TYPE_ %s _STUB, %s StubClass)) \n ' % ( i . ns_upper , i . name_upper , i . ns_upper , i . name_upper , i . camel_name ) )
self . h . write ( ' #define %s %s _STUB_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %s TYPE_ %s _STUB, %s StubClass)) \n ' % ( i . ns_upper , i . name_upper , i . ns_upper , i . name_upper , i . camel_name ) )
self . h . write ( ' #define %s IS_ %s _STUB(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %s TYPE_ %s _STUB)) \n ' % ( i . ns_upper , i . name_upper , i . ns_upper , i . name_upper ) )
self . h . write ( ' #define %s IS_ %s _STUB_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %s TYPE_ %s _STUB)) \n ' % ( i . ns_upper , i . name_upper , i . ns_upper , i . name_upper ) )
self . h . write ( ' \n ' )
self . h . write ( ' typedef struct _ %s Stub %s Stub; \n ' % ( i . camel_name , i . camel_name ) )
self . h . write ( ' typedef struct _ %s StubClass %s StubClass; \n ' % ( i . camel_name , i . camel_name ) )
self . h . write ( ' typedef struct _ %s StubPrivate %s StubPrivate; \n ' % ( i . camel_name , i . camel_name ) )
self . h . write ( ' \n ' )
self . h . write ( ' struct _ %s Stub \n ' % ( i . camel_name ) )
self . h . write ( ' { \n ' )
self . h . write ( ' GDBusInterfaceStub parent_instance; \n ' )
self . h . write ( ' %s StubPrivate *priv; \n ' % ( i . camel_name ) )
self . h . write ( ' }; \n ' )
self . h . write ( ' \n ' )
self . h . write ( ' struct _ %s StubClass \n ' % ( i . camel_name ) )
self . h . write ( ' { \n ' )
self . h . write ( ' GDBusInterfaceStubClass parent_class; \n ' )
self . h . write ( ' }; \n ' )
self . h . write ( ' \n ' )
self . h . write ( ' GType %s _stub_get_gtype (void) G_GNUC_CONST; \n ' % ( i . name_lower ) )
self . h . write ( ' \n ' )
self . h . write ( ' %s * %s _stub_new (void); \n ' % ( i . camel_name , i . name_lower ) )
self . h . write ( ' \n ' )
# Finally, the proxy manager
2011-04-12 17:50:34 +02:00
if self . generate_objmanager :
self . h . write ( ' \n ' )
self . h . write ( ' /* ---- */ \n ' )
self . h . write ( ' \n ' )
self . h . write ( ' #define %s TYPE_OBJECT_MANAGER_CLIENT ( %s object_manager_client_get_gtype ()) \n ' % ( self . ns_upper , self . ns_lower ) )
self . h . write ( ' #define %s OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %s TYPE_OBJECT_MANAGER_CLIENT, %s ObjectManagerClient)) \n ' % ( self . ns_upper , self . ns_upper , self . namespace ) )
self . h . write ( ' #define %s OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %s TYPE_OBJECT_MANAGER_CLIENT, %s ObjectManagerClientClass)) \n ' % ( self . ns_upper , self . ns_upper , self . namespace ) )
self . h . write ( ' #define %s OBJECT_MANAGER_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %s TYPE_OBJECT_MANAGER_CLIENT, %s ObjectManagerClientClass)) \n ' % ( self . ns_upper , self . ns_upper , self . namespace ) )
self . h . write ( ' #define %s IS_OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %s TYPE_OBJECT_MANAGER_CLIENT)) \n ' % ( self . ns_upper , self . ns_upper ) )
self . h . write ( ' #define %s IS_OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %s TYPE_OBJECT_MANAGER_CLIENT)) \n ' % ( self . ns_upper , self . ns_upper ) )
self . h . write ( ' \n ' )
self . h . write ( ' typedef struct _ %s ObjectManagerClient %s ObjectManagerClient; \n ' % ( self . namespace , self . namespace ) )
self . h . write ( ' typedef struct _ %s ObjectManagerClientClass %s ObjectManagerClientClass; \n ' % ( self . namespace , self . namespace ) )
self . h . write ( ' typedef struct _ %s ObjectManagerClientPrivate %s ObjectManagerClientPrivate; \n ' % ( self . namespace , self . namespace ) )
self . h . write ( ' \n ' )
self . h . write ( ' struct _ %s ObjectManagerClient \n ' % ( self . namespace ) )
self . h . write ( ' { \n ' )
self . h . write ( ' GDBusObjectManagerClient parent_instance; \n ' )
self . h . write ( ' %s ObjectManagerClientPrivate *priv; \n ' % ( self . namespace ) )
self . h . write ( ' }; \n ' )
self . h . write ( ' \n ' )
self . h . write ( ' struct _ %s ObjectManagerClientClass \n ' % ( self . namespace ) )
self . h . write ( ' { \n ' )
self . h . write ( ' GDBusObjectManagerClientClass parent_class; \n ' )
self . h . write ( ' }; \n ' )
self . h . write ( ' \n ' )
self . h . write ( ' GType %s object_manager_client_get_gtype (void) G_GNUC_CONST; \n ' % ( self . ns_lower ) )
self . h . write ( ' \n ' )
self . h . write ( ' GDBusProxyTypeFunc %s object_manager_client_get_proxy_type_func (void); \n ' % ( self . ns_lower ) )
self . h . write ( ' \n ' )
self . h . write ( ' void %s object_manager_client_new ( \n '
' GDBusConnection *connection, \n '
' GDBusObjectManagerClientFlags flags, \n '
' const gchar *name, \n '
' const gchar *object_path, \n '
' GCancellable *cancellable, \n '
' GAsyncReadyCallback callback, \n '
' gpointer user_data); \n '
% ( self . ns_lower ) )
self . h . write ( ' GDBusObjectManager * %s object_manager_client_new_finish ( \n '
' GAsyncResult *res, \n '
' GError **error); \n '
% ( self . ns_lower ) )
self . h . write ( ' GDBusObjectManager * %s object_manager_client_new_sync ( \n '
' GDBusConnection *connection, \n '
' GDBusObjectManagerClientFlags flags, \n '
' const gchar *name, \n '
' const gchar *object_path, \n '
' GCancellable *cancellable, \n '
' GError **error); \n '
% ( self . ns_lower ) )
self . h . write ( ' \n ' )
self . h . write ( ' void %s object_manager_client_new_for_bus ( \n '
' GBusType bus_type, \n '
' GDBusObjectManagerClientFlags flags, \n '
' const gchar *name, \n '
' const gchar *object_path, \n '
' GCancellable *cancellable, \n '
' GAsyncReadyCallback callback, \n '
' gpointer user_data); \n '
% ( self . ns_lower ) )
self . h . write ( ' GDBusObjectManager * %s object_manager_client_new_for_bus_finish ( \n '
' GAsyncResult *res, \n '
' GError **error); \n '
% ( self . ns_lower ) )
self . h . write ( ' GDBusObjectManager * %s object_manager_client_new_for_bus_sync ( \n '
' GBusType bus_type, \n '
' GDBusObjectManagerClientFlags flags, \n '
' const gchar *name, \n '
' const gchar *object_path, \n '
' GCancellable *cancellable, \n '
' GError **error); \n '
% ( self . ns_lower ) )
self . h . write ( ' \n ' )
2011-04-08 22:57:31 +02:00
# ----------------------------------------------------------------------------------------------------
def generate_outro ( self ) :
self . h . write ( ' \n '
' G_END_DECLS \n '
' \n '
' #endif /* __ %s __ */ \n ' % ( self . header_guard ) )
# ----------------------------------------------------------------------------------------------------
def generate_annotations ( self , prefix , annotations ) :
if annotations == None :
return
n = 0
for a in annotations :
#self.generate_annotations('%s_%d'%(prefix, n), a.get_annotations())
# skip internal annotations
if a . key . startswith ( ' org.gtk.GDBus ' ) :
continue
self . c . write ( ' static const GDBusAnnotationInfo %s _ %d = \n '
' { \n '
' -1, \n '
' " %s " , \n '
' " %s " , \n ' % ( prefix , n , a . key , a . value ) )
if len ( a . annotations ) == 0 :
self . c . write ( ' NULL \n ' )
else :
self . c . write ( ' (GDBusAnnotationInfo **) & %s _ %d _pointers \n ' % ( prefix , n ) )
self . c . write ( ' }; \n '
' \n ' )
n + = 1
if n > 0 :
self . c . write ( ' static const GDBusAnnotationInfo * const %s _pointers[] = \n '
' { \n ' % ( prefix ) )
m = 0 ;
for a in annotations :
if a . key . startswith ( ' org.gtk.GDBus ' ) :
continue
self . c . write ( ' & %s _ %d , \n ' % ( prefix , m ) )
m + = 1
self . c . write ( ' NULL \n '
' }; \n '
' \n ' )
return n
def generate_args ( self , prefix , args ) :
for a in args :
num_anno = self . generate_annotations ( ' %s _arg_ %s _annotation_info ' % ( prefix , a . name ) , a . annotations )
self . c . write ( ' static const _ExtendedGDBusArgInfo %s _ %s = \n '
' { \n '
' { \n '
' -1, \n '
' " %s " , \n '
' " %s " , \n ' % ( prefix , a . name , a . name , a . signature ) )
if num_anno == 0 :
self . c . write ( ' NULL \n ' )
else :
self . c . write ( ' (GDBusAnnotationInfo **) & %s _arg_ %s _annotation_info_pointers \n ' % ( prefix , a . name ) )
self . c . write ( ' }, \n ' )
if not utils . lookup_annotation ( a . annotations , ' org.gtk.GDBus.C.ForceGVariant ' ) :
self . c . write ( ' FALSE \n ' )
else :
self . c . write ( ' TRUE \n ' )
self . c . write ( ' }; \n '
' \n ' )
if len ( args ) > 0 :
self . c . write ( ' static const _ExtendedGDBusArgInfo * const %s _pointers[] = \n '
' { \n ' % ( prefix ) )
for a in args :
self . c . write ( ' & %s _ %s , \n ' % ( prefix , a . name ) )
self . c . write ( ' NULL \n '
' }; \n '
' \n ' )
def generate_introspection_for_interface ( self , i ) :
self . c . write ( ' /* ---- Introspection data for %s ---- */ \n '
' \n ' % ( i . name ) )
if len ( i . methods ) > 0 :
for m in i . methods :
self . generate_args ( ' _ %s _method_info_ %s _IN_ARG ' % ( i . name_lower , m . name_lower ) , m . in_args )
self . generate_args ( ' _ %s _method_info_ %s _OUT_ARG ' % ( i . name_lower , m . name_lower ) , m . out_args )
num_anno = self . generate_annotations ( ' _ %s _method_ %s _annotation_info ' % ( i . name_lower , m . name_lower ) , m . annotations )
self . c . write ( ' static const _ExtendedGDBusMethodInfo _ %s _method_info_ %s = \n '
' { \n '
' { \n '
' -1, \n '
' " %s " , \n ' % ( i . name_lower , m . name_lower , m . name ) )
if len ( m . in_args ) == 0 :
self . c . write ( ' NULL, \n ' )
else :
self . c . write ( ' (GDBusArgInfo **) &_ %s _method_info_ %s _IN_ARG_pointers, \n ' % ( i . name_lower , m . name_lower ) )
if len ( m . out_args ) == 0 :
self . c . write ( ' NULL, \n ' )
else :
self . c . write ( ' (GDBusArgInfo **) &_ %s _method_info_ %s _OUT_ARG_pointers, \n ' % ( i . name_lower , m . name_lower ) )
if num_anno == 0 :
self . c . write ( ' NULL \n ' )
else :
self . c . write ( ' (GDBusAnnotationInfo **) &_ %s _method_ %s _annotation_info_pointers \n ' % ( i . name_lower , m . name_lower ) )
self . c . write ( ' }, \n '
' " handle- %s " \n '
% ( m . name_hyphen ) )
self . c . write ( ' }; \n '
' \n ' )
self . c . write ( ' static const _ExtendedGDBusMethodInfo * const _ %s _method_info_pointers[] = \n '
' { \n ' % ( i . name_lower ) )
for m in i . methods :
self . c . write ( ' &_ %s _method_info_ %s , \n ' % ( i . name_lower , m . name_lower ) )
self . c . write ( ' NULL \n '
' }; \n '
' \n ' )
# ---
if len ( i . signals ) > 0 :
for s in i . signals :
self . generate_args ( ' _ %s _signal_info_ %s _ARG ' % ( i . name_lower , s . name_lower ) , s . args )
num_anno = self . generate_annotations ( ' _ %s _signal_ %s _annotation_info ' % ( i . name_lower , s . name_lower ) , s . annotations )
self . c . write ( ' static const _ExtendedGDBusSignalInfo _ %s _signal_info_ %s = \n '
' { \n '
' { \n '
' -1, \n '
' " %s " , \n ' % ( i . name_lower , s . name_lower , s . name ) )
if len ( s . args ) == 0 :
self . c . write ( ' NULL, \n ' )
else :
self . c . write ( ' (GDBusArgInfo **) &_ %s _signal_info_ %s _ARG_pointers, \n ' % ( i . name_lower , s . name_lower ) )
if num_anno == 0 :
self . c . write ( ' NULL \n ' )
else :
self . c . write ( ' (GDBusAnnotationInfo **) &_ %s _signal_ %s _annotation_info_pointers \n ' % ( i . name_lower , s . name_lower ) )
self . c . write ( ' }, \n '
' " %s " \n '
% ( s . name_hyphen ) )
self . c . write ( ' }; \n '
' \n ' )
self . c . write ( ' static const _ExtendedGDBusSignalInfo * const _ %s _signal_info_pointers[] = \n '
' { \n ' % ( i . name_lower ) )
for s in i . signals :
self . c . write ( ' &_ %s _signal_info_ %s , \n ' % ( i . name_lower , s . name_lower ) )
self . c . write ( ' NULL \n '
' }; \n '
' \n ' )
# ---
if len ( i . properties ) > 0 :
for p in i . properties :
if p . readable and p . writable :
access = ' G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE '
elif p . readable :
access = ' G_DBUS_PROPERTY_INFO_FLAGS_READABLE '
elif p . writable :
access = ' G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE '
else :
access = ' G_DBUS_PROPERTY_INFO_FLAGS_NONE '
num_anno = self . generate_annotations ( ' _ %s _property_ %s _annotation_info ' % ( i . name_lower , p . name_lower ) , p . annotations )
self . c . write ( ' static const _ExtendedGDBusPropertyInfo _ %s _property_info_ %s = \n '
' { \n '
' { \n '
' -1, \n '
' " %s " , \n '
' " %s " , \n '
' %s , \n ' % ( i . name_lower , p . name_lower , p . name , p . arg . signature , access ) )
if num_anno == 0 :
self . c . write ( ' NULL \n ' )
else :
self . c . write ( ' (GDBusAnnotationInfo **) &_ %s _property_ %s _annotation_info_pointers \n ' % ( i . name_lower , p . name_lower ) )
self . c . write ( ' }, \n '
' " %s " , \n '
% ( p . name_hyphen ) )
if not utils . lookup_annotation ( p . annotations , ' org.gtk.GDBus.C.ForceGVariant ' ) :
self . c . write ( ' FALSE \n ' )
else :
self . c . write ( ' TRUE \n ' )
self . c . write ( ' }; \n '
' \n ' )
self . c . write ( ' static const _ExtendedGDBusPropertyInfo * const _ %s _property_info_pointers[] = \n '
' { \n ' % ( i . name_lower ) )
for p in i . properties :
self . c . write ( ' &_ %s _property_info_ %s , \n ' % ( i . name_lower , p . name_lower ) )
self . c . write ( ' NULL \n '
' }; \n '
' \n ' )
num_anno = self . generate_annotations ( ' _ %s _annotation_info ' % ( i . name_lower ) , i . annotations )
self . c . write ( ' static const GDBusInterfaceInfo _ %s _interface_info = \n '
' { \n '
' -1, \n '
' " %s " , \n ' % ( i . name_lower , i . name ) )
if len ( i . methods ) == 0 :
self . c . write ( ' NULL, \n ' )
else :
self . c . write ( ' (GDBusMethodInfo **) &_ %s _method_info_pointers, \n ' % ( i . name_lower ) )
if len ( i . signals ) == 0 :
self . c . write ( ' NULL, \n ' )
else :
self . c . write ( ' (GDBusSignalInfo **) &_ %s _signal_info_pointers, \n ' % ( i . name_lower ) )
if len ( i . properties ) == 0 :
self . c . write ( ' NULL, \n ' )
else :
self . c . write ( ' (GDBusPropertyInfo **) &_ %s _property_info_pointers, \n ' % ( i . name_lower ) )
if num_anno == 0 :
self . c . write ( ' NULL \n ' )
else :
self . c . write ( ' (GDBusAnnotationInfo **) &_ %s _annotation_info_pointers \n ' % ( i . name_lower ) )
self . c . write ( ' }; \n '
' \n ' )
self . c . write ( ' \n ' )
self . c . write ( ' GDBusInterfaceInfo * \n '
' %s _interface_info (void) \n '
' { \n '
' return (GDBusInterfaceInfo *) &_ %s _interface_info; \n '
' } \n '
' \n ' % ( i . name_lower , i . name_lower ) )
if len ( i . properties ) > 0 :
self . c . write ( ' guint \n '
' %s _override_properties (GObjectClass *klass, guint property_id_begin) \n '
' { \n ' % ( i . name_lower ) )
for p in i . properties :
self . c . write ( ' g_object_class_override_property (klass, property_id_begin++, " %s " ); \n ' % ( p . name_hyphen ) )
self . c . write ( ' return property_id_begin - 1; \n '
' } \n '
' \n ' )
self . c . write ( ' \n ' )
# ----------------------------------------------------------------------------------------------------
def generate_interface ( self , i ) :
self . c . write ( ' \n ' )
self . c . write ( ' static void \n '
' %s _default_init ( %s Iface *iface) \n '
' { \n ' % ( i . name_lower , i . camel_name ) ) ;
if len ( i . methods ) > 0 :
self . c . write ( ' /* GObject signals for incoming D-Bus method calls: */ \n ' )
for m in i . methods :
self . c . write ( ' g_signal_new ( " handle- %s " , \n '
' G_TYPE_FROM_INTERFACE (iface), \n '
' G_SIGNAL_RUN_LAST, \n '
' G_STRUCT_OFFSET ( %s Iface, handle_ %s ), \n '
' g_signal_accumulator_true_handled, \n '
' NULL, \n ' # accu_data
2011-04-08 23:34:44 +02:00
' g_cclosure_marshal_generic, \n '
2011-04-08 22:57:31 +02:00
' G_TYPE_BOOLEAN, \n '
' %d , \n '
' G_TYPE_DBUS_METHOD_INVOCATION '
% ( m . name_hyphen , i . camel_name , m . name_lower , len ( m . in_args ) + 1 ) )
for a in m . in_args :
self . c . write ( ' , %s ' % ( a . gtype ) )
self . c . write ( ' ); \n ' )
self . c . write ( ' \n ' )
if len ( i . signals ) > 0 :
self . c . write ( ' /* GObject signals for received D-Bus signals: */ \n ' )
for s in i . signals :
self . c . write ( ' g_signal_new ( " %s " , \n '
' G_TYPE_FROM_INTERFACE (iface), \n '
' G_SIGNAL_RUN_LAST, \n '
' G_STRUCT_OFFSET ( %s Iface, %s ), \n '
' NULL, \n ' # accumulator
' NULL, \n ' # accu_data
2011-04-08 23:34:44 +02:00
' g_cclosure_marshal_generic, \n '
2011-04-08 22:57:31 +02:00
' G_TYPE_NONE, \n '
' %d '
% ( s . name_hyphen , i . camel_name , s . name_lower , len ( s . args ) ) )
for a in s . args :
self . c . write ( ' , %s ' % ( a . gtype ) )
self . c . write ( ' ); \n ' )
self . c . write ( ' \n ' )
if len ( i . properties ) > 0 :
self . c . write ( ' /* GObject properties for D-Bus properties: */ \n ' )
for p in i . properties :
self . c . write ( ' g_object_interface_install_property (iface, \n ' )
if p . arg . gtype == ' G_TYPE_VARIANT ' :
s = ' g_param_spec_variant ( " %s " , NULL, NULL, G_VARIANT_TYPE ( " %s " ), NULL ' % ( p . name_hyphen , p . arg . signature )
elif p . arg . signature == ' b ' :
s = ' g_param_spec_boolean ( " %s " , NULL, NULL, FALSE ' % ( p . name_hyphen )
elif p . arg . signature == ' y ' :
s = ' g_param_spec_uchar ( " %s " , NULL, NULL, 0, 255, 0 ' % ( p . name_hyphen )
elif p . arg . signature == ' n ' :
s = ' g_param_spec_int ( " %s " , NULL, NULL, G_MININT16, G_MAXINT16, 0 ' % ( p . name_hyphen )
elif p . arg . signature == ' q ' :
s = ' g_param_spec_uint ( " %s " , NULL, NULL, 0, G_MAXUINT16, 0 ' % ( p . name_hyphen )
elif p . arg . signature == ' i ' :
s = ' g_param_spec_int ( " %s " , NULL, NULL, G_MININT32, G_MAXINT32, 0 ' % ( p . name_hyphen )
elif p . arg . signature == ' u ' :
s = ' g_param_spec_uint ( " %s " , NULL, NULL, 0, G_MAXUINT32, 0 ' % ( p . name_hyphen )
elif p . arg . signature == ' x ' :
s = ' g_param_spec_int64 ( " %s " , NULL, NULL, G_MININT64, G_MAXINT64, 0 ' % ( p . name_hyphen )
elif p . arg . signature == ' t ' :
s = ' g_param_spec_uint64 ( " %s " , NULL, NULL, 0, G_MAXUINT64, 0 ' % ( p . name_hyphen )
elif p . arg . signature == ' d ' :
s = ' g_param_spec_double ( " %s " , NULL, NULL, -G_MAXDOUBLE, G_MAXDOUBLE, 0.0 ' % ( p . name_hyphen )
elif p . arg . signature == ' s ' :
s = ' g_param_spec_string ( " %s " , NULL, NULL, NULL ' % ( p . name_hyphen )
elif p . arg . signature == ' o ' :
s = ' g_param_spec_string ( " %s " , NULL, NULL, NULL ' % ( p . name_hyphen )
elif p . arg . signature == ' g ' :
s = ' g_param_spec_string ( " %s " , NULL, NULL, NULL ' % ( p . name_hyphen )
elif p . arg . signature == ' ay ' :
s = ' g_param_spec_string ( " %s " , NULL, NULL, NULL ' % ( p . name_hyphen )
elif p . arg . signature == ' as ' :
s = ' g_param_spec_boxed ( " %s " , NULL, NULL, G_TYPE_STRV ' % ( p . name_hyphen )
elif p . arg . signature == ' aay ' :
s = ' g_param_spec_boxed ( " %s " , NULL, NULL, G_TYPE_STRV ' % ( p . name_hyphen )
else :
raise RuntimeError ( ' Unsupported gtype %s for GParamSpec ' % ( p . arg . gtype ) )
self . c . write ( ' %s , G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ' % s ) ;
self . c . write ( ' \n ' )
self . c . write ( ' } \n '
' \n ' )
self . c . write ( ' typedef %s Iface %s Interface; \n ' % ( i . camel_name , i . camel_name ) )
self . c . write ( ' #define %s _get_type %s _get_gtype \n ' % ( i . name_lower , i . name_lower ) )
self . c . write ( ' G_DEFINE_INTERFACE ( %s , %s , G_TYPE_OBJECT); \n ' % ( i . camel_name , i . name_lower ) )
self . c . write ( ' #undef %s _get_type \n ' % ( i . name_lower ) )
self . c . write ( ' \n ' )
# ----------------------------------------------------------------------------------------------------
def generate_property_accessors ( self , i ) :
for p in i . properties :
# getter
self . c . write ( ' %s \n '
' %s _get_ %s ( %s *object) \n '
' { \n '
' %s value; \n ' % ( p . arg . ctype_in , i . name_lower , p . name_lower , i . camel_name , p . arg . ctype_in_g ) )
self . c . write ( ' g_object_get (G_OBJECT (object), " %s " , &value, NULL); \n ' % ( p . name_hyphen ) )
if p . arg . free_func :
self . c . write ( ' if (value != NULL) \n '
' g_object_set_data_full (G_OBJECT (object), " -x-memoizing- %s " , (gpointer) value, (GDestroyNotify) %s ); \n '
' else \n '
' g_object_set_data_full (G_OBJECT (object), " -x-memoizing- %s " , (gpointer) value, NULL); \n '
% ( p . name_hyphen , p . arg . free_func , p . name_hyphen ) )
self . c . write ( ' return value; \n ' )
self . c . write ( ' } \n ' )
self . c . write ( ' \n ' )
# setter
self . c . write ( ' void \n '
' %s _set_ %s ( %s *object, %s value) \n '
' { \n ' % ( i . name_lower , p . name_lower , i . camel_name , p . arg . ctype_in , ) )
self . c . write ( ' g_object_set (G_OBJECT (object), " %s " , value, NULL); \n ' % ( p . name_hyphen ) )
self . c . write ( ' } \n ' )
self . c . write ( ' \n ' )
# ---------------------------------------------------------------------------------------------------
def generate_signal_emitters ( self , i ) :
for s in i . signals :
self . c . write ( ' void \n '
' %s _emit_ %s ( \n '
' %s *object ' % ( i . name_lower , s . name_lower , i . camel_name ) )
for a in s . args :
self . c . write ( ' , \n %s %s ' % ( a . ctype_in , a . name ) )
self . c . write ( ' ) \n '
' { \n '
' g_signal_emit_by_name (object, " %s " ' % ( s . name_hyphen ) )
for a in s . args :
self . c . write ( ' , %s ' % a . name )
self . c . write ( ' ); \n ' )
self . c . write ( ' } \n '
' \n ' )
# ---------------------------------------------------------------------------------------------------
def generate_method_calls ( self , i ) :
for m in i . methods :
# async begin
self . c . write ( ' void \n '
' %s _call_ %s ( \n '
' %s *proxy ' % ( i . name_lower , m . name_lower , i . camel_name ) )
for a in m . in_args :
self . c . write ( ' , \n %s %s ' % ( a . ctype_in , a . name ) )
self . c . write ( ' , \n '
' GCancellable *cancellable, \n '
' GAsyncReadyCallback callback, \n '
' gpointer user_data) \n '
' { \n ' )
self . c . write ( ' g_dbus_proxy_call (G_DBUS_PROXY (proxy), \n '
' " %s " , \n '
' g_variant_new ( " ( ' % ( m . name ) )
for a in m . in_args :
self . c . write ( ' %s ' % ( a . format_in ) )
self . c . write ( ' ) " ' )
for a in m . in_args :
self . c . write ( ' , \n %s ' % ( a . name ) )
self . c . write ( ' ), \n '
' G_DBUS_CALL_FLAGS_NONE, \n '
' -1, \n '
' cancellable, \n '
' callback, \n '
' user_data); \n ' )
self . c . write ( ' } \n '
' \n ' )
# async finish
self . c . write ( ' gboolean \n '
' %s _call_ %s _finish ( \n '
' %s *proxy ' % ( i . name_lower , m . name_lower , i . camel_name ) )
for a in m . out_args :
self . c . write ( ' , \n %s out_ %s ' % ( a . ctype_out , a . name ) )
self . c . write ( ' , \n '
' GAsyncResult *res, \n '
' GError **error) \n '
' { \n '
' GVariant *_ret; \n '
' _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); \n '
' if (_ret == NULL) \n '
' goto _out; \n ' )
self . c . write ( ' g_variant_get (_ret, \n '
' \" ( ' )
for a in m . out_args :
self . c . write ( ' %s ' % ( a . format_out ) )
self . c . write ( ' ) " ' )
for a in m . out_args :
self . c . write ( ' , \n out_ %s ' % ( a . name ) )
self . c . write ( ' ); \n '
' g_variant_unref (_ret); \n ' )
self . c . write ( ' _out: \n '
' return _ret != NULL; \n '
' } \n '
' \n ' )
# sync
self . c . write ( ' gboolean \n '
' %s _call_ %s _sync ( \n '
' %s *proxy ' % ( i . name_lower , m . name_lower , i . camel_name ) )
for a in m . in_args :
self . c . write ( ' , \n %s %s ' % ( a . ctype_in , a . name ) )
for a in m . out_args :
self . c . write ( ' , \n %s out_ %s ' % ( a . ctype_out , a . name ) )
self . c . write ( ' , \n '
' GCancellable *cancellable, \n '
' GError **error) \n '
' { \n '
' GVariant *_ret; \n ' )
self . c . write ( ' _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), \n '
' " %s " , \n '
' g_variant_new ( " ( ' % ( m . name ) )
for a in m . in_args :
self . c . write ( ' %s ' % ( a . format_in ) )
self . c . write ( ' ) " ' )
for a in m . in_args :
self . c . write ( ' , \n %s ' % ( a . name ) )
self . c . write ( ' ), \n '
' G_DBUS_CALL_FLAGS_NONE, \n '
' -1, \n '
' cancellable, \n '
' error); \n '
' if (_ret == NULL) \n '
' goto _out; \n ' )
self . c . write ( ' g_variant_get (_ret, \n '
' \" ( ' )
for a in m . out_args :
self . c . write ( ' %s ' % ( a . format_out ) )
self . c . write ( ' ) " ' )
for a in m . out_args :
self . c . write ( ' , \n out_ %s ' % ( a . name ) )
self . c . write ( ' ); \n '
' g_variant_unref (_ret); \n ' )
self . c . write ( ' _out: \n '
' return _ret != NULL; \n '
' } \n '
' \n ' )
# ---------------------------------------------------------------------------------------------------
def generate_method_completers ( self , i ) :
for m in i . methods :
self . c . write ( ' void \n '
' %s _complete_ %s ( \n '
' %s *object, \n '
' GDBusMethodInvocation *invocation ' % ( i . name_lower , m . name_lower , i . camel_name ) )
for a in m . out_args :
self . c . write ( ' , \n %s %s ' % ( a . ctype_in , a . name ) )
self . c . write ( ' ) \n '
' { \n ' )
self . c . write ( ' g_dbus_method_invocation_return_value (invocation, \n '
' g_variant_new ( " ( ' )
for a in m . out_args :
self . c . write ( ' %s ' % ( a . format_in ) )
self . c . write ( ' ) " ' )
for a in m . out_args :
self . c . write ( ' , \n %s ' % ( a . name ) )
self . c . write ( ' )); \n '
' } \n '
' \n ' )
# ---------------------------------------------------------------------------------------------------
def generate_proxy ( self , i ) :
# class boilerplate
self . c . write ( ' /* ------------------------------------------------------------------------ */ \n '
' \n ' )
self . c . write ( ' static void \n '
' %s _proxy_iface_init ( %s Iface *iface) \n '
' { \n '
' } \n '
' \n ' % ( i . name_lower , i . camel_name ) )
self . c . write ( ' #define %s _proxy_get_type %s _proxy_get_gtype \n ' % ( i . name_lower , i . name_lower ) )
self . c . write ( ' G_DEFINE_TYPE_WITH_CODE ( %s Proxy, %s _proxy, G_TYPE_DBUS_PROXY, \n ' % ( i . camel_name , i . name_lower ) )
self . c . write ( ' G_IMPLEMENT_INTERFACE ( %s TYPE_ %s , %s _proxy_iface_init)); \n ' % ( i . ns_upper , i . name_upper , i . name_lower ) )
self . c . write ( ' #undef %s _proxy_get_type \n '
' \n ' % ( i . name_lower ) )
# property accessors
#
# Note that we are guaranteed that prop_id starts at 1 and is
# laid out in the same order as introspection data pointers
#
self . c . write ( ' static void \n '
' %s _proxy_get_property (GObject *object, \n '
' guint prop_id, \n '
' GValue *value, \n '
' GParamSpec *pspec) \n '
' { \n ' % ( i . name_lower ) )
if len ( i . properties ) > 0 :
self . c . write ( ' const _ExtendedGDBusPropertyInfo *info; \n '
' GVariant *variant; \n '
' g_assert (prop_id - 1 >= 0 && prop_id - 1 < %d ); \n '
' info = _ %s _property_info_pointers[prop_id - 1]; \n '
' variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name); \n '
' if (info->use_gvariant) \n '
' g_value_set_variant (value, variant); \n '
' else \n '
' g_dbus_gvariant_to_gvalue (variant, value); \n '
' if (variant != NULL) \n '
' g_variant_unref (variant); \n '
% ( len ( i . properties ) , i . name_lower ) )
self . c . write ( ' } \n '
' \n ' )
if len ( i . properties ) > 0 :
self . c . write ( ' static void \n '
' %s _proxy_set_property_cb (GDBusProxy *proxy, \n '
' GAsyncResult *res, \n '
' gpointer user_data) \n '
' { \n ' % ( i . name_lower ) )
self . c . write ( ' const _ExtendedGDBusPropertyInfo *info = user_data; \n '
' GError *error; \n '
' error = NULL; \n '
' if (!g_dbus_proxy_call_finish (proxy, res, &error)) \n '
' { \n '
' g_warning ( " Error setting property ` %% s \' on interface %s : %% s ( %% s, %% d) " , \n '
' info->parent_struct.name, \n '
' error->message, g_quark_to_string (error->domain), error->code); \n '
' g_error_free (error); \n '
' } \n '
% ( i . name ) )
self . c . write ( ' } \n '
' \n ' )
self . c . write ( ' static void \n '
' %s _proxy_set_property (GObject *object, \n '
' guint prop_id, \n '
' const GValue *value, \n '
' GParamSpec *pspec) \n '
' { \n ' % ( i . name_lower ) )
if len ( i . properties ) > 0 :
self . c . write ( ' const _ExtendedGDBusPropertyInfo *info; \n '
' GVariant *variant; \n '
' g_assert (prop_id - 1 >= 0 && prop_id - 1 < %d ); \n '
' info = _ %s _property_info_pointers[prop_id - 1]; \n '
' variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature)); \n '
' g_dbus_proxy_call (G_DBUS_PROXY (object), \n '
' " org.freedesktop.DBus.Properties.Set " , \n '
' g_variant_new ( " (ssv) " , " %s " , info->parent_struct.name, variant), \n '
' G_DBUS_CALL_FLAGS_NONE, \n '
' -1, \n '
' NULL, (GAsyncReadyCallback) %s _proxy_set_property_cb, (gpointer) info); \n '
' g_variant_unref (variant); \n '
% ( len ( i . properties ) , i . name_lower , i . name , i . name_lower ) )
self . c . write ( ' } \n '
' \n ' )
# signal received
self . c . write ( ' static void \n '
' %s _proxy_g_signal (GDBusProxy *proxy, \n '
' const gchar *sender_name, \n '
' const gchar *signal_name, \n '
' GVariant *parameters) \n '
' { \n ' % ( i . name_lower ) )
self . c . write ( ' _ExtendedGDBusSignalInfo *info; \n '
' GVariantIter iter; \n '
' GVariant *child; \n '
' GValue *paramv; \n '
' guint num_params; \n '
' guint n; \n '
' guint signal_id; \n ' ) ;
# Note: info could be NULL if we are talking to a newer version of the interface
self . c . write ( ' info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_ %s _interface_info, signal_name); \n '
' if (info == NULL) \n '
' return; \n '
% ( i . name_lower ) )
self . c . write ( ' num_params = g_variant_n_children (parameters); \n '
' paramv = g_new0 (GValue, num_params + 1); \n '
' g_value_init (¶mv[0], %s TYPE_ %s ); \n '
' g_value_set_object (¶mv[0], proxy); \n '
% ( i . ns_upper , i . name_upper ) )
self . c . write ( ' g_variant_iter_init (&iter, parameters); \n '
' n = 1; \n '
' while ((child = g_variant_iter_next_value (&iter)) != NULL) \n '
' { \n '
' _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1]; \n '
' if (arg_info->use_gvariant) \n '
' { \n '
' g_value_init (¶mv[n], G_TYPE_VARIANT); \n '
' g_value_set_variant (¶mv[n], child); \n '
' n++; \n '
' } \n '
' else \n '
' g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); \n '
' g_variant_unref (child); \n '
' } \n '
)
self . c . write ( ' signal_id = g_signal_lookup (info->signal_name, %s TYPE_ %s ); \n '
% ( i . ns_upper , i . name_upper ) )
self . c . write ( ' g_signal_emitv (paramv, signal_id, 0, NULL); \n ' )
self . c . write ( ' for (n = 0; n < num_params + 1; n++) \n '
' g_value_unset (¶mv[n]); \n '
' g_free (paramv); \n ' )
self . c . write ( ' } \n '
' \n ' )
# property changed
self . c . write ( ' static void \n '
' %s _proxy_g_properties_changed (GDBusProxy *proxy, \n '
' GVariant *changed_properties, \n '
' const gchar *const *invalidated_properties) \n '
' { \n ' % ( i . name_lower ) )
# Note: info could be NULL if we are talking to a newer version of the interface
self . c . write ( ' guint n; \n '
' const gchar *key; \n '
' GVariantIter *iter; \n '
' _ExtendedGDBusPropertyInfo *info; \n '
' g_variant_get (changed_properties, " a {sv} " , &iter); \n '
' while (g_variant_iter_next (iter, " { &sv} " , &key, NULL)) \n '
' { \n '
' info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_ %s _interface_info, key); \n '
' if (info != NULL) \n '
' g_object_notify (G_OBJECT (proxy), info->hyphen_name); \n '
' } \n '
' g_variant_iter_free (iter); \n '
' for (n = 0; invalidated_properties[n] != NULL; n++) \n '
' { \n '
' info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_ %s _interface_info, invalidated_properties[n]); \n '
' if (info != NULL) \n '
' g_object_notify (G_OBJECT (proxy), info->hyphen_name); \n '
' } \n '
' } \n '
' \n '
% ( i . name_lower , i . name_lower ) )
# class boilerplate
self . c . write ( ' static void \n '
' %s _proxy_init ( %s Proxy *proxy) \n '
' { \n '
' g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), %s _interface_info ()); \n '
' } \n '
' \n ' % ( i . name_lower , i . camel_name , i . name_lower ) )
self . c . write ( ' static void \n '
' %s _proxy_class_init ( %s ProxyClass *klass) \n '
' { \n '
' GObjectClass *gobject_class; \n '
' GDBusProxyClass *proxy_class; \n '
' \n '
' gobject_class = G_OBJECT_CLASS (klass); \n '
' gobject_class->get_property = %s _proxy_get_property; \n '
' gobject_class->set_property = %s _proxy_set_property; \n '
' \n '
' proxy_class = G_DBUS_PROXY_CLASS (klass); \n '
' proxy_class->g_signal = %s _proxy_g_signal; \n '
' proxy_class->g_properties_changed = %s _proxy_g_properties_changed; \n '
' \n ' % ( i . name_lower , i . camel_name , i . name_lower , i . name_lower , i . name_lower , i . name_lower ) )
if len ( i . properties ) > 0 :
self . c . write ( ' \n '
' %s _override_properties (gobject_class, 1); \n ' % ( i . name_lower ) )
self . c . write ( ' } \n ' )
# constructors
self . c . write ( ' void \n '
' %s _proxy_new ( \n '
' GDBusConnection *connection, \n '
' GDBusProxyFlags flags, \n '
' const gchar *name, \n '
' const gchar *object_path, \n '
' GCancellable *cancellable, \n '
' GAsyncReadyCallback callback, \n '
' gpointer user_data) \n '
' { \n '
' g_async_initable_new_async ( %s TYPE_ %s _PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, " g-flags " , flags, " g-name " , name, " g-connection " , connection, " g-object-path " , object_path, " g-interface-name " , " %s " , NULL); \n '
' } \n '
' \n '
% ( i . name_lower , i . ns_upper , i . name_upper , i . name ) )
self . c . write ( ' %s * \n '
' %s _proxy_new_finish ( \n '
' GAsyncResult *res, \n '
' GError **error) \n '
' { \n '
' GObject *ret; \n '
' GObject *source_object; \n '
' source_object = g_async_result_get_source_object (res); \n '
' ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); \n '
' g_object_unref (source_object); \n '
' if (ret != NULL) \n '
' return %s %s (ret); \n '
' else \n '
' return NULL; \n '
' } \n '
' \n '
% ( i . camel_name , i . name_lower , i . ns_upper , i . name_upper ) )
self . c . write ( ' %s * \n '
' %s _proxy_new_sync ( \n '
' GDBusConnection *connection, \n '
' GDBusProxyFlags flags, \n '
' const gchar *name, \n '
' const gchar *object_path, \n '
' GCancellable *cancellable, \n '
' GError **error) \n '
' { \n '
' GInitable *ret; \n '
' ret = g_initable_new ( %s TYPE_ %s _PROXY, cancellable, error, " g-flags " , flags, " g-name " , name, " g-connection " , connection, " g-object-path " , object_path, " g-interface-name " , " %s " , NULL); \n '
' if (ret != NULL) \n '
' return %s %s (ret); \n '
' else \n '
' return NULL; \n '
' } \n '
' \n '
% ( i . camel_name , i . name_lower , i . ns_upper , i . name_upper , i . name , i . ns_upper , i . name_upper ) )
self . c . write ( ' \n ' )
self . c . write ( ' void \n '
' %s _proxy_new_for_bus ( \n '
' GBusType bus_type, \n '
' GDBusProxyFlags flags, \n '
' const gchar *name, \n '
' const gchar *object_path, \n '
' GCancellable *cancellable, \n '
' GAsyncReadyCallback callback, \n '
' gpointer user_data) \n '
' { \n '
' g_async_initable_new_async ( %s TYPE_ %s _PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, " g-flags " , flags, " g-name " , name, " g-bus-type " , bus_type, " g-object-path " , object_path, " g-interface-name " , " %s " , NULL); \n '
' } \n '
' \n '
% ( i . name_lower , i . ns_upper , i . name_upper , i . name ) )
self . c . write ( ' %s * \n '
' %s _proxy_new_for_bus_finish ( \n '
' GAsyncResult *res, \n '
' GError **error) \n '
' { \n '
' GObject *ret; \n '
' GObject *source_object; \n '
' source_object = g_async_result_get_source_object (res); \n '
' ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); \n '
' g_object_unref (source_object); \n '
' if (ret != NULL) \n '
' return %s %s (ret); \n '
' else \n '
' return NULL; \n '
' } \n '
' \n '
% ( i . camel_name , i . name_lower , i . ns_upper , i . name_upper ) )
self . c . write ( ' %s * \n '
' %s _proxy_new_for_bus_sync ( \n '
' GBusType bus_type, \n '
' GDBusProxyFlags flags, \n '
' const gchar *name, \n '
' const gchar *object_path, \n '
' GCancellable *cancellable, \n '
' GError **error) \n '
' { \n '
' GInitable *ret; \n '
' ret = g_initable_new ( %s TYPE_ %s _PROXY, cancellable, error, " g-flags " , flags, " g-name " , name, " g-bus-type " , bus_type, " g-object-path " , object_path, " g-interface-name " , " %s " , NULL); \n '
' if (ret != NULL) \n '
' return %s %s (ret); \n '
' else \n '
' return NULL; \n '
' } \n '
' \n '
% ( i . camel_name , i . name_lower , i . ns_upper , i . name_upper , i . name , i . ns_upper , i . name_upper ) )
self . c . write ( ' \n ' )
# ---------------------------------------------------------------------------------------------------
def generate_stub ( self , i ) :
# class boilerplate
self . c . write ( ' /* ------------------------------------------------------------------------ */ \n '
' \n ' )
self . c . write ( ' struct _ %s StubPrivate \n '
' { \n '
' GValueArray *properties; \n '
' GList *changed_properties; \n '
' GSource *changed_properties_idle_source; \n '
' GMainContext *context; \n '
' }; \n '
' \n ' % i . camel_name )
self . c . write ( ' static void \n '
' _ %s _stub_handle_method_call ( \n '
' GDBusConnection *connection, \n '
' const gchar *sender, \n '
' const gchar *object_path, \n '
' const gchar *interface_name, \n '
' const gchar *method_name, \n '
' GVariant *parameters, \n '
' GDBusMethodInvocation *invocation, \n '
' gpointer user_data) \n '
' { \n '
' %s Stub *stub = %s %s _STUB (user_data); \n '
' _ExtendedGDBusMethodInfo *info; \n '
' GVariantIter iter; \n '
' GVariant *child; \n '
' GValue *paramv; \n '
' guint num_params; \n '
' guint n; \n '
' guint signal_id; \n '
' GValue return_value = {0} ; \n '
% ( i . name_lower , i . camel_name , i . ns_upper , i . name_upper ) )
self . c . write ( ' info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation); \n '
' g_assert (info != NULL); \n '
% ( ) )
self . c . write ( ' num_params = g_variant_n_children (parameters); \n '
' paramv = g_new0 (GValue, num_params + 2); \n '
' g_value_init (¶mv[0], %s TYPE_ %s ); \n '
' g_value_set_object (¶mv[0], stub); \n '
' g_value_init (¶mv[1], G_TYPE_DBUS_METHOD_INVOCATION); \n '
' g_value_set_object (¶mv[1], invocation); \n '
% ( i . ns_upper , i . name_upper ) )
self . c . write ( ' g_variant_iter_init (&iter, parameters); \n '
' n = 2; \n '
' while ((child = g_variant_iter_next_value (&iter)) != NULL) \n '
' { \n '
' _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - 2]; \n '
' if (arg_info->use_gvariant) \n '
' { \n '
' g_value_init (¶mv[n], G_TYPE_VARIANT); \n '
' g_value_set_variant (¶mv[n], child); \n '
' n++; \n '
' } \n '
' else \n '
' g_dbus_gvariant_to_gvalue (child, ¶mv[n++]); \n '
' g_variant_unref (child); \n '
' } \n '
)
self . c . write ( ' signal_id = g_signal_lookup (info->signal_name, %s TYPE_ %s ); \n '
% ( i . ns_upper , i . name_upper ) )
self . c . write ( ' g_value_init (&return_value, G_TYPE_BOOLEAN); \n '
' g_signal_emitv (paramv, signal_id, 0, &return_value); \n '
' if (!g_value_get_boolean (&return_value)) \n '
' g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, " Method %s is not implemented on interface %s " , method_name, interface_name); \n '
' g_value_unset (&return_value); \n '
)
self . c . write ( ' for (n = 0; n < num_params + 2; n++) \n '
' g_value_unset (¶mv[n]); \n '
' g_free (paramv); \n ' )
self . c . write ( ' } \n '
' \n ' )
self . c . write ( ' static GVariant * \n '
' _ %s _stub_handle_get_property ( \n '
' GDBusConnection *connection, \n '
' const gchar *sender, \n '
' const gchar *object_path, \n '
' const gchar *interface_name, \n '
' const gchar *property_name, \n '
' GError **error, \n '
' gpointer user_data) \n '
' { \n '
' %s Stub *stub = %s %s _STUB (user_data); \n '
' GValue value = {0} ; \n '
' GParamSpec *pspec; \n '
' _ExtendedGDBusPropertyInfo *info; \n '
' GVariant *ret; \n '
% ( i . name_lower , i . camel_name , i . ns_upper , i . name_upper ) )
self . c . write ( ' ret = NULL; \n '
' info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_ %s _interface_info, property_name); \n '
' g_assert (info != NULL); \n '
' pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (stub), info->hyphen_name); \n '
' if (pspec == NULL) \n '
' { \n '
' g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, " No property with name %% s " , property_name); \n '
' } \n '
' else \n '
' { \n '
' g_value_init (&value, pspec->value_type); \n '
' g_object_get_property (G_OBJECT (stub), info->hyphen_name, &value); \n '
' ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature)); \n '
' g_value_unset (&value); \n '
' } \n '
' return ret; \n '
' } \n '
' \n '
% ( i . name_lower ) )
self . c . write ( ' static gboolean \n '
' _ %s _stub_handle_set_property ( \n '
' GDBusConnection *connection, \n '
' const gchar *sender, \n '
' const gchar *object_path, \n '
' const gchar *interface_name, \n '
' const gchar *property_name, \n '
' GVariant *variant, \n '
' GError **error, \n '
' gpointer user_data) \n '
' { \n '
' %s Stub *stub = %s %s _STUB (user_data); \n '
' GValue value = {0} ; \n '
' GParamSpec *pspec; \n '
' _ExtendedGDBusPropertyInfo *info; \n '
' gboolean ret; \n '
% ( i . name_lower , i . camel_name , i . ns_upper , i . name_upper ) )
self . c . write ( ' ret = FALSE; \n '
' info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_ %s _interface_info, property_name); \n '
' g_assert (info != NULL); \n '
' pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (stub), info->hyphen_name); \n '
' if (pspec == NULL) \n '
' { \n '
' g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, " No property with name %% s " , property_name); \n '
' } \n '
' else \n '
' { \n '
' if (info->use_gvariant) \n '
' g_value_set_variant (&value, variant); \n '
' else \n '
' g_dbus_gvariant_to_gvalue (variant, &value); \n '
' g_object_set_property (G_OBJECT (stub), info->hyphen_name, &value); \n '
' g_value_unset (&value); \n '
' ret = TRUE; \n '
' } \n '
' return ret; \n '
' } \n '
' \n '
% ( i . name_lower ) )
self . c . write ( ' static const GDBusInterfaceVTable _ %s _stub_vtable = \n '
' { \n '
' _ %s _stub_handle_method_call, \n '
' _ %s _stub_handle_get_property, \n '
' _ %s _stub_handle_set_property \n '
' }; \n '
' \n ' % ( i . name_lower , i . name_lower , i . name_lower , i . name_lower ) )
self . c . write ( ' static GDBusInterfaceInfo * \n '
' %s _stub_dbus_interface_get_info (GDBusInterfaceStub *stub) \n '
' { \n '
' return %s _interface_info (); \n '
% ( i . name_lower , i . name_lower ) )
self . c . write ( ' } \n '
' \n ' )
self . c . write ( ' static GDBusInterfaceVTable * \n '
' %s _stub_dbus_interface_get_vtable (GDBusInterfaceStub *stub) \n '
' { \n '
' return (GDBusInterfaceVTable *) &_ %s _stub_vtable; \n '
% ( i . name_lower , i . name_lower ) )
self . c . write ( ' } \n '
' \n ' )
self . c . write ( ' static GVariant * \n '
' %s _stub_dbus_interface_get_properties (GDBusInterfaceStub *_stub) \n '
' { \n '
' %s Stub *stub = %s %s _STUB (_stub); \n '
% ( i . name_lower , i . camel_name , i . ns_upper , i . name_upper ) )
self . c . write ( ' \n '
' GVariantBuilder builder; \n '
' guint n; \n '
' g_variant_builder_init (&builder, G_VARIANT_TYPE ( " a {sv} " )); \n '
' if (_ %s _interface_info.properties == NULL) \n '
' goto out; \n '
' for (n = 0; _ %s _interface_info.properties[n] != NULL; n++) \n '
' { \n '
' GDBusPropertyInfo *info = _ %s _interface_info.properties[n]; \n '
' if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE) \n '
' { \n '
' GVariant *value; \n '
' value = _ %s _stub_handle_get_property (g_dbus_interface_stub_get_connection (G_DBUS_INTERFACE_STUB (stub)), NULL, g_dbus_interface_stub_get_object_path (G_DBUS_INTERFACE_STUB (stub)), " %s " , info->name, NULL, stub); \n '
' if (value != NULL) \n '
' { \n '
' if (g_variant_is_floating (value)) \n '
' g_variant_ref_sink (value); \n '
' g_variant_builder_add (&builder, " {sv} " , info->name, value); \n '
' g_variant_unref (value); \n '
' } \n '
' } \n '
' } \n '
' out: \n '
' return g_variant_builder_end (&builder); \n '
' } \n '
' \n '
% ( i . name_lower , i . name_lower , i . name_lower , i . name_lower , i . name ) )
if len ( i . properties ) > 0 :
self . c . write ( ' static gboolean _ %s _emit_changed (gpointer user_data); \n '
' \n '
% ( i . name_lower ) )
self . c . write ( ' static void \n '
' %s _stub_dbus_interface_flush (GDBusInterfaceStub *_stub) \n '
' { \n '
% ( i . name_lower ) )
if len ( i . properties ) > 0 :
self . c . write ( ' %s Stub *stub = %s %s _STUB (_stub); \n '
' if (stub->priv->changed_properties_idle_source != NULL) \n '
' { \n '
' g_source_destroy (stub->priv->changed_properties_idle_source); \n '
' stub->priv->changed_properties_idle_source = NULL; \n '
' _ %s _emit_changed (stub); \n '
' } \n '
% ( i . camel_name , i . ns_upper , i . name_upper , i . name_lower ) )
self . c . write ( ' } \n '
' \n ' )
for s in i . signals :
self . c . write ( ' static void \n '
' _ %s _on_signal_ %s ( \n '
' %s *object ' % ( i . name_lower , s . name_lower , i . camel_name ) )
for a in s . args :
self . c . write ( ' , \n %s %s ' % ( a . ctype_in , a . name ) )
self . c . write ( ' ) \n '
' { \n '
' %s Stub *stub = %s %s _STUB (object); \n '
' GDBusConnection *connection = g_dbus_interface_stub_get_connection (G_DBUS_INTERFACE_STUB (stub)); \n '
% ( i . camel_name , i . ns_upper , i . name_upper ) )
self . c . write ( ' if (connection == NULL) \n '
' return; \n '
' g_dbus_connection_emit_signal (connection, \n '
' NULL, g_dbus_interface_stub_get_object_path (G_DBUS_INTERFACE_STUB (stub)), " %s " , " %s " , \n '
' g_variant_new ( " ( '
% ( i . name , s . name ) )
for a in s . args :
self . c . write ( ' %s ' % ( a . format_in ) )
self . c . write ( ' ) " ' )
for a in s . args :
self . c . write ( ' , \n %s ' % ( a . name ) )
self . c . write ( ' ), NULL); \n ' )
self . c . write ( ' } \n '
' \n ' )
self . c . write ( ' static void \n '
' %s _stub_iface_init ( %s Iface *iface) \n '
' { \n '
% ( i . name_lower , i . camel_name ) )
for s in i . signals :
self . c . write ( ' iface-> %s = _ %s _on_signal_ %s ; \n '
% ( s . name_lower , i . name_lower , s . name_lower ) )
self . c . write ( ' } \n '
' \n ' )
self . c . write ( ' #define %s _stub_get_type %s _stub_get_gtype \n ' % ( i . name_lower , i . name_lower ) )
self . c . write ( ' G_DEFINE_TYPE_WITH_CODE ( %s Stub, %s _stub, G_TYPE_DBUS_INTERFACE_STUB, \n ' % ( i . camel_name , i . name_lower ) )
self . c . write ( ' G_IMPLEMENT_INTERFACE ( %s TYPE_ %s , %s _stub_iface_init)); \n ' % ( i . ns_upper , i . name_upper , i . name_lower ) )
self . c . write ( ' #undef %s _stub_get_type \n '
' \n ' % ( i . name_lower ) )
# finalize
self . c . write ( ' static void \n '
' %s _stub_finalize (GObject *object) \n '
' { \n ' % ( i . name_lower ) )
self . c . write ( ' %s Stub *stub = %s %s _STUB (object); \n ' % ( i . camel_name , i . ns_upper , i . name_upper ) )
if len ( i . properties ) > 0 :
self . c . write ( ' g_value_array_free (stub->priv->properties); \n ' )
self . c . write ( ' g_list_foreach (stub->priv->changed_properties, (GFunc) _changed_property_free, NULL); \n ' )
self . c . write ( ' g_list_free (stub->priv->changed_properties); \n ' )
self . c . write ( ' if (stub->priv->changed_properties_idle_source != NULL) \n ' )
self . c . write ( ' g_source_destroy (stub->priv->changed_properties_idle_source); \n ' )
self . c . write ( ' if (stub->priv->context != NULL) \n ' )
self . c . write ( ' g_main_context_unref (stub->priv->context); \n ' )
self . c . write ( ' G_OBJECT_CLASS ( %s _stub_parent_class)->finalize (object); \n '
' } \n '
' \n ' % ( i . name_lower ) )
# property accessors (TODO: generate PropertiesChanged signals in setter)
self . c . write ( ' static void \n '
' %s _stub_get_property (GObject *object, \n '
' guint prop_id, \n '
' GValue *value, \n '
' GParamSpec *pspec) \n '
' { \n ' % ( i . name_lower ) )
self . c . write ( ' %s Stub *stub = %s %s _STUB (object); \n '
' g_assert (prop_id - 1 >= 0 && prop_id - 1 < %d ); \n '
' g_value_copy (&stub->priv->properties->values[prop_id - 1], value); \n '
% ( i . camel_name , i . ns_upper , i . name_upper , len ( i . properties ) ) )
self . c . write ( ' } \n '
' \n ' )
if len ( i . properties ) > 0 :
self . c . write ( ' static gboolean \n '
' _ %s _emit_changed (gpointer user_data) \n '
' { \n '
' %s Stub *stub = %s %s _STUB (user_data); \n '
% ( i . name_lower , i . camel_name , i . ns_upper , i . name_upper ) )
self . c . write ( ' GList *l; \n '
' GVariantBuilder builder; \n '
' GVariantBuilder invalidated_builder; \n '
' g_variant_builder_init (&builder, G_VARIANT_TYPE ( " a {sv} " )); \n '
' g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ( " as " )); \n '
' for (l = stub->priv->changed_properties; l != NULL; l = l->next) \n '
' { \n '
' ChangedProperty *cp = l->data; \n '
' GVariant *variant; \n '
' variant = g_dbus_gvalue_to_gvariant (&cp->value, G_VARIANT_TYPE (cp->info->parent_struct.signature)); \n '
' g_variant_builder_add (&builder, " {sv} " , cp->info->parent_struct.name, variant); \n '
' g_variant_unref (variant); \n '
' } \n '
' g_dbus_connection_emit_signal (g_dbus_interface_stub_get_connection (G_DBUS_INTERFACE_STUB (stub)), \n '
' NULL, g_dbus_interface_stub_get_object_path (G_DBUS_INTERFACE_STUB (stub)), \n '
' " org.freedesktop.DBus.Properties " , \n '
' " PropertiesChanged " , \n '
' g_variant_new ( " (sa {sv} as) " , \n '
' " %s " , \n '
' &builder, &invalidated_builder), \n '
' NULL); \n '
% ( i . name ) )
self . c . write ( ' g_list_foreach (stub->priv->changed_properties, (GFunc) _changed_property_free, NULL); \n ' )
self . c . write ( ' g_list_free (stub->priv->changed_properties); \n ' )
self . c . write ( ' stub->priv->changed_properties = NULL; \n ' )
self . c . write ( ' stub->priv->changed_properties_idle_source = NULL; \n ' )
self . c . write ( ' return FALSE; \n '
' } \n '
' \n ' )
# if property is already scheduled then re-use entry
self . c . write ( ' static void \n '
' _ %s _schedule_emit_changed ( %s Stub *stub, const _ExtendedGDBusPropertyInfo *info, GParamSpec *pspec, const GValue *value) \n '
' { \n '
' ChangedProperty *cp; \n '
' GList *l; \n '
' cp = NULL; \n '
' for (l = stub->priv->changed_properties; l != NULL; l = l->next) \n '
' { \n '
' ChangedProperty *i_cp = l->data; \n '
' if (i_cp->info == info) \n '
' { \n '
' cp = i_cp; \n '
' g_value_unset (&cp->value); \n '
' break; \n '
' } \n '
' } \n '
' if (cp == NULL) \n '
' { \n '
' cp = g_new0 (ChangedProperty, 1); \n '
' cp->pspec = pspec; \n '
' cp->info = info; \n '
' stub->priv->changed_properties = g_list_prepend (stub->priv->changed_properties, cp); \n '
' } \n '
' g_value_init (&cp->value, G_VALUE_TYPE (value)); \n '
' g_value_copy (value, &cp->value); \n '
' if (stub->priv->changed_properties_idle_source == NULL) \n '
' { \n '
' stub->priv->changed_properties_idle_source = g_idle_source_new (); \n '
' g_source_set_priority (stub->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT); \n '
' g_source_set_callback (stub->priv->changed_properties_idle_source, _ %s _emit_changed, g_object_ref (stub), (GDestroyNotify) g_object_unref); \n '
' g_source_attach (stub->priv->changed_properties_idle_source, stub->priv->context); \n '
' g_source_unref (stub->priv->changed_properties_idle_source); \n '
' } \n '
' } \n '
' \n '
% ( i . name_lower , i . camel_name , i . name_lower ) )
self . c . write ( ' static void \n '
' %s _stub_set_property (GObject *object, \n '
' guint prop_id, \n '
' const GValue *value, \n '
' GParamSpec *pspec) \n '
' { \n ' % ( i . name_lower ) )
if len ( i . properties ) > 0 :
self . c . write ( ' %s Stub *stub = %s %s _STUB (object); \n '
' g_assert (prop_id - 1 >= 0 && prop_id - 1 < %d ); \n '
' if (!_g_value_equal (value, &stub->priv->properties->values[prop_id - 1])) \n '
' { \n '
' g_value_copy (value, &stub->priv->properties->values[prop_id - 1]); \n '
' g_object_notify_by_pspec (object, pspec); \n '
' if (g_dbus_interface_stub_get_connection (G_DBUS_INTERFACE_STUB (stub)) != NULL) \n '
' _ %s _schedule_emit_changed (stub, _ %s _property_info_pointers[prop_id - 1], pspec, value); \n '
' } \n '
% ( i . camel_name , i . ns_upper , i . name_upper , len ( i . properties ) , i . name_lower , i . name_lower ) )
self . c . write ( ' } \n '
' \n ' )
self . c . write ( ' static void \n '
' %s _stub_init ( %s Stub *stub) \n '
' { \n '
' stub->priv = G_TYPE_INSTANCE_GET_PRIVATE (stub, %s TYPE_ %s _STUB, %s StubPrivate); \n '
% ( i . name_lower , i . camel_name , i . ns_upper , i . name_upper , i . camel_name ) )
self . c . write ( ' stub->priv->context = g_main_context_get_thread_default (); \n ' )
self . c . write ( ' if (stub->priv->context != NULL) \n ' )
self . c . write ( ' g_main_context_ref (stub->priv->context); \n ' )
if len ( i . properties ) > 0 :
self . c . write ( ' stub->priv->properties = g_value_array_new ( %d ); \n ' % ( len ( i . properties ) ) )
n = 0
for p in i . properties :
self . c . write ( ' g_value_array_append (stub->priv->properties, NULL); \n ' )
self . c . write ( ' g_value_init (&stub->priv->properties->values[ %d ], %s ); \n ' % ( n , p . arg . gtype ) )
n + = 1
self . c . write ( ' } \n '
' \n ' )
self . c . write ( ' static void \n '
' %s _stub_class_init ( %s StubClass *klass) \n '
' { \n '
' GObjectClass *gobject_class; \n '
' GDBusInterfaceStubClass *stub_class; \n '
' \n '
' g_type_class_add_private (klass, sizeof ( %s StubPrivate)); \n '
' \n '
' gobject_class = G_OBJECT_CLASS (klass); \n '
' gobject_class->finalize = %s _stub_finalize; \n '
' gobject_class->get_property = %s _stub_get_property; \n '
' gobject_class->set_property = %s _stub_set_property; \n '
' \n ' % ( i . name_lower , i . camel_name , i . camel_name , i . name_lower , i . name_lower , i . name_lower ) )
if len ( i . properties ) > 0 :
self . c . write ( ' \n '
' %s _override_properties (gobject_class, 1); \n ' % ( i . name_lower ) )
self . c . write ( ' \n '
' stub_class = G_DBUS_INTERFACE_STUB_CLASS (klass); \n ' ) ;
self . c . write ( ' stub_class->get_info = %s _stub_dbus_interface_get_info; \n ' % ( i . name_lower ) )
self . c . write ( ' stub_class->get_properties = %s _stub_dbus_interface_get_properties; \n ' % ( i . name_lower ) )
self . c . write ( ' stub_class->flush = %s _stub_dbus_interface_flush; \n ' % ( i . name_lower ) )
self . c . write ( ' stub_class->get_vtable = %s _stub_dbus_interface_get_vtable; \n ' % ( i . name_lower ) )
self . c . write ( ' } \n '
' \n ' )
# constructors
self . c . write ( ' %s * \n '
' %s _stub_new (void) \n '
' { \n '
' return %s %s (g_object_new ( %s TYPE_ %s _STUB, NULL)); \n '
' } \n '
' \n ' % ( i . camel_name , i . name_lower , i . ns_upper , i . name_upper , i . ns_upper , i . name_upper ) )
# ---------------------------------------------------------------------------------------------------
def generate_object_manager_client ( self ) :
self . c . write ( ' /* ------------------------------------------------------------------------ \n '
' * Code for proxy manager \n '
' * ------------------------------------------------------------------------ \n '
' */ \n '
' \n ' )
# class boilerplate
self . c . write ( ' /* ------------------------------------------------------------------------ */ \n '
' \n ' )
self . c . write ( ' #define %s object_manager_client_get_type %s object_manager_client_get_gtype \n ' % ( self . ns_lower , self . ns_lower ) )
self . c . write ( ' G_DEFINE_TYPE ( %s ObjectManagerClient, %s object_manager_client, G_TYPE_DBUS_OBJECT_MANAGER_CLIENT); \n ' % ( self . namespace , self . ns_lower ) )
self . c . write ( ' #undef %s object_manager_client_get_type \n '
' \n ' % ( self . ns_lower ) )
# class boilerplate
self . c . write ( ' static void \n '
' %s object_manager_client_init ( %s ObjectManagerClient *manager) \n '
' { \n '
' } \n '
' \n ' % ( self . ns_lower , self . namespace ) )
self . c . write ( ' static void \n '
' %s object_manager_client_class_init ( %s ObjectManagerClientClass *klass) \n '
' { \n '
' } \n '
' \n ' % ( self . ns_lower , self . namespace ) )
self . c . write ( ' static GType \n '
' _ %s object_manager_client_get_proxy_type_func (GDBusObjectManagerClient *manager, const gchar *object_path, const gchar *interface_name, gpointer user_data) \n '
' { \n '
% ( self . ns_lower ) )
self . c . write ( ' static gsize once_init_value = 0; \n '
' static GHashTable *lookup_hash; \n '
' GType ret; \n '
' \n '
' if (g_once_init_enter (&once_init_value)) \n '
' { \n '
' lookup_hash = g_hash_table_new (g_str_hash, g_str_equal); \n ' )
for i in self . ifaces :
self . c . write ( ' g_hash_table_insert (lookup_hash, " %s " , GSIZE_TO_POINTER ( %s TYPE_ %s _PROXY)); \n '
% ( i . name , i . ns_upper , i . name_upper ) )
self . c . write ( ' g_once_init_leave (&once_init_value, 1); \n '
' } \n ' )
self . c . write ( ' ret = (GType) GPOINTER_TO_SIZE (g_hash_table_lookup (lookup_hash, interface_name)); \n '
' if (ret == (GType) 0) \n '
' ret = G_TYPE_DBUS_PROXY; \n ' )
self . c . write ( ' return ret; \n '
' } \n '
' \n ' )
self . c . write ( ' GDBusProxyTypeFunc \n '
' %s object_manager_client_get_proxy_type_func (void) \n '
' { \n '
' return _ %s object_manager_client_get_proxy_type_func; \n '
' } \n '
' \n '
% ( self . ns_lower , self . ns_lower ) )
# constructors
self . c . write ( ' void \n '
' %s object_manager_client_new ( \n '
' GDBusConnection *connection, \n '
' GDBusObjectManagerClientFlags flags, \n '
' const gchar *name, \n '
' const gchar *object_path, \n '
' GCancellable *cancellable, \n '
' GAsyncReadyCallback callback, \n '
' gpointer user_data) \n '
' { \n '
' g_async_initable_new_async ( %s TYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, " flags " , flags, " name " , name, " connection " , connection, " object-path " , object_path, " get-proxy-type-func " , _ %s object_manager_client_get_proxy_type_func, NULL); \n '
' } \n '
' \n '
% ( self . ns_lower , self . ns_upper , self . ns_lower ) )
self . c . write ( ' GDBusObjectManager * \n '
' %s object_manager_client_new_finish ( \n '
' GAsyncResult *res, \n '
' GError **error) \n '
' { \n '
' GObject *ret; \n '
' GObject *source_object; \n '
' source_object = g_async_result_get_source_object (res); \n '
' ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); \n '
' g_object_unref (source_object); \n '
' if (ret != NULL) \n '
' return G_DBUS_OBJECT_MANAGER (ret); \n '
' else \n '
' return NULL; \n '
' } \n '
' \n '
% ( self . ns_lower ) )
self . c . write ( ' GDBusObjectManager * \n '
' %s object_manager_client_new_sync ( \n '
' GDBusConnection *connection, \n '
' GDBusObjectManagerClientFlags flags, \n '
' const gchar *name, \n '
' const gchar *object_path, \n '
' GCancellable *cancellable, \n '
' GError **error) \n '
' { \n '
' GInitable *ret; \n '
' ret = g_initable_new ( %s TYPE_OBJECT_MANAGER_CLIENT, cancellable, error, " flags " , flags, " name " , name, " connection " , connection, " object-path " , object_path, " get-proxy-type-func " , _ %s object_manager_client_get_proxy_type_func, NULL); \n '
' if (ret != NULL) \n '
' return G_DBUS_OBJECT_MANAGER (ret); \n '
' else \n '
' return NULL; \n '
' } \n '
' \n '
% ( self . ns_lower , self . ns_upper , self . ns_lower ) )
self . c . write ( ' \n ' )
self . c . write ( ' void \n '
' %s object_manager_client_new_for_bus ( \n '
' GBusType bus_type, \n '
' GDBusObjectManagerClientFlags flags, \n '
' const gchar *name, \n '
' const gchar *object_path, \n '
' GCancellable *cancellable, \n '
' GAsyncReadyCallback callback, \n '
' gpointer user_data) \n '
' { \n '
' g_async_initable_new_async ( %s TYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, " flags " , flags, " name " , name, " bus-type " , bus_type, " object-path " , object_path, " get-proxy-type-func " , _ %s object_manager_client_get_proxy_type_func, NULL); \n '
' } \n '
' \n '
% ( self . ns_lower , self . ns_upper , self . ns_lower ) )
self . c . write ( ' GDBusObjectManager * \n '
' %s object_manager_client_new_for_bus_finish ( \n '
' GAsyncResult *res, \n '
' GError **error) \n '
' { \n '
' GObject *ret; \n '
' GObject *source_object; \n '
' source_object = g_async_result_get_source_object (res); \n '
' ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); \n '
' g_object_unref (source_object); \n '
' if (ret != NULL) \n '
' return G_DBUS_OBJECT_MANAGER (ret); \n '
' else \n '
' return NULL; \n '
' } \n '
' \n '
% ( self . ns_lower ) )
self . c . write ( ' GDBusObjectManager * \n '
' %s object_manager_client_new_for_bus_sync ( \n '
' GBusType bus_type, \n '
' GDBusObjectManagerClientFlags flags, \n '
' const gchar *name, \n '
' const gchar *object_path, \n '
' GCancellable *cancellable, \n '
' GError **error) \n '
' { \n '
' GInitable *ret; \n '
' ret = g_initable_new ( %s TYPE_OBJECT_MANAGER_CLIENT, cancellable, error, " flags " , flags, " name " , name, " bus-type " , bus_type, " object-path " , object_path, " get-proxy-type-func " , _ %s object_manager_client_get_proxy_type_func, NULL); \n '
' if (ret != NULL) \n '
' return G_DBUS_OBJECT_MANAGER (ret); \n '
' else \n '
' return NULL; \n '
' } \n '
' \n '
% ( self . ns_lower , self . ns_upper , self . ns_lower ) )
self . c . write ( ' \n ' )
# ---------------------------------------------------------------------------------------------------
def generate ( self ) :
self . generate_intro ( )
self . declare_types ( )
for i in self . ifaces :
self . c . write ( ' /* ------------------------------------------------------------------------ \n '
' * Code for interface %s \n '
' * ------------------------------------------------------------------------ \n '
' */ \n '
' \n ' % ( i . name ) )
self . generate_introspection_for_interface ( i )
self . generate_interface ( i )
self . generate_property_accessors ( i )
self . generate_signal_emitters ( i )
self . generate_method_calls ( i )
self . generate_method_completers ( i )
self . generate_proxy ( i )
self . generate_stub ( i )
2011-04-12 17:50:34 +02:00
if self . generate_objmanager :
self . generate_object_manager_client ( )
2011-04-08 22:57:31 +02:00
self . generate_outro ( )