summaryrefslogtreecommitdiff
path: root/src/nm-dbus-utils.h
blob: 8ae6cb3a08367eb94125d2745bf95d19a3a3695c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
// SPDX-License-Identifier: GPL-2.0+
/*
 * Copyright (C) 2018 Red Hat, Inc.
 */

#ifndef __NM_DBUS_UTILS_H__
#define __NM_DBUS_UTILS_H__

/*****************************************************************************/

struct _NMDBusInterfaceInfoExtended;
struct _NMDBusMethodInfoExtended;

struct _NMDBusPropertyInfoExtendedBase {
	GDBusPropertyInfo _parent;
	const char *property_name;

	/* Whether the properties needs to be notified on the legacy
	 * PropertyChanged signal. This is only to preserve API, new
	 * properties should not use this. */
	bool include_in_legacy_property_changed;
};

struct _NMDBusPropertyInfoExtendedReadWritable {
	struct _NMDBusPropertyInfoExtendedBase _base;

	/* this is the polkit permission type for authenticating setting
	 * the property. */
	const char *permission;

	/* this is the audit operation type for writing the property. */
	const char *audit_op;
};

typedef struct {
	union {

		GDBusPropertyInfo _parent;
		struct _NMDBusPropertyInfoExtendedBase _base;
		struct _NMDBusPropertyInfoExtendedReadWritable writable;

		/* duplicate the base structure in the union, so that the common fields
		 * are accessible directly in the parent struct. */
		struct {
			GDBusPropertyInfo parent;
			const char *property_name;

			/* Whether the properties needs to be notified on the legacy
			 * PropertyChanged signal. This is only to preserve API, new
			 * properties should not use this. */
			bool include_in_legacy_property_changed;
		};
	};
} NMDBusPropertyInfoExtended;

G_STATIC_ASSERT (G_STRUCT_OFFSET (NMDBusPropertyInfoExtended, property_name) == G_STRUCT_OFFSET (struct _NMDBusPropertyInfoExtendedBase, property_name));
G_STATIC_ASSERT (G_STRUCT_OFFSET (NMDBusPropertyInfoExtended, include_in_legacy_property_changed) == G_STRUCT_OFFSET (struct _NMDBusPropertyInfoExtendedBase, include_in_legacy_property_changed));

#define NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_FULL(m_name, m_signature, m_property_name, m_include_in_legacy_property_changed) \
	((GDBusPropertyInfo *) &((const struct _NMDBusPropertyInfoExtendedBase) { \
		._parent = { \
			.ref_count = -1, \
			.name = m_name, \
			.signature = m_signature, \
			.flags = G_DBUS_PROPERTY_INFO_FLAGS_READABLE, \
		}, \
		.property_name = m_property_name, \
		.include_in_legacy_property_changed = m_include_in_legacy_property_changed, \
	}))

#define NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE(m_name, m_signature, m_property_name) \
	NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_FULL (m_name, m_signature, m_property_name, FALSE)

/* define a legacy property. Do not use for new code. */
#define NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L(m_name, m_signature, m_property_name) \
	NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_FULL (m_name, m_signature, m_property_name, TRUE)

#define NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READWRITABLE_FULL(m_name, m_signature, m_property_name, m_permission, m_audit_op, m_include_in_legacy_property_changed) \
	((GDBusPropertyInfo *) &((const struct _NMDBusPropertyInfoExtendedReadWritable) { \
		._base = { \
			._parent = { \
				.ref_count = -1, \
				.name = m_name, \
				.signature = m_signature, \
				.flags = G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE, \
			}, \
			.property_name = m_property_name, \
			.include_in_legacy_property_changed = m_include_in_legacy_property_changed, \
		}, \
		.permission = m_permission, \
		.audit_op = m_audit_op, \
	}))

#define NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READWRITABLE(m_name, m_signature, m_property_name, m_permission, m_audit_op) \
	NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READWRITABLE_FULL (m_name, m_signature, m_property_name, m_permission, m_audit_op, FALSE)

/* define a legacy property. Do not use for new code. */
#define NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READWRITABLE_L(m_name, m_signature, m_property_name, m_permission, m_audit_op) \
	NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READWRITABLE_FULL (m_name, m_signature, m_property_name, m_permission, m_audit_op, TRUE)

typedef struct _NMDBusMethodInfoExtended {
	GDBusMethodInfo parent;
	void (*handle) (NMDBusObject *obj,
	                const struct _NMDBusInterfaceInfoExtended *interface_info,
	                const struct _NMDBusMethodInfoExtended *method_info,
	                GDBusConnection *connection,
	                const char *sender,
	                GDBusMethodInvocation *invocation,
	                GVariant *parameters);
	bool allow_during_shutdown;
} NMDBusMethodInfoExtended;

#define NM_DEFINE_DBUS_METHOD_INFO_EXTENDED(parent_, ...) \
	((GDBusMethodInfo *) (&((const NMDBusMethodInfoExtended) { \
		.parent = parent_, \
		__VA_ARGS__ \
	})))

typedef struct _NMDBusInterfaceInfoExtended {
	GDBusInterfaceInfo parent;

	/* Whether the interface has a legacy property changed signal (@nm_signal_info_property_changed_legacy).
	 * New interfaces should not use this. */
	bool legacy_property_changed:1;
} NMDBusInterfaceInfoExtended;

extern const GDBusSignalInfo nm_signal_info_property_changed_legacy;

#define NM_DBUS_INTERFACE_INFOS(...) \
	({ \
		static const NMDBusInterfaceInfoExtended *const _interface_infos[] = { \
			__VA_ARGS__, \
			NULL, \
		}; \
		_interface_infos; \
	});

/*****************************************************************************/

GDBusPropertyInfo *nm_dbus_utils_interface_info_lookup_property (const GDBusInterfaceInfo *interface_info,
                                                                 const char *property_name,
                                                                 guint *property_idx);

GDBusMethodInfo *nm_dbus_utils_interface_info_lookup_method (const GDBusInterfaceInfo *interface_info,
                                                             const char *method_name);

GVariant *nm_dbus_utils_get_property (GObject *obj,
                                      const char *signature,
                                      const char *property_name);

/*****************************************************************************/

struct CList;

const char **nm_dbus_utils_get_paths_for_clist (const struct CList *lst_head,
                                                gssize lst_len,
                                                guint member_offset,
                                                gboolean expect_all_exported);

void nm_dbus_utils_g_value_set_object_path (GValue *value, gpointer object);

void nm_dbus_utils_g_value_set_object_path_still_exported (GValue *value, gpointer object);

void nm_dbus_utils_g_value_set_object_path_from_hash (GValue *value,
                                                      GHashTable *hash,
                                                      gboolean expect_all_exported);

/*****************************************************************************/

typedef struct {
	union {
		gpointer const obj;
		gpointer _obj;
	};
	GObject *_notify_target;
	const GParamSpec *_notify_pspec;
	gulong _notify_signal_id;
	union {
		const bool visible;
		bool _visible;
	};
} NMDBusTrackObjPath;

void nm_dbus_track_obj_path_init (NMDBusTrackObjPath *track,
                                  GObject *target,
                                  const GParamSpec *pspec);

void nm_dbus_track_obj_path_deinit (NMDBusTrackObjPath *track);

void nm_dbus_track_obj_path_notify (const NMDBusTrackObjPath *track);

const char *nm_dbus_track_obj_path_get (const NMDBusTrackObjPath *track);

void nm_dbus_track_obj_path_set (NMDBusTrackObjPath *track,
                                 gpointer obj,
                                 gboolean visible);

#endif /* __NM_DBUS_UTILS_H__ */