New utility function (cal_backend_load): use above (cal_backend_create):

2000-09-19  JP Rosevear  <jpr@helixcode.com>

	* pcs/cal-backend.c (cal_backend_set_uri): New utility function
	(cal_backend_load): use above
	(cal_backend_create): use above
	(cal_backend_log_name): Take a uri instead of a backend param

	* pcs/cal-backend-file.c: Get rid of useless hash functions
	(cal_backend_file_load): Check to make sure path exists and is
	local
	(cal_backend_file_load): Unref the current uri if there is one
	(cal_backend_file_create): ditto

	* pcs/cal-backend.c (cal_backend_last_client_gone): Sync before
	shooting ourselves in the foot

	* pcs/cal-backend-file.c (save): Fully implement backing up the
	calendar before writing out the new entry.

svn path=/trunk/; revision=5516
This commit is contained in:
JP Rosevear
2000-09-20 03:58:06 +00:00
committed by JP Rosevear
parent e0e2f5c660
commit 86061c474b
3 changed files with 89 additions and 52 deletions

View File

@ -1,3 +1,22 @@
2000-09-19 JP Rosevear <jpr@helixcode.com>
* pcs/cal-backend.c (cal_backend_set_uri): New utility function
(cal_backend_load): use above
(cal_backend_create): use above
(cal_backend_log_name): Take a uri instead of a backend param
* pcs/cal-backend-file.c: Get rid of useless hash functions
(cal_backend_file_load): Check to make sure path exists and is
local
(cal_backend_file_load): Unref the current uri if there is one
(cal_backend_file_create): ditto
* pcs/cal-backend.c (cal_backend_last_client_gone): Sync before
shooting ourselves in the foot
* pcs/cal-backend-file.c (save): Fully implement backing up the
calendar before writing out the new entry.
2000-09-19 JP Rosevear <jpr@helixcode.com>
* conduits/todo/todo-conduit.c (check_for_slow_setting): Add some

View File

@ -182,20 +182,6 @@ free_cal_component (gpointer key, gpointer value, gpointer data)
gtk_object_unref (GTK_OBJECT (comp));
}
/* For hashing pilot id's */
/* FIX ME, these are not unique */
static guint
cbf_pilot_hash (gconstpointer v)
{
return *(const guint*) v;
}
static gint
cbf_pilot_equal (gconstpointer v1, gconstpointer v2)
{
return *((const unsigned long*) v1) == *((const unsigned long*) v2);
}
/* Saves the calendar data */
static void
save (CalBackendFile *cbfile)
@ -204,20 +190,36 @@ save (CalBackendFile *cbfile)
GnomeVFSHandle *handle = NULL;
GnomeVFSResult result;
GnomeVFSFileSize out;
GnomeVFSURI *backup_uri;
gchar *tmp;
char *buf;
priv = cbfile->priv;
g_assert (priv->uri != NULL);
g_assert (priv->icalcomp != NULL);
/* Make a backup copy of the file */
backup_uri = gnome_vfs_uri_append_file_name (priv->uri, "~");
result = gnome_vfs_move_uri (priv->uri, backup_uri, TRUE);
gnome_vfs_uri_unref (backup_uri);
/* Make a backup copy of the file if it exists */
if (gnome_vfs_uri_exists (priv->uri)) {
tmp = gnome_vfs_uri_to_string (priv->uri, GNOME_VFS_URI_HIDE_NONE);
if (tmp) {
GnomeVFSURI *backup_uri;
gchar *backup_uristr;
backup_uristr = g_strconcat (tmp, "~", NULL);
backup_uri = gnome_vfs_uri_new (backup_uristr);
result = gnome_vfs_move_uri (priv->uri, backup_uri, TRUE);
gnome_vfs_uri_unref (backup_uri);
g_free (tmp);
g_free (backup_uristr);
}
} else {
result = GNOME_VFS_OK;
}
// if (result != GNOME_VFS_OK)
// goto error;
if (result != GNOME_VFS_OK)
goto error;
/* Now write the new file out */
result = gnome_vfs_create_uri (&handle, priv->uri,
@ -642,9 +644,11 @@ cal_backend_file_load (CalBackend *backend, GnomeVFSURI *uri)
g_return_val_if_fail (priv->icalcomp == NULL, CAL_BACKEND_LOAD_ERROR);
g_return_val_if_fail (uri != NULL, CAL_BACKEND_LOAD_ERROR);
/* FIXME: this looks rather bad; maybe we should check for local files
* and fail if they are remote.
*/
if (!gnome_vfs_uri_is_local (uri))
return CAL_BACKEND_LOAD_ERROR;
if (!gnome_vfs_uri_exists (uri))
return CAL_BACKEND_LOAD_ERROR;;
str_uri = gnome_vfs_uri_to_string (uri,
(GNOME_VFS_URI_HIDE_USER_NAME
@ -654,7 +658,6 @@ cal_backend_file_load (CalBackend *backend, GnomeVFSURI *uri)
| GNOME_VFS_URI_HIDE_TOPLEVEL_METHOD));
/* Load! */
file = fopen (str_uri, "r");
g_free (str_uri);
@ -683,12 +686,13 @@ cal_backend_file_load (CalBackend *backend, GnomeVFSURI *uri)
priv->icalcomp = icalcomp;
priv->comp_uid_hash = g_hash_table_new (g_str_hash, g_str_equal);
/* priv->comp_pilot_hash = g_hash_table_new (cbf_pilot_hash, cbf_pilot_equal); */
priv->comp_pilot_hash = g_hash_table_new (g_int_hash, g_int_equal);
scan_vcalendar (cbfile);
/* Clean up */
if (priv->uri)
gnome_vfs_uri_unref (uri);
gnome_vfs_uri_ref (uri);
priv->uri = uri;
@ -730,13 +734,13 @@ cal_backend_file_create (CalBackend *backend, GnomeVFSURI *uri)
g_assert (priv->comp_uid_hash == NULL);
priv->comp_uid_hash = g_hash_table_new (g_str_hash, g_str_equal);
/* priv->comp_pilot_hash = g_hash_table_new (cbf_pilot_hash, cbf_pilot_equal); */
priv->comp_pilot_hash = g_hash_table_new (g_int_hash, g_int_equal);
/* Done */
/* Clean up */
if (priv->uri)
gnome_vfs_uri_unref (priv->uri);
gnome_vfs_uri_ref (uri);
priv->uri = uri;
mark_dirty (cbfile);

View File

@ -135,6 +135,23 @@ cal_backend_get_uri (CalBackend *backend)
return (* CLASS (backend)->get_uri) (backend);
}
static void
cal_backend_set_uri (CalBackend *backend, GnomeVFSURI *uri)
{
if (backend->uri)
gnome_vfs_uri_unref (backend->uri);
if (backend->timer)
gtk_timeout_remove (backend->timer);
gnome_vfs_uri_ref (uri);
backend->uri = uri;
backend->timer = gtk_timeout_add (60000,
(GtkFunction)cal_backend_log_sync,
backend);
}
/**
* cal_backend_add_cal:
* @backend: A calendar backend.
@ -177,20 +194,9 @@ cal_backend_load (CalBackend *backend, GnomeVFSURI *uri)
/* Remember the URI for saving the log file in the same dir and add
* a timeout handler so for saving pending entries sometimes */
if (backend->uri)
gnome_vfs_uri_unref (backend->uri);
if (backend->timer)
gtk_timeout_remove (backend->timer);
if (result == CAL_BACKEND_LOAD_SUCCESS) {
backend->uri = uri;
gnome_vfs_uri_ref (uri);
backend->timer = gtk_timeout_add (60000,
(GtkFunction)cal_backend_log_sync,
backend);
}
if (result == CAL_BACKEND_LOAD_SUCCESS)
cal_backend_set_uri (backend, uri);
return result;
}
@ -210,6 +216,10 @@ cal_backend_create (CalBackend *backend, GnomeVFSURI *uri)
g_assert (CLASS (backend)->create != NULL);
(* CLASS (backend)->create) (backend, uri);
/* Remember the URI for saving the log file in the same dir and add
* a timeout handler so for saving pending entries sometimes */
cal_backend_set_uri (backend, uri);
}
/**
@ -435,11 +445,11 @@ typedef struct {
} CalBackendParseState;
static gchar *
cal_backend_log_name (CalBackend *backend)
cal_backend_log_name (GnomeVFSURI *uri)
{
gchar *path, *filename;
path = gnome_vfs_uri_extract_dirname (backend->uri);
path = gnome_vfs_uri_extract_dirname (uri);
filename = g_strdup_printf ("%slog.xml", path);
g_free (path);
@ -489,11 +499,13 @@ cal_backend_log_sync (CalBackend *backend)
int ret;
time_t start_time = (time_t) - 1;
g_return_val_if_fail (backend->uri != NULL, FALSE);
if (backend->entries == NULL)
return TRUE;
filename = cal_backend_log_name (backend);
filename = cal_backend_log_name (backend->uri);
doc = xmlParseFile (filename);
if (doc == NULL) {
/* Create the document */
@ -632,8 +644,10 @@ cal_backend_log_sax_parse (CalBackend *backend, xmlSAXHandler *handler,
int ret = 0;
xmlParserCtxtPtr ctxt;
char *filename;
g_return_val_if_fail (backend->uri != NULL, -1);
filename = cal_backend_log_name (backend);
filename = cal_backend_log_name (backend->uri);
if (!g_file_exists (filename))
return 0;
@ -763,9 +777,9 @@ cal_backend_last_client_gone (CalBackend *backend)
g_return_if_fail (backend != NULL);
g_return_if_fail (IS_CAL_BACKEND (backend));
gtk_signal_emit (GTK_OBJECT (backend), cal_backend_signals[LAST_CLIENT_GONE]);
cal_backend_log_sync (backend);
gtk_signal_emit (GTK_OBJECT (backend), cal_backend_signals[LAST_CLIENT_GONE]);
}