diff options
-rw-r--r-- | calendar/ChangeLog | 18 | ||||
-rw-r--r-- | calendar/cal-client/cal-client.c | 73 | ||||
-rw-r--r-- | calendar/cal-client/cal-client.h | 8 | ||||
-rw-r--r-- | calendar/gui/Makefile.am | 27 | ||||
-rw-r--r-- | calendar/gui/calendar-pilot-sync.c | 521 | ||||
-rw-r--r-- | calendar/idl/evolution-calendar.idl | 20 | ||||
-rw-r--r-- | calendar/pcs/cal-backend-imc.c | 69 | ||||
-rw-r--r-- | calendar/pcs/cal-backend.c | 23 | ||||
-rw-r--r-- | calendar/pcs/cal-backend.h | 10 | ||||
-rw-r--r-- | calendar/pcs/cal.c | 53 |
10 files changed, 638 insertions, 184 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index b438ba7145..ba01ebddbc 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,21 @@ +2000-06-29 Seth Alves <alves@hungry.com> + + * pcs/cal.c (Cal_get_uid_by_pilot_id): + (Cal_update_pilot_id): + * pcs/cal-backend-imc.c (cal_backend_imc_update_pilot_id): + (cal_backend_imc_get_uid_by_pilot_id): + * pcs/cal-backend.c (cal_backend_get_uid_by_pilot_id): + (cal_backend_update_pilot_id): server code to service these: + + * gui/calendar-pilot-sync.c: updated to make use of cal-client. + also uses dirty bits on both sides to aid in syncing. + + * cal-client/cal-client.c (cal_client_get_uid_by_pilot_id): new + function -- ask the cal server to return uid given an object's + pilot id. + (cal_client_update_pilot_id): new function -- inform the + cal server of an objects pilot id and pilot dirty-flag. + 2000-06-28 Federico Mena Quintero <federico@helixcode.com> * cal-util/cal-component.[ch]: New files for the new iCalendar diff --git a/calendar/cal-client/cal-client.c b/calendar/cal-client/cal-client.c index f1e60be3f3..3023a37dc1 100644 --- a/calendar/cal-client/cal-client.c +++ b/calendar/cal-client/cal-client.c @@ -687,6 +687,77 @@ cal_client_get_object (CalClient *client, const char *uid, iCalObject **ico) #endif } + + +CalClientGetStatus cal_client_get_uid_by_pilot_id (CalClient *client, + unsigned long pilot_id, + char **uid) +{ + CalClientPrivate *priv; + CORBA_Environment ev; + CalClientGetStatus retval; + char *uid_str; + + g_return_val_if_fail (client != NULL, CAL_CLIENT_GET_NOT_FOUND); + g_return_val_if_fail (IS_CAL_CLIENT (client), + CAL_CLIENT_GET_NOT_FOUND); + + priv = client->priv; + g_return_val_if_fail (priv->load_state == LOAD_STATE_LOADED, + CAL_CLIENT_GET_NOT_FOUND); + + retval = CAL_CLIENT_GET_NOT_FOUND; + *uid = NULL; + + CORBA_exception_init (&ev); + uid_str = Evolution_Calendar_Cal_get_uid_by_pilot_id (priv->cal, pilot_id, &ev); + + if (ev._major == CORBA_USER_EXCEPTION && + strcmp (CORBA_exception_id (&ev), + ex_Evolution_Calendar_Cal_NotFound) == 0) + goto out; + else if (ev._major != CORBA_NO_EXCEPTION) { + //g_message ("cal_client_get_object(): could not get the object"); + goto out; + } + + if (uid_str) { + retval = CAL_CLIENT_GET_SUCCESS; + (*uid) = g_strdup (uid_str); + CORBA_free (uid_str); + } + + out: + + CORBA_exception_free (&ev); + return retval; +} + + + +void cal_client_update_pilot_id (CalClient *client, char *uid, + unsigned long pilot_id, + unsigned long pilot_status) +{ + CalClientPrivate *priv; + CORBA_Environment ev; + + g_return_if_fail (client != NULL); + g_return_if_fail (IS_CAL_CLIENT (client)); + + priv = client->priv; + g_return_if_fail (priv->load_state == LOAD_STATE_LOADED); + + CORBA_exception_init (&ev); + Evolution_Calendar_Cal_update_pilot_id (priv->cal, uid, + pilot_id, pilot_status, + &ev); + + CORBA_exception_free (&ev); +} + + + /** * cal_client_get_uids: * @client: A calendar client. @@ -1052,7 +1123,7 @@ cal_client_remove_object (CalClient *client, const char *uid) strcmp (CORBA_exception_id (&ev), ex_Evolution_Calendar_Cal_NotFound) == 0) goto out; else if (ev._major != CORBA_NO_EXCEPTION) { - g_message ("cal_client_remove_object(): could not remove the object"); + /*g_message ("cal_client_remove_object(): could not remove the object");*/ goto out; } diff --git a/calendar/cal-client/cal-client.h b/calendar/cal-client/cal-client.h index 7c67cfba2e..5dc30ddec2 100644 --- a/calendar/cal-client/cal-client.h +++ b/calendar/cal-client/cal-client.h @@ -87,6 +87,14 @@ CalClientGetStatus cal_client_get_object (CalClient *client, const char *uid, iCalObject **ico); +CalClientGetStatus cal_client_get_uid_by_pilot_id (CalClient *client, + unsigned long pilot_id, + char **uid); + +void cal_client_update_pilot_id (CalClient *client, char *uid, + unsigned long pilot_id, + unsigned long pilot_status); + GList *cal_client_get_uids (CalClient *client, CalObjType type); GList *cal_client_get_events_in_range (CalClient *client, time_t start, time_t end); diff --git a/calendar/gui/Makefile.am b/calendar/gui/Makefile.am index 5920d2112e..b7c6082f99 100644 --- a/calendar/gui/Makefile.am +++ b/calendar/gui/Makefile.am @@ -40,7 +40,8 @@ glade_DATA = \ glade_messages = event-editor-dialog.glade.h -bin_PROGRAMS = evolution-calendar +bin_PROGRAMS = evolution-calendar calendar-pilot-sync #empty-pilot-calendar +# calendar-conduit-control-applet evolution_calendar_SOURCES = \ alarm.c \ @@ -101,6 +102,30 @@ evolution_calendar_LDADD = \ evolution_calendar_LDFLAGS = `gnome-config --libs gdk_pixbuf` + +calendar_pilot_sync_SOURCES = \ + calendar-pilot-sync.c + +calendar_pilot_sync_LDADD = -lpisock \ + $(EXTRA_GNOME_LIBS) \ + $(BONOBO_HTML_GNOME_LIBS) \ + $(LINK_FLAGS) + + +#empty_pilot_calendar_SOURCES = \ +# empty-pilot-calendar.c + +#empty_pilot_calendar_LDADD = -lpisock \ +# $(EXTRA_GNOME_LIBS) \ +# $(BONOBO_HTML_GNOME_LIBS) \ +# $(LINK_FLAGS) + + +#calendar_pilot_sync_LDADD = \ +# $(PISOCK_LIBDIR) $(PISOCK_LIBS) \ +# $(LINK_FLAGS) + + if USING_OAF oafdir = $(datadir)/oaf oaf_DATA = calendar-control.oafinfo evolution-calendar.oafinfo diff --git a/calendar/gui/calendar-pilot-sync.c b/calendar/gui/calendar-pilot-sync.c index 98740a51f4..d9f44c14cb 100644 --- a/calendar/gui/calendar-pilot-sync.c +++ b/calendar/gui/calendar-pilot-sync.c @@ -1,3 +1,4 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * calendar-pilot-sync.c: * @@ -7,30 +8,44 @@ * Miguel de Icaza (miguel@gnome-support.com) * */ + + +/* + * + * this only works in a monogamous pilot/desktop situation. + * + */ + + + #include <config.h> #include <gnome.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <libgnorba/gnome-factory.h> +#include <bonobo.h> +#include <bonobo/bonobo-control.h> + +#ifdef USING_OAF +#include <liboaf/liboaf.h> +#else #include <libgnorba/gnorba.h> -#include "calobj.h" -/* #include "calendar.h" DELETE */ -#include "timeutil.h" -#include "GnomeCal.h" +#endif + +#include <cal-client/cal-client.h> +#include "cal-util/calobj.h" +#include "cal-util/timeutil.h" #include "pi-source.h" #include "pi-socket.h" #include "pi-datebook.h" #include "pi-dlp.h" -/* the CORBA ORB */ -CORBA_ORB orb; + +char *calendar_file; /* The default port to communicate with */ char *pilot_port = "/dev/pilot"; -CORBA_Environment ev; - /* Our pi-socket address where we connect to */ struct pi_sockaddr addr; @@ -43,18 +58,11 @@ int debug_alarms = 0; /* True if you want to dump the flags bits from the records */ int debug_attrs = 0; -/* Default values for alarms */ -CalendarAlarm alarm_defaults[4] = { - { ALARM_MAIL, 0, 15, ALARM_MINUTES }, - { ALARM_PROGRAM, 0, 15, ALARM_MINUTES }, - { ALARM_DISPLAY, 0, 15, ALARM_MINUTES }, - { ALARM_AUDIO, 0, 15, ALARM_MINUTES } -}; - int only_desktop_to_pilot = 0; int only_pilot_to_desktop = 0; + const struct poptOption calendar_sync_options [] = { { "pilot", 0, POPT_ARG_STRING, &pilot_port, 0, N_("Specifies the port on which the Pilot is"), N_("PORT") }, @@ -89,14 +97,15 @@ setup_connection (void) g_error (_("Can not create Pilot socket\n")); addr.pi_family = PI_AF_SLP; - strncpy ((void *) &addr.pi_device, pilot_port, sizeof (addr.pi_device)); + strncpy ((void *)&addr.pi_device, pilot_port, sizeof (addr.pi_device)); ret = pi_bind (socket, (struct sockaddr *)&addr, sizeof (addr)); if (ret == -1) g_error (_("Can not bind to device %s\n"), pilot_port); if (pi_listen (socket, 1) == -1) - g_error (_("Failed to get a connection from the Pilot device")); + g_error (_("Failed to get a connection " + "from the Pilot device")); if ((news = pi_accept (socket, 0, 0)) == -1) g_error (_("pi_accept failed")); @@ -104,58 +113,90 @@ setup_connection (void) return news; } -static GNOME_Calendar_Repository -locate_calendar_server (void) + +static void +init_bonobo (int *argc, char **argv) { - GNOME_Calendar_Repository repo; - - repo = goad_server_activate_with_id ( - NULL, "IDL:GNOME:Calendar:Repository:1.0", - 0, NULL); - - if (repo == CORBA_OBJECT_NIL) - g_error ("Can not communicate with GnomeCalendar server"); +# ifdef USING_OAF + /* FIXME: VERSION instead of "0.0". */ + gnome_init_with_popt_table ("evolution-calendar", "0.0", + *argc, argv, oaf_popt_options, + 0, NULL); + oaf_init (*argc, argv); +# else + CORBA_Environment ev; - if (ev._major != CORBA_NO_EXCEPTION){ - printf ("Exception: %s\n", CORBA_exception_id (&ev)); - abort (); - } - - return repo; + CORBA_exception_init (&ev); + gnome_CORBA_init_with_popt_table ( + "evolution-calendar", "0.0", + argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev); + CORBA_exception_free (&ev); +# endif + + if (bonobo_init (CORBA_OBJECT_NIL, + CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE) + g_error (_("Could not initialize Bonobo")); } + static void -delete_record (GNOME_Calendar_Repository repo, int id) +delete_record_from_desktop (CalClient *client, int id) { char *uid; + CalClientGetStatus status; - uid = GNOME_Calendar_Repository_get_id_from_pilot_id (repo, id, &ev); + status = cal_client_get_uid_by_pilot_id (client, id, &uid); - /* The record was already deleted */ - if (ev._major != CORBA_NO_EXCEPTION) - return; - - GNOME_Calendar_Repository_delete_object (repo, uid, &ev); - CORBA_free (uid); + if (status == CAL_CLIENT_GET_SUCCESS) { + cal_client_remove_object (client, uid); + g_free (uid); + } } + + static void -update_record (GNOME_Calendar_Repository repo, int id, struct Appointment *a, int attr) +dump_attr (int flags) +{ + if (flags & dlpRecAttrDeleted) + printf (" Deleted"); + if (flags & dlpRecAttrDirty) + printf (" Dirty"); + if (flags & dlpRecAttrBusy) + printf (" Busy"); + if (flags & dlpRecAttrSecret) + printf (" Secret"); + if (flags & dlpRecAttrArchived) + printf (" Archive"); + printf ("\n"); +} + + + +/* take a record retrieved from a pilot and merge it into the desktop cal */ + +static void +update_record (CalClient *client, int id, struct Appointment *a, int attr) { - char *vcal_string; iCalObject *obj; int i; - char *str; + CalClientGetStatus status; + char *uid = NULL; + gboolean success; - obj = ical_new (a->note ? a->note : "", - g_get_user_name (), - a->description ? a->description : ""); + printf ("pilot->cal: %d, ", id); - printf ("requesting %d [%s]\n", id, a->description); - vcal_string = GNOME_Calendar_Repository_get_object_by_pilot_id (repo, id, &ev); + status = cal_client_get_uid_by_pilot_id (client, id, &uid); + if (status == CAL_CLIENT_GET_SUCCESS) + status = cal_client_get_object (client, uid, &obj); - if (ev._major == CORBA_USER_EXCEPTION){ + if (status != CAL_CLIENT_GET_SUCCESS) { + /* Object did not exist, creating a new one */ time_t now = time (NULL); + + obj = ical_new (a->note ? a->note : "", + g_get_user_name (), + a->description ? a->description : ""); obj->created = now; obj->last_mod = now; @@ -164,14 +205,11 @@ update_record (GNOME_Calendar_Repository repo, int id, struct Appointment *a, in obj->related = NULL; obj->pilot_id = id; obj->pilot_status = ICAL_PILOT_SYNC_NONE; - printf (_("\tObject did not exist, creating a new one\n")); - } else { - printf ("\tFound\n"); - obj = ical_object_new_from_string (vcal_string); } - if (obj->pilot_status == ICAL_PILOT_SYNC_MOD){ - printf (_("\tObject has been modified on desktop and on the pilot, desktop takes precedence\n")); + if (obj->pilot_status == ICAL_PILOT_SYNC_MOD) { + printf (_("\tObject has been modified on desktop and on " + "the pilot, desktop takes precedence\n")); ical_object_unref (obj); return; } @@ -191,11 +229,18 @@ update_record (GNOME_Calendar_Repository repo, int id, struct Appointment *a, in a->end.tm_min = 0; a->end.tm_hour = 10; } + + if (a->note) + obj->comment = g_strdup (a->note); + + if (a->description) + obj->summary = g_strdup (a->description); + obj->dtstart = mktime (&a->begin); obj->dtend = mktime (&a->end); - /* Special case: daily repetitions are converted to a multi-day event */ + /* Special case: daily repetitions are converted to a multiday event */ if (a->repeatType == repeatDaily){ time_t newt = time_add_day (obj->dtend, a->repeatFrequency); @@ -302,14 +347,19 @@ update_record (GNOME_Calendar_Repository repo, int id, struct Appointment *a, in obj->class = g_strdup ("PUBLIC"); /* - * Now, convert the in memory iCalObject to a full vCalendar we can send + * Now, convert the in memory iCalObject to a full vCalendar + * we can send */ - str = calendar_string_from_object (obj); + success = cal_client_update_object (client, obj); + /* set the pilot_status to sync_none so we don't send + this event right back to the pilot */ + cal_client_update_pilot_id (client, obj->uid, obj->pilot_id, + ICAL_PILOT_SYNC_NONE); - GNOME_Calendar_Repository_update_object (repo, obj->uid, str, &ev); - free (str); - + dump_attr (attr); + printf (" but not used.\n"); + /* * Shutdown */ @@ -346,8 +396,9 @@ try_alarm (CalendarAlarm *alarm, struct Appointment *a) return 1; } + static void -sync_object_to_pilot (GNOME_Calendar_Repository repo, iCalObject *obj, int pilot_fd) +sync_object_to_pilot (CalClient *client, iCalObject *obj, int pilot_fd) { char buffer [65536]; struct Appointment *a; @@ -360,10 +411,13 @@ sync_object_to_pilot (GNOME_Calendar_Repository repo, iCalObject *obj, int pilot attr = 0; cat = 0; idx = 0; - - if (obj->pilot_id){ + + printf ("cal->pilot: pilotid=%d, ", obj->pilot_id); + + if (obj->pilot_id) { rec_len = dlp_ReadRecordById (pilot_fd, db, obj->pilot_id, - buffer, &idx, &rec_len, &attr, &cat); + buffer, + &idx, &rec_len, &attr, &cat); if (rec_len > 0) unpack_Appointment (a, buffer, rec_len); @@ -372,7 +426,8 @@ sync_object_to_pilot (GNOME_Calendar_Repository repo, iCalObject *obj, int pilot cat = 0; } - /* a contains the appointment either cleared or with the data from the Pilot */ + /* a contains the appointment either cleared or with + the data from the Pilot */ a->begin = *localtime (&obj->dtstart); a->end = *localtime (&obj->dtend); @@ -427,11 +482,12 @@ sync_object_to_pilot (GNOME_Calendar_Repository repo, iCalObject *obj, int pilot } /* - * Pilot uses a repeat-daily for a multi-day event, adjust for that case + * Pilot uses a repeat-daily for a multi-day event, adjust + * for that case */ if ((a->end.tm_mday != a->begin.tm_mday) || (a->end.tm_mon != a->begin.tm_mon) || - (a->end.tm_year != a->begin.tm_year)){ + (a->end.tm_year != a->begin.tm_year)) { a->event = 1; a->begin.tm_sec = 0; a->begin.tm_min = 0; @@ -451,7 +507,7 @@ sync_object_to_pilot (GNOME_Calendar_Repository repo, iCalObject *obj, int pilot * Exceptions */ a->exceptions = g_list_length (obj->exdate); - a->exception = (struct tm *) malloc (sizeof (struct tm) * a->exceptions); + a->exception = (struct tm *)malloc (sizeof(struct tm) * a->exceptions); for (i = 0, l = obj->exdate; l; l = l->next, i++){ time_t *exdate = l->data; @@ -484,69 +540,151 @@ sync_object_to_pilot (GNOME_Calendar_Repository repo, iCalObject *obj, int pilot */ rec_len = pack_Appointment (a, buffer, sizeof (buffer)); attr &= ~dlpRecAttrDirty; - - dlp_WriteRecord ( - pilot_fd, db, 0, - obj->pilot_id, 0, buffer, rec_len, &new_id); - - GNOME_Calendar_Repository_update_pilot_id (repo, obj->uid, new_id, ICAL_PILOT_SYNC_NONE, &ev); + + dump_attr (attr); + printf ("\n"); + + dlp_WriteRecord (pilot_fd, db, attr, + obj->pilot_id, 0, buffer, rec_len, &new_id); + + cal_client_update_pilot_id (client, obj->uid, new_id, + ICAL_PILOT_SYNC_NONE); + conduit_free_Appointment (a); g_free (a); } static void -sync_cal_to_pilot (GNOME_Calendar_Repository repo, Calendar *cal, int pilot_fd) +sync_cal_to_pilot (CalClient *client, int pilot_fd) { - GList *l; - int c = g_list_length (cal->events); + int c; int i; + GList *uids; + GList *cur; - printf ("\n"); - for (i = 0, l = cal->events; l; l = l->next, i++){ - iCalObject *obj = l->data; - printf ("Syncing desktop to pilot: %d/%d\r", i + 1, c); - fflush (stdout); - if (obj->pilot_status != ICAL_PILOT_SYNC_MOD){ - g_warning ("Strange, we were supposed to get only a dirty object"); - continue; + uids = cal_client_get_uids (client, CALOBJ_TYPE_ANY); + + c = g_list_length (uids); + + + for (cur=uids, i=0; cur; cur=cur->next, i++) { + const char *uid = cur->data; + CalClientGetStatus status; + iCalObject *ico; + + status = cal_client_get_object (client, uid, &ico); + if (status == CAL_CLIENT_GET_SUCCESS && + ico->pilot_status == ICAL_PILOT_SYNC_MOD) { + printf ("uid='%s', pilot_status=%d\n", uid, + ico->pilot_status); + sync_object_to_pilot (client, ico, pilot_fd); } - - sync_object_to_pilot (repo, obj, pilot_fd); + /* + else { + warn + } + */ } - printf ("\n"); } + static void -dump_attr (int flags) +sync_pilot_to_cal (CalClient *client, int pilot_fd) { - if (flags & dlpRecAttrDeleted) - fprintf(stderr, " Deleted"); - if (flags & dlpRecAttrDirty) - fprintf(stderr, " Dirty"); - if (flags & dlpRecAttrBusy) - fprintf(stderr, " Busy"); - if (flags & dlpRecAttrSecret) - fprintf(stderr, " Secret"); - if (flags & dlpRecAttrArchived) - fprintf(stderr, " Archive"); - fprintf (stderr, "\n"); + int record; + unsigned char buffer [65536]; + + for (record = 0;; record++) { + struct Appointment a; + int rec_len, attr, size; + recordid_t id; + + rec_len = dlp_ReadRecordByIndex (pilot_fd, db, + record, buffer, + &id, &size, &attr, 0); + if (rec_len < 0) + break; + + unpack_Appointment (&a, buffer, rec_len); + + if (debug_attrs) + dump_attr (attr); + + /* If the object was deleted, remove it from + the desktop database */ + if (attr & dlpRecAttrDeleted) { + delete_record_from_desktop (client, id); + conduit_free_Appointment (&a); + dlp_DeleteRecord (pilot_fd, db, 0, id); + continue; + } + + if (attr & dlpRecAttrArchived) + continue; + + if (attr & dlpRecAttrDirty) { + update_record (client, id, &a, attr); + } else { + /* if the dirty flag is clear yet we have + no copy of it in the desktop database, then + we deleted it from the desktop database, so + delete it from the pilot */ + + char *uid; + CalClientGetStatus status; + status = cal_client_get_uid_by_pilot_id (client, + id, &uid); + if (status == CAL_CLIENT_GET_NOT_FOUND) { + printf ("deleting %ld from pilot\n", id); + dlp_DeleteRecord (pilot_fd, db, 0, id); + } + else + g_free (uid); + } + + attr &= ~dlpRecAttrDirty; + + conduit_free_Appointment (&a); + } } + static void -sync_pilot (GNOME_Calendar_Repository repo, int pilot_fd) +sync_pilot (CalClient *client, int pilot_fd) { struct PilotUser user_info; - int record; - unsigned char buffer [65536]; - Calendar *dirty_cal; - char *vcalendar_string; - char *error; + struct SysInfo sys_info; + unsigned char buffer [300]; - printf (_("Syncing with the pilot...")); + + /* Get the pilot's system information. FIX ME check return */ + dlp_ReadSysInfo (pilot_fd, &sys_info); + + /* Ask the pilot who it is. FIX ME check return */ dlp_ReadUserInfo (pilot_fd, &user_info); + + printf ("---------sys info--------------\n"); + printf ("romVersion=%ld\n", sys_info.romVersion); + printf ("locale=%ld\n", sys_info.locale); + strncpy (buffer, sys_info.name, sys_info.nameLength); + printf ("name='%s'\n", buffer); + printf ("---------user info--------------\n"); + printf ("userID=%ld\n", user_info.userID); + printf ("viewerID=%ld\n", user_info.viewerID); + printf ("lastSyncPC=%ld\n", user_info.lastSyncPC); + printf ("successfulSyncDate=%s", + ctime (& user_info.successfulSyncDate)); + printf ("lastSyncDate=%s", + ctime (& user_info.lastSyncDate)); + printf ("username='%s'\n", user_info.username); + strncpy (buffer, user_info.password, user_info.passwordLength); + printf ("password='%s'\n", buffer); + printf ("--------------------------------\n"); + + /* This informs the user of the progress on the Pilot */ dlp_OpenConduit (pilot_fd); @@ -561,96 +699,115 @@ sync_pilot (GNOME_Calendar_Repository repo, int pilot_fd) * 1. Pull all the records from the Pilot, and make any updates * required on the desktop side */ - if (!only_desktop_to_pilot){ - for (record = 0;; record++){ - struct Appointment a; - int rec_len, attr, size; - recordid_t id; - - rec_len = dlp_ReadRecordByIndex ( - pilot_fd, db, - record, buffer, &id, &size, &attr, 0); + if (! only_desktop_to_pilot) + sync_pilot_to_cal (client, pilot_fd); - if (rec_len < 0) - break; - - printf ("processing record %d\n", record); - unpack_Appointment (&a, buffer, rec_len); - - if (debug_attrs) - dump_attr (attr); - - /* If the object was deleted, remove it from the database */ - if (attr & dlpRecAttrDeleted){ - printf ("Deleting id %ld\n", id); - delete_record (repo, id); - conduit_free_Appointment (&a); - dlp_DeleteRecord (pilot_fd, db, 0, id); - continue; - } - if (attr & dlpRecAttrArchived) - continue; - - printf ("updating record\n"); - update_record (repo, id, &a, attr); + /* + * 2. Push all changes on the desktop to the pilot. + * + */ + + if (! only_pilot_to_desktop) + sync_cal_to_pilot (client, pilot_fd); - conduit_free_Appointment (&a); - } - } - /* - * 2. Pull all the records from the Calendar, and move any new items - * to the pilot + * 3. Clear the dirty bits on all the pilot's events. + * + */ + + dlp_ResetSyncFlags (pilot_fd, db); + + /* + * 4. Close down. + * */ - if (!only_pilot_to_desktop){ - vcalendar_string = GNOME_Calendar_Repository_get_updated_objects (repo, &ev); - dirty_cal = calendar_new ("Temporal",CALENDAR_INIT_NIL); - error = calendar_load_from_memory (dirty_cal, vcalendar_string); - if (!error) - sync_cal_to_pilot (repo, dirty_cal, pilot_fd); - calendar_destroy (dirty_cal); - } - dlp_CloseDB (pilot_fd, db); - dlp_AddSyncLogEntry (pilot_fd, _("Synced DateBook from Pilot to GnomeCal")); + dlp_AddSyncLogEntry (pilot_fd, + _("Synced DateBook from Pilot to GnomeCal")); pi_close (pilot_fd); + + /* + * 5. Dump Core. + * + */ } + +static void +gnome_calendar_load_cb (GtkWidget *cal_client, + CalClientLoadStatus status, + int *link) +{ + CalClient *client = CAL_CLIENT (cal_client); + static int tried = 0; + + if (status == CAL_CLIENT_LOAD_SUCCESS) { + printf ("<Syncing>\n"); + sync_pilot (client, *link); + printf ("</Syncing>\n"); + } + else { + if (tried) { + printf ("load and create of calendar failed\n"); + return; + } + + cal_client_create_calendar (client, calendar_file); + tried = 1; + } + + gtk_main_quit (); +} + + int main (int argc, char *argv []) { int link; - GNOME_Calendar_Repository repository; - - CORBA_exception_init (&ev); - orb = gnome_CORBA_init_with_popt_table ( - "calendar-pilot-sync", VERSION, &argc, argv, - calendar_sync_options, 0, NULL, 0, &ev); - - printf ("Please, press HotSync button on the palm..."); - fflush (stdout); - link = setup_connection (); - printf ("Connected\n"); - - printf ("Launching GnomeCal..."); - fflush (stdout); - repository = locate_calendar_server (); - printf ("Done\n"); - - printf ("<Syncing>\n"); - sync_pilot (repository, link); - printf ("</Syncing>\n"); - - GNOME_Calendar_Repository_done (repository, &ev); - - CORBA_exception_free (&ev); + CalClient *client; + + init_bonobo (&argc, argv); + + g_log_set_always_fatal (G_LOG_LEVEL_ERROR | + G_LOG_LEVEL_CRITICAL | + G_LOG_LEVEL_WARNING); + + + /* FIX ME */ + calendar_file = g_concat_dir_and_file (g_get_home_dir (), + "evolution/local/Calendar/calendar.vcf"); + + + for (;;) { + printf ("Please, press HotSync button on the palm...\n"); + fflush (stdout); + link = setup_connection (); + printf ("Connected\n"); + + printf ("Contacting calendar server...\n"); + fflush (stdout); + client = cal_client_new (); + + gtk_signal_connect (GTK_OBJECT (client), "cal_loaded", + gnome_calendar_load_cb, &link); + + cal_client_load_calendar (client, calendar_file); + + bonobo_main (); + + gtk_object_unref (GTK_OBJECT (client)); + pi_close (link); + } return 0; } /* Just a stub to link with */ + +void calendar_notify (time_t time, CalendarAlarm *which, void *data); + void calendar_notify (time_t time, CalendarAlarm *which, void *data) { diff --git a/calendar/idl/evolution-calendar.idl b/calendar/idl/evolution-calendar.idl index b7340bf51a..f81cfbecf8 100644 --- a/calendar/idl/evolution-calendar.idl +++ b/calendar/idl/evolution-calendar.idl @@ -45,6 +45,9 @@ module Calendar { /* Used to store a time_t */ typedef unsigned long Time_t; + /* Used to store pilot IDs */ + typedef unsigned long PilotID; + /* An instance of a calendar object that actually occurs. These are * "virtual" objects in that they are used to represent instances of * recurring events and alarms. "Real" objects just contain the @@ -107,6 +110,23 @@ module Calendar { in Time_t start, in Time_t end) raises (NotFound, InvalidRange); + + /* something + * + */ + CalObjUID get_uid_by_pilot_id (in PilotID pilotid) + raises (NotFound); + + + /* + * update_pilot_id: + * @uid: Unique identifier for the event we want to update + * @pilot_id: new ID assigned by the pilot + * @pilot_status: Status to flag the event with + */ + void update_pilot_id (in CalObjUID uid, in PilotID pilot_id, in unsigned long pilot_status) + raises (NotFound); + /* Updates an object by adding it if it does not exist or by * changing an existing one. */ diff --git a/calendar/pcs/cal-backend-imc.c b/calendar/pcs/cal-backend-imc.c index 7999d97d6e..3e079218cf 100644 --- a/calendar/pcs/cal-backend-imc.c +++ b/calendar/pcs/cal-backend-imc.c @@ -1,3 +1,4 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* Evolution calendar - Internet Mail Consortium formats backend * * Copyright (C) 2000 Helix Code, Inc. @@ -86,6 +87,12 @@ static gboolean cal_backend_imc_get_alarms_for_object (CalBackend *backend, cons static gboolean cal_backend_imc_update_object (CalBackend *backend, const char *uid, const char *calobj); static gboolean cal_backend_imc_remove_object (CalBackend *backend, const char *uid); +static char *cal_backend_imc_get_uid_by_pilot_id (CalBackend *backend, unsigned long int pilot_id); +static void cal_backend_imc_update_pilot_id (CalBackend *backend, + const char *uid, + unsigned long int pilot_id, + unsigned long int pilot_status); + static CalBackendClass *parent_class; @@ -147,6 +154,8 @@ cal_backend_imc_class_init (CalBackendIMCClass *class) backend_class->get_alarms_for_object = cal_backend_imc_get_alarms_for_object; backend_class->update_object = cal_backend_imc_update_object; backend_class->remove_object = cal_backend_imc_remove_object; + backend_class->get_uid_by_pilot_id = cal_backend_imc_get_uid_by_pilot_id; + backend_class->update_pilot_id = cal_backend_imc_update_pilot_id; object_class->destroy = cal_backend_imc_destroy; } @@ -969,6 +978,65 @@ cal_backend_imc_get_uids (CalBackend *backend, CalObjType type) return c.uid_list; } + + +static char * +cal_backend_imc_get_uid_by_pilot_id (CalBackend *backend, + unsigned long int pilot_id) +{ + CalBackendIMC *cbimc; + IMCPrivate *priv; + GList *l; + iCalObject *obj = NULL; + + g_return_val_if_fail (backend != NULL, NULL); + cbimc = CAL_BACKEND_IMC (backend); + priv = cbimc->priv; + g_return_val_if_fail (priv->loaded, NULL); + + for (l = priv->events; l; l = l->next){ + obj = l->data; + if (obj->pilot_id == pilot_id) + goto done; + } + + for (l = priv->todos; l; l = l->next){ + obj = l->data; + if (obj->pilot_id == pilot_id) + goto done; + } + + done: + if (!obj || obj->pilot_id != pilot_id) + return NULL; + + return g_strdup (obj->uid); +} + + +void +cal_backend_imc_update_pilot_id (CalBackend *backend, + const char *uid, + unsigned long int pilot_id, + unsigned long int pilot_status) +{ + CalBackendIMC *cbimc; + IMCPrivate *priv; + iCalObject *obj; + + g_return_if_fail (backend != NULL); + cbimc = CAL_BACKEND_IMC (backend); + priv = cbimc->priv; + g_return_if_fail (priv->loaded); + + obj = lookup_object (cbimc, uid); + + obj->pilot_id = pilot_id; + obj->pilot_status = pilot_status; +} + + + /* Allocates and fills in a new CalObjInstance structure */ static CalObjInstance * build_cal_obj_instance (iCalObject *ico, time_t start, time_t end) @@ -1310,6 +1378,7 @@ cal_backend_imc_update_object (CalBackend *backend, const char *uid, const char remove_object (cbimc, ico); add_object (cbimc, new_ico); + new_ico->pilot_status = ICAL_PILOT_SYNC_MOD; save (cbimc); /* FIXME: do the notification asynchronously */ diff --git a/calendar/pcs/cal-backend.c b/calendar/pcs/cal-backend.c index 7956f77473..658f55012b 100644 --- a/calendar/pcs/cal-backend.c +++ b/calendar/pcs/cal-backend.c @@ -314,6 +314,29 @@ cal_backend_get_alarms_for_object (CalBackend *backend, const char *uid, return (* CLASS (backend)->get_alarms_for_object) (backend, uid, start, end, alarms); } + +char *cal_backend_get_uid_by_pilot_id (CalBackend *backend, unsigned long int pilot_id) +{ + g_return_val_if_fail (backend != NULL, FALSE); + g_return_val_if_fail (IS_CAL_BACKEND (backend), FALSE); + g_assert (CLASS(backend)->get_uid_by_pilot_id != NULL); + return (* CLASS(backend)->get_uid_by_pilot_id) (backend, pilot_id); +} + + +void cal_backend_update_pilot_id (CalBackend *backend, const char *uid, + unsigned long int pilot_id, + unsigned long int pilot_status) +{ + g_return_if_fail (backend != NULL); + g_return_if_fail (IS_CAL_BACKEND (backend)); + g_assert (CLASS(backend)->update_pilot_id != NULL); + (* CLASS(backend)->update_pilot_id) (backend, uid, + pilot_id, pilot_status); +} + + + /** * cal_backend_update_object: * @backend: A calendar backend. diff --git a/calendar/pcs/cal-backend.h b/calendar/pcs/cal-backend.h index 57f3acf18e..2daa4ad56b 100644 --- a/calendar/pcs/cal-backend.h +++ b/calendar/pcs/cal-backend.h @@ -1,3 +1,4 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* Evolution calendar - generic backend class * * Copyright (C) 2000 Helix Code, Inc. @@ -75,6 +76,8 @@ struct _CalBackendClass { GList **alarms); gboolean (* update_object) (CalBackend *backend, const char *uid, const char *calobj); gboolean (* remove_object) (CalBackend *backend, const char *uid); + char *(* get_uid_by_pilot_id) (CalBackend *backend, unsigned long int pilot_id); + void (* update_pilot_id) (CalBackend *backend, const char *uid, unsigned long int pilot_id, unsigned long int pilot_status); }; GtkType cal_backend_get_type (void); @@ -101,12 +104,19 @@ gboolean cal_backend_get_alarms_for_object (CalBackend *backend, const char *uid time_t start, time_t end, GList **alarms); + gboolean cal_backend_update_object (CalBackend *backend, const char *uid, const char *calobj); gboolean cal_backend_remove_object (CalBackend *backend, const char *uid); void cal_backend_last_client_gone (CalBackend *backend); +char *cal_backend_get_uid_by_pilot_id (CalBackend *backend, unsigned long int pilot_id); + +void cal_backend_update_pilot_id (CalBackend *backend, const char *uid, + unsigned long int pilot_id, + unsigned long int pilot_status); + END_GNOME_DECLS diff --git a/calendar/pcs/cal.c b/calendar/pcs/cal.c index a01c0ce8dc..35677c6cac 100644 --- a/calendar/pcs/cal.c +++ b/calendar/pcs/cal.c @@ -517,6 +517,57 @@ Cal_remove_object (PortableServer_Servant servant, NULL); } + + +/* Cal::get_uid_by_pilot_id method */ +static Evolution_Calendar_CalObjUID +Cal_get_uid_by_pilot_id (PortableServer_Servant servant, + const Evolution_Calendar_PilotID pilot_id, + CORBA_Environment *ev) +{ + Cal *cal; + CalPrivate *priv; + char *uid; + + cal = CAL (bonobo_object_from_servant (servant)); + priv = cal->priv; + + uid = cal_backend_get_uid_by_pilot_id (priv->backend, pilot_id); + + if (uid) { + CORBA_char *uid_copy; + + uid_copy = CORBA_string_dup (uid); + g_free (uid); + return uid_copy; + } else { + CORBA_exception_set (ev, CORBA_USER_EXCEPTION, + ex_Evolution_Calendar_Cal_NotFound, + NULL); + return NULL; + } +} + + +/* Cal::update_pilot_id method */ +static void +Cal_update_pilot_id (PortableServer_Servant servant, + const Evolution_Calendar_CalObjUID uid, + const Evolution_Calendar_PilotID pilot_id, + const CORBA_unsigned_long pilot_status, + CORBA_Environment * ev) +{ + Cal *cal; + CalPrivate *priv; + + cal = CAL (bonobo_object_from_servant (servant)); + priv = cal->priv; + + cal_backend_update_pilot_id (priv->backend, uid, + pilot_id, pilot_status); +} + + /** * cal_get_epv: * @void: @@ -540,6 +591,8 @@ cal_get_epv (void) epv->get_alarms_for_object = Cal_get_alarms_for_object; epv->update_object = Cal_update_object; epv->remove_object = Cal_remove_object; + epv->get_uid_by_pilot_id = Cal_get_uid_by_pilot_id; + epv->update_pilot_id = Cal_update_pilot_id; return epv; } |