gdbus服务端客户端使用详解 - 客户端

本文是关于GDBus服务端实现的续篇,主要聚焦于客户端的详细操作。内容包括如何使用gdbus-codegen生成客户端代码,并通过g_bus_get_sync创建GDBusConnection。在没有实例参考的情况下,自行探索可能较为困难。
摘要由CSDN通过智能技术生成

上篇讲解服务端如何实现,这篇开始讲解客户端,基本都一样,但是如果没有看到一个例子,自己研究,满满都是泪啊

因为上一篇中已经创建了xml文件,客户端就直接使用gdbus-codegen创建客户端使用的代码文件,命令跟服务端基本一致,多了一个参数指定是创建客户端的,先看一下gdbus-codegen的help:

Usage: gdbus-codegen [options]

Options:
  -h, --help            show this help message and exit
  --xml-files=FILE      D-Bus introspection XML file
  --interface-prefix=PREFIX
                        String to strip from D-Bus interface names for code
                        and docs
  --c-namespace=NAMESPACE
                        The namespace to use for generated C code
  --c-generate-object-manager
                        Generate a GDBusObjectManagerClient subclass when
                        generating C code
  --generate-c-code=OUTFILES
                        Generate C code in OUTFILES.[ch]
  --generate-docbook=OUTFILES
                        Generate Docbook in OUTFILES-org.Project.IFace.xml
  --annotate=WHAT KEY VALUE
                        Add annotation (may be used several times)

没错就是多了“--c-generate-object-manager”,所有创建命令就是如下:

./gdbus-codegen --generate-c-code=BuildingClient --c-generate-object-manager Building.xml

执行完命令后,在当前目录下创建了两个文件BuildingClient.[hc],同样的也把代码贴出来,方便大家观看:

BuildingClient.h

/*
 * Generated by gdbus-codegen 2.30.3. DO NOT EDIT.
 *
 * The license of this code is the same as for the source it was derived from.
 */

#ifndef __BUILDINGCLIENT_H__
#define __BUILDINGCLIENT_H__

#include <gio/gio.h>

G_BEGIN_DECLS


/* ------------------------------------------------------------------------ */
/* Declarations for com.alibaba.Building.Test */

#define TYPE_COM_ALIBABA_BUILDING_TEST (com_alibaba_building_test_get_type ())
#define COM_ALIBABA_BUILDING_TEST(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_COM_ALIBABA_BUILDING_TEST, ComAlibabaBuildingTest))
#define IS_COM_ALIBABA_BUILDING_TEST(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_COM_ALIBABA_BUILDING_TEST))
#define COM_ALIBABA_BUILDING_TEST_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_COM_ALIBABA_BUILDING_TEST, ComAlibabaBuildingTestIface))

struct _ComAlibabaBuildingTest;
typedef struct _ComAlibabaBuildingTest ComAlibabaBuildingTest;
typedef struct _ComAlibabaBuildingTestIface ComAlibabaBuildingTestIface;

struct _ComAlibabaBuildingTestIface
{
  GTypeInterface parent_iface;


  gboolean (*handle_set_version) (
    ComAlibabaBuildingTest *object,
    GDBusMethodInvocation *invocation,
    const gchar *arg_version);

  void (*test_status) (
    ComAlibabaBuildingTest *object,
    gint arg_status);

};

GType com_alibaba_building_test_get_type (void) G_GNUC_CONST;

GDBusInterfaceInfo *com_alibaba_building_test_interface_info (void);
guint com_alibaba_building_test_override_properties (GObjectClass *klass, guint property_id_begin);


/* D-Bus method call completion functions: */
void com_alibaba_building_test_complete_set_version (
    ComAlibabaBuildingTest *object,
    GDBusMethodInvocation *invocation);



/* D-Bus signal emissions functions: */
void com_alibaba_building_test_emit_test_status (
    ComAlibabaBuildingTest *object,
    gint arg_status);



/* D-Bus method calls: */
void com_alibaba_building_test_call_set_version (
    ComAlibabaBuildingTest *proxy,
    const gchar *arg_version,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);

gboolean com_alibaba_building_test_call_set_version_finish (
    ComAlibabaBuildingTest *proxy,
    GAsyncResult *res,
    GError **error);

gboolean com_alibaba_building_test_call_set_version_sync (
    ComAlibabaBuildingTest *proxy,
    const gchar *arg_version,
    GCancellable *cancellable,
    GError **error);



/* ---- */

#define TYPE_COM_ALIBABA_BUILDING_TEST_PROXY (com_alibaba_building_test_proxy_get_type ())
#define COM_ALIBABA_BUILDING_TEST_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_COM_ALIBABA_BUILDING_TEST_PROXY, ComAlibabaBuildingTestProxy))
#define COM_ALIBABA_BUILDING_TEST_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_COM_ALIBABA_BUILDING_TEST_PROXY, ComAlibabaBuildingTestProxyClass))
#define COM_ALIBABA_BUILDING_TEST_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_COM_ALIBABA_BUILDING_TEST_PROXY, ComAlibabaBuildingTestProxyClass))
#define IS_COM_ALIBABA_BUILDING_TEST_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_COM_ALIBABA_BUILDING_TEST_PROXY))
#define IS_COM_ALIBABA_BUILDING_TEST_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_COM_ALIBABA_BUILDING_TEST_PROXY))

typedef struct _ComAlibabaBuildingTestProxy ComAlibabaBuildingTestProxy;
typedef struct _ComAlibabaBuildingTestProxyClass ComAlibabaBuildingTestProxyClass;
typedef struct _ComAlibabaBuildingTestProxyPrivate ComAlibabaBuildingTestProxyPrivate;

struct _ComAlibabaBuildingTestProxy
{
  /*< private >*/
  GDBusProxy parent_instance;
  ComAlibabaBuildingTestProxyPrivate *priv;
};

struct _ComAlibabaBuildingTestProxyClass
{
  GDBusProxyClass parent_class;
};

GType com_alibaba_building_test_proxy_get_type (void) G_GNUC_CONST;

void com_alibaba_building_test_proxy_new (
    GDBusConnection     *connection,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GAsyncReadyCallback  callback,
    gpointer             user_data);
ComAlibabaBuildingTest *com_alibaba_building_test_proxy_new_finish (
    GAsyncResult        *res,
    GError             **error);
ComAlibabaBuildingTest *com_alibaba_building_test_proxy_new_sync (
    GDBusConnection     *connection,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GError             **error);

void com_alibaba_building_test_proxy_new_for_bus (
    GBusType             bus_type,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GAsyncReadyCallback  callback,
    gpointer             user_data);
ComAlibabaBuildingTest *com_alibaba_building_test_proxy_new_for_bus_finish (
    GAsyncResult        *res,
    GError             **error);
ComAlibabaBuildingTest *com_alibaba_building_test_proxy_new_for_bus_sync (
    GBusType             bus_type,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GError             **error);


/* ---- */

#define TYPE_COM_ALIBABA_BUILDING_TEST_SKELETON (com_alibaba_building_test_skeleton_get_type ())
#define COM_ALIBABA_BUILDING_TEST_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_COM_ALIBABA_BUILDING_TEST_SKELETON, ComAlibabaBuildingTestSkeleton))
#define COM_ALIBABA_BUILDING_TEST_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_COM_ALIBABA_BUILDING_TEST_SKELETON, ComAlibabaBuildingTestSkeletonClass))
#define COM_ALIBABA_BUILDING_TEST_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_COM_ALIBABA_BUILDING_TEST_SKELETON, ComAlibabaBuildingTestSkeletonClass))
#define IS_COM_ALIBABA_BUILDING_TEST_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_COM_ALIBABA_BUILDING_TEST_SKELETON))
#define IS_COM_ALIBABA_BUILDING_TEST_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_COM_ALIBABA_BUILDING_TEST_SKELETON))

typedef struct _ComAlibabaBuildingTestSkeleton ComAlibabaBuildingTestSkeleton;
typedef struct _ComAlibabaBuildingTestSkeletonClass ComAlibabaBuildingTestSkeletonClass;
typedef struct _ComAlibabaBuildingTestSkeletonPrivate ComAlibabaBuildingTestSkeletonPrivate;

struct _ComAlibabaBuildingTestSkeleton
{
  /*< private >*/
  GDBusInterfaceSkeleton parent_instance;
  ComAlibabaBuildingTestSkeletonPrivate *priv;
};

struct _ComAlibabaBuildingTestSkeletonClass
{
  GDBusInterfaceSkeletonClass parent_class;
};

GType com_alibaba_building_test_skeleton_get_type (void) G_GNUC_CONST;

ComAlibabaBuildingTest *com_alibaba_building_test_skeleton_new (void);


/* ---- */

#define TYPE_OBJECT (object_get_type ())
#define OBJECT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT, Object))
#define IS_OBJECT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT))
#define OBJECT_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_OBJECT, Object))

struct _Object;
typedef struct _Object Object;
typedef struct _ObjectIface ObjectIface;

struct _ObjectIface
{
  GTypeInterface parent_iface;
};

GType object_get_type (void) G_GNUC_CONST;

ComAlibabaBuildingTest *object_get_com_alibaba_building_test (Object *object);
ComAlibabaBuildingTest *object_peek_com_alibaba_building_test (Object *object);

#define TYPE_OBJECT_PROXY (object_proxy_get_type ())
#define OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT_PROXY, ObjectProxy))
#define OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_OBJECT_PROXY, ObjectProxyClass))
#define OBJECT_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_OBJECT_PROXY, ObjectProxyClass))
#define IS_OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT_PROXY))
#define IS_OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_OBJECT_PROXY))

typedef struct _ObjectProxy ObjectProxy;
typedef struct _ObjectProxyClass ObjectProxyClass;
typedef struct _ObjectProxyPrivate ObjectProxyPrivate;

struct _ObjectProxy
{
  /*< private >*/
  GDBusObjectProxy parent_instance;
  ObjectProxyPrivate *priv;
};

struct _ObjectProxyClass
{
  GDBusObjectProxyClass parent_class;
};

GType object_proxy_get_type (void) G_GNUC_CONST;
ObjectProxy *object_proxy_new (GDBusConnection *connection, const gchar *object_path);

#define TYPE_OBJECT_SKELETON (object_skeleton_get_type ())
#define OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT_SKELETON, ObjectSkeleton))
#define OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_OBJECT_SKELETON, ObjectSkeletonClass))
#define OBJECT_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_OBJECT_SKELETON, ObjectSkeletonClass))
#define IS_OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT_SKELETON))
#define IS_OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_OBJECT_SKELETON))

typedef struct _ObjectSkeleton ObjectSkeleton;
typedef struct _ObjectSkeletonClass ObjectSkeletonClass;
typedef struct _ObjectSkeletonPrivate ObjectSkeletonPrivate;

struct _ObjectSkeleton
{
  /*< private >*/
  GDBusObjectSkeleton parent_instance;
  ObjectSkeletonPrivate *priv;
};

struct _ObjectSkeletonClass
{
  GDBusObjectSkeletonClass parent_class;
};

GType object_skeleton_get_type (void) G_GNUC_CONST;
ObjectSkeleton *object_skeleton_new (const gchar *object_path);
void object_skeleton_set_com_alibaba_building_test (ObjectSkeleton *object, ComAlibabaBuildingTest *interface_);

/* ---- */

#define TYPE_OBJECT_MANAGER_CLIENT (object_manager_client_get_type ())
#define OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT_MANAGER_CLIENT, ObjectManagerClient))
#define OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_OBJECT_MANAGER_CLIENT, ObjectManagerClientClass))
#define OBJECT_MANAGER_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_OBJECT_MANAGER_CLIENT, ObjectManagerClientClass))
#define IS_OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT_MANAGER_CLIENT))
#define IS_OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_OBJECT_MANAGER_CLIENT))

typedef struct _ObjectManagerClient ObjectManagerClient;
typedef struct _ObjectManagerClientClass ObjectManagerClientClass;
typedef struct _ObjectManagerClientPrivate ObjectManagerClientPrivate;

struct _ObjectManagerClient
{
  /*< private >*/
  GDBusObjectManagerClient parent_instance;
  ObjectManagerClientPrivate *priv;
};

struct _ObjectManagerClientClass
{
  GDBusObjectManagerClientClass parent_class;
};

GType object_manager_client_get_type (void) G_GNUC_CONST;

GType object_manager_client_get_proxy_type (GDBusObjectManagerClient *manager, const gchar *object_path, const gchar *interface_name, gpointer user_data);

void object_manager_client_new (
    GDBusConnection        *connection,
    GDBusObjectManagerClientFlags  flags,
    const gchar            *name,
    const gchar            *object_path,
    GCancellable           *cancellable,
    GAsyncReadyCallback     callback,
    gpointer                user_data);
GDBusObjectManager *object_manager_client_new_finish (
    GAsyncResult        *res,
    GError             **error);
GDBusObjectManager *object_manager_client_new_sync (
    GDBusConnection        *connection,
    GDBusObjectManagerClientFlags  flags,
    const gchar            *name,
    const gchar            *object_path,
    GCancellable           *cancellable,
    GError                **error);

void object_manager_client_new_for_bus (
    GBusType                bus_type,
    GDBusObjectManagerClientFlags  flags,
    const gchar            *name,
    const gchar            *object_path,
    GCancellable           *cancellable,
    GAsyncReadyCallback     callback,
    gpointer                user_data);
GDBusObjectManager *object_manager_client_new_for_bus_finish (
    GAsyncResult        *res,
    GError             **error);
GDBusObjectManager *object_manager_client_new_for_bus_sync (
    GBusType                bus_type,
    GDBusObjectManagerClientFlags  flags,
    const gchar            *name,
    const gchar            *object_path,
    GCancellable           *cancellable,
    GError                **error);


G_END_DECLS

#endif /* __BUILDINGCLIENT_H__ */

BuildingClient.c

/*
 * Generated by gdbus-codegen 2.30.3. DO NOT EDIT.
 *
 * The license of this code is the same as for the source it was derived from.
 */

#ifdef HAVE_CONFIG_H
#  include "config.h"
#endif

#include "BuildingClient.h"

#ifdef G_OS_UNIX
#  include <gio/gunixfdlist.h>
#endif

typedef struct
{
  GDBusArgInfo parent_struct;
  gboolean use_gvariant;
} _ExtendedGDBusArgInfo;

typedef struct
{
  GDBusMethodInfo parent_struct;
  const gchar *signal_name;
  gboolean pass_fdlist;
} _ExtendedGDBusMethodInfo;

typedef struct
{
  GDBusSignalInfo parent_struct;
  const gchar *signal_name;
} _ExtendedGDBusSignalInfo;

typedef struct
{
  GDBusPropertyInfo parent_struct;
  const gchar *hyphen_name;
  gboolean use_gvariant;
} _ExtendedGDBusPropertyInfo;

typedef struct
{
  GDBusInterfaceInfo parent_struct;
  const gchar *hyphen_name;
} _ExtendedGDBusInterfaceInfo;

typedef struct
{
  const _ExtendedGDBusPropertyInfo *info;
  guint prop_id;
  GValue orig_value; /* the value before the change */
} ChangedProperty;

static void
_changed_property_free (ChangedProperty *data)
{
  g_value_unset (&data->orig_value);
  g_free (data);
}

static gboolean
_g_strv_equal0 (gchar **a, gchar **b)
{
  gboolean ret = FALSE;
  guint n;
  if (a 
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值