函数

Giobus_own_name

自:2.26

声明 [源]

guint
g_bus_own_name (
  GBusType bus_type,
  const gchar* name,
  GBusNameOwnerFlags flags,
  GBusAcquiredCallback bus_acquired_handler,
  GBusNameAcquiredCallback name_acquired_handler,
  GBusNameLostCallback name_lost_handler,
  gpointer user_data,
  GDestroyNotify user_data_free_func
)

描述 [源]

在由bus_type指定的总线上开始获取name,并分别在名称获取或丢失时调用name_acquired_handlername_lost_handler。回调和线程由您调用此函数的线程的[g-thread-default main上下文][g-main-context-push-thread-default]调用。

您保证在调用此函数后,name_acquired_handlername_lost_handler回调之一将被调用 - 有三种可能的情况

  • name_lost_handler有一个NULL连接(如果无法建立与总线的连接)。

  • 然后bus_acquired_handler然后name_lost_handler(如果无法获取名称)

  • bus_acquired_handler然后name_acquired_handler(如果已获取名称)。

您拥有完名称后,只需使用此函数返回的所有权ID调用g_bus_unown_name()

如果在获取或丢失名称时(例如,如果允许替换,则另一个应用程序可以获取该名称或当前拥有该名称的应用程序退出),也会调用处理程序。如果用于尝试拥有名称的GDBusConnection关闭,则调用name_lost_handler,因为其他进程无法再访问该进程。

您不能多次使用g_bus_own_name()对同一名称(除非与g_bus_unown_name()的调用交替) - 只有第一次调用将有效。

另一个保证是,name_acquired_handlername_lost_handler的调用将交替进行;即,如果name_acquired_handler被调用,那么您可以保证下- 次处理程序调用将是name_lost_handler。反之亦然。

如果您打算导出对象(例如使用g_dbus_connection_register_object()),请注意,在name_acquired_handler中导出对象通常太晚了。相反,您可以在bus_acquired_handler中这样做,因为您保证这将在从总线请求名称之前运行。

这种行为使得编写想要[拥有名称][gdbus-owning-names]和导出对象的应用程序变得非常简单。只需在bus_acquired_handler中注册要导出的对象,并在name_lost_handler中取消注册对象(如果有)。

自:2.26

此函数的实现由语言绑定中的g_bus_own_name_with_closures()提供。

参数

bus_type

类型: GBusType

要拥有名称的总线类型。

name

类型: const gchar*

要拥有的知名名称。

数据由函数的调用者拥有。
值是NUL终止的UTF-8字符串。
flags

类型: GBusNameOwnerFlags

GBusNameOwnerFlags枚举的集合。

bus_acquired_handler

类型: GBusAcquiredCallback

在连接到类型为bus_type的总线或NULL时调用的处理程序。

参数可以是NULL
name_acquired_handler

类型: GBusNameAcquiredCallback

name 被获取或为 NULL 时调用的处理器。

参数可以是NULL
name_lost_handler

类型: GBusNameLostCallback

name 失去或为 NULL 时调用的处理器。

参数可以是NULL
user_data

类型: gpointer

传递给处理器的用户数据。

参数可以是NULL
数据由函数的调用者拥有。
user_data_free_func

类型: GDestroyNotify

用于释放 user_dataNULL 的函数。

参数可以是NULL

返回值

类型: guint

一个可用于与 g_bus_unown_name() 一起使用的标识符(永远不会是 0),用于停止拥有该名称。