[network-manager-openvpn/th/export-bgo764132: 2/27] shared: add "shared/nm-shared-utils.h"



commit 203a22e23d97231cec5711eff71cac56ca49e5d1
Author: Thomas Haller <thaller redhat com>
Date:   Wed Mar 23 17:17:57 2016 +0100

    shared: add "shared/nm-shared-utils.h"

 po/POTFILES.in             |    1 +
 properties/import-export.c |    1 +
 shared/Makefile.am         |    2 +
 shared/nm-shared-utils.c   |  228 ++++++++++++++++++++++++++++++++++++++++++++
 shared/nm-shared-utils.h   |   63 ++++++++++++
 shared/utils.c             |   75 ---------------
 shared/utils.h             |    2 -
 7 files changed, 295 insertions(+), 77 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 13fd42b..90ae330 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -5,5 +5,6 @@ properties/auth-helpers.c
 properties/import-export.c
 properties/nm-openvpn.c
 [type: gettext/glade]properties/nm-openvpn-dialog.ui
+shared/nm-shared-utils.c
 src/nm-openvpn-service.c
 src/nm-openvpn-service-openvpn-helper.c
diff --git a/properties/import-export.c b/properties/import-export.c
index 8754eec..2d1a4c1 100644
--- a/properties/import-export.c
+++ b/properties/import-export.c
@@ -39,6 +39,7 @@
 #include "nm-openvpn-service-defines.h"
 #include "utils.h"
 #include "nm-macros-internal.h"
+#include "nm-shared-utils.h"
 
 
 #define INLINE_BLOB_CA                  "ca"
diff --git a/shared/Makefile.am b/shared/Makefile.am
index fa4edd5..f9a7a5e 100644
--- a/shared/Makefile.am
+++ b/shared/Makefile.am
@@ -13,6 +13,8 @@ libnm_openvpn_shared_la_CPPFLAGS = \
     -I$(top_srcdir)/shared
 
 libnm_vpn_plugin_openvpn_shared_la_SOURCES= \
+    nm-shared-utils.c \
+    nm-shared-utils.h \
     utils.c \
     utils.h \
     nm-openvpn-service-defines.h
diff --git a/shared/nm-shared-utils.c b/shared/nm-shared-utils.c
new file mode 100644
index 0000000..0ae54bd
--- /dev/null
+++ b/shared/nm-shared-utils.c
@@ -0,0 +1,228 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager -- Network link manager
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * (C) Copyright 2016 Red Hat, Inc.
+ */
+
+#include "nm-default.h"
+
+#include "nm-shared-utils.h"
+
+#include <errno.h>
+
+/*****************************************************************************/
+
+/* _nm_utils_ascii_str_to_int64:
+ *
+ * A wrapper for g_ascii_strtoll, that checks whether the whole string
+ * can be successfully converted to a number and is within a given
+ * range. On any error, @fallback will be returned and %errno will be set
+ * to a non-zero value. On success, %errno will be set to zero, check %errno
+ * for errors. Any trailing or leading (ascii) white space is ignored and the
+ * functions is locale independent.
+ *
+ * The function is guaranteed to return a value between @min and @max
+ * (inclusive) or @fallback. Also, the parsing is rather strict, it does
+ * not allow for any unrecognized characters, except leading and trailing
+ * white space.
+ **/
+gint64
+_nm_utils_ascii_str_to_int64 (const char *str, guint base, gint64 min, gint64 max, gint64 fallback)
+{
+       gint64 v;
+       size_t len;
+       char buf[64], *s, *str_free = NULL;
+
+       if (str) {
+               while (g_ascii_isspace (str[0]))
+                       str++;
+       }
+       if (!str || !str[0]) {
+               errno = EINVAL;
+               return fallback;
+       }
+
+       len = strlen (str);
+       if (g_ascii_isspace (str[--len])) {
+               /* backward search the first non-ws character.
+                * We already know that str[0] is non-ws. */
+               while (g_ascii_isspace (str[--len]))
+                       ;
+
+               /* str[len] is now the last non-ws character... */
+               len++;
+
+               if (len >= sizeof (buf))
+                       s = str_free = g_malloc (len + 1);
+               else
+                       s = buf;
+
+               memcpy (s, str, len);
+               s[len] = 0;
+
+               nm_assert (len > 0 && len < strlen (str) && len == strlen (s));
+               nm_assert (!g_ascii_isspace (str[len-1]) && g_ascii_isspace (str[len]));
+               nm_assert (strncmp (str, s, len) == 0);
+
+               str = s;
+       }
+
+       errno = 0;
+       v = g_ascii_strtoll (str, &s, base);
+
+       if (errno != 0)
+               v = fallback;
+       else if (s[0] != 0) {
+               errno = EINVAL;
+               v = fallback;
+       } else if (v > max || v < min) {
+               errno = ERANGE;
+               v = fallback;
+       }
+
+       if (G_UNLIKELY (str_free))
+               g_free (str_free);
+       return v;
+}
+
+/*****************************************************************************/
+
+G_DEFINE_QUARK (nm-utils-error-quark, nm_utils_error)
+
+void
+nm_utils_error_set_cancelled (GError **error,
+                              gboolean is_disposing,
+                              const char *instance_name)
+{
+       if (is_disposing) {
+               g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_CANCELLED_DISPOSING,
+                            "Disposing %s instance",
+                            instance_name && *instance_name ? instance_name : "source");
+       } else {
+               g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_CANCELLED,
+                                    "Request cancelled");
+       }
+}
+
+gboolean
+nm_utils_error_is_cancelled (GError *error,
+                             gboolean consider_is_disposing)
+{
+       if (error) {
+               if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+                       return TRUE;
+               if (   consider_is_disposing
+                   && g_error_matches (error, NM_UTILS_ERROR, NM_UTILS_ERROR_CANCELLED_DISPOSING))
+                       return TRUE;
+       }
+       return FALSE;
+}
+
+/*****************************************************************************/
+
+/**
+ * nm_g_object_set_property:
+ * @object: the target object
+ * @property_name: the property name
+ * @value: the #GValue to set
+ * @error: (allow-none): optional error argument
+ *
+ * A reimplementation of g_object_set_property(), but instead
+ * returning an error instead of logging a warning. All g_object_set*()
+ * versions in glib require you to not pass invalid types or they will
+ * log a g_warning() -- without reporting an error. We don't want that,
+ * so we need to hack error checking around it.
+ *
+ * Returns: whether the value was successfully set.
+ */
+gboolean
+nm_g_object_set_property (GObject *object,
+                          const gchar  *property_name,
+                          const GValue *value,
+                          GError **error)
+{
+       GParamSpec *pspec;
+       nm_auto_unset_gvalue GValue tmp_value = G_VALUE_INIT;
+       GObjectClass *klass;
+
+       g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
+       g_return_val_if_fail (property_name != NULL, FALSE);
+       g_return_val_if_fail (G_IS_VALUE (value), FALSE);
+       g_return_val_if_fail (!error || !*error, FALSE);
+
+       /* g_object_class_find_property() does g_param_spec_get_redirect_target(),
+        * where we differ from a plain g_object_set_property(). */
+       pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (object), property_name);
+
+       if (!pspec) {
+               g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
+                            _("object class '%s' has no property named '%s'"),
+                            G_OBJECT_TYPE_NAME (object),
+                            property_name);
+               return FALSE;
+       }
+       if (!(pspec->flags & G_PARAM_WRITABLE)) {
+               g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
+                            _("property '%s' of object class '%s' is not writable"),
+                            pspec->name,
+                            G_OBJECT_TYPE_NAME (object));
+               return FALSE;
+       }
+       if ((pspec->flags & G_PARAM_CONSTRUCT_ONLY)) {
+               g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
+                            _("construct property \"%s\" for object '%s' can't be set after construction"),
+                            pspec->name, G_OBJECT_TYPE_NAME (object));
+               return FALSE;
+       }
+
+       klass = g_type_class_peek (pspec->owner_type);
+       if (klass == NULL) {
+               g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
+                            _("'%s::%s' is not a valid property name; '%s' is not a GObject subtype"),
+                           g_type_name (pspec->owner_type), pspec->name, g_type_name (pspec->owner_type));
+               return FALSE;
+       }
+
+       /* provide a copy to work from, convert (if necessary) and validate */
+       g_value_init (&tmp_value, pspec->value_type);
+       if (!g_value_transform (value, &tmp_value)) {
+               g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
+                            _("unable to set property '%s' of type '%s' from value of type '%s'"),
+                            pspec->name,
+                            g_type_name (pspec->value_type),
+                            G_VALUE_TYPE_NAME (value));
+               return FALSE;
+       }
+       if (   g_param_value_validate (pspec, &tmp_value)
+           && !(pspec->flags & G_PARAM_LAX_VALIDATION)) {
+               gs_free char *contents = g_strdup_value_contents (value);
+
+               g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
+                            _("value \"%s\" of type '%s' is invalid or out of range for property '%s' of 
type '%s'"),
+                            contents,
+                            G_VALUE_TYPE_NAME (value),
+                            pspec->name,
+                            g_type_name (pspec->value_type));
+               return FALSE;
+       }
+
+       g_object_set_property (object, property_name, &tmp_value);
+       return TRUE;
+}
+
+/*****************************************************************************/
diff --git a/shared/nm-shared-utils.h b/shared/nm-shared-utils.h
new file mode 100644
index 0000000..f80c850
--- /dev/null
+++ b/shared/nm-shared-utils.h
@@ -0,0 +1,63 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager -- Network link manager
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * (C) Copyright 2016 Red Hat, Inc.
+ */
+
+#ifndef __NM_SHARED_UTILS_H__
+#define __NM_SHARED_UTILS_H__
+
+/******************************************************************************/
+
+gint64 _nm_utils_ascii_str_to_int64 (const char *str, guint base, gint64 min, gint64 max, gint64 fallback);
+
+/******************************************************************************/
+
+/**
+ * NMUtilsError:
+ * @NM_UTILS_ERROR_UNKNOWN: unknown or unclassified error
+ * @NM_UTILS_ERROR_CANCELLED_DISPOSING: when disposing an object that has
+ *   pending aynchronous operations, the operation is cancelled with this
+ *   error reason. Depending on the usage, this might indicate a bug because
+ *   usually the target object should stay alive as long as there are pending
+ *   operations.
+ */
+typedef enum {
+       NM_UTILS_ERROR_UNKNOWN = 0,                 /*< nick=Unknown >*/
+       NM_UTILS_ERROR_CANCELLED_DISPOSING,         /*< nick=CancelledDisposing >*/
+} NMUtilsError;
+
+#define NM_UTILS_ERROR (nm_utils_error_quark ())
+GQuark nm_utils_error_quark (void);
+
+void nm_utils_error_set_cancelled (GError **error,
+                                   gboolean is_disposing,
+                                   const char *instance_name);
+gboolean nm_utils_error_is_cancelled (GError *error,
+                                      gboolean consider_is_disposing);
+
+/******************************************************************************/
+
+gboolean nm_g_object_set_property (GObject *object,
+                                   const gchar  *property_name,
+                                   const GValue *value,
+                                   GError **error);
+
+/******************************************************************************/
+
+#endif /* __NM_SHARED_UTILS_H__ */
diff --git a/shared/utils.c b/shared/utils.c
index 0731aff..13cb73d 100644
--- a/shared/utils.c
+++ b/shared/utils.c
@@ -95,81 +95,6 @@ is_encrypted (const char *filename)
 
 /*****************************************************************************/
 
-/* _nm_utils_ascii_str_to_int64:
- *
- * A wrapper for g_ascii_strtoll, that checks whether the whole string
- * can be successfully converted to a number and is within a given
- * range. On any error, @fallback will be returned and %errno will be set
- * to a non-zero value. On success, %errno will be set to zero, check %errno
- * for errors. Any trailing or leading (ascii) white space is ignored and the
- * functions is locale independent.
- *
- * The function is guaranteed to return a value between @min and @max
- * (inclusive) or @fallback. Also, the parsing is rather strict, it does
- * not allow for any unrecognized characters, except leading and trailing
- * white space.
- **/
-gint64
-_nm_utils_ascii_str_to_int64 (const char *str, guint base, gint64 min, gint64 max, gint64 fallback)
-{
-       gint64 v;
-       size_t len;
-       char buf[64], *s, *str_free = NULL;
-
-       if (str) {
-               while (g_ascii_isspace (str[0]))
-                       str++;
-       }
-       if (!str || !str[0]) {
-               errno = EINVAL;
-               return fallback;
-       }
-
-       len = strlen (str);
-       if (g_ascii_isspace (str[--len])) {
-               /* backward search the first non-ws character.
-                * We already know that str[0] is non-ws. */
-               while (g_ascii_isspace (str[--len]))
-                       ;
-
-               /* str[len] is now the last non-ws character... */
-               len++;
-
-               if (len >= sizeof (buf))
-                       s = str_free = g_malloc (len + 1);
-               else
-                       s = buf;
-
-               memcpy (s, str, len);
-               s[len] = 0;
-
-               nm_assert (len > 0 && len < strlen (str) && len == strlen (s));
-               nm_assert (!g_ascii_isspace (str[len-1]) && g_ascii_isspace (str[len]));
-               nm_assert (strncmp (str, s, len) == 0);
-
-               str = s;
-       }
-
-       errno = 0;
-       v = g_ascii_strtoll (str, &s, base);
-
-       if (errno != 0)
-               v = fallback;
-       else if (s[0] != 0) {
-               errno = EINVAL;
-               v = fallback;
-       } else if (v > max || v < min) {
-               errno = ERANGE;
-               v = fallback;
-       }
-
-       if (G_UNLIKELY (str_free))
-               g_free (str_free);
-       return v;
-}
-
-/*****************************************************************************/
-
 /**
  * nmv_utils_str_utf8safe_escape:
  * @str: NUL terminated input string, possibly in utf-8 encoding
diff --git a/shared/utils.h b/shared/utils.h
index 3853c6c..a727d96 100644
--- a/shared/utils.h
+++ b/shared/utils.h
@@ -28,8 +28,6 @@ gboolean is_pkcs12 (const char *filepath);
 
 gboolean is_encrypted (const char *filename);
 
-gint64 _nm_utils_ascii_str_to_int64 (const char *str, guint base, gint64 min, gint64 max, gint64 fallback);
-
 char *      nmv_utils_str_utf8safe_escape     (const char *str);
 const char *nmv_utils_str_utf8safe_escape_c   (const char *str, char **out_clone);
 char *      nmv_utils_str_utf8safe_unescape   (const char *str);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]