diff options
Diffstat (limited to 'e-util')
-rw-r--r-- | e-util/e-bit-array.c | 6 | ||||
-rw-r--r-- | e-util/e-iconv.c | 14 | ||||
-rw-r--r-- | e-util/e-sorter-array.c | 4 | ||||
-rw-r--r-- | e-util/e-sorter.c | 4 | ||||
-rw-r--r-- | e-util/e-text-event-processor-emacs-like.c | 6 | ||||
-rw-r--r-- | e-util/e-text-event-processor.c | 8 | ||||
-rw-r--r-- | e-util/e-util-private.h | 46 | ||||
-rw-r--r-- | e-util/e-util.c | 58 | ||||
-rw-r--r-- | e-util/e-win32-reloc.c | 115 | ||||
-rw-r--r-- | e-util/e-xml-utils.c | 57 |
10 files changed, 259 insertions, 59 deletions
diff --git a/e-util/e-bit-array.c b/e-util/e-bit-array.c index bb98a3f465..8fa7af134e 100644 --- a/e-util/e-bit-array.c +++ b/e-util/e-bit-array.c @@ -22,9 +22,11 @@ */ #include <config.h> -#include <gtk/gtksignal.h> + +#include <gtk/gtk.h> + #include "e-bit-array.h" -#include "gal/util/e-util.h" +#include "e-util.h" #define PARENT_TYPE G_TYPE_OBJECT diff --git a/e-util/e-iconv.c b/e-util/e-iconv.c index 3236521438..6cf3987021 100644 --- a/e-util/e-iconv.c +++ b/e-util/e-iconv.c @@ -22,25 +22,21 @@ * 02111-1307, USA. */ -#ifdef HAVE_CONFIG_H #include <config.h> -#endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> - -#include <glib.h> -#include "e-iconv.h" - #include <locale.h> - #ifdef HAVE_CODESET #include <langinfo.h> #endif +#include <glib.h> + #include "iconv-detect.h" +#include "e-iconv.h" #define cd(x) @@ -289,7 +285,11 @@ e_iconv_init(int keep) iconv_cache = g_hash_table_new(g_str_hash, g_str_equal); iconv_cache_open = g_hash_table_new(NULL, NULL); +#ifndef G_OS_WIN32 locale = setlocale (LC_ALL, NULL); +#else + locale = g_win32_getlocale (); +#endif if (!locale || !strcmp (locale, "C") || !strcmp (locale, "POSIX")) { /* The locale "C" or "POSIX" is a portable locale; its diff --git a/e-util/e-sorter-array.c b/e-util/e-sorter-array.c index ab1e748d9a..7b7e6ab4ea 100644 --- a/e-util/e-sorter-array.c +++ b/e-util/e-sorter-array.c @@ -22,10 +22,12 @@ */ #include <config.h> + #include <stdlib.h> #include <string.h> -#include "gal/util/e-util.h" + #include "e-sorter-array.h" +#include "e-util.h" #define d(x) diff --git a/e-util/e-sorter.c b/e-util/e-sorter.c index adee6d0d98..4ac07809be 100644 --- a/e-util/e-sorter.c +++ b/e-util/e-sorter.c @@ -22,10 +22,12 @@ */ #include <config.h> + #include <stdlib.h> #include <string.h> -#include "gal/util/e-util.h" + #include "e-sorter.h" +#include "e-util.h" #define d(x) diff --git a/e-util/e-text-event-processor-emacs-like.c b/e-util/e-text-event-processor-emacs-like.c index 478dc2d68b..5fa248fe75 100644 --- a/e-util/e-text-event-processor-emacs-like.c +++ b/e-util/e-text-event-processor-emacs-like.c @@ -21,10 +21,14 @@ * 02111-1307, USA. */ +#include <config.h> + #include <string.h> + #include <gdk/gdkkeysyms.h> -#include <gal/util/e-util.h> + #include "e-text-event-processor-emacs-like.h" +#include "e-util.h" static void e_text_event_processor_emacs_like_init (ETextEventProcessorEmacsLike *card); static void e_text_event_processor_emacs_like_class_init (ETextEventProcessorEmacsLikeClass *klass); diff --git a/e-util/e-text-event-processor.c b/e-util/e-text-event-processor.c index 6b974d894e..9a9dfb3368 100644 --- a/e-util/e-text-event-processor.c +++ b/e-util/e-text-event-processor.c @@ -21,10 +21,12 @@ * 02111-1307, USA. */ +#include <config.h> + +#include "e-i18n.h" +#include "e-marshal.h" #include "e-text-event-processor.h" -#include <gal/util/e-util.h> -#include <gal/util/e-i18n.h> -#include "gal/util/e-marshal.h" +#include "e-util.h" static void e_text_event_processor_init (ETextEventProcessor *card); static void e_text_event_processor_class_init (ETextEventProcessorClass *klass); diff --git a/e-util/e-util-private.h b/e-util/e-util-private.h new file mode 100644 index 0000000000..10a1194a9b --- /dev/null +++ b/e-util/e-util-private.h @@ -0,0 +1,46 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * e-util-private.h + * Copyright 2005, Novell, Inc. + * + * Authors: + * Tor Lillqvist <tml@novell.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License, version 2, as published by the Free Software Foundation. + * + * 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef _E_UTIL_PRIVATE_H_ +#define _E_UTIL_PRIVATE_H_ + +#include <glib.h> + +#ifdef G_OS_WIN32 + +const char *_gal_get_localedir (void) G_GNUC_CONST; +const char *_gal_get_gladedir (void) G_GNUC_CONST; +const char *_gal_get_imagesdir (void) G_GNUC_CONST; + +#undef GAL_LOCALEDIR +#define GAL_LOCALEDIR _gal_get_localedir () + +#undef GAL_GLADEDIR +#define GAL_GLADEDIR _gal_get_gladedir () + +#undef GAL_IMAGESDIR +#define GAL_IMAGESDIR _gal_get_imagesdir () + +#endif /* G_OS_WIN32 */ + +#endif /* _E_UTIL_PRIVATE_H_ */ diff --git a/e-util/e-util.c b/e-util/e-util.c index 2514cfc931..1a4fd13fd2 100644 --- a/e-util/e-util.c +++ b/e-util/e-util.c @@ -22,27 +22,27 @@ */ #include <config.h> -#include "e-util.h" -#include "e-i18n.h" -#include <glib.h> -#include <gtk/gtkobject.h> +#include <stdlib.h> +#include <stdio.h> #include <errno.h> -#include <fcntl.h> #include <unistd.h> #include <ctype.h> -#include <sys/stat.h> +#include <math.h> #include <string.h> #include <locale.h> -#include <stdio.h> -#include <stdlib.h> #include <time.h> +#include <sys/stat.h> +#include <fcntl.h> + +#include <glib.h> +#include <glib/gstdio.h> +#include <gtk/gtk.h> #include <libgnome/gnome-util.h> -#include <math.h> -#if 0 -#include <libgnomevfs/gnome-vfs.h> -#endif +#include "e-i18n.h" +#include "e-util.h" +#include "e-util-private.h" int g_str_compare (const void *x, const void *y) @@ -154,7 +154,7 @@ e_read_file(const char *filename) int bytes; char *ret_val; - fd = open(filename, O_RDONLY); + fd = g_open(filename, O_RDONLY, 0); if (fd == -1) return NULL; bytes = read(fd, buffer, BUFF_SIZE); @@ -198,7 +198,7 @@ e_write_file(const char *filename, const char *data, int flags) int fd; int length = strlen(data); int bytes; - fd = open(filename, flags | O_WRONLY, 0666); + fd = g_open(filename, flags | O_WRONLY, 0666); if (fd == -1) return errno; while (length > 0) { @@ -226,7 +226,7 @@ e_write_file_mkstemp(char *filename, const char *data) int fd; int length = strlen(data); int bytes; - fd = mkstemp (filename); + fd = g_mkstemp (filename); if (fd == -1) return errno; while (length > 0) { @@ -264,25 +264,37 @@ e_mkdir_hier(const char *path, mode_t mode) { char *copy, *p; - if (path[0] == '/') { + if (g_path_is_absolute (path)) { p = copy = g_strdup (path); } else { gchar *current_dir = g_get_current_dir(); - p = copy = g_concat_dir_and_file (current_dir, path); + p = copy = g_build_filename (current_dir, path, NULL); + g_free (current_dir); } + p = g_path_skip_root (p); do { - p = strchr (p + 1, '/'); + char *p1 = strchr (p, '/'); +#ifdef G_OS_WIN32 + { + char *p2 = strchr (p, '\\'); + if (p1 == NULL || + (p2 != NULL && p2 < p1)) + p1 = p2; + } +#endif + p = p1; if (p) *p = '\0'; - if (access (copy, F_OK) == -1) { - if (mkdir (copy, mode) == -1) { + if (!g_file_test (copy, G_FILE_TEST_IS_DIR)) { + if (g_mkdir (copy, mode) == -1) { g_free (copy); return -1; } } - if (p) - *p = '/'; + if (p) { + *p++ = '/'; + } } while (p); g_free (copy); @@ -1220,7 +1232,7 @@ e_gettext (const char *msgid) static gboolean initialized = FALSE; if (!initialized) { - bindtextdomain (E_I18N_DOMAIN, GNOMELOCALEDIR); + bindtextdomain (E_I18N_DOMAIN, GAL_LOCALEDIR); bind_textdomain_codeset (E_I18N_DOMAIN, "UTF-8"); initialized = TRUE; } diff --git a/e-util/e-win32-reloc.c b/e-util/e-win32-reloc.c new file mode 100644 index 0000000000..20db453381 --- /dev/null +++ b/e-util/e-win32-reloc.c @@ -0,0 +1,115 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * e-win32-reloc.c: Support relocatable installation on Win32 + * Copyright 2005, Novell, Inc. + * + * Authors: + * Tor Lillqvist <tml@novell.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License, version 2, as published by the Free Software Foundation. + * + * 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#include <config.h> + +#include <windows.h> +#include <string.h> + +#include <glib.h> +#include <libgnome/gnome-init.h> + +/* localedir uses system codepage as it is passed to the non-UTF8ified + * gettext library + */ +static char *localedir = NULL; + +/* The others are in UTF-8 */ +static char *gladedir; +static char *imagesdir; + +static HMODULE hmodule; +G_LOCK_DEFINE_STATIC (mutex); + +/* Silence gcc with a prototype. Yes, this is silly. */ +BOOL WINAPI DllMain (HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved); + +/* Minimal DllMain that just tucks away the DLL's HMODULE */ +BOOL WINAPI +DllMain (HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + hmodule = hinstDLL; + break; + } + return TRUE; +} + +static char * +replace_prefix (const char *runtime_prefix, + const char *configure_time_path) +{ + if (runtime_prefix && + strncmp (configure_time_path, GAL_PREFIX "/", + strlen (GAL_PREFIX) + 1) == 0) { + return g_strconcat (runtime_prefix, + configure_time_path + strlen (GAL_PREFIX), + NULL); + } else + return g_strdup (configure_time_path); +} + +static void +setup (void) +{ + char *full_prefix; + char *cp_prefix; + + G_LOCK (mutex); + if (localedir != NULL) { + G_UNLOCK (mutex); + return; + } + + gnome_win32_get_prefixes (hmodule, &full_prefix, &cp_prefix); + + localedir = replace_prefix (cp_prefix, GAL_LOCALEDIR); + g_free (cp_prefix); + + gladedir = replace_prefix (full_prefix, GAL_GLADEDIR); + imagesdir = replace_prefix (full_prefix, GAL_IMAGESDIR); + g_free (full_prefix); + + G_UNLOCK (mutex); +} + +#include "e-util-private.h" /* For prototypes */ + +#define GETTER(varbl) \ +const char * \ +_gal_get_##varbl (void) \ +{ \ + setup (); \ + return varbl; \ +} + +GETTER(localedir) +GETTER(gladedir) +GETTER(imagesdir) + + diff --git a/e-util/e-xml-utils.c b/e-util/e-xml-utils.c index 437934be65..0382d684a9 100644 --- a/e-util/e-xml-utils.c +++ b/e-util/e-xml-utils.c @@ -21,12 +21,7 @@ * 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H #include <config.h> -#endif - -#include "e-xml-utils.h" #include <stdio.h> #include <stdlib.h> @@ -39,11 +34,19 @@ #include <errno.h> #include <math.h> #include <string.h> + +#include <glib.h> +#include <glib/gstdio.h> #include <libxml/parser.h> #include <libxml/xmlmemory.h> -#include "gal/util/e-i18n.h" -#include "gal/util/e-util.h" +#include "e-i18n.h" +#include "e-util.h" +#include "e-xml-utils.h" + +#ifdef G_OS_WIN32 +#define fsync(fd) 0 /* No fsync() in Microsoft's C library */ +#endif xmlNode * e_xml_get_child_by_name (const xmlNode *parent, const xmlChar *child_name) @@ -440,27 +443,34 @@ e_xml_get_translated_string_prop_by_name (const xmlNode *parent, const xmlChar * int e_xml_save_file (const char *filename, xmlDocPtr doc) { - char *filesave, *slash, *xmlbuf; + char *filesave, *xmlbuf; size_t n, written = 0; int ret, fd, size; int errnosave; ssize_t w; - filesave = alloca (strlen (filename) + 5); - slash = strrchr (filename, '/'); - if (slash) - sprintf (filesave, "%.*s.#%s", slash - filename + 1, filename, slash + 1); - else - sprintf (filesave, ".#%s", filename); + { + gchar *dirname = g_path_get_dirname (filename); + gchar *basename = g_path_get_basename (filename); + gchar *savebasename = g_strconcat (".#", basename); + + g_free (basename); + filesave = g_build_filename (dirname, savebasename, NULL); + g_free (savebasename); + g_free (dirname); + } - fd = open (filesave, O_WRONLY | O_CREAT | O_TRUNC, 0600); - if (fd == -1) + fd = g_open (filesave, O_WRONLY | O_CREAT | O_TRUNC, 0600); + if (fd == -1) { + g_free (filesave); return -1; + } xmlDocDumpFormatMemory (doc, (xmlChar **) &xmlbuf, &size, TRUE); if (size <= 0) { close (fd); - unlink (filesave); + g_unlink (filesave); + g_free (filesave); errno = ENOMEM; return -1; } @@ -480,7 +490,8 @@ e_xml_save_file (const char *filename, xmlDocPtr doc) if (written < n || fsync (fd) == -1) { errnosave = errno; close (fd); - unlink (filesave); + g_unlink (filesave); + g_free (filesave); errno = errnosave; return -1; } @@ -488,15 +499,19 @@ e_xml_save_file (const char *filename, xmlDocPtr doc) while ((ret = close (fd)) == -1 && errno == EINTR) ; - if (ret == -1) + if (ret == -1) { + g_free (filesave); return -1; + } - if (rename (filesave, filename) == -1) { + if (g_rename (filesave, filename) == -1) { errnosave = errno; - unlink (filesave); + g_unlink (filesave); + g_free (filesave); errno = errnosave; return -1; } + g_free (filesave); return 0; } |