|
Packit Service |
b23acc |
// SPDX-License-Identifier: GPL-2.0+
|
|
Packit Service |
b23acc |
/*
|
|
Packit Service |
b23acc |
* Copyright (C) 2018 Red Hat, Inc.
|
|
Packit Service |
b23acc |
*/
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#ifndef __NM_DBUS_OBJECT_H__
|
|
Packit Service |
b23acc |
#define __NM_DBUS_OBJECT_H__
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/*****************************************************************************/
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#include "c-list/src/c-list.h"
|
|
Packit Service |
b23acc |
#include "nm-dbus-utils.h"
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/*****************************************************************************/
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
typedef struct {
|
|
Packit Service |
b23acc |
const char *path;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/* if path is of type NM_DBUS_EXPORT_PATH_NUMBERED(), we need a
|
|
Packit Service |
b23acc |
* per-class counter when generating a new numbered path.
|
|
Packit Service |
b23acc |
*
|
|
Packit Service |
b23acc |
* Each NMDBusObjectClass instance has a shallow clone of the NMDBusObjectClass parent
|
|
Packit Service |
b23acc |
* instance in every derived type. Hence we cannot embed the counter there directly,
|
|
Packit Service |
b23acc |
* because it must be shared, e.g. between NMDeviceBond and NMDeviceEthernet.
|
|
Packit Service |
b23acc |
* Make int_counter a pointer to the actual counter that is used by ever sibling
|
|
Packit Service |
b23acc |
* class. */
|
|
Packit Service |
b23acc |
long long unsigned *int_counter;
|
|
Packit Service |
b23acc |
} NMDBusExportPath;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#define NM_DBUS_EXPORT_PATH_STATIC(basepath) \
|
|
Packit Service |
b23acc |
({ \
|
|
Packit Service |
b23acc |
((NMDBusExportPath) { \
|
|
Packit Service |
b23acc |
.path = ""basepath"", \
|
|
Packit Service |
b23acc |
}); \
|
|
Packit Service |
b23acc |
})
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#define NM_DBUS_EXPORT_PATH_NUMBERED(basepath) \
|
|
Packit Service |
b23acc |
({ \
|
|
Packit Service |
b23acc |
static long long unsigned _int_counter = 0; \
|
|
Packit Service |
b23acc |
((NMDBusExportPath) { \
|
|
Packit Service |
b23acc |
.path = ""basepath"/%llu", \
|
|
Packit Service |
b23acc |
.int_counter = &_int_counter, \
|
|
Packit Service |
b23acc |
}); \
|
|
Packit Service |
b23acc |
})
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/*****************************************************************************/
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/* "org.freedesktop.NetworkManager.Device.Statistics" is a special interface,
|
|
Packit Service |
b23acc |
* because although it has a legacy PropertiesChanged signal, it only notifies
|
|
Packit Service |
b23acc |
* about properties that actually exist on that interface. That is, because it
|
|
Packit Service |
b23acc |
* was added with 1.4.0 release, and thus didn't have the broken behavior like
|
|
Packit Service |
b23acc |
* other legacy interfaces. Those notify about *all* properties, even if they
|
|
Packit Service |
b23acc |
* are not part of that D-Bus interface. See also "include_in_legacy_property_changed"
|
|
Packit Service |
b23acc |
* and "legacy_property_changed". */
|
|
Packit Service |
b23acc |
extern const NMDBusInterfaceInfoExtended nm_interface_info_device_statistics;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/*****************************************************************************/
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#define NM_TYPE_DBUS_OBJECT (nm_dbus_object_get_type ())
|
|
Packit Service |
b23acc |
#define NM_DBUS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DBUS_OBJECT, NMDBusObject))
|
|
Packit Service |
b23acc |
#define NM_DBUS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DBUS_OBJECT, NMDBusObjectClass))
|
|
Packit Service |
b23acc |
#define NM_IS_DBUS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DBUS_OBJECT))
|
|
Packit Service |
b23acc |
#define NM_IS_DBUS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DBUS_OBJECT))
|
|
Packit Service |
b23acc |
#define NM_DBUS_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DBUS_OBJECT, NMDBusObjectClass))
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#define NM_DBUS_OBJECT_EXPORTED_CHANGED "exported-changed"
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/* NMDBusObject and NMDBusManager cooperate strongly. Hence, there is an
|
|
Packit Service |
b23acc |
* internal data structure attached to the NMDBusObject accessible to both of them. */
|
|
Packit Service |
b23acc |
struct _NMDBusObjectInternal {
|
|
Packit Service |
b23acc |
char *path;
|
|
Packit Service |
b23acc |
NMDBusManager *bus_manager;
|
|
Packit Service |
b23acc |
CList objects_lst;
|
|
Packit Service |
b23acc |
CList registration_lst_head;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/* we perform asynchronous operation on exported objects. For example, we receive
|
|
Packit Service |
b23acc |
* a Set property call, and asynchronously validate the operation. We must make
|
|
Packit Service |
b23acc |
* sure that when the authentication is complete, that we are still looking at
|
|
Packit Service |
b23acc |
* the same (exported) object. In the meantime, the object could have been
|
|
Packit Service |
b23acc |
* unexported, or even re-exported afterwards. If that happens, we want
|
|
Packit Service |
b23acc |
* to fail the request. For that, we keep track of a version id. */
|
|
Packit Service |
b23acc |
guint64 export_version_id;
|
|
Packit Service |
b23acc |
bool is_unexporting:1;
|
|
Packit Service |
b23acc |
};
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
struct _NMDBusObject {
|
|
Packit Service |
b23acc |
GObject parent;
|
|
Packit Service |
b23acc |
struct _NMDBusObjectInternal internal;
|
|
Packit Service |
b23acc |
};
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#define NM_DEFINE_DBUS_INTERFACE_INFO(...) \
|
|
Packit Service |
b23acc |
((NMDBusInterfaceInfo *) (&((const NMDBusInterfaceInfo) { \
|
|
Packit Service |
b23acc |
__VA_ARGS__ \
|
|
Packit Service |
b23acc |
})))
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
typedef struct {
|
|
Packit Service |
b23acc |
GObjectClass parent;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
NMDBusExportPath export_path;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
const NMDBusInterfaceInfoExtended *const*interface_infos;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
bool export_on_construction;
|
|
Packit Service |
b23acc |
} NMDBusObjectClass;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
GType nm_dbus_object_get_type (void);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static inline NMDBusManager *
|
|
Packit Service |
b23acc |
nm_dbus_object_get_manager (NMDBusObject *obj)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
nm_assert (NM_IS_DBUS_OBJECT (obj));
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
return obj->internal.bus_manager;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static inline guint64
|
|
Packit Service |
b23acc |
nm_dbus_object_get_export_version_id (NMDBusObject *obj)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
nm_assert (NM_IS_DBUS_OBJECT (obj));
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
return obj->internal.export_version_id;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/**
|
|
Packit Service |
b23acc |
* nm_dbus_object_get_path:
|
|
Packit Service |
b23acc |
* @self: an #NMDBusObject
|
|
Packit Service |
b23acc |
*
|
|
Packit Service |
b23acc |
* Gets @self's D-Bus path.
|
|
Packit Service |
b23acc |
*
|
|
Packit Service |
b23acc |
* Returns: @self's D-Bus path, or %NULL if @self is not exported.
|
|
Packit Service |
b23acc |
*/
|
|
Packit Service |
b23acc |
static inline const char *
|
|
Packit Service |
b23acc |
nm_dbus_object_get_path (NMDBusObject *self)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
g_return_val_if_fail (NM_IS_DBUS_OBJECT (self), NULL);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
return self->internal.path;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/**
|
|
Packit Service |
b23acc |
* nm_dbus_object_is_exported:
|
|
Packit Service |
b23acc |
* @self: an #NMDBusObject
|
|
Packit Service |
b23acc |
*
|
|
Packit Service |
b23acc |
* Checks if @self is exported
|
|
Packit Service |
b23acc |
*
|
|
Packit Service |
b23acc |
* Returns: %TRUE if @self is exported
|
|
Packit Service |
b23acc |
*/
|
|
Packit Service |
b23acc |
static inline gboolean
|
|
Packit Service |
b23acc |
nm_dbus_object_is_exported (NMDBusObject *self)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
return !!nm_dbus_object_get_path (self);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static inline const char *
|
|
Packit Service |
b23acc |
nm_dbus_object_get_path_still_exported (NMDBusObject *self)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
g_return_val_if_fail (NM_IS_DBUS_OBJECT (self), NULL);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/* like nm_dbus_object_get_path(), however, while unexporting
|
|
Packit Service |
b23acc |
* (exported-changed signal), returns %NULL instead of the path. */
|
|
Packit Service |
b23acc |
return self->internal.is_unexporting
|
|
Packit Service |
b23acc |
? NULL
|
|
Packit Service |
b23acc |
: self->internal.path;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
const char *nm_dbus_object_export (NMDBusObject *self);
|
|
Packit Service |
b23acc |
void nm_dbus_object_unexport (NMDBusObject *self);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
void _nm_dbus_object_clear_and_unexport (NMDBusObject **location);
|
|
Packit Service |
b23acc |
#define nm_dbus_object_clear_and_unexport(location) _nm_dbus_object_clear_and_unexport ((NMDBusObject **) (location))
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
void nm_dbus_object_emit_signal_variant (NMDBusObject *self,
|
|
Packit Service |
b23acc |
const NMDBusInterfaceInfoExtended *interface_info,
|
|
Packit Service |
b23acc |
const GDBusSignalInfo *signal_info,
|
|
Packit Service |
b23acc |
GVariant *args);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
void nm_dbus_object_emit_signal (NMDBusObject *self,
|
|
Packit Service |
b23acc |
const NMDBusInterfaceInfoExtended *interface_info,
|
|
Packit Service |
b23acc |
const GDBusSignalInfo *signal_info,
|
|
Packit Service |
b23acc |
const char *format,
|
|
Packit Service |
b23acc |
...);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#endif /* __NM_DBUS_OBJECT_H__ */
|