上篇讲解服务端如何实现,这篇开始讲解客户端,基本都一样,但是如果没有看到一个例子,自己研究,满满都是泪啊
因为上一篇中已经创建了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