From ad24a0d6eb148f9fdf82cc42384b2891ce32a61f Mon Sep 17 00:00:00 2001 From: Eskil Heyn Olsen Date: Mon, 20 Sep 1999 21:09:00 +0000 Subject: lot of rework, implemented various set_* functions, transmit and * gncal/calendar-conduit: lot of rework, implemented various set_* functions, transmit and free_transmit, now appears stable, still only syncs oneway (pilot -> gnomecal) svn path=/trunk/; revision=1243 --- calendar/calendar-conduit.c | 554 ++++++++++++++++++-------- calendar/calendar-conduit.h | 16 +- calendar/conduits/calendar/calendar-conduit.c | 554 ++++++++++++++++++-------- calendar/conduits/calendar/calendar-conduit.h | 16 +- calendar/corba-cal.c | 5 - calendar/gui/calendar-conduit.c | 554 ++++++++++++++++++-------- calendar/gui/calendar-conduit.h | 16 +- calendar/gui/corba-cal.c | 5 - 8 files changed, 1206 insertions(+), 514 deletions(-) diff --git a/calendar/calendar-conduit.c b/calendar/calendar-conduit.c index 929527264f..8f7772bcf4 100644 --- a/calendar/calendar-conduit.c +++ b/calendar/calendar-conduit.c @@ -36,8 +36,7 @@ void conduit_destroy_gpilot_conduit (GnomePilotConduit*); typedef struct _ConduitData ConduitData; struct _ConduitData { - struct AppointmentAppInfo ai; - Calendar *cal; + struct AppointmentAppInfo ai; }; #define GET_DATA(c) ((ConduitData*)gtk_object_get_data(GTK_OBJECT(c),"conduit_data")) @@ -47,19 +46,22 @@ CORBA_Environment ev; CORBA_ORB orb; static GNOME_Calendar_Repository -calendar_server (void) +start_calendar_server (GnomePilotConduitStandardAbs *conduit) { - calendar = goad_server_activate_with_id (NULL, "IDL:GNOME:Calendar:Repository:1.0", - 0, NULL); - if (calendar == CORBA_OBJECT_NIL) - g_error ("Can not communicate with GnomeCalendar server"); + g_return_val_if_fail(conduit!=NULL,CORBA_OBJECT_NIL); + + calendar = goad_server_activate_with_id (NULL, + "IDL:GNOME:Calendar:Repository:1.0", + 0, NULL); + if (calendar == CORBA_OBJECT_NIL) + g_error ("Can not communicate with GnomeCalendar server"); - if (ev._major != CORBA_NO_EXCEPTION){ - printf ("Exception: %s\n", CORBA_exception_id (&ev)); - return CORBA_OBJECT_NIL; - } + if (ev._major != CORBA_NO_EXCEPTION){ + g_warning ("Exception: %s\n", CORBA_exception_id (&ev)); + return CORBA_OBJECT_NIL; + } - return calendar; + return calendar; } @@ -69,62 +71,162 @@ calendar_notify (time_t time, CalendarAlarm *which, void *data) { } +static GList * +get_calendar_objects(GnomePilotConduitStandardAbs *conduit) +{ + char *vcalendar_string; + char *error; + GList *retval,*l; + Calendar *cal; + + g_return_val_if_fail(conduit!=NULL,NULL); + + vcalendar_string = + GNOME_Calendar_Repository_get_objects (calendar, &ev); + + cal = calendar_new("Temporary"); + + error = calendar_load_from_memory(cal,vcalendar_string); + if(error != NULL) { + g_warning("Error while converting records"); + g_warning("Error : %s",error); + return NULL; + } + retval = NULL; + for(l=cal->events ; l ; l=l->next) { + g_print("calconduit: duping %d [%s]\n", + ((iCalObject*)l->data)->pilot_id, + ((iCalObject*)l->data)->summary); + retval = g_list_prepend(retval,ical_object_duplicate(l->data)); + } + + /* g_free(vcalendar_string); FIXME: this coredumps, but won't it leak without ? */ + calendar_destroy(cal); + + return retval; +} + +/* + * converts a iCalObject to a CalLocalRecord + */ + static void -local_from_ical(CalLocalRecord **local,iCalObject *obj) { - g_return_if_fail(local!=NULL); - g_return_if_fail(*local!=NULL); - g_return_if_fail(obj!=NULL); +local_record_from_icalobject(CalLocalRecord **local, + iCalObject *obj) +{ + g_return_if_fail(local!=NULL); + g_return_if_fail(*local!=NULL); + g_return_if_fail(obj!=NULL); - (*local)->ical = obj; - (*local)->ID = (*local)->ical->pilot_id; + (*local)->ical = obj; + (*local)->local.ID = (*local)->ical->pilot_id; - g_message("(*local)->Id = %ld",(*local)->ID); - switch((*local)->ical->pilot_status) { - case ICAL_PILOT_SYNC_NONE: (*local)->local.attr = RecordNothing; break; - case ICAL_PILOT_SYNC_MOD: (*local)->local.attr = RecordNew|RecordModified; break; - case ICAL_PILOT_SYNC_DEL: (*local)->local.attr = RecordDeleted; break; - } + g_print("calconduit: (*local)->Id = %ld [%s], status = %d\n", + (*local)->local.ID,obj->summary,(*local)->ical->pilot_status); + + switch((*local)->ical->pilot_status) { + case ICAL_PILOT_SYNC_NONE: + (*local)->local.attr = GnomePilotRecordNothing; + break; + case ICAL_PILOT_SYNC_MOD: + (*local)->local.attr = GnomePilotRecordModified; + break; + case ICAL_PILOT_SYNC_DEL: + (*local)->local.attr = GnomePilotRecordDeleted; + break; + } + + /* Records without a pilot_id are new */ + if((*local)->local.ID == 0) + (*local)->local.attr = GnomePilotRecordNew; - (*local)->local.secret = 0; - if(obj->class!=NULL) - if(strcmp(obj->class,"PRIVATE")==0) - (*local)->local.secret = 1; + (*local)->local.secret = 0; + if(obj->class!=NULL) + if(strcmp(obj->class,"PRIVATE")==0) + (*local)->local.secret = 1; - (*local)->local.archived = 0; + (*local)->local.archived = 0; - /* used by iterations */ - (*local)->list_ptr = NULL; + /* used by iterations */ + (*local)->list_ptr = NULL; } +/* + * Given a PilotRecord, find the matching record in + * the calendar repository. If no match, return NULL + */ static CalLocalRecord * -match_record_from_repository(PilotRecord *remote) { - char *vcal_string; - CalLocalRecord *loc; +find_record_in_repository(GnomePilotConduitStandardAbs *conduit, + PilotRecord *remote) +{ + char *vcal_string; + CalLocalRecord *loc; - g_return_val_if_fail(remote!=NULL,NULL); + g_return_val_if_fail(conduit!=NULL,NULL); + g_return_val_if_fail(remote!=NULL,NULL); - printf ("requesting %ld []\n", remote->ID); + g_message ("calconduit: requesting %ld []\n", remote->ID); - /* FIXME: ehm, who frees this string ? */ - vcal_string = - GNOME_Calendar_Repository_get_object_by_pilot_id (calendar, remote->ID, &ev); + vcal_string = + GNOME_Calendar_Repository_get_object_by_pilot_id (calendar, remote->ID, &ev); - if (ev._major == CORBA_USER_EXCEPTION){ - printf (_("\tObject did not exist\n")); - return NULL; - } else if(ev._major != CORBA_NO_EXCEPTION) { - printf(_("\tError while communicating with calendar server\n")); - CORBA_exception_free(&ev); - return NULL; - } else { - printf ("\tFound\n"); - loc = g_new0(CalLocalRecord,1); - /* memory allocated in new_from_string is freed in free_match */ - local_from_ical(&loc,ical_object_new_from_string (vcal_string)); - return loc; - } - - return NULL; + if (ev._major == CORBA_USER_EXCEPTION){ + g_message ("calconduit: \tObject did not exist\n"); + CORBA_exception_free(&ev); + return NULL; + } else if(ev._major != CORBA_NO_EXCEPTION) { + g_warning(_("\tError while communicating with calendar server\n")); + CORBA_exception_free(&ev); + return NULL; + } else { + g_message ("calconduit: \tFound\n"); + loc = g_new0(CalLocalRecord,1); + /* memory allocated in new_from_string is freed in free_match */ + local_record_from_icalobject(&loc, + ical_object_new_from_string (vcal_string)); + /* g_free(vcal_string); FIXME: this coredumps, but won't it leak without ? */ + return loc; + } + + return NULL; +} + +/* + * updates an given iCalObject in the repository + */ +static void +update_calendar_entry_in_repository(GnomePilotConduitStandardAbs *conduit, + iCalObject *obj) +{ + char *str; + + g_return_if_fail(conduit!=NULL); + g_return_if_fail(obj!=NULL); + + str = calendar_string_from_object (obj); + + GNOME_Calendar_Repository_update_object (calendar, obj->uid, str, &ev); + + if (ev._major == CORBA_USER_EXCEPTION){ + g_message ("calconduit: \tObject did not exist\n"); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return; + } else if(ev._major != CORBA_NO_EXCEPTION) { + g_warning(_("\tError while communicating with calendar server\n")); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return; + } + + free (str); +} + +static iCalObject * +ical_from_remote_record(GnomePilotConduitStandardAbs *conduit, + PilotRecord *remote) +{ + return NULL; } /* Code blatantly stolen from @@ -137,12 +239,12 @@ match_record_from_repository(PilotRecord *remote) { * */ static void -update_record (PilotRecord *remote) +update_record (GnomePilotConduitStandardAbs *conduit, + PilotRecord *remote) { char *vcal_string; iCalObject *obj; int i; - char *str; struct Appointment a; g_return_if_fail(remote!=NULL); @@ -153,8 +255,7 @@ update_record (PilotRecord *remote) g_get_user_name (), a.description ? a.description : ""); - printf ("requesting %ld [%s]\n", remote->ID, a.description); - /* FIXME: ehm, who frees this string ? */ + g_message ("calconduit: requesting %ld [%s]\n", remote->ID, a.description); vcal_string = GNOME_Calendar_Repository_get_object_by_pilot_id (calendar, remote->ID, &ev); if (ev._major == CORBA_USER_EXCEPTION){ @@ -167,25 +268,27 @@ update_record (PilotRecord *remote) obj->related = NULL; obj->pilot_id = remote->ID; obj->pilot_status = ICAL_PILOT_SYNC_NONE; - printf (_("\tObject did not exist, creating a new one\n")); + g_warning (_("\tObject did not exist, creating a new one\n")); + CORBA_exception_free(&ev); } else if(ev._major != CORBA_NO_EXCEPTION) { - printf(_("\tError while communicating with calendar server\n")); - printf("\texception id = %s\n",CORBA_exception_id(&ev)); - CORBA_exception_free(&ev); - ical_object_destroy (obj); - return; + g_warning(_("\tError while communicating with calendar server\n")); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + ical_object_destroy (obj); + free_Appointment(&a); + return; } else { - printf ("\tFound\n"); + g_message ("calconduit: \tFound\n"); ical_object_destroy (obj); 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")); - ical_object_destroy (obj); - return; - } + 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_destroy (obj); + return; + } */ /* @@ -194,14 +297,15 @@ update_record (PilotRecord *remote) if (a.event) { - /* turn day-long events into a full day's appointment */ + /* turn day-long events into a full day's appointment + FIXME: get settings from gnomecal */ a.begin.tm_sec = 0; a.begin.tm_min = 0; - a.begin.tm_hour = 6; + a.begin.tm_hour = 0; a.end.tm_sec = 0; - a.end.tm_min = 0; - a.end.tm_hour = 10; + a.end.tm_min =59; + a.end.tm_hour = 23; } obj->dtstart = mktime (&a.begin); @@ -286,7 +390,7 @@ update_record (PilotRecord *remote) break; default: - g_warning ("Unhandled repeate case"); + g_warning ("Unhandled repeat case"); } if (a.repeatForever) @@ -313,21 +417,20 @@ update_record (PilotRecord *remote) else obj->class = g_strdup ("PUBLIC"); - /* - * Now, convert the in memory iCalObject to a full vCalendar we can send - */ - str = calendar_string_from_object (obj); - - GNOME_Calendar_Repository_update_object (calendar, obj->uid, str, &ev); - free (str); + /* update record on server */ + update_calendar_entry_in_repository(conduit,obj); + /* * Shutdown */ ical_object_destroy (obj); + free_Appointment(&a); + g_free(vcal_string); } +/* static gint load_records(GnomePilotConduit *c) { @@ -346,31 +449,32 @@ load_records(GnomePilotConduit *c) return 0; } +*/ static gint pre_sync(GnomePilotConduit *c, GnomePilotDBInfo *dbi) { - int l; - unsigned char *buf; + int l; + unsigned char *buf; - calendar = CORBA_OBJECT_NIL; - calendar = calendar_server(); - if(calendar == CORBA_OBJECT_NIL) { - return 0; - } + calendar = CORBA_OBJECT_NIL; + calendar = start_calendar_server(GNOME_PILOT_CONDUIT_STANDARD_ABS(c)); + if(calendar == CORBA_OBJECT_NIL) { + return 0; + } - gtk_object_set_data(GTK_OBJECT(c),"dbinfo",dbi); + gtk_object_set_data(GTK_OBJECT(c),"dbinfo",dbi); - load_records(c); + /* load_records(c); */ - buf = (unsigned char*)g_malloc(0xffff); - if((l=dlp_ReadAppBlock(dbi->pilot_socket,dbi->db_handle,0,(unsigned char *)buf,0xffff))<0) { - return 0; - } - unpack_AppointmentAppInfo(&(GET_DATA(c)->ai),buf,l); - g_free(buf); + buf = (unsigned char*)g_malloc(0xffff); + if((l=dlp_ReadAppBlock(dbi->pilot_socket,dbi->db_handle,0,(unsigned char *)buf,0xffff))<0) { + return 0; + } + unpack_AppointmentAppInfo(&(GET_DATA(c)->ai),buf,l); + g_free(buf); - return 1; + return 1; } /** @@ -387,12 +491,12 @@ match_record (GnomePilotConduitStandardAbs *conduit, PilotRecord *remote, gpointer data) { - g_return_val_if_fail(remote!=NULL,0); - g_print ("in match_record\n"); + g_return_val_if_fail(remote!=NULL,0); + g_print ("in match_record\n"); - *local = match_record_from_repository(remote); + *local = find_record_in_repository(conduit,remote); - return 1; + return 1; } /** @@ -413,7 +517,9 @@ free_match (GnomePilotConduitStandardAbs *conduit, return 1; } - +/* + Move to archive and set status to Nothing + */ static gint archive_local (GnomePilotConduitStandardAbs *conduit, CalLocalRecord *local, @@ -424,6 +530,9 @@ archive_local (GnomePilotConduitStandardAbs *conduit, } +/* + Store in archive and set status to Nothing + */ static gint archive_remote (GnomePilotConduitStandardAbs *conduit, CalLocalRecord *local, @@ -434,17 +543,20 @@ archive_remote (GnomePilotConduitStandardAbs *conduit, return 1; } +/* + Store and set status to Nothing + */ static gint store_remote (GnomePilotConduitStandardAbs *conduit, PilotRecord *remote, gpointer data) { - g_print ("entering store_remote\n"); - g_return_val_if_fail(remote!=NULL,0); + g_print ("entering store_remote\n"); + g_return_val_if_fail(remote!=NULL,0); - update_record(remote); + update_record(conduit,remote); - return 1; + return 1; } static gint @@ -456,36 +568,62 @@ clear_status_archive_local (GnomePilotConduitStandardAbs *conduit, return 1; } +/** + * called with *local = NULL, sets *local to first record and returns 1. + * Thereafter repeatedly called with updated *local value, + * updates this to next records and returns 1. + * When last record is reached, sets *local to zero + * and returns 0 + */ + static gint iterate (GnomePilotConduitStandardAbs *conduit, CalLocalRecord **local, gpointer data) { - g_return_val_if_fail(local!=NULL,0); + static GList *events; + + g_return_val_if_fail(local!=NULL,0); - if(*local==NULL) { - g_message("calconduit: beginning iteration"); - if(GET_DATA(conduit)->cal->events!=NULL) { - *local = g_new0(CalLocalRecord,1); - - local_from_ical(local,(iCalObject*)GET_DATA(conduit)->cal->events->data); - (*local)->list_ptr = GET_DATA(conduit)->cal->events; - } else { - g_message("calconduit: no events"); - (*local) = NULL; - } - } else { - g_message("calconduit: continuing iteration"); - if(g_list_next((*local)->list_ptr)==NULL) { - g_message("calconduit: ending"); - g_free((*local)); - (*local) = NULL; /* ends iteration */ - } else { - local_from_ical(local,(iCalObject*)(g_list_next((*local)->list_ptr)->data)); - (*local)->list_ptr = g_list_next((*local)->list_ptr); - } - } - return 1; + if(*local==NULL) { + g_print("calconduit: beginning iteration\n"); + + events = get_calendar_objects(conduit); + + if(events!=NULL) { + g_print("calconduit: iterating over %d records\n",g_list_length(events)); + *local = g_new0(CalLocalRecord,1); + + local_record_from_icalobject(local,(iCalObject*)events->data); + (*local)->list_ptr = events; + } else { + g_print("calconduit: no events\n"); + (*local) = NULL; + } + } else { + g_print("calconduit: continuing iteration\n"); + if(g_list_next((*local)->list_ptr)==NULL) { + GList *l; + + g_print("calconduit: ending\n"); + /** free stuff allocated for iteration */ + g_free((*local)); + + g_print("calconduit: iterated over %d records\n",g_list_length(events)); + for(l=events;l;l=l->next) + ical_object_destroy(l->data); + + g_list_free(events); + + /* ends iteration */ + (*local) = NULL; + return 0; + } else { + local_record_from_icalobject(local,(iCalObject*)(g_list_next((*local)->list_ptr)->data)); + (*local)->list_ptr = g_list_next((*local)->list_ptr); + } + } + return 1; } static gint @@ -495,28 +633,29 @@ iterate_specific (GnomePilotConduitStandardAbs *conduit, gint archived, gpointer data) { - g_return_val_if_fail(local!=NULL,0); + g_return_val_if_fail(local!=NULL,0); - g_print ("entering iterate_specific\n"); - do { - gnome_pilot_conduit_standard_abs_iterate(conduit,(LocalRecord**)local); - if((*local)==NULL) break; - if(archived && ((*local)->local.archived==archived)) break; - if((*local)->local.attr |= flag) break; - } while((*local)!=NULL); + g_print ("entering iterate_specific\n"); + /** iterate until a record meets the criteria */ + while(gnome_pilot_conduit_standard_abs_iterate(conduit,(LocalRecord**)local)) { + if((*local)==NULL) break; + g_print("calconduit: local->attr = %d, flag = %d, & %d\n",(*local)->local.attr,flag,((*local)->local.attr & flag)); + if(archived && ((*local)->local.archived==archived)) break; + if(((*local)->local.attr == flag)) break; + } - return 1; + return (*local)==NULL?0:1; } static gint purge (GnomePilotConduitStandardAbs *conduit, gpointer data) { - g_print ("entering purge\n"); + g_print ("entering purge\n"); - /* HEST, gem posterne her */ + /* HEST, gem posterne her */ - return 1; + return 1; } static gint @@ -531,19 +670,35 @@ set_status (GnomePilotConduitStandardAbs *conduit, local->local.attr = status; switch(status) { - case RecordPending: - case RecordNothing: - local->ical->pilot_status = ICAL_PILOT_SYNC_NONE; - break; - case RecordDeleted: - local->ical->pilot_status = ICAL_PILOT_SYNC_DEL; - break; - case RecordNew: - case RecordModified: - local->ical->pilot_status = ICAL_PILOT_SYNC_MOD; - break; + case GnomePilotRecordPending: + case GnomePilotRecordNothing: + local->ical->pilot_status = ICAL_PILOT_SYNC_NONE; + break; + case GnomePilotRecordDeleted: + local->ical->pilot_status = ICAL_PILOT_SYNC_DEL; + break; + case GnomePilotRecordNew: + case GnomePilotRecordModified: + local->ical->pilot_status = ICAL_PILOT_SYNC_MOD; + break; } - return 0; + GNOME_Calendar_Repository_update_pilot_id(calendar, + local->ical->uid, + local->local.ID, + local->ical->pilot_status, + &ev); + if (ev._major == CORBA_USER_EXCEPTION){ + g_message ("calconduit: \tObject did not exist\n"); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return 0; + } else if(ev._major != CORBA_NO_EXCEPTION) { + g_warning(_("\tError while communicating with calendar server\n")); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return 0; + } + return 1; } static gint @@ -557,6 +712,7 @@ set_archived (GnomePilotConduitStandardAbs *conduit, g_assert(local->ical!=NULL); local->local.archived = archived; + update_calendar_entry_in_repository(conduit,local->ical); /* FIXME: This should move the entry into a speciel calendar file, eg. Archive, or (by config option), simply delete it */ @@ -573,8 +729,25 @@ set_pilot_id (GnomePilotConduitStandardAbs *conduit, g_return_val_if_fail(local!=NULL,0); g_assert(local->ical!=NULL); - local->ID = ID; + local->local.ID = ID; local->ical->pilot_id = ID; + GNOME_Calendar_Repository_update_pilot_id(calendar, + local->ical->uid, + local->local.ID, + local->ical->pilot_status, + &ev); + + if (ev._major == CORBA_USER_EXCEPTION){ + g_message ("calconduit: \tObject did not exist\n"); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return 0; + } else if(ev._major != CORBA_NO_EXCEPTION) { + g_warning(_("\tError while communicating with calendar server\n")); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return 0; + } return 1; } @@ -604,7 +777,13 @@ free_transmit (GnomePilotConduitStandardAbs *conduit, PilotRecord *remote, gpointer data) { + g_return_val_if_fail(local!=NULL,0); + g_return_val_if_fail(remote!=NULL,0); + g_print ("entering free_transmit\n"); + + free_Appointment(local->a); + g_free(remote->record); return 1; } @@ -621,8 +800,62 @@ transmit (GnomePilotConduitStandardAbs *conduit, CalLocalRecord *local, gpointer data) { + PilotRecord *p; + + g_return_val_if_fail(conduit!=NULL,NULL); + g_return_val_if_fail(local!=NULL,NULL); + g_return_val_if_fail(local->a==NULL,NULL); + g_assert(local->ical!=NULL); + g_print ("entering transmit\n"); - return NULL; + p = g_new0(PilotRecord,1); + + p->ID = local->local.ID; + p->attr = local->local.attr; + p->archived = local->local.archived; + p->secret = local->local.secret; + + local->a = g_new0(struct Appointment,1); + + local->a->event = 0; + local->a->begin = *localtime(&local->ical->dtstart); + local->a->end = *localtime(&local->ical->dtend); + + /* g_print("calconduit: new item from %s to %s\n",asctime(&(local->a->begin)),asctime(&(local->a->end))); */ + + local->a->alarm = 0; + local->a->advance = 0; + local->a->advanceUnits = advMinutes; + local->a->repeatType = repeatNone; + local->a->repeatForever = 0; + local->a->repeatEnd = local->a->end; + local->a->repeatFrequency = 0; + local->a->repeatDay = dom1stSun; + local->a->repeatDays[0] = 0; + local->a->repeatDays[1] = 0; + local->a->repeatDays[2] = 0; + local->a->repeatDays[3] = 0; + local->a->repeatDays[4] = 0; + local->a->repeatDays[5] = 0; + local->a->repeatDays[6] = 0; + local->a->repeatWeekstart = 0; + local->a->exceptions = 0; + local->a->exception = NULL; + + g_message("local->ical->comment = %s",local->ical->comment); + g_message("local->ical->summary = %s",local->ical->summary); + + /* STOP: don't replace these with g_strdup, since free_Appointment + uses free to deallocte */ + local->a->note = + local->ical->comment==NULL?NULL:strdup(local->ical->comment); + local->a->description = + local->ical->summary==NULL?NULL:strdup(local->ical->summary); + + p->record = g_new0(char,0xffff); + pack_Appointment(local->a,p->record,sizeof(p->record)); + + return p; } GnomePilotConduit * @@ -676,13 +909,14 @@ conduit_destroy_gpilot_conduit (GnomePilotConduit *conduit) ConduitCfg *cc; ConduitData *cd; - GNOME_Calendar_Repository_done (calendar, &ev); + if(calendar!=CORBA_OBJECT_NIL) + GNOME_Calendar_Repository_done (calendar, &ev); cc = GET_CONFIG(conduit); destroy_configuration(&cc); cd = GET_DATA(conduit); - if(cd->cal!=NULL) calendar_destroy(cd->cal); + g_free(cd); gtk_object_destroy (GTK_OBJECT (conduit)); diff --git a/calendar/calendar-conduit.h b/calendar/calendar-conduit.h index 2f5cc0c7da..c34457acc5 100644 --- a/calendar/calendar-conduit.h +++ b/calendar/calendar-conduit.h @@ -13,14 +13,14 @@ typedef struct _CalLocalRecord CalLocalRecord; struct _CalLocalRecord { - /* The stuff from gnome-pilot-conduit-standard-abs.h */ - LocalRecord local; - /* The Pilot ID of the record */ - recordid_t ID; - /* The corresponding iCal object */ - iCalObject *ical; - /* used by iterations, points to a GList element */ - GList *list_ptr; + /* The stuff from gnome-pilot-conduit-standard-abs.h */ + LocalRecord local; + /* The corresponding iCal object */ + iCalObject *ical; + /* used by iterations, points to a GList element */ + GList *list_ptr; + /* pilot-link appointment structure, used for implementing Transmit */ + struct Appointment *a; }; typedef struct _ConduitCfg ConduitCfg; diff --git a/calendar/conduits/calendar/calendar-conduit.c b/calendar/conduits/calendar/calendar-conduit.c index 929527264f..8f7772bcf4 100644 --- a/calendar/conduits/calendar/calendar-conduit.c +++ b/calendar/conduits/calendar/calendar-conduit.c @@ -36,8 +36,7 @@ void conduit_destroy_gpilot_conduit (GnomePilotConduit*); typedef struct _ConduitData ConduitData; struct _ConduitData { - struct AppointmentAppInfo ai; - Calendar *cal; + struct AppointmentAppInfo ai; }; #define GET_DATA(c) ((ConduitData*)gtk_object_get_data(GTK_OBJECT(c),"conduit_data")) @@ -47,19 +46,22 @@ CORBA_Environment ev; CORBA_ORB orb; static GNOME_Calendar_Repository -calendar_server (void) +start_calendar_server (GnomePilotConduitStandardAbs *conduit) { - calendar = goad_server_activate_with_id (NULL, "IDL:GNOME:Calendar:Repository:1.0", - 0, NULL); - if (calendar == CORBA_OBJECT_NIL) - g_error ("Can not communicate with GnomeCalendar server"); + g_return_val_if_fail(conduit!=NULL,CORBA_OBJECT_NIL); + + calendar = goad_server_activate_with_id (NULL, + "IDL:GNOME:Calendar:Repository:1.0", + 0, NULL); + if (calendar == CORBA_OBJECT_NIL) + g_error ("Can not communicate with GnomeCalendar server"); - if (ev._major != CORBA_NO_EXCEPTION){ - printf ("Exception: %s\n", CORBA_exception_id (&ev)); - return CORBA_OBJECT_NIL; - } + if (ev._major != CORBA_NO_EXCEPTION){ + g_warning ("Exception: %s\n", CORBA_exception_id (&ev)); + return CORBA_OBJECT_NIL; + } - return calendar; + return calendar; } @@ -69,62 +71,162 @@ calendar_notify (time_t time, CalendarAlarm *which, void *data) { } +static GList * +get_calendar_objects(GnomePilotConduitStandardAbs *conduit) +{ + char *vcalendar_string; + char *error; + GList *retval,*l; + Calendar *cal; + + g_return_val_if_fail(conduit!=NULL,NULL); + + vcalendar_string = + GNOME_Calendar_Repository_get_objects (calendar, &ev); + + cal = calendar_new("Temporary"); + + error = calendar_load_from_memory(cal,vcalendar_string); + if(error != NULL) { + g_warning("Error while converting records"); + g_warning("Error : %s",error); + return NULL; + } + retval = NULL; + for(l=cal->events ; l ; l=l->next) { + g_print("calconduit: duping %d [%s]\n", + ((iCalObject*)l->data)->pilot_id, + ((iCalObject*)l->data)->summary); + retval = g_list_prepend(retval,ical_object_duplicate(l->data)); + } + + /* g_free(vcalendar_string); FIXME: this coredumps, but won't it leak without ? */ + calendar_destroy(cal); + + return retval; +} + +/* + * converts a iCalObject to a CalLocalRecord + */ + static void -local_from_ical(CalLocalRecord **local,iCalObject *obj) { - g_return_if_fail(local!=NULL); - g_return_if_fail(*local!=NULL); - g_return_if_fail(obj!=NULL); +local_record_from_icalobject(CalLocalRecord **local, + iCalObject *obj) +{ + g_return_if_fail(local!=NULL); + g_return_if_fail(*local!=NULL); + g_return_if_fail(obj!=NULL); - (*local)->ical = obj; - (*local)->ID = (*local)->ical->pilot_id; + (*local)->ical = obj; + (*local)->local.ID = (*local)->ical->pilot_id; - g_message("(*local)->Id = %ld",(*local)->ID); - switch((*local)->ical->pilot_status) { - case ICAL_PILOT_SYNC_NONE: (*local)->local.attr = RecordNothing; break; - case ICAL_PILOT_SYNC_MOD: (*local)->local.attr = RecordNew|RecordModified; break; - case ICAL_PILOT_SYNC_DEL: (*local)->local.attr = RecordDeleted; break; - } + g_print("calconduit: (*local)->Id = %ld [%s], status = %d\n", + (*local)->local.ID,obj->summary,(*local)->ical->pilot_status); + + switch((*local)->ical->pilot_status) { + case ICAL_PILOT_SYNC_NONE: + (*local)->local.attr = GnomePilotRecordNothing; + break; + case ICAL_PILOT_SYNC_MOD: + (*local)->local.attr = GnomePilotRecordModified; + break; + case ICAL_PILOT_SYNC_DEL: + (*local)->local.attr = GnomePilotRecordDeleted; + break; + } + + /* Records without a pilot_id are new */ + if((*local)->local.ID == 0) + (*local)->local.attr = GnomePilotRecordNew; - (*local)->local.secret = 0; - if(obj->class!=NULL) - if(strcmp(obj->class,"PRIVATE")==0) - (*local)->local.secret = 1; + (*local)->local.secret = 0; + if(obj->class!=NULL) + if(strcmp(obj->class,"PRIVATE")==0) + (*local)->local.secret = 1; - (*local)->local.archived = 0; + (*local)->local.archived = 0; - /* used by iterations */ - (*local)->list_ptr = NULL; + /* used by iterations */ + (*local)->list_ptr = NULL; } +/* + * Given a PilotRecord, find the matching record in + * the calendar repository. If no match, return NULL + */ static CalLocalRecord * -match_record_from_repository(PilotRecord *remote) { - char *vcal_string; - CalLocalRecord *loc; +find_record_in_repository(GnomePilotConduitStandardAbs *conduit, + PilotRecord *remote) +{ + char *vcal_string; + CalLocalRecord *loc; - g_return_val_if_fail(remote!=NULL,NULL); + g_return_val_if_fail(conduit!=NULL,NULL); + g_return_val_if_fail(remote!=NULL,NULL); - printf ("requesting %ld []\n", remote->ID); + g_message ("calconduit: requesting %ld []\n", remote->ID); - /* FIXME: ehm, who frees this string ? */ - vcal_string = - GNOME_Calendar_Repository_get_object_by_pilot_id (calendar, remote->ID, &ev); + vcal_string = + GNOME_Calendar_Repository_get_object_by_pilot_id (calendar, remote->ID, &ev); - if (ev._major == CORBA_USER_EXCEPTION){ - printf (_("\tObject did not exist\n")); - return NULL; - } else if(ev._major != CORBA_NO_EXCEPTION) { - printf(_("\tError while communicating with calendar server\n")); - CORBA_exception_free(&ev); - return NULL; - } else { - printf ("\tFound\n"); - loc = g_new0(CalLocalRecord,1); - /* memory allocated in new_from_string is freed in free_match */ - local_from_ical(&loc,ical_object_new_from_string (vcal_string)); - return loc; - } - - return NULL; + if (ev._major == CORBA_USER_EXCEPTION){ + g_message ("calconduit: \tObject did not exist\n"); + CORBA_exception_free(&ev); + return NULL; + } else if(ev._major != CORBA_NO_EXCEPTION) { + g_warning(_("\tError while communicating with calendar server\n")); + CORBA_exception_free(&ev); + return NULL; + } else { + g_message ("calconduit: \tFound\n"); + loc = g_new0(CalLocalRecord,1); + /* memory allocated in new_from_string is freed in free_match */ + local_record_from_icalobject(&loc, + ical_object_new_from_string (vcal_string)); + /* g_free(vcal_string); FIXME: this coredumps, but won't it leak without ? */ + return loc; + } + + return NULL; +} + +/* + * updates an given iCalObject in the repository + */ +static void +update_calendar_entry_in_repository(GnomePilotConduitStandardAbs *conduit, + iCalObject *obj) +{ + char *str; + + g_return_if_fail(conduit!=NULL); + g_return_if_fail(obj!=NULL); + + str = calendar_string_from_object (obj); + + GNOME_Calendar_Repository_update_object (calendar, obj->uid, str, &ev); + + if (ev._major == CORBA_USER_EXCEPTION){ + g_message ("calconduit: \tObject did not exist\n"); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return; + } else if(ev._major != CORBA_NO_EXCEPTION) { + g_warning(_("\tError while communicating with calendar server\n")); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return; + } + + free (str); +} + +static iCalObject * +ical_from_remote_record(GnomePilotConduitStandardAbs *conduit, + PilotRecord *remote) +{ + return NULL; } /* Code blatantly stolen from @@ -137,12 +239,12 @@ match_record_from_repository(PilotRecord *remote) { * */ static void -update_record (PilotRecord *remote) +update_record (GnomePilotConduitStandardAbs *conduit, + PilotRecord *remote) { char *vcal_string; iCalObject *obj; int i; - char *str; struct Appointment a; g_return_if_fail(remote!=NULL); @@ -153,8 +255,7 @@ update_record (PilotRecord *remote) g_get_user_name (), a.description ? a.description : ""); - printf ("requesting %ld [%s]\n", remote->ID, a.description); - /* FIXME: ehm, who frees this string ? */ + g_message ("calconduit: requesting %ld [%s]\n", remote->ID, a.description); vcal_string = GNOME_Calendar_Repository_get_object_by_pilot_id (calendar, remote->ID, &ev); if (ev._major == CORBA_USER_EXCEPTION){ @@ -167,25 +268,27 @@ update_record (PilotRecord *remote) obj->related = NULL; obj->pilot_id = remote->ID; obj->pilot_status = ICAL_PILOT_SYNC_NONE; - printf (_("\tObject did not exist, creating a new one\n")); + g_warning (_("\tObject did not exist, creating a new one\n")); + CORBA_exception_free(&ev); } else if(ev._major != CORBA_NO_EXCEPTION) { - printf(_("\tError while communicating with calendar server\n")); - printf("\texception id = %s\n",CORBA_exception_id(&ev)); - CORBA_exception_free(&ev); - ical_object_destroy (obj); - return; + g_warning(_("\tError while communicating with calendar server\n")); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + ical_object_destroy (obj); + free_Appointment(&a); + return; } else { - printf ("\tFound\n"); + g_message ("calconduit: \tFound\n"); ical_object_destroy (obj); 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")); - ical_object_destroy (obj); - return; - } + 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_destroy (obj); + return; + } */ /* @@ -194,14 +297,15 @@ update_record (PilotRecord *remote) if (a.event) { - /* turn day-long events into a full day's appointment */ + /* turn day-long events into a full day's appointment + FIXME: get settings from gnomecal */ a.begin.tm_sec = 0; a.begin.tm_min = 0; - a.begin.tm_hour = 6; + a.begin.tm_hour = 0; a.end.tm_sec = 0; - a.end.tm_min = 0; - a.end.tm_hour = 10; + a.end.tm_min =59; + a.end.tm_hour = 23; } obj->dtstart = mktime (&a.begin); @@ -286,7 +390,7 @@ update_record (PilotRecord *remote) break; default: - g_warning ("Unhandled repeate case"); + g_warning ("Unhandled repeat case"); } if (a.repeatForever) @@ -313,21 +417,20 @@ update_record (PilotRecord *remote) else obj->class = g_strdup ("PUBLIC"); - /* - * Now, convert the in memory iCalObject to a full vCalendar we can send - */ - str = calendar_string_from_object (obj); - - GNOME_Calendar_Repository_update_object (calendar, obj->uid, str, &ev); - free (str); + /* update record on server */ + update_calendar_entry_in_repository(conduit,obj); + /* * Shutdown */ ical_object_destroy (obj); + free_Appointment(&a); + g_free(vcal_string); } +/* static gint load_records(GnomePilotConduit *c) { @@ -346,31 +449,32 @@ load_records(GnomePilotConduit *c) return 0; } +*/ static gint pre_sync(GnomePilotConduit *c, GnomePilotDBInfo *dbi) { - int l; - unsigned char *buf; + int l; + unsigned char *buf; - calendar = CORBA_OBJECT_NIL; - calendar = calendar_server(); - if(calendar == CORBA_OBJECT_NIL) { - return 0; - } + calendar = CORBA_OBJECT_NIL; + calendar = start_calendar_server(GNOME_PILOT_CONDUIT_STANDARD_ABS(c)); + if(calendar == CORBA_OBJECT_NIL) { + return 0; + } - gtk_object_set_data(GTK_OBJECT(c),"dbinfo",dbi); + gtk_object_set_data(GTK_OBJECT(c),"dbinfo",dbi); - load_records(c); + /* load_records(c); */ - buf = (unsigned char*)g_malloc(0xffff); - if((l=dlp_ReadAppBlock(dbi->pilot_socket,dbi->db_handle,0,(unsigned char *)buf,0xffff))<0) { - return 0; - } - unpack_AppointmentAppInfo(&(GET_DATA(c)->ai),buf,l); - g_free(buf); + buf = (unsigned char*)g_malloc(0xffff); + if((l=dlp_ReadAppBlock(dbi->pilot_socket,dbi->db_handle,0,(unsigned char *)buf,0xffff))<0) { + return 0; + } + unpack_AppointmentAppInfo(&(GET_DATA(c)->ai),buf,l); + g_free(buf); - return 1; + return 1; } /** @@ -387,12 +491,12 @@ match_record (GnomePilotConduitStandardAbs *conduit, PilotRecord *remote, gpointer data) { - g_return_val_if_fail(remote!=NULL,0); - g_print ("in match_record\n"); + g_return_val_if_fail(remote!=NULL,0); + g_print ("in match_record\n"); - *local = match_record_from_repository(remote); + *local = find_record_in_repository(conduit,remote); - return 1; + return 1; } /** @@ -413,7 +517,9 @@ free_match (GnomePilotConduitStandardAbs *conduit, return 1; } - +/* + Move to archive and set status to Nothing + */ static gint archive_local (GnomePilotConduitStandardAbs *conduit, CalLocalRecord *local, @@ -424,6 +530,9 @@ archive_local (GnomePilotConduitStandardAbs *conduit, } +/* + Store in archive and set status to Nothing + */ static gint archive_remote (GnomePilotConduitStandardAbs *conduit, CalLocalRecord *local, @@ -434,17 +543,20 @@ archive_remote (GnomePilotConduitStandardAbs *conduit, return 1; } +/* + Store and set status to Nothing + */ static gint store_remote (GnomePilotConduitStandardAbs *conduit, PilotRecord *remote, gpointer data) { - g_print ("entering store_remote\n"); - g_return_val_if_fail(remote!=NULL,0); + g_print ("entering store_remote\n"); + g_return_val_if_fail(remote!=NULL,0); - update_record(remote); + update_record(conduit,remote); - return 1; + return 1; } static gint @@ -456,36 +568,62 @@ clear_status_archive_local (GnomePilotConduitStandardAbs *conduit, return 1; } +/** + * called with *local = NULL, sets *local to first record and returns 1. + * Thereafter repeatedly called with updated *local value, + * updates this to next records and returns 1. + * When last record is reached, sets *local to zero + * and returns 0 + */ + static gint iterate (GnomePilotConduitStandardAbs *conduit, CalLocalRecord **local, gpointer data) { - g_return_val_if_fail(local!=NULL,0); + static GList *events; + + g_return_val_if_fail(local!=NULL,0); - if(*local==NULL) { - g_message("calconduit: beginning iteration"); - if(GET_DATA(conduit)->cal->events!=NULL) { - *local = g_new0(CalLocalRecord,1); - - local_from_ical(local,(iCalObject*)GET_DATA(conduit)->cal->events->data); - (*local)->list_ptr = GET_DATA(conduit)->cal->events; - } else { - g_message("calconduit: no events"); - (*local) = NULL; - } - } else { - g_message("calconduit: continuing iteration"); - if(g_list_next((*local)->list_ptr)==NULL) { - g_message("calconduit: ending"); - g_free((*local)); - (*local) = NULL; /* ends iteration */ - } else { - local_from_ical(local,(iCalObject*)(g_list_next((*local)->list_ptr)->data)); - (*local)->list_ptr = g_list_next((*local)->list_ptr); - } - } - return 1; + if(*local==NULL) { + g_print("calconduit: beginning iteration\n"); + + events = get_calendar_objects(conduit); + + if(events!=NULL) { + g_print("calconduit: iterating over %d records\n",g_list_length(events)); + *local = g_new0(CalLocalRecord,1); + + local_record_from_icalobject(local,(iCalObject*)events->data); + (*local)->list_ptr = events; + } else { + g_print("calconduit: no events\n"); + (*local) = NULL; + } + } else { + g_print("calconduit: continuing iteration\n"); + if(g_list_next((*local)->list_ptr)==NULL) { + GList *l; + + g_print("calconduit: ending\n"); + /** free stuff allocated for iteration */ + g_free((*local)); + + g_print("calconduit: iterated over %d records\n",g_list_length(events)); + for(l=events;l;l=l->next) + ical_object_destroy(l->data); + + g_list_free(events); + + /* ends iteration */ + (*local) = NULL; + return 0; + } else { + local_record_from_icalobject(local,(iCalObject*)(g_list_next((*local)->list_ptr)->data)); + (*local)->list_ptr = g_list_next((*local)->list_ptr); + } + } + return 1; } static gint @@ -495,28 +633,29 @@ iterate_specific (GnomePilotConduitStandardAbs *conduit, gint archived, gpointer data) { - g_return_val_if_fail(local!=NULL,0); + g_return_val_if_fail(local!=NULL,0); - g_print ("entering iterate_specific\n"); - do { - gnome_pilot_conduit_standard_abs_iterate(conduit,(LocalRecord**)local); - if((*local)==NULL) break; - if(archived && ((*local)->local.archived==archived)) break; - if((*local)->local.attr |= flag) break; - } while((*local)!=NULL); + g_print ("entering iterate_specific\n"); + /** iterate until a record meets the criteria */ + while(gnome_pilot_conduit_standard_abs_iterate(conduit,(LocalRecord**)local)) { + if((*local)==NULL) break; + g_print("calconduit: local->attr = %d, flag = %d, & %d\n",(*local)->local.attr,flag,((*local)->local.attr & flag)); + if(archived && ((*local)->local.archived==archived)) break; + if(((*local)->local.attr == flag)) break; + } - return 1; + return (*local)==NULL?0:1; } static gint purge (GnomePilotConduitStandardAbs *conduit, gpointer data) { - g_print ("entering purge\n"); + g_print ("entering purge\n"); - /* HEST, gem posterne her */ + /* HEST, gem posterne her */ - return 1; + return 1; } static gint @@ -531,19 +670,35 @@ set_status (GnomePilotConduitStandardAbs *conduit, local->local.attr = status; switch(status) { - case RecordPending: - case RecordNothing: - local->ical->pilot_status = ICAL_PILOT_SYNC_NONE; - break; - case RecordDeleted: - local->ical->pilot_status = ICAL_PILOT_SYNC_DEL; - break; - case RecordNew: - case RecordModified: - local->ical->pilot_status = ICAL_PILOT_SYNC_MOD; - break; + case GnomePilotRecordPending: + case GnomePilotRecordNothing: + local->ical->pilot_status = ICAL_PILOT_SYNC_NONE; + break; + case GnomePilotRecordDeleted: + local->ical->pilot_status = ICAL_PILOT_SYNC_DEL; + break; + case GnomePilotRecordNew: + case GnomePilotRecordModified: + local->ical->pilot_status = ICAL_PILOT_SYNC_MOD; + break; } - return 0; + GNOME_Calendar_Repository_update_pilot_id(calendar, + local->ical->uid, + local->local.ID, + local->ical->pilot_status, + &ev); + if (ev._major == CORBA_USER_EXCEPTION){ + g_message ("calconduit: \tObject did not exist\n"); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return 0; + } else if(ev._major != CORBA_NO_EXCEPTION) { + g_warning(_("\tError while communicating with calendar server\n")); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return 0; + } + return 1; } static gint @@ -557,6 +712,7 @@ set_archived (GnomePilotConduitStandardAbs *conduit, g_assert(local->ical!=NULL); local->local.archived = archived; + update_calendar_entry_in_repository(conduit,local->ical); /* FIXME: This should move the entry into a speciel calendar file, eg. Archive, or (by config option), simply delete it */ @@ -573,8 +729,25 @@ set_pilot_id (GnomePilotConduitStandardAbs *conduit, g_return_val_if_fail(local!=NULL,0); g_assert(local->ical!=NULL); - local->ID = ID; + local->local.ID = ID; local->ical->pilot_id = ID; + GNOME_Calendar_Repository_update_pilot_id(calendar, + local->ical->uid, + local->local.ID, + local->ical->pilot_status, + &ev); + + if (ev._major == CORBA_USER_EXCEPTION){ + g_message ("calconduit: \tObject did not exist\n"); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return 0; + } else if(ev._major != CORBA_NO_EXCEPTION) { + g_warning(_("\tError while communicating with calendar server\n")); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return 0; + } return 1; } @@ -604,7 +777,13 @@ free_transmit (GnomePilotConduitStandardAbs *conduit, PilotRecord *remote, gpointer data) { + g_return_val_if_fail(local!=NULL,0); + g_return_val_if_fail(remote!=NULL,0); + g_print ("entering free_transmit\n"); + + free_Appointment(local->a); + g_free(remote->record); return 1; } @@ -621,8 +800,62 @@ transmit (GnomePilotConduitStandardAbs *conduit, CalLocalRecord *local, gpointer data) { + PilotRecord *p; + + g_return_val_if_fail(conduit!=NULL,NULL); + g_return_val_if_fail(local!=NULL,NULL); + g_return_val_if_fail(local->a==NULL,NULL); + g_assert(local->ical!=NULL); + g_print ("entering transmit\n"); - return NULL; + p = g_new0(PilotRecord,1); + + p->ID = local->local.ID; + p->attr = local->local.attr; + p->archived = local->local.archived; + p->secret = local->local.secret; + + local->a = g_new0(struct Appointment,1); + + local->a->event = 0; + local->a->begin = *localtime(&local->ical->dtstart); + local->a->end = *localtime(&local->ical->dtend); + + /* g_print("calconduit: new item from %s to %s\n",asctime(&(local->a->begin)),asctime(&(local->a->end))); */ + + local->a->alarm = 0; + local->a->advance = 0; + local->a->advanceUnits = advMinutes; + local->a->repeatType = repeatNone; + local->a->repeatForever = 0; + local->a->repeatEnd = local->a->end; + local->a->repeatFrequency = 0; + local->a->repeatDay = dom1stSun; + local->a->repeatDays[0] = 0; + local->a->repeatDays[1] = 0; + local->a->repeatDays[2] = 0; + local->a->repeatDays[3] = 0; + local->a->repeatDays[4] = 0; + local->a->repeatDays[5] = 0; + local->a->repeatDays[6] = 0; + local->a->repeatWeekstart = 0; + local->a->exceptions = 0; + local->a->exception = NULL; + + g_message("local->ical->comment = %s",local->ical->comment); + g_message("local->ical->summary = %s",local->ical->summary); + + /* STOP: don't replace these with g_strdup, since free_Appointment + uses free to deallocte */ + local->a->note = + local->ical->comment==NULL?NULL:strdup(local->ical->comment); + local->a->description = + local->ical->summary==NULL?NULL:strdup(local->ical->summary); + + p->record = g_new0(char,0xffff); + pack_Appointment(local->a,p->record,sizeof(p->record)); + + return p; } GnomePilotConduit * @@ -676,13 +909,14 @@ conduit_destroy_gpilot_conduit (GnomePilotConduit *conduit) ConduitCfg *cc; ConduitData *cd; - GNOME_Calendar_Repository_done (calendar, &ev); + if(calendar!=CORBA_OBJECT_NIL) + GNOME_Calendar_Repository_done (calendar, &ev); cc = GET_CONFIG(conduit); destroy_configuration(&cc); cd = GET_DATA(conduit); - if(cd->cal!=NULL) calendar_destroy(cd->cal); + g_free(cd); gtk_object_destroy (GTK_OBJECT (conduit)); diff --git a/calendar/conduits/calendar/calendar-conduit.h b/calendar/conduits/calendar/calendar-conduit.h index 2f5cc0c7da..c34457acc5 100644 --- a/calendar/conduits/calendar/calendar-conduit.h +++ b/calendar/conduits/calendar/calendar-conduit.h @@ -13,14 +13,14 @@ typedef struct _CalLocalRecord CalLocalRecord; struct _CalLocalRecord { - /* The stuff from gnome-pilot-conduit-standard-abs.h */ - LocalRecord local; - /* The Pilot ID of the record */ - recordid_t ID; - /* The corresponding iCal object */ - iCalObject *ical; - /* used by iterations, points to a GList element */ - GList *list_ptr; + /* The stuff from gnome-pilot-conduit-standard-abs.h */ + LocalRecord local; + /* The corresponding iCal object */ + iCalObject *ical; + /* used by iterations, points to a GList element */ + GList *list_ptr; + /* pilot-link appointment structure, used for implementing Transmit */ + struct Appointment *a; }; typedef struct _ConduitCfg ConduitCfg; diff --git a/calendar/corba-cal.c b/calendar/corba-cal.c index 8c6246da14..e21ea29f6a 100644 --- a/calendar/corba-cal.c +++ b/calendar/corba-cal.c @@ -83,8 +83,6 @@ cal_repo_get_object_by_pilot_id (PortableServer_Servant servant, char *buffer; CORBA_char *ret; - g_message("entering cal_repo_get_object_by_pilot_id\n"); - obj = calendar_object_find_by_pilot (gcal->cal, pilot_id); if (obj == NULL){ GNOME_Calendar_Repository_NotFound *exn; @@ -93,7 +91,6 @@ cal_repo_get_object_by_pilot_id (PortableServer_Servant servant, CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Calendar_Repository_NotFound, exn); - g_message("leaving cal_repo_get_object_by_pilot_id the hard way\n"); return NULL; } @@ -101,8 +98,6 @@ cal_repo_get_object_by_pilot_id (PortableServer_Servant servant, ret = CORBA_string_dup (buffer); free (buffer); - g_message("leaving cal_repo_get_object_by_pilot_id\n"); - return ret; } diff --git a/calendar/gui/calendar-conduit.c b/calendar/gui/calendar-conduit.c index 929527264f..8f7772bcf4 100644 --- a/calendar/gui/calendar-conduit.c +++ b/calendar/gui/calendar-conduit.c @@ -36,8 +36,7 @@ void conduit_destroy_gpilot_conduit (GnomePilotConduit*); typedef struct _ConduitData ConduitData; struct _ConduitData { - struct AppointmentAppInfo ai; - Calendar *cal; + struct AppointmentAppInfo ai; }; #define GET_DATA(c) ((ConduitData*)gtk_object_get_data(GTK_OBJECT(c),"conduit_data")) @@ -47,19 +46,22 @@ CORBA_Environment ev; CORBA_ORB orb; static GNOME_Calendar_Repository -calendar_server (void) +start_calendar_server (GnomePilotConduitStandardAbs *conduit) { - calendar = goad_server_activate_with_id (NULL, "IDL:GNOME:Calendar:Repository:1.0", - 0, NULL); - if (calendar == CORBA_OBJECT_NIL) - g_error ("Can not communicate with GnomeCalendar server"); + g_return_val_if_fail(conduit!=NULL,CORBA_OBJECT_NIL); + + calendar = goad_server_activate_with_id (NULL, + "IDL:GNOME:Calendar:Repository:1.0", + 0, NULL); + if (calendar == CORBA_OBJECT_NIL) + g_error ("Can not communicate with GnomeCalendar server"); - if (ev._major != CORBA_NO_EXCEPTION){ - printf ("Exception: %s\n", CORBA_exception_id (&ev)); - return CORBA_OBJECT_NIL; - } + if (ev._major != CORBA_NO_EXCEPTION){ + g_warning ("Exception: %s\n", CORBA_exception_id (&ev)); + return CORBA_OBJECT_NIL; + } - return calendar; + return calendar; } @@ -69,62 +71,162 @@ calendar_notify (time_t time, CalendarAlarm *which, void *data) { } +static GList * +get_calendar_objects(GnomePilotConduitStandardAbs *conduit) +{ + char *vcalendar_string; + char *error; + GList *retval,*l; + Calendar *cal; + + g_return_val_if_fail(conduit!=NULL,NULL); + + vcalendar_string = + GNOME_Calendar_Repository_get_objects (calendar, &ev); + + cal = calendar_new("Temporary"); + + error = calendar_load_from_memory(cal,vcalendar_string); + if(error != NULL) { + g_warning("Error while converting records"); + g_warning("Error : %s",error); + return NULL; + } + retval = NULL; + for(l=cal->events ; l ; l=l->next) { + g_print("calconduit: duping %d [%s]\n", + ((iCalObject*)l->data)->pilot_id, + ((iCalObject*)l->data)->summary); + retval = g_list_prepend(retval,ical_object_duplicate(l->data)); + } + + /* g_free(vcalendar_string); FIXME: this coredumps, but won't it leak without ? */ + calendar_destroy(cal); + + return retval; +} + +/* + * converts a iCalObject to a CalLocalRecord + */ + static void -local_from_ical(CalLocalRecord **local,iCalObject *obj) { - g_return_if_fail(local!=NULL); - g_return_if_fail(*local!=NULL); - g_return_if_fail(obj!=NULL); +local_record_from_icalobject(CalLocalRecord **local, + iCalObject *obj) +{ + g_return_if_fail(local!=NULL); + g_return_if_fail(*local!=NULL); + g_return_if_fail(obj!=NULL); - (*local)->ical = obj; - (*local)->ID = (*local)->ical->pilot_id; + (*local)->ical = obj; + (*local)->local.ID = (*local)->ical->pilot_id; - g_message("(*local)->Id = %ld",(*local)->ID); - switch((*local)->ical->pilot_status) { - case ICAL_PILOT_SYNC_NONE: (*local)->local.attr = RecordNothing; break; - case ICAL_PILOT_SYNC_MOD: (*local)->local.attr = RecordNew|RecordModified; break; - case ICAL_PILOT_SYNC_DEL: (*local)->local.attr = RecordDeleted; break; - } + g_print("calconduit: (*local)->Id = %ld [%s], status = %d\n", + (*local)->local.ID,obj->summary,(*local)->ical->pilot_status); + + switch((*local)->ical->pilot_status) { + case ICAL_PILOT_SYNC_NONE: + (*local)->local.attr = GnomePilotRecordNothing; + break; + case ICAL_PILOT_SYNC_MOD: + (*local)->local.attr = GnomePilotRecordModified; + break; + case ICAL_PILOT_SYNC_DEL: + (*local)->local.attr = GnomePilotRecordDeleted; + break; + } + + /* Records without a pilot_id are new */ + if((*local)->local.ID == 0) + (*local)->local.attr = GnomePilotRecordNew; - (*local)->local.secret = 0; - if(obj->class!=NULL) - if(strcmp(obj->class,"PRIVATE")==0) - (*local)->local.secret = 1; + (*local)->local.secret = 0; + if(obj->class!=NULL) + if(strcmp(obj->class,"PRIVATE")==0) + (*local)->local.secret = 1; - (*local)->local.archived = 0; + (*local)->local.archived = 0; - /* used by iterations */ - (*local)->list_ptr = NULL; + /* used by iterations */ + (*local)->list_ptr = NULL; } +/* + * Given a PilotRecord, find the matching record in + * the calendar repository. If no match, return NULL + */ static CalLocalRecord * -match_record_from_repository(PilotRecord *remote) { - char *vcal_string; - CalLocalRecord *loc; +find_record_in_repository(GnomePilotConduitStandardAbs *conduit, + PilotRecord *remote) +{ + char *vcal_string; + CalLocalRecord *loc; - g_return_val_if_fail(remote!=NULL,NULL); + g_return_val_if_fail(conduit!=NULL,NULL); + g_return_val_if_fail(remote!=NULL,NULL); - printf ("requesting %ld []\n", remote->ID); + g_message ("calconduit: requesting %ld []\n", remote->ID); - /* FIXME: ehm, who frees this string ? */ - vcal_string = - GNOME_Calendar_Repository_get_object_by_pilot_id (calendar, remote->ID, &ev); + vcal_string = + GNOME_Calendar_Repository_get_object_by_pilot_id (calendar, remote->ID, &ev); - if (ev._major == CORBA_USER_EXCEPTION){ - printf (_("\tObject did not exist\n")); - return NULL; - } else if(ev._major != CORBA_NO_EXCEPTION) { - printf(_("\tError while communicating with calendar server\n")); - CORBA_exception_free(&ev); - return NULL; - } else { - printf ("\tFound\n"); - loc = g_new0(CalLocalRecord,1); - /* memory allocated in new_from_string is freed in free_match */ - local_from_ical(&loc,ical_object_new_from_string (vcal_string)); - return loc; - } - - return NULL; + if (ev._major == CORBA_USER_EXCEPTION){ + g_message ("calconduit: \tObject did not exist\n"); + CORBA_exception_free(&ev); + return NULL; + } else if(ev._major != CORBA_NO_EXCEPTION) { + g_warning(_("\tError while communicating with calendar server\n")); + CORBA_exception_free(&ev); + return NULL; + } else { + g_message ("calconduit: \tFound\n"); + loc = g_new0(CalLocalRecord,1); + /* memory allocated in new_from_string is freed in free_match */ + local_record_from_icalobject(&loc, + ical_object_new_from_string (vcal_string)); + /* g_free(vcal_string); FIXME: this coredumps, but won't it leak without ? */ + return loc; + } + + return NULL; +} + +/* + * updates an given iCalObject in the repository + */ +static void +update_calendar_entry_in_repository(GnomePilotConduitStandardAbs *conduit, + iCalObject *obj) +{ + char *str; + + g_return_if_fail(conduit!=NULL); + g_return_if_fail(obj!=NULL); + + str = calendar_string_from_object (obj); + + GNOME_Calendar_Repository_update_object (calendar, obj->uid, str, &ev); + + if (ev._major == CORBA_USER_EXCEPTION){ + g_message ("calconduit: \tObject did not exist\n"); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return; + } else if(ev._major != CORBA_NO_EXCEPTION) { + g_warning(_("\tError while communicating with calendar server\n")); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return; + } + + free (str); +} + +static iCalObject * +ical_from_remote_record(GnomePilotConduitStandardAbs *conduit, + PilotRecord *remote) +{ + return NULL; } /* Code blatantly stolen from @@ -137,12 +239,12 @@ match_record_from_repository(PilotRecord *remote) { * */ static void -update_record (PilotRecord *remote) +update_record (GnomePilotConduitStandardAbs *conduit, + PilotRecord *remote) { char *vcal_string; iCalObject *obj; int i; - char *str; struct Appointment a; g_return_if_fail(remote!=NULL); @@ -153,8 +255,7 @@ update_record (PilotRecord *remote) g_get_user_name (), a.description ? a.description : ""); - printf ("requesting %ld [%s]\n", remote->ID, a.description); - /* FIXME: ehm, who frees this string ? */ + g_message ("calconduit: requesting %ld [%s]\n", remote->ID, a.description); vcal_string = GNOME_Calendar_Repository_get_object_by_pilot_id (calendar, remote->ID, &ev); if (ev._major == CORBA_USER_EXCEPTION){ @@ -167,25 +268,27 @@ update_record (PilotRecord *remote) obj->related = NULL; obj->pilot_id = remote->ID; obj->pilot_status = ICAL_PILOT_SYNC_NONE; - printf (_("\tObject did not exist, creating a new one\n")); + g_warning (_("\tObject did not exist, creating a new one\n")); + CORBA_exception_free(&ev); } else if(ev._major != CORBA_NO_EXCEPTION) { - printf(_("\tError while communicating with calendar server\n")); - printf("\texception id = %s\n",CORBA_exception_id(&ev)); - CORBA_exception_free(&ev); - ical_object_destroy (obj); - return; + g_warning(_("\tError while communicating with calendar server\n")); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + ical_object_destroy (obj); + free_Appointment(&a); + return; } else { - printf ("\tFound\n"); + g_message ("calconduit: \tFound\n"); ical_object_destroy (obj); 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")); - ical_object_destroy (obj); - return; - } + 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_destroy (obj); + return; + } */ /* @@ -194,14 +297,15 @@ update_record (PilotRecord *remote) if (a.event) { - /* turn day-long events into a full day's appointment */ + /* turn day-long events into a full day's appointment + FIXME: get settings from gnomecal */ a.begin.tm_sec = 0; a.begin.tm_min = 0; - a.begin.tm_hour = 6; + a.begin.tm_hour = 0; a.end.tm_sec = 0; - a.end.tm_min = 0; - a.end.tm_hour = 10; + a.end.tm_min =59; + a.end.tm_hour = 23; } obj->dtstart = mktime (&a.begin); @@ -286,7 +390,7 @@ update_record (PilotRecord *remote) break; default: - g_warning ("Unhandled repeate case"); + g_warning ("Unhandled repeat case"); } if (a.repeatForever) @@ -313,21 +417,20 @@ update_record (PilotRecord *remote) else obj->class = g_strdup ("PUBLIC"); - /* - * Now, convert the in memory iCalObject to a full vCalendar we can send - */ - str = calendar_string_from_object (obj); - - GNOME_Calendar_Repository_update_object (calendar, obj->uid, str, &ev); - free (str); + /* update record on server */ + update_calendar_entry_in_repository(conduit,obj); + /* * Shutdown */ ical_object_destroy (obj); + free_Appointment(&a); + g_free(vcal_string); } +/* static gint load_records(GnomePilotConduit *c) { @@ -346,31 +449,32 @@ load_records(GnomePilotConduit *c) return 0; } +*/ static gint pre_sync(GnomePilotConduit *c, GnomePilotDBInfo *dbi) { - int l; - unsigned char *buf; + int l; + unsigned char *buf; - calendar = CORBA_OBJECT_NIL; - calendar = calendar_server(); - if(calendar == CORBA_OBJECT_NIL) { - return 0; - } + calendar = CORBA_OBJECT_NIL; + calendar = start_calendar_server(GNOME_PILOT_CONDUIT_STANDARD_ABS(c)); + if(calendar == CORBA_OBJECT_NIL) { + return 0; + } - gtk_object_set_data(GTK_OBJECT(c),"dbinfo",dbi); + gtk_object_set_data(GTK_OBJECT(c),"dbinfo",dbi); - load_records(c); + /* load_records(c); */ - buf = (unsigned char*)g_malloc(0xffff); - if((l=dlp_ReadAppBlock(dbi->pilot_socket,dbi->db_handle,0,(unsigned char *)buf,0xffff))<0) { - return 0; - } - unpack_AppointmentAppInfo(&(GET_DATA(c)->ai),buf,l); - g_free(buf); + buf = (unsigned char*)g_malloc(0xffff); + if((l=dlp_ReadAppBlock(dbi->pilot_socket,dbi->db_handle,0,(unsigned char *)buf,0xffff))<0) { + return 0; + } + unpack_AppointmentAppInfo(&(GET_DATA(c)->ai),buf,l); + g_free(buf); - return 1; + return 1; } /** @@ -387,12 +491,12 @@ match_record (GnomePilotConduitStandardAbs *conduit, PilotRecord *remote, gpointer data) { - g_return_val_if_fail(remote!=NULL,0); - g_print ("in match_record\n"); + g_return_val_if_fail(remote!=NULL,0); + g_print ("in match_record\n"); - *local = match_record_from_repository(remote); + *local = find_record_in_repository(conduit,remote); - return 1; + return 1; } /** @@ -413,7 +517,9 @@ free_match (GnomePilotConduitStandardAbs *conduit, return 1; } - +/* + Move to archive and set status to Nothing + */ static gint archive_local (GnomePilotConduitStandardAbs *conduit, CalLocalRecord *local, @@ -424,6 +530,9 @@ archive_local (GnomePilotConduitStandardAbs *conduit, } +/* + Store in archive and set status to Nothing + */ static gint archive_remote (GnomePilotConduitStandardAbs *conduit, CalLocalRecord *local, @@ -434,17 +543,20 @@ archive_remote (GnomePilotConduitStandardAbs *conduit, return 1; } +/* + Store and set status to Nothing + */ static gint store_remote (GnomePilotConduitStandardAbs *conduit, PilotRecord *remote, gpointer data) { - g_print ("entering store_remote\n"); - g_return_val_if_fail(remote!=NULL,0); + g_print ("entering store_remote\n"); + g_return_val_if_fail(remote!=NULL,0); - update_record(remote); + update_record(conduit,remote); - return 1; + return 1; } static gint @@ -456,36 +568,62 @@ clear_status_archive_local (GnomePilotConduitStandardAbs *conduit, return 1; } +/** + * called with *local = NULL, sets *local to first record and returns 1. + * Thereafter repeatedly called with updated *local value, + * updates this to next records and returns 1. + * When last record is reached, sets *local to zero + * and returns 0 + */ + static gint iterate (GnomePilotConduitStandardAbs *conduit, CalLocalRecord **local, gpointer data) { - g_return_val_if_fail(local!=NULL,0); + static GList *events; + + g_return_val_if_fail(local!=NULL,0); - if(*local==NULL) { - g_message("calconduit: beginning iteration"); - if(GET_DATA(conduit)->cal->events!=NULL) { - *local = g_new0(CalLocalRecord,1); - - local_from_ical(local,(iCalObject*)GET_DATA(conduit)->cal->events->data); - (*local)->list_ptr = GET_DATA(conduit)->cal->events; - } else { - g_message("calconduit: no events"); - (*local) = NULL; - } - } else { - g_message("calconduit: continuing iteration"); - if(g_list_next((*local)->list_ptr)==NULL) { - g_message("calconduit: ending"); - g_free((*local)); - (*local) = NULL; /* ends iteration */ - } else { - local_from_ical(local,(iCalObject*)(g_list_next((*local)->list_ptr)->data)); - (*local)->list_ptr = g_list_next((*local)->list_ptr); - } - } - return 1; + if(*local==NULL) { + g_print("calconduit: beginning iteration\n"); + + events = get_calendar_objects(conduit); + + if(events!=NULL) { + g_print("calconduit: iterating over %d records\n",g_list_length(events)); + *local = g_new0(CalLocalRecord,1); + + local_record_from_icalobject(local,(iCalObject*)events->data); + (*local)->list_ptr = events; + } else { + g_print("calconduit: no events\n"); + (*local) = NULL; + } + } else { + g_print("calconduit: continuing iteration\n"); + if(g_list_next((*local)->list_ptr)==NULL) { + GList *l; + + g_print("calconduit: ending\n"); + /** free stuff allocated for iteration */ + g_free((*local)); + + g_print("calconduit: iterated over %d records\n",g_list_length(events)); + for(l=events;l;l=l->next) + ical_object_destroy(l->data); + + g_list_free(events); + + /* ends iteration */ + (*local) = NULL; + return 0; + } else { + local_record_from_icalobject(local,(iCalObject*)(g_list_next((*local)->list_ptr)->data)); + (*local)->list_ptr = g_list_next((*local)->list_ptr); + } + } + return 1; } static gint @@ -495,28 +633,29 @@ iterate_specific (GnomePilotConduitStandardAbs *conduit, gint archived, gpointer data) { - g_return_val_if_fail(local!=NULL,0); + g_return_val_if_fail(local!=NULL,0); - g_print ("entering iterate_specific\n"); - do { - gnome_pilot_conduit_standard_abs_iterate(conduit,(LocalRecord**)local); - if((*local)==NULL) break; - if(archived && ((*local)->local.archived==archived)) break; - if((*local)->local.attr |= flag) break; - } while((*local)!=NULL); + g_print ("entering iterate_specific\n"); + /** iterate until a record meets the criteria */ + while(gnome_pilot_conduit_standard_abs_iterate(conduit,(LocalRecord**)local)) { + if((*local)==NULL) break; + g_print("calconduit: local->attr = %d, flag = %d, & %d\n",(*local)->local.attr,flag,((*local)->local.attr & flag)); + if(archived && ((*local)->local.archived==archived)) break; + if(((*local)->local.attr == flag)) break; + } - return 1; + return (*local)==NULL?0:1; } static gint purge (GnomePilotConduitStandardAbs *conduit, gpointer data) { - g_print ("entering purge\n"); + g_print ("entering purge\n"); - /* HEST, gem posterne her */ + /* HEST, gem posterne her */ - return 1; + return 1; } static gint @@ -531,19 +670,35 @@ set_status (GnomePilotConduitStandardAbs *conduit, local->local.attr = status; switch(status) { - case RecordPending: - case RecordNothing: - local->ical->pilot_status = ICAL_PILOT_SYNC_NONE; - break; - case RecordDeleted: - local->ical->pilot_status = ICAL_PILOT_SYNC_DEL; - break; - case RecordNew: - case RecordModified: - local->ical->pilot_status = ICAL_PILOT_SYNC_MOD; - break; + case GnomePilotRecordPending: + case GnomePilotRecordNothing: + local->ical->pilot_status = ICAL_PILOT_SYNC_NONE; + break; + case GnomePilotRecordDeleted: + local->ical->pilot_status = ICAL_PILOT_SYNC_DEL; + break; + case GnomePilotRecordNew: + case GnomePilotRecordModified: + local->ical->pilot_status = ICAL_PILOT_SYNC_MOD; + break; } - return 0; + GNOME_Calendar_Repository_update_pilot_id(calendar, + local->ical->uid, + local->local.ID, + local->ical->pilot_status, + &ev); + if (ev._major == CORBA_USER_EXCEPTION){ + g_message ("calconduit: \tObject did not exist\n"); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return 0; + } else if(ev._major != CORBA_NO_EXCEPTION) { + g_warning(_("\tError while communicating with calendar server\n")); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return 0; + } + return 1; } static gint @@ -557,6 +712,7 @@ set_archived (GnomePilotConduitStandardAbs *conduit, g_assert(local->ical!=NULL); local->local.archived = archived; + update_calendar_entry_in_repository(conduit,local->ical); /* FIXME: This should move the entry into a speciel calendar file, eg. Archive, or (by config option), simply delete it */ @@ -573,8 +729,25 @@ set_pilot_id (GnomePilotConduitStandardAbs *conduit, g_return_val_if_fail(local!=NULL,0); g_assert(local->ical!=NULL); - local->ID = ID; + local->local.ID = ID; local->ical->pilot_id = ID; + GNOME_Calendar_Repository_update_pilot_id(calendar, + local->ical->uid, + local->local.ID, + local->ical->pilot_status, + &ev); + + if (ev._major == CORBA_USER_EXCEPTION){ + g_message ("calconduit: \tObject did not exist\n"); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return 0; + } else if(ev._major != CORBA_NO_EXCEPTION) { + g_warning(_("\tError while communicating with calendar server\n")); + g_warning("\texception id = %s\n",CORBA_exception_id(&ev)); + CORBA_exception_free(&ev); + return 0; + } return 1; } @@ -604,7 +777,13 @@ free_transmit (GnomePilotConduitStandardAbs *conduit, PilotRecord *remote, gpointer data) { + g_return_val_if_fail(local!=NULL,0); + g_return_val_if_fail(remote!=NULL,0); + g_print ("entering free_transmit\n"); + + free_Appointment(local->a); + g_free(remote->record); return 1; } @@ -621,8 +800,62 @@ transmit (GnomePilotConduitStandardAbs *conduit, CalLocalRecord *local, gpointer data) { + PilotRecord *p; + + g_return_val_if_fail(conduit!=NULL,NULL); + g_return_val_if_fail(local!=NULL,NULL); + g_return_val_if_fail(local->a==NULL,NULL); + g_assert(local->ical!=NULL); + g_print ("entering transmit\n"); - return NULL; + p = g_new0(PilotRecord,1); + + p->ID = local->local.ID; + p->attr = local->local.attr; + p->archived = local->local.archived; + p->secret = local->local.secret; + + local->a = g_new0(struct Appointment,1); + + local->a->event = 0; + local->a->begin = *localtime(&local->ical->dtstart); + local->a->end = *localtime(&local->ical->dtend); + + /* g_print("calconduit: new item from %s to %s\n",asctime(&(local->a->begin)),asctime(&(local->a->end))); */ + + local->a->alarm = 0; + local->a->advance = 0; + local->a->advanceUnits = advMinutes; + local->a->repeatType = repeatNone; + local->a->repeatForever = 0; + local->a->repeatEnd = local->a->end; + local->a->repeatFrequency = 0; + local->a->repeatDay = dom1stSun; + local->a->repeatDays[0] = 0; + local->a->repeatDays[1] = 0; + local->a->repeatDays[2] = 0; + local->a->repeatDays[3] = 0; + local->a->repeatDays[4] = 0; + local->a->repeatDays[5] = 0; + local->a->repeatDays[6] = 0; + local->a->repeatWeekstart = 0; + local->a->exceptions = 0; + local->a->exception = NULL; + + g_message("local->ical->comment = %s",local->ical->comment); + g_message("local->ical->summary = %s",local->ical->summary); + + /* STOP: don't replace these with g_strdup, since free_Appointment + uses free to deallocte */ + local->a->note = + local->ical->comment==NULL?NULL:strdup(local->ical->comment); + local->a->description = + local->ical->summary==NULL?NULL:strdup(local->ical->summary); + + p->record = g_new0(char,0xffff); + pack_Appointment(local->a,p->record,sizeof(p->record)); + + return p; } GnomePilotConduit * @@ -676,13 +909,14 @@ conduit_destroy_gpilot_conduit (GnomePilotConduit *conduit) ConduitCfg *cc; ConduitData *cd; - GNOME_Calendar_Repository_done (calendar, &ev); + if(calendar!=CORBA_OBJECT_NIL) + GNOME_Calendar_Repository_done (calendar, &ev); cc = GET_CONFIG(conduit); destroy_configuration(&cc); cd = GET_DATA(conduit); - if(cd->cal!=NULL) calendar_destroy(cd->cal); + g_free(cd); gtk_object_destroy (GTK_OBJECT (conduit)); diff --git a/calendar/gui/calendar-conduit.h b/calendar/gui/calendar-conduit.h index 2f5cc0c7da..c34457acc5 100644 --- a/calendar/gui/calendar-conduit.h +++ b/calendar/gui/calendar-conduit.h @@ -13,14 +13,14 @@ typedef struct _CalLocalRecord CalLocalRecord; struct _CalLocalRecord { - /* The stuff from gnome-pilot-conduit-standard-abs.h */ - LocalRecord local; - /* The Pilot ID of the record */ - recordid_t ID; - /* The corresponding iCal object */ - iCalObject *ical; - /* used by iterations, points to a GList element */ - GList *list_ptr; + /* The stuff from gnome-pilot-conduit-standard-abs.h */ + LocalRecord local; + /* The corresponding iCal object */ + iCalObject *ical; + /* used by iterations, points to a GList element */ + GList *list_ptr; + /* pilot-link appointment structure, used for implementing Transmit */ + struct Appointment *a; }; typedef struct _ConduitCfg ConduitCfg; diff --git a/calendar/gui/corba-cal.c b/calendar/gui/corba-cal.c index 8c6246da14..e21ea29f6a 100644 --- a/calendar/gui/corba-cal.c +++ b/calendar/gui/corba-cal.c @@ -83,8 +83,6 @@ cal_repo_get_object_by_pilot_id (PortableServer_Servant servant, char *buffer; CORBA_char *ret; - g_message("entering cal_repo_get_object_by_pilot_id\n"); - obj = calendar_object_find_by_pilot (gcal->cal, pilot_id); if (obj == NULL){ GNOME_Calendar_Repository_NotFound *exn; @@ -93,7 +91,6 @@ cal_repo_get_object_by_pilot_id (PortableServer_Servant servant, CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Calendar_Repository_NotFound, exn); - g_message("leaving cal_repo_get_object_by_pilot_id the hard way\n"); return NULL; } @@ -101,8 +98,6 @@ cal_repo_get_object_by_pilot_id (PortableServer_Servant servant, ret = CORBA_string_dup (buffer); free (buffer); - g_message("leaving cal_repo_get_object_by_pilot_id\n"); - return ret; } -- cgit v1.2.3