diff options
author | Marc-André Lureau <marcandre.lureau@redhat.com> | 2013-01-29 13:15:55 +0100 |
---|---|---|
committer | Marc-André Lureau <marcandre.lureau@redhat.com> | 2013-01-29 13:17:04 +0100 |
commit | 5ea753946fb579dcc4a1dce1e4a0fe03ce4fb751 (patch) | |
tree | a3774e04bf03d002a6ee68e84971c4d602cd008b /SpiceXPI | |
parent | cc1c1169b1ddab5fc664bd169db086e29ecd6af5 (diff) |
xpi: add a few g_environ functions from GLib >= 2.28
Diffstat (limited to 'SpiceXPI')
-rw-r--r-- | SpiceXPI/src/plugin/Makefile.am | 2 | ||||
-rw-r--r-- | SpiceXPI/src/plugin/glib-compat.c | 188 | ||||
-rw-r--r-- | SpiceXPI/src/plugin/glib-compat.h | 49 | ||||
-rw-r--r-- | SpiceXPI/src/plugin/plugin.h | 1 |
4 files changed, 240 insertions, 0 deletions
diff --git a/SpiceXPI/src/plugin/Makefile.am b/SpiceXPI/src/plugin/Makefile.am index 08d89d7..7bc87df 100644 --- a/SpiceXPI/src/plugin/Makefile.am +++ b/SpiceXPI/src/plugin/Makefile.am @@ -35,6 +35,8 @@ libnsISpicec_la_LIBADD = \ libnsISpicec_la_SOURCES = \ $(top_srcdir)/common/common.h \ $(top_srcdir)/common/rederrorcodes.h \ + glib-compat.c \ + glib-compat.h \ controller.cpp \ controller.h \ np_entry.cpp \ diff --git a/SpiceXPI/src/plugin/glib-compat.c b/SpiceXPI/src/plugin/glib-compat.c new file mode 100644 index 0000000..f360677 --- /dev/null +++ b/SpiceXPI/src/plugin/glib-compat.c @@ -0,0 +1,188 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#include <unistd.h> +#include <string.h> + +#include "glib-compat.h" + +#if !GLIB_CHECK_VERSION (2,32,0) +static gint +g_environ_find (gchar **envp, + const gchar *variable) +{ + gint len, i; + + if (envp == NULL) + return -1; + + len = strlen (variable); + + for (i = 0; envp[i]; i++) + { + if (strncmp (envp[i], variable, len) == 0 && + envp[i][len] == '=') + return i; + } + + return -1; +} + +/** + * g_environ_getenv: + * @envp: (allow-none) (array zero-terminated=1) (transfer none): an environment + * list (eg, as returned from g_get_environ()), or %NULL + * for an empty environment list + * @variable: the environment variable to get, in the GLib file name + * encoding + * + * Returns the value of the environment variable @variable in the + * provided list @envp. + * + * The name and value are in the GLib file name encoding. + * On UNIX, this means the actual bytes which might or might not + * be in some consistent character set and encoding. On Windows, + * it is in UTF-8. On Windows, in case the environment variable's + * value contains references to other environment variables, they + * are expanded. + * + * Return value: the value of the environment variable, or %NULL if + * the environment variable is not set in @envp. The returned + * string is owned by @envp, and will be freed if @variable is + * set or unset again. + * + * Since: 2.32 + */ +const gchar * +g_environ_getenv (gchar **envp, + const gchar *variable) +{ + gint index; + + g_return_val_if_fail (variable != NULL, NULL); + + index = g_environ_find (envp, variable); + if (index != -1) + return envp[index] + strlen (variable) + 1; + else + return NULL; +} + +/** + * g_environ_setenv: + * @envp: (allow-none) (array zero-terminated=1) (transfer full): an environment + * list that can be freed using g_strfreev() (e.g., as returned from g_get_environ()), or %NULL + * for an empty environment list + * @variable: the environment variable to set, must not contain '=' + * @value: the value for to set the variable to + * @overwrite: whether to change the variable if it already exists + * + * Sets the environment variable @variable in the provided list + * @envp to @value. + * + * Both the variable's name and value should be in the GLib + * file name encoding. On UNIX, this means that they can be + * arbitrary byte strings. On Windows, they should be in UTF-8. + * + * Return value: (array zero-terminated=1) (transfer full): the + * updated environment list. Free it using g_strfreev(). + * + * Since: 2.32 + */ +gchar ** +g_environ_setenv (gchar **envp, + const gchar *variable, + const gchar *value, + gboolean overwrite) +{ + gint index; + + g_return_val_if_fail (variable != NULL, NULL); + g_return_val_if_fail (strchr (variable, '=') == NULL, NULL); + + index = g_environ_find (envp, variable); + if (index != -1) + { + if (overwrite) + { + g_free (envp[index]); + envp[index] = g_strdup_printf ("%s=%s", variable, value); + } + } + else + { + gint length; + + length = envp ? g_strv_length (envp) : 0; + envp = g_renew (gchar *, envp, length + 2); + envp[length] = g_strdup_printf ("%s=%s", variable, value); + envp[length + 1] = NULL; + } + + return envp; +} +#endif /* !GLIB_CHECK_VERSION (2,32,0) */ + + +#if !GLIB_CHECK_VERSION (2,28,0) +#ifndef G_OS_WIN32 +/* According to the Single Unix Specification, environ is not + * in any system header, although unistd.h often declares it. + */ +extern char **environ; + +gchar ** +g_get_environ (void) +{ + return g_strdupv (environ); +} + +#else /* G_OS_WIN32 */ + +gchar ** +g_get_environ (void) +{ + gunichar2 *strings; + gchar **result; + gint i, n; + + strings = GetEnvironmentStringsW (); + for (n = 0, i = 0; strings[n]; i++) + n += wcslen (strings + n) + 1; + + result = g_new (char *, i + 1); + for (n = 0, i = 0; strings[n]; i++) + { + result[i] = g_utf16_to_utf8 (strings + n, -1, NULL, NULL, NULL); + n += wcslen (strings + n) + 1; + } + FreeEnvironmentStringsW (strings); + result[i] = NULL; + + return result; +} +#endif /* G_OS_WIN32 */ +#endif /* !GLIB_CHECK_VERSION (2,28,0) */ diff --git a/SpiceXPI/src/plugin/glib-compat.h b/SpiceXPI/src/plugin/glib-compat.h new file mode 100644 index 0000000..0724417 --- /dev/null +++ b/SpiceXPI/src/plugin/glib-compat.h @@ -0,0 +1,49 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#ifndef GLIB_COMPAT_H_ +# define GLIB_COMPAT_H_ + +#include <glib.h> + +G_BEGIN_DECLS + +#if !GLIB_CHECK_VERSION (2,32,0) +const gchar * g_environ_getenv (gchar **envp, + const gchar *variable); +gchar ** g_environ_setenv (gchar **envp, + const gchar *variable, + const gchar *value, + gboolean overwrite); +#endif + +#if !GLIB_CHECK_VERSION (2,28,0) +gchar ** g_get_environ (void); +#endif + +G_END_DECLS + +#endif /* GLIB_COMPAT_H_ */ diff --git a/SpiceXPI/src/plugin/plugin.h b/SpiceXPI/src/plugin/plugin.h index 38a8c82..6305dcc 100644 --- a/SpiceXPI/src/plugin/plugin.h +++ b/SpiceXPI/src/plugin/plugin.h @@ -58,6 +58,7 @@ extern "C" { #include "pluginbase.h" #include "controller.h" #include "common.h" +#include "glib-compat.h" class nsPluginInstance: public nsPluginInstanceBase { |