X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgdbusconnection.h;h=19a637e9574526f065f6dd127f3bad2bc75521ec;hb=3389489f0f25a3a324ad62d9df5a6f1c038d5986;hp=6dfb6fbbd20254724c60018c15de0c94bc83db58;hpb=914b046226c762bae578e17f7ed9a0fdf058045a;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gdbusconnection.h b/gio/gdbusconnection.h index 6dfb6fb..19a637e 100644 --- a/gio/gdbusconnection.h +++ b/gio/gdbusconnection.h @@ -13,20 +13,18 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. + * Public License along with this library; if not, see . * * Author: David Zeuthen */ +#ifndef __G_DBUS_CONNECTION_H__ +#define __G_DBUS_CONNECTION_H__ + #if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) #error "Only can be included directly." #endif -#ifndef __G_DBUS_CONNECTION_H__ -#define __G_DBUS_CONNECTION_H__ - #include G_BEGIN_DECLS @@ -35,22 +33,27 @@ G_BEGIN_DECLS #define G_DBUS_CONNECTION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_CONNECTION, GDBusConnection)) #define G_IS_DBUS_CONNECTION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_CONNECTION)) +GLIB_AVAILABLE_IN_ALL GType g_dbus_connection_get_type (void) G_GNUC_CONST; /* ---------------------------------------------------------------------------------------------------- */ +GLIB_AVAILABLE_IN_ALL void g_bus_get (GBusType bus_type, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); +GLIB_AVAILABLE_IN_ALL GDBusConnection *g_bus_get_finish (GAsyncResult *res, GError **error); +GLIB_AVAILABLE_IN_ALL GDBusConnection *g_bus_get_sync (GBusType bus_type, GCancellable *cancellable, GError **error); /* ---------------------------------------------------------------------------------------------------- */ +GLIB_AVAILABLE_IN_ALL void g_dbus_connection_new (GIOStream *stream, const gchar *guid, GDBusConnectionFlags flags, @@ -58,8 +61,10 @@ void g_dbus_connection_new (GIOStream GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); +GLIB_AVAILABLE_IN_ALL GDBusConnection *g_dbus_connection_new_finish (GAsyncResult *res, GError **error); +GLIB_AVAILABLE_IN_ALL GDBusConnection *g_dbus_connection_new_sync (GIOStream *stream, const gchar *guid, GDBusConnectionFlags flags, @@ -67,14 +72,17 @@ GDBusConnection *g_dbus_connection_new_sync (GIOStream GCancellable *cancellable, GError **error); +GLIB_AVAILABLE_IN_ALL void g_dbus_connection_new_for_address (const gchar *address, GDBusConnectionFlags flags, GDBusAuthObserver *observer, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); +GLIB_AVAILABLE_IN_ALL GDBusConnection *g_dbus_connection_new_for_address_finish (GAsyncResult *res, GError **error); +GLIB_AVAILABLE_IN_ALL GDBusConnection *g_dbus_connection_new_for_address_sync (const gchar *address, GDBusConnectionFlags flags, GDBusAuthObserver *observer, @@ -83,61 +91,128 @@ GDBusConnection *g_dbus_connection_new_for_address_sync (const gchar /* ---------------------------------------------------------------------------------------------------- */ +GLIB_AVAILABLE_IN_2_40 +guint32 g_dbus_request_name (GDBusConnection *connection, + const gchar *name, + GBusNameOwnerFlags flags, + GError **error); +GLIB_AVAILABLE_IN_2_40 +guint32 g_dbus_release_name (GDBusConnection *connection, + const gchar *name, + GError **error); +GLIB_AVAILABLE_IN_2_40 +gchar *g_dbus_get_bus_id (GDBusConnection *connection, + GError **error); +GLIB_AVAILABLE_IN_2_40 +gchar **g_dbus_get_list_names (GDBusConnection *connection, + GError **error); +GLIB_AVAILABLE_IN_2_40 +gchar **g_dbus_get_list_activatable_names (GDBusConnection *connection, + GError **error); +GLIB_AVAILABLE_IN_2_40 +gchar **g_dbus_get_list_queued_owners (GDBusConnection *connection, + const gchar *name, + GError **error); +GLIB_AVAILABLE_IN_2_40 +gchar *g_dbus_get_name_owner (GDBusConnection *connection, + const gchar *name, + GError **error); +GLIB_AVAILABLE_IN_2_40 +gboolean g_dbus_name_has_owner (GDBusConnection *connection, + const gchar *name, + GError **error); +GLIB_AVAILABLE_IN_2_40 +guint32 g_dbus_get_connection_pid (GDBusConnection *connection, + const gchar *name, + GError **error); +GLIB_AVAILABLE_IN_2_40 +guint32 g_dbus_get_connection_uid (GDBusConnection *connection, + const gchar *name, + GError **error); + +/* ---------------------------------------------------------------------------------------------------- */ + +GLIB_AVAILABLE_IN_ALL void g_dbus_connection_start_message_processing (GDBusConnection *connection); +GLIB_AVAILABLE_IN_ALL gboolean g_dbus_connection_is_closed (GDBusConnection *connection); +GLIB_AVAILABLE_IN_ALL GIOStream *g_dbus_connection_get_stream (GDBusConnection *connection); +GLIB_AVAILABLE_IN_ALL const gchar *g_dbus_connection_get_guid (GDBusConnection *connection); +GLIB_AVAILABLE_IN_ALL const gchar *g_dbus_connection_get_unique_name (GDBusConnection *connection); +GLIB_AVAILABLE_IN_ALL GCredentials *g_dbus_connection_get_peer_credentials (GDBusConnection *connection); + +GLIB_AVAILABLE_IN_2_34 +guint32 g_dbus_connection_get_last_serial (GDBusConnection *connection); + +GLIB_AVAILABLE_IN_ALL gboolean g_dbus_connection_get_exit_on_close (GDBusConnection *connection); +GLIB_AVAILABLE_IN_ALL void g_dbus_connection_set_exit_on_close (GDBusConnection *connection, gboolean exit_on_close); +GLIB_AVAILABLE_IN_ALL GDBusCapabilityFlags g_dbus_connection_get_capabilities (GDBusConnection *connection); /* ---------------------------------------------------------------------------------------------------- */ +GLIB_AVAILABLE_IN_ALL void g_dbus_connection_close (GDBusConnection *connection, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); +GLIB_AVAILABLE_IN_ALL gboolean g_dbus_connection_close_finish (GDBusConnection *connection, GAsyncResult *res, GError **error); +GLIB_AVAILABLE_IN_ALL gboolean g_dbus_connection_close_sync (GDBusConnection *connection, GCancellable *cancellable, GError **error); /* ---------------------------------------------------------------------------------------------------- */ +GLIB_AVAILABLE_IN_ALL void g_dbus_connection_flush (GDBusConnection *connection, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); +GLIB_AVAILABLE_IN_ALL gboolean g_dbus_connection_flush_finish (GDBusConnection *connection, GAsyncResult *res, GError **error); +GLIB_AVAILABLE_IN_ALL gboolean g_dbus_connection_flush_sync (GDBusConnection *connection, GCancellable *cancellable, GError **error); /* ---------------------------------------------------------------------------------------------------- */ +GLIB_AVAILABLE_IN_ALL gboolean g_dbus_connection_send_message (GDBusConnection *connection, GDBusMessage *message, + GDBusSendMessageFlags flags, volatile guint32 *out_serial, GError **error); +GLIB_AVAILABLE_IN_ALL void g_dbus_connection_send_message_with_reply (GDBusConnection *connection, GDBusMessage *message, + GDBusSendMessageFlags flags, gint timeout_msec, volatile guint32 *out_serial, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); +GLIB_AVAILABLE_IN_ALL GDBusMessage *g_dbus_connection_send_message_with_reply_finish (GDBusConnection *connection, GAsyncResult *res, GError **error); +GLIB_AVAILABLE_IN_ALL GDBusMessage *g_dbus_connection_send_message_with_reply_sync (GDBusConnection *connection, GDBusMessage *message, + GDBusSendMessageFlags flags, gint timeout_msec, volatile guint32 *out_serial, GCancellable *cancellable, @@ -145,6 +220,7 @@ GDBusMessage *g_dbus_connection_send_message_with_reply_sync (GDBusConnecti /* ---------------------------------------------------------------------------------------------------- */ +GLIB_AVAILABLE_IN_ALL gboolean g_dbus_connection_emit_signal (GDBusConnection *connection, const gchar *destination_bus_name, const gchar *object_path, @@ -152,6 +228,7 @@ gboolean g_dbus_connection_emit_signal (GDBusConnection const gchar *signal_name, GVariant *parameters, GError **error); +GLIB_AVAILABLE_IN_ALL void g_dbus_connection_call (GDBusConnection *connection, const gchar *bus_name, const gchar *object_path, @@ -164,9 +241,11 @@ void g_dbus_connection_call (GDBusConnection GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); +GLIB_AVAILABLE_IN_ALL GVariant *g_dbus_connection_call_finish (GDBusConnection *connection, GAsyncResult *res, GError **error); +GLIB_AVAILABLE_IN_ALL GVariant *g_dbus_connection_call_sync (GDBusConnection *connection, const gchar *bus_name, const gchar *object_path, @@ -178,6 +257,39 @@ GVariant *g_dbus_connection_call_sync (GDBusConnection gint timeout_msec, GCancellable *cancellable, GError **error); +GLIB_AVAILABLE_IN_2_30 +void g_dbus_connection_call_with_unix_fd_list (GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + const GVariantType *reply_type, + GDBusCallFlags flags, + gint timeout_msec, + GUnixFDList *fd_list, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_2_30 +GVariant *g_dbus_connection_call_with_unix_fd_list_finish (GDBusConnection *connection, + GUnixFDList **out_fd_list, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_2_30 +GVariant *g_dbus_connection_call_with_unix_fd_list_sync (GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + const GVariantType *reply_type, + GDBusCallFlags flags, + gint timeout_msec, + GUnixFDList *fd_list, + GUnixFDList **out_fd_list, + GCancellable *cancellable, + GError **error); /* ---------------------------------------------------------------------------------------------------- */ @@ -190,7 +302,7 @@ GVariant *g_dbus_connection_call_sync (GDBusConnection * @interface_name: The D-Bus interface name the method was invoked on. * @method_name: The name of the method that was invoked. * @parameters: A #GVariant tuple with parameters. - * @invocation: A #GDBusMethodInvocation object that can be used to return a value or error. + * @invocation: (transfer full): A #GDBusMethodInvocation object that must be used to return a value or error. * @user_data: The @user_data #gpointer passed to g_dbus_connection_register_object(). * * The type of the @method_call function in #GDBusInterfaceVTable. @@ -218,7 +330,9 @@ typedef void (*GDBusInterfaceMethodCallFunc) (GDBusConnection *connection, * * The type of the @get_property function in #GDBusInterfaceVTable. * - * Returns: A newly-allocated #GVariant with the value for @property_name or %NULL if @error is set. + * Returns: A #GVariant with the value for @property_name or %NULL if + * @error is set. If the returned #GVariant is floating, it is + * consumed - otherwise its reference count is decreased by one. * * Since: 2.26 */ @@ -265,9 +379,44 @@ typedef gboolean (*GDBusInterfaceSetPropertyFunc) (GDBusConnection *conne * Virtual table for handling properties and method calls for a D-Bus * interface. * - * If you want to handle getting/setting D-Bus properties asynchronously, simply - * register an object with the org.freedesktop.DBus.Properties - * D-Bus interface using g_dbus_connection_register_object(). + * Since 2.38, if you want to handle getting/setting D-Bus properties + * asynchronously, give %NULL as your get_property() or set_property() + * function. The D-Bus call will be directed to your @method_call function, + * with the provided @interface_name set to "org.freedesktop.DBus.Properties". + * + * Ownership of the #GDBusMethodInvocation object passed to the + * method_call() function is transferred to your handler; you must + * call one of the methods of #GDBusMethodInvocation to return a reply + * (possibly empty), or an error. These functions also take ownership + * of the passed-in invocation object, so unless the invocation + * object has otherwise been referenced, it will be then be freed. + * Calling one of these functions may be done within your + * method_call() implementation but it also can be done at a later + * point to handle the method asynchronously. + * + * The usual checks on the validity of the calls is performed. For + * `Get` calls, an error is automatically returned if the property does + * not exist or the permissions do not allow access. The same checks are + * performed for `Set` calls, and the provided value is also checked for + * being the correct type. + * + * For both `Get` and `Set` calls, the #GDBusMethodInvocation + * passed to the @method_call handler can be queried with + * g_dbus_method_invocation_get_property_info() to get a pointer + * to the #GDBusPropertyInfo of the property. + * + * If you have readable properties specified in your interface info, + * you must ensure that you either provide a non-%NULL @get_property() + * function or provide implementations of both the `Get` and `GetAll` + * methods on org.freedesktop.DBus.Properties interface in your @method_call + * function. Note that the required return type of the `Get` call is + * `(v)`, not the type of the property. `GetAll` expects a return value + * of type `a{sv}`. + * + * If you have writable properties specified in your interface info, + * you must ensure that you either provide a non-%NULL @set_property() + * function or provide an implementation of the `Set` call. If implementing + * the call, you must return the value of type %G_VARIANT_TYPE_UNIT. * * Since: 2.26 */ @@ -278,17 +427,22 @@ struct _GDBusInterfaceVTable GDBusInterfaceSetPropertyFunc set_property; /*< private >*/ - /* Padding for future expansion */ + /* Padding for future expansion - also remember to update + * gdbusconnection.c:_g_dbus_interface_vtable_copy() when + * changing this. + */ gpointer padding[8]; }; +GLIB_AVAILABLE_IN_ALL guint g_dbus_connection_register_object (GDBusConnection *connection, const gchar *object_path, - const GDBusInterfaceInfo *interface_info, + GDBusInterfaceInfo *interface_info, const GDBusInterfaceVTable *vtable, gpointer user_data, GDestroyNotify user_data_free_func, GError **error); +GLIB_AVAILABLE_IN_ALL gboolean g_dbus_connection_unregister_object (GDBusConnection *connection, guint registration_id); @@ -303,6 +457,16 @@ gboolean g_dbus_connection_unregister_object (GDBusConnection * * The type of the @enumerate function in #GDBusSubtreeVTable. * + * This function is called when generating introspection data and also + * when preparing to dispatch incoming messages in the event that the + * %G_DBUS_SUBTREE_FLAGS_DISPATCH_TO_UNENUMERATED_NODES flag is not + * specified (ie: to verify that the object path is valid). + * + * Hierarchies are not supported; the items that you return should not + * contain the '/' character. + * + * The return value will be freed with g_strfreev(). + * * Returns: A newly allocated array of strings for node names that are children of @object_path. * * Since: 2.26 @@ -317,21 +481,37 @@ typedef gchar** (*GDBusSubtreeEnumerateFunc) (GDBusConnection *connection, * @connection: A #GDBusConnection. * @sender: The unique bus name of the remote caller. * @object_path: The object path that was registered with g_dbus_connection_register_subtree(). - * @node: A node that is a child of @object_path (relative to @object_path) or / for the root of the subtree. + * @node: A node that is a child of @object_path (relative to @object_path) or %NULL for the root of the subtree. * @user_data: The @user_data #gpointer passed to g_dbus_connection_register_subtree(). * * The type of the @introspect function in #GDBusSubtreeVTable. * - * Returns: A newly-allocated #GPtrArray with pointers to #GDBusInterfaceInfo describing - * the interfaces implemented by @node. + * Subtrees are flat. @node, if non-%NULL, is always exactly one + * segment of the object path (ie: it never contains a slash). + * + * This function should return %NULL to indicate that there is no object + * at this node. + * + * If this function returns non-%NULL, the return value is expected to + * be a %NULL-terminated array of pointers to #GDBusInterfaceInfo + * structures describing the interfaces implemented by @node. This + * array will have g_dbus_interface_info_unref() called on each item + * before being freed with g_free(). + * + * The difference between returning %NULL and an array containing zero + * items is that the standard DBus interfaces will returned to the + * remote introspector in the empty array case, but not in the %NULL + * case. + * + * Returns: A %NULL-terminated array of pointers to #GDBusInterfaceInfo, or %NULL. * * Since: 2.26 */ -typedef GPtrArray *(*GDBusSubtreeIntrospectFunc) (GDBusConnection *connection, - const gchar *sender, - const gchar *object_path, - const gchar *node, - gpointer user_data); +typedef GDBusInterfaceInfo ** (*GDBusSubtreeIntrospectFunc) (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *node, + gpointer user_data); /** * GDBusSubtreeDispatchFunc: @@ -339,12 +519,15 @@ typedef GPtrArray *(*GDBusSubtreeIntrospectFunc) (GDBusConnection *connect * @sender: The unique bus name of the remote caller. * @object_path: The object path that was registered with g_dbus_connection_register_subtree(). * @interface_name: The D-Bus interface name that the method call or property access is for. - * @node: A node that is a child of @object_path (relative to @object_path) or / for the root of the subtree. + * @node: A node that is a child of @object_path (relative to @object_path) or %NULL for the root of the subtree. * @out_user_data: Return location for user data to pass to functions in the returned #GDBusInterfaceVTable (never %NULL). * @user_data: The @user_data #gpointer passed to g_dbus_connection_register_subtree(). * * The type of the @dispatch function in #GDBusSubtreeVTable. * + * Subtrees are flat. @node, if non-%NULL, is always exactly one + * segment of the object path (ie: it never contains a slash). + * * Returns: A #GDBusInterfaceVTable or %NULL if you don't want to handle the methods. * * Since: 2.26 @@ -374,17 +557,14 @@ struct _GDBusSubtreeVTable GDBusSubtreeDispatchFunc dispatch; /*< private >*/ - /* Padding for future expansion */ - void (*_g_reserved1) (void); - void (*_g_reserved2) (void); - void (*_g_reserved3) (void); - void (*_g_reserved4) (void); - void (*_g_reserved5) (void); - void (*_g_reserved6) (void); - void (*_g_reserved7) (void); - void (*_g_reserved8) (void); + /* Padding for future expansion - also remember to update + * gdbusconnection.c:_g_dbus_subtree_vtable_copy() when + * changing this. + */ + gpointer padding[8]; }; +GLIB_AVAILABLE_IN_ALL guint g_dbus_connection_register_subtree (GDBusConnection *connection, const gchar *object_path, const GDBusSubtreeVTable *vtable, @@ -392,6 +572,7 @@ guint g_dbus_connection_register_subtree (GDBusConnection gpointer user_data, GDestroyNotify user_data_free_func, GError **error); +GLIB_AVAILABLE_IN_ALL gboolean g_dbus_connection_unregister_subtree (GDBusConnection *connection, guint registration_id); @@ -419,15 +600,18 @@ typedef void (*GDBusSignalCallback) (GDBusConnection *connection, GVariant *parameters, gpointer user_data); +GLIB_AVAILABLE_IN_ALL guint g_dbus_connection_signal_subscribe (GDBusConnection *connection, const gchar *sender, const gchar *interface_name, const gchar *member, const gchar *object_path, const gchar *arg0, + GDBusSignalFlags flags, GDBusSignalCallback callback, gpointer user_data, GDestroyNotify user_data_free_func); +GLIB_AVAILABLE_IN_ALL void g_dbus_connection_signal_unsubscribe (GDBusConnection *connection, guint subscription_id); @@ -435,29 +619,90 @@ void g_dbus_connection_signal_unsubscribe (GDBusConnection /** * GDBusMessageFilterFunction: - * @connection: A #GDBusConnection. - * @message: A #GDBusMessage. + * @connection: (transfer none): A #GDBusConnection. + * @message: (transfer full): A locked #GDBusMessage that the filter function takes ownership of. * @incoming: %TRUE if it is a message received from the other peer, %FALSE if it is * a message to be sent to the other peer. * @user_data: User data passed when adding the filter. * * Signature for function used in g_dbus_connection_add_filter(). * - * Returns: %TRUE if the filter handled @message, %FALSE to let other - * handlers run. + * A filter function is passed a #GDBusMessage and expected to return + * a #GDBusMessage too. Passive filter functions that don't modify the + * message can simply return the @message object: + * |[ + * static GDBusMessage * + * passive_filter (GDBusConnection *connection + * GDBusMessage *message, + * gboolean incoming, + * gpointer user_data) + * { + * /* inspect @message */ + * return message; + * } + * ]| + * Filter functions that wants to drop a message can simply return %NULL: + * |[ + * static GDBusMessage * + * drop_filter (GDBusConnection *connection + * GDBusMessage *message, + * gboolean incoming, + * gpointer user_data) + * { + * if (should_drop_message) + * { + * g_object_unref (message); + * message = NULL; + * } + * return message; + * } + * ]| + * Finally, a filter function may modify a message by copying it: + * |[ + * static GDBusMessage * + * modifying_filter (GDBusConnection *connection + * GDBusMessage *message, + * gboolean incoming, + * gpointer user_data) + * { + * GDBusMessage *copy; + * GError *error; + * + * error = NULL; + * copy = g_dbus_message_copy (message, &error); + * /* handle @error being is set */ + * g_object_unref (message); + * + * /* modify @copy */ + * + * return copy; + * } + * ]| + * If the returned #GDBusMessage is different from @message and cannot + * be sent on @connection (it could use features, such as file + * descriptors, not compatible with @connection), then a warning is + * logged to standard error. Applications can + * check this ahead of time using g_dbus_message_to_blob() passing a + * #GDBusCapabilityFlags value obtained from @connection. + * + * Returns: (transfer full) (allow-none): A #GDBusMessage that will be freed with + * g_object_unref() or %NULL to drop the message. Passive filter + * functions can simply return the passed @message object. * * Since: 2.26 */ -typedef gboolean (*GDBusMessageFilterFunction) (GDBusConnection *connection, - GDBusMessage *message, - gboolean incoming, - gpointer user_data); +typedef GDBusMessage *(*GDBusMessageFilterFunction) (GDBusConnection *connection, + GDBusMessage *message, + gboolean incoming, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL guint g_dbus_connection_add_filter (GDBusConnection *connection, GDBusMessageFilterFunction filter_function, gpointer user_data, GDestroyNotify user_data_free_func); +GLIB_AVAILABLE_IN_ALL void g_dbus_connection_remove_filter (GDBusConnection *connection, guint filter_id);