aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--addressbook/ChangeLog9
-rw-r--r--addressbook/gui/component/Makefile.am2
-rw-r--r--addressbook/gui/component/addressbook-component.c129
-rw-r--r--addressbook/gui/component/addressbook-factory.c6
4 files changed, 134 insertions, 12 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog
index 9cce046894..3850f1d622 100644
--- a/addressbook/ChangeLog
+++ b/addressbook/ChangeLog
@@ -1,3 +1,12 @@
+2001-10-24 Jon Trowbridge <trow@ximian.com>
+
+ * gui/component/addressbook-factory.c (main): Initialize
+ gnome-vfs.
+
+ * gui/component/addressbook-component.c (xfer_file): Added.
+ (Copied from the calendar.)
+ (xfer_folder): Fixed to allow renaming of contact folders.
+
2001-10-24 Christopher James Lahey <clahey@ximian.com>
* gui/widgets/e-addressbook-view.c
diff --git a/addressbook/gui/component/Makefile.am b/addressbook/gui/component/Makefile.am
index 68138c8390..8d8c7198bc 100644
--- a/addressbook/gui/component/Makefile.am
+++ b/addressbook/gui/component/Makefile.am
@@ -16,6 +16,7 @@ INCLUDES = \
-I$(top_srcdir)/addressbook/backend \
-I$(top_builddir)/addressbook/backend \
$(BONOBO_HTML_GNOME_CFLAGS) \
+ $(GNOME_VFS_CFLAGS) \
-DEVOLUTION_DATADIR=\""$(datadir)"\" \
-DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
-DEVOLUTION_ICONSDIR=\""$(iconsdir)"\" \
@@ -49,6 +50,7 @@ evolution_addressbook_LDADD = \
$(top_builddir)/shell/libeshell.la \
$(EXTRA_GNOME_LIBS) \
$(BONOBO_HTML_GNOME_LIBS) \
+ $(GNOME_VFS_LIBS) \
$(BONOBO_CONF_LIBS) \
$(top_builddir)/addressbook/gui/widgets/libeminicard.a \
$(top_builddir)/addressbook/backend/ebook/libebook.la \
diff --git a/addressbook/gui/component/addressbook-component.c b/addressbook/gui/component/addressbook-component.c
index 43dcb6098f..62ef784ecd 100644
--- a/addressbook/gui/component/addressbook-component.c
+++ b/addressbook/gui/component/addressbook-component.c
@@ -25,6 +25,12 @@
#include <config.h>
#endif
+#include <libgnomevfs/gnome-vfs-types.h>
+#include <libgnomevfs/gnome-vfs-uri.h>
+#include <libgnomevfs/gnome-vfs-ops.h>
+#include <libgnomevfs/gnome-vfs-directory.h>
+#include <libgnomevfs/gnome-vfs-file-info.h>
+
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
@@ -183,6 +189,92 @@ remove_folder (EvolutionShellComponent *shell_component,
CORBA_exception_free(&ev);
}
+/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */
+
+/* This code is cut & pasted from calendar/gui/component-factory.c */
+
+static GNOME_Evolution_ShellComponentListener_Result
+xfer_file (GnomeVFSURI *base_src_uri,
+ GnomeVFSURI *base_dest_uri,
+ const char *file_name,
+ int remove_source)
+{
+ GnomeVFSURI *src_uri, *dest_uri;
+ GnomeVFSHandle *hin, *hout;
+ GnomeVFSResult result;
+ GnomeVFSFileInfo file_info;
+ GnomeVFSFileSize size;
+ char *buffer;
+
+ src_uri = gnome_vfs_uri_append_file_name (base_src_uri, file_name);
+
+ result = gnome_vfs_open_uri (&hin, src_uri, GNOME_VFS_OPEN_READ);
+ if (result == GNOME_VFS_ERROR_NOT_FOUND) {
+ gnome_vfs_uri_unref (src_uri);
+ return GNOME_Evolution_ShellComponentListener_OK; /* No need to xfer anything. */
+ }
+ if (result != GNOME_VFS_OK) {
+ gnome_vfs_uri_unref (src_uri);
+ return GNOME_Evolution_ShellComponentListener_PERMISSION_DENIED;
+ }
+
+ result = gnome_vfs_get_file_info_uri (src_uri, &file_info, GNOME_VFS_FILE_INFO_DEFAULT);
+ if (result != GNOME_VFS_OK) {
+ gnome_vfs_uri_unref (src_uri);
+ return GNOME_Evolution_ShellComponentListener_PERMISSION_DENIED;
+ }
+
+ dest_uri = gnome_vfs_uri_append_file_name (base_dest_uri, file_name);
+
+ result = gnome_vfs_create_uri (&hout, dest_uri, GNOME_VFS_OPEN_WRITE, FALSE, 0600);
+ if (result != GNOME_VFS_OK) {
+ gnome_vfs_close (hin);
+ gnome_vfs_uri_unref (src_uri);
+ gnome_vfs_uri_unref (dest_uri);
+ return GNOME_Evolution_ShellComponentListener_PERMISSION_DENIED;
+ }
+
+ /* write source file to destination file */
+ buffer = g_malloc (file_info.size);
+ result = gnome_vfs_read (hin, buffer, file_info.size, &size);
+ if (result != GNOME_VFS_OK) {
+ gnome_vfs_close (hin);
+ gnome_vfs_close (hout);
+ gnome_vfs_uri_unref (src_uri);
+ gnome_vfs_uri_unref (dest_uri);
+ g_free (buffer);
+ return GNOME_Evolution_ShellComponentListener_PERMISSION_DENIED;
+ }
+
+ result = gnome_vfs_write (hout, buffer, file_info.size, &size);
+ if (result != GNOME_VFS_OK) {
+ gnome_vfs_close (hin);
+ gnome_vfs_close (hout);
+ gnome_vfs_uri_unref (src_uri);
+ gnome_vfs_uri_unref (dest_uri);
+ g_free (buffer);
+ return GNOME_Evolution_ShellComponentListener_PERMISSION_DENIED;
+ }
+
+ if (remove_source) {
+ char *text_uri;
+
+ /* Sigh, we have to do this as there is no gnome_vfs_unlink_uri(). :-( */
+
+ text_uri = gnome_vfs_uri_to_string (src_uri, GNOME_VFS_URI_HIDE_NONE);
+ result = gnome_vfs_unlink (text_uri);
+ g_free (text_uri);
+ }
+
+ gnome_vfs_close (hin);
+ gnome_vfs_close (hout);
+ gnome_vfs_uri_unref (src_uri);
+ gnome_vfs_uri_unref (dest_uri);
+ g_free (buffer);
+
+ return GNOME_Evolution_ShellComponentListener_OK;
+}
+
static void
xfer_folder (EvolutionShellComponent *shell_component,
const char *source_physical_uri,
@@ -193,8 +285,12 @@ xfer_folder (EvolutionShellComponent *shell_component,
void *closure)
{
CORBA_Environment ev;
- char *source_path;
- char *destination_path;
+
+ GnomeVFSURI *src_uri;
+ GnomeVFSURI *dest_uri;
+ GnomeVFSResult result;
+
+ CORBA_exception_init (&ev);
if (!IS_CONTACT_TYPE (type)) {
GNOME_Evolution_ShellComponentListener_notifyResult (listener,
@@ -212,6 +308,7 @@ xfer_folder (EvolutionShellComponent *shell_component,
CORBA_exception_free(&ev);
return;
}
+
if (strncmp (source_physical_uri, "file://", 7)
|| strncmp (destination_physical_uri, "file://", 7)) {
GNOME_Evolution_ShellComponentListener_notifyResult (listener,
@@ -221,18 +318,28 @@ xfer_folder (EvolutionShellComponent *shell_component,
return;
}
- /* strip the 'file://' from the beginning of each uri and add addressbook.db */
- source_path = g_concat_dir_and_file (source_physical_uri + 7, "addressbook.db");
- destination_path = g_concat_dir_and_file (destination_physical_uri + 7, "addressbook.db");
+ /* check URIs */
+ src_uri = gnome_vfs_uri_new (source_physical_uri);
+ dest_uri = gnome_vfs_uri_new (destination_physical_uri);
+ if (!src_uri || ! dest_uri) {
+ GNOME_Evolution_ShellComponentListener_notifyResult (
+ listener,
+ GNOME_Evolution_ShellComponentListener_INVALID_URI,
+ &ev);
+ gnome_vfs_uri_unref (src_uri);
+ gnome_vfs_uri_unref (dest_uri);
+ CORBA_exception_free (&ev);
+ return;
+ }
- CORBA_exception_init (&ev);
+ result = xfer_file (src_uri, dest_uri, "addressbook.db", remove_source);
+
+ GNOME_Evolution_ShellComponentListener_notifyResult (listener, result, &ev);
- /* XXX always fail for now, until the above stuff is written */
- GNOME_Evolution_ShellComponentListener_notifyResult (listener, GNOME_Evolution_ShellComponentListener_PERMISSION_DENIED, &ev);
+ gnome_vfs_uri_unref (src_uri);
+ gnome_vfs_uri_unref (dest_uri);
- g_free (source_path);
- g_free (destination_path);
- CORBA_exception_free (&ev);
+ CORBA_exception_free (&ev);
}
static char*
diff --git a/addressbook/gui/component/addressbook-factory.c b/addressbook/gui/component/addressbook-factory.c
index d0172be328..d7a52c9a6d 100644
--- a/addressbook/gui/component/addressbook-factory.c
+++ b/addressbook/gui/component/addressbook-factory.c
@@ -15,6 +15,7 @@
#include <libgnomeui/gnome-init.h>
#include <liboaf/liboaf.h>
#include <bonobo/bonobo-main.h>
+#include <libgnomevfs/gnome-vfs-init.h>
#include <glade/glade.h>
#include <gal/widgets/e-cursors.h>
#include <e-util/e-passwords.h>
@@ -65,6 +66,9 @@ main (int argc, char **argv)
init_bonobo (argc, argv);
+ if (!gnome_vfs_init ())
+ g_error (_("Could not initialize gnome-vfs"));
+
/* FIXME: Messy names here. This file should be `main.c'. `addressbook.c' should
be `addressbook-control-factory.c' and the functions should be called
`addressbook_control_factory_something()'. And `addressbook-component.c'
@@ -88,7 +92,7 @@ main (int argc, char **argv)
g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING);
#endif
- g_thread_init (NULL);
+ /*g_thread_init (NULL);*/
camel_type_init ();
bonobo_main ();