aboutsummaryrefslogtreecommitdiffstats
path: root/e-util
diff options
context:
space:
mode:
Diffstat (limited to 'e-util')
-rw-r--r--e-util/e-bit-array.c6
-rw-r--r--e-util/e-iconv.c14
-rw-r--r--e-util/e-sorter-array.c4
-rw-r--r--e-util/e-sorter.c4
-rw-r--r--e-util/e-text-event-processor-emacs-like.c6
-rw-r--r--e-util/e-text-event-processor.c8
-rw-r--r--e-util/e-util-private.h46
-rw-r--r--e-util/e-util.c58
-rw-r--r--e-util/e-win32-reloc.c115
-rw-r--r--e-util/e-xml-utils.c57
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;
}