summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-02-19 08:56:18 +0100
committerThomas Haller <thaller@redhat.com>2019-02-19 09:33:05 +0100
commitc9244d28ae83d4345b4b8f87beb8e984cb40a991 (patch)
treeedb785baa2712a7eb752a62184620797ea824e51
parentfc9d6610182bf205587bf8c6b87c4333bc0c6e43 (diff)
downloadNetworkManager-c9244d28ae83d4345b4b8f87beb8e984cb40a991.tar.gz
shared: add nm_g_type_find_implementing_class_for_property() helper
A helper method, only useful for printf debugging -- and thus unused in the source-tree. It is relatively cumbersome to lookup the GType that implements a property. For example, for NMDeviceBond.driver, it should return NMDevice (which implements the "driver" property).
-rw-r--r--shared/nm-utils/nm-shared-utils.c47
-rw-r--r--shared/nm-utils/nm-shared-utils.h5
2 files changed, 52 insertions, 0 deletions
diff --git a/shared/nm-utils/nm-shared-utils.c b/shared/nm-utils/nm-shared-utils.c
index f5b0d0f773..b22251afc8 100644
--- a/shared/nm-utils/nm-shared-utils.c
+++ b/shared/nm-utils/nm-shared-utils.c
@@ -1413,6 +1413,53 @@ nm_g_object_class_find_property_from_gtype (GType gtype,
/*****************************************************************************/
+/**
+ * nm_g_type_find_implementing_class_for_property:
+ * @gtype: the GObject type which has a property @pname
+ * @pname: the name of the property to look up
+ *
+ * This is only a helper function for printf debugging. It's not
+ * used in actual code. Hence, the function just asserts that
+ * @pname and @gtype arguments are suitable. It cannot fail.
+ *
+ * Returns: the most ancestor type of @gtype, that
+ * implements the property @pname. It means, it
+ * searches the type hierarchy to find the type
+ * that added @pname.
+ */
+GType
+nm_g_type_find_implementing_class_for_property (GType gtype,
+ const char *pname)
+{
+ nm_auto_unref_gtypeclass GObjectClass *klass = NULL;
+ GParamSpec *pspec;
+
+ g_return_val_if_fail (pname, G_TYPE_INVALID);
+
+ klass = g_type_class_ref (gtype);
+ g_return_val_if_fail (G_IS_OBJECT_CLASS (klass), G_TYPE_INVALID);
+
+ pspec = g_object_class_find_property (klass, pname);
+ g_return_val_if_fail (pspec, G_TYPE_INVALID);
+
+ gtype = G_TYPE_FROM_CLASS (klass);
+
+ while (TRUE) {
+ nm_auto_unref_gtypeclass GObjectClass *k = NULL;
+
+ k = g_type_class_ref (g_type_parent (gtype));
+
+ g_return_val_if_fail (G_IS_OBJECT_CLASS (k), G_TYPE_INVALID);
+
+ if (g_object_class_find_property (k, pname) != pspec)
+ return gtype;
+
+ gtype = G_TYPE_FROM_CLASS (k);
+ }
+}
+
+/*****************************************************************************/
+
static void
_str_append_escape (GString *s, char ch)
{
diff --git a/shared/nm-utils/nm-shared-utils.h b/shared/nm-utils/nm-shared-utils.h
index ce308ef67c..4758c4a083 100644
--- a/shared/nm-utils/nm-shared-utils.h
+++ b/shared/nm-utils/nm-shared-utils.h
@@ -795,6 +795,11 @@ GParamSpec *nm_g_object_class_find_property_from_gtype (GType gtype,
/*****************************************************************************/
+GType nm_g_type_find_implementing_class_for_property (GType gtype,
+ const char *pname);
+
+/*****************************************************************************/
+
typedef enum {
NM_UTILS_STR_UTF8_SAFE_FLAG_NONE = 0,
NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL = 0x0001,