summaryrefslogtreecommitdiff
path: root/cli/src
diff options
context:
space:
mode:
Diffstat (limited to 'cli/src')
-rw-r--r--cli/src/Makefile.am10
-rw-r--r--cli/src/settings-docs.xsl86
-rw-r--r--cli/src/settings.c21
3 files changed, 109 insertions, 8 deletions
diff --git a/cli/src/Makefile.am b/cli/src/Makefile.am
index e61c036898..d30725c5c7 100644
--- a/cli/src/Makefile.am
+++ b/cli/src/Makefile.am
@@ -3,6 +3,7 @@ bin_PROGRAMS = \
AM_CPPFLAGS = \
-I${top_srcdir} \
+ -I${top_builddir} \
-I${top_srcdir}/include \
-I${top_builddir}/include \
-I${top_srcdir}/libnm-util \
@@ -37,4 +38,13 @@ nmcli_LDADD = \
$(top_builddir)/libnm-util/libnm-util.la \
$(top_builddir)/libnm-glib/libnm-glib.la
+if HAVE_INTROSPECTION
+settings-docs.c: settings-docs.xsl $(top_builddir)/libnm-util/nm-setting-docs.xml
+ $(AM_V_GEN) xsltproc --output $@ $^
+BUILT_SOURCES = settings-docs.c
+endif
+
+DISTCLEANFILES = settings-docs.c
+
+EXTRA_DIST = settings-docs.c settings-docs.xsl
diff --git a/cli/src/settings-docs.xsl b/cli/src/settings-docs.xsl
new file mode 100644
index 0000000000..996644bd9e
--- /dev/null
+++ b/cli/src/settings-docs.xsl
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+ <xsl:output
+ method="text"
+ doctype-public="-//OASIS//DTD DocBook XML V4.3//EN"
+ doctype-system="http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
+ />
+
+ <xsl:template match="nm-setting-docs">/* Generated file. Do not edit. */
+
+typedef struct {
+ const char *name;
+ const char *docs;
+} NmcPropertyDesc;
+<xsl:apply-templates select="setting" mode="properties"><xsl:sort select="@name"/></xsl:apply-templates>
+
+typedef struct {
+ const char *name;
+ NmcPropertyDesc *properties;
+ int n_properties;
+} NmcSettingDesc;
+
+NmcSettingDesc all_settings[] = {
+<xsl:apply-templates select="setting" mode="settings"><xsl:sort select="@name"/></xsl:apply-templates>
+};
+
+static int
+find_by_name (gconstpointer keyv, gconstpointer cmpv)
+{
+ const char *key = keyv;
+ struct { const char *name; gpointer data; } *cmp = (gpointer)cmpv;
+
+ return strcmp (key, cmp->name);
+}
+
+static const char *
+nmc_setting_get_property_doc (NMSetting *setting, const char *prop)
+{
+ NmcSettingDesc *setting_desc;
+ NmcPropertyDesc *property_desc;
+
+ setting_desc = bsearch (nm_setting_get_name (setting),
+ all_settings, G_N_ELEMENTS (all_settings),
+ sizeof (NmcSettingDesc), find_by_name);
+ if (!setting_desc)
+ return NULL;
+ property_desc = bsearch (prop,
+ setting_desc->properties, setting_desc->n_properties,
+ sizeof (NmcPropertyDesc), find_by_name);
+ if (!property_desc)
+ return NULL;
+ return property_desc->docs;
+}
+ </xsl:template>
+
+ <xsl:template match="setting" mode="properties">
+NmcPropertyDesc setting_<xsl:value-of select="translate(@name,'-','_')"/>[] = {<xsl:apply-templates select="property"><xsl:sort select="@name"/></xsl:apply-templates>
+};
+ </xsl:template>
+
+ <xsl:template match="property">
+ <xsl:variable name="docs">
+ <xsl:call-template name="escape_quotes">
+ <xsl:with-param name="string" select="@description"/>
+ </xsl:call-template>
+ </xsl:variable>
+ { "<xsl:value-of select="@name"/>", "<xsl:value-of select="$docs"/>" },</xsl:template>
+
+ <xsl:template match="setting" mode="settings">
+ { "<xsl:value-of select="@name"/>", setting_<xsl:value-of select="translate(@name,'-','_')"/>, <xsl:value-of select="count(./property)"/> },</xsl:template>
+
+ <xsl:template name="escape_quotes">
+ <xsl:param name="string" />
+ <xsl:choose>
+ <xsl:when test="contains($string, '&quot;')">
+ <xsl:value-of select="substring-before($string, '&quot;')" />\&quot;<xsl:call-template name="escape_quotes"><xsl:with-param name="string" select="substring-after($string, '&quot;')" /></xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$string" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/cli/src/settings.c b/cli/src/settings.c
index 0fc708b352..379ffc185d 100644
--- a/cli/src/settings.c
+++ b/cli/src/settings.c
@@ -21,6 +21,7 @@
#include <net/if_arp.h>
#include <stdio.h>
+#include <stdlib.h>
#include <glib.h>
#include <glib/gi18n.h>
@@ -6367,10 +6368,16 @@ nmc_setting_get_property_allowed_values (NMSetting *setting, const char *prop)
return NULL;
}
+#ifdef HAVE_INTROSPECTION
+#include "settings-docs.c"
+#else
+#define nmc_setting_get_property_doc(setting, prop) "(not available)"
+#endif
+
/*
* Create a description string for a property.
*
- * It returns a description got from properties blurb, concatenated with
+ * It returns a description got from property documentation, concatenated with
* nmcli specific description (if it exists).
*
* Returns: property description or NULL on failure. The caller must free the string.
@@ -6378,9 +6385,8 @@ nmc_setting_get_property_allowed_values (NMSetting *setting, const char *prop)
char *
nmc_setting_get_property_desc (NMSetting *setting, const char *prop)
{
- GParamSpec *spec;
const NmcPropertyFuncs *item;
- const char *setting_desc = "";
+ const char *setting_desc = NULL;
const char *setting_desc_title = "";
const char *nmcli_desc = NULL;
const char *nmcli_desc_title = "";
@@ -6388,11 +6394,9 @@ nmc_setting_get_property_desc (NMSetting *setting, const char *prop)
g_return_val_if_fail (NM_IS_SETTING (setting), FALSE);
- spec = g_object_class_find_property (G_OBJECT_GET_CLASS (G_OBJECT (setting)), prop);
- if (spec) {
- setting_desc = g_param_spec_get_blurb (spec);
+ setting_desc = nmc_setting_get_property_doc (setting, prop);
+ if (setting_desc)
setting_desc_title = _("[NM property description]");
- }
item = nmc_properties_find (nm_setting_get_name (setting), prop);
if (item && item->describe_func) {
@@ -6402,7 +6406,8 @@ nmc_setting_get_property_desc (NMSetting *setting, const char *prop)
}
return g_strdup_printf ("%s\n%s\n%s%s%s%s",
- setting_desc_title, setting_desc,
+ setting_desc_title,
+ setting_desc ? setting_desc : "",
nmcli_nl, nmcli_desc_title, nmcli_nl,
nmcli_desc ? nmcli_desc : "");
}