2 * This program is free software; you can redistribute it and/or modify it
3 * under the terms of the GNU Lesser General Public License as published by
4 * the Free Software Foundation.
6 * This program is distributed in the hope that it will be useful, but
7 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
8 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
11 * You should have received a copy of the GNU Lesser General Public License
12 * along with this program; if not, see <http://www.gnu.org/licenses/>.
16 * JP Rosevear <jpr@ximian.com>
18 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
22 #include "evolution-config.h"
26 #include "e-meeting-utils.h"
27 #include "e-meeting-attendee.h"
29 #define E_MEETING_ATTENDEE_GET_PRIVATE(obj) \
30 (G_TYPE_INSTANCE_GET_PRIVATE \
31 ((obj), E_TYPE_MEETING_ATTENDEE, EMeetingAttendeePrivate))
33 struct _EMeetingAttendeePrivate
{
38 icalparameter_cutype cutype
;
39 icalparameter_role role
;
46 icalparameter_partstat status
;
52 EMeetingAttendeeEditLevel edit_level
;
54 gboolean has_calendar_info
;
57 gboolean busy_periods_sorted
;
59 EMeetingTime busy_periods_start
;
60 EMeetingTime busy_periods_end
;
61 gboolean start_busy_range_set
;
62 gboolean end_busy_range_set
;
64 gint longest_period_in_days
;
71 static guint signals
[LAST_SIGNAL
];
73 static void e_meeting_attendee_finalize (GObject
*obj
);
75 G_DEFINE_TYPE (EMeetingAttendee
, e_meeting_attendee
, G_TYPE_OBJECT
)
78 string_test (gchar
*string
)
80 return string
!= NULL
? string
: g_strdup ("");
84 string_is_set (gchar
*string
)
86 if (string
!= NULL
&& *string
!= '\0')
93 busy_periods_array_clear_func (gpointer data
)
95 EMeetingFreeBusyPeriod
*period
= (EMeetingFreeBusyPeriod
*) data
;
97 /* We're expected to clear the data segment,
98 * but not deallocate the segment itself. The
99 * XFB data possibly attached to the
100 * EMeetingFreeBusyPeriod requires special
101 * care when removing elements from the GArray
103 e_meeting_xfb_data_clear (&(period
->xfb
));
107 notify_changed (EMeetingAttendee
*ia
)
109 g_signal_emit_by_name (ia
, "changed");
113 e_meeting_attendee_finalize (GObject
*object
)
115 EMeetingAttendeePrivate
*priv
;
117 priv
= E_MEETING_ATTENDEE_GET_PRIVATE (object
);
119 g_free (priv
->address
);
120 g_free (priv
->member
);
121 g_free (priv
->fburi
);
123 g_free (priv
->delto
);
124 g_free (priv
->delfrom
);
126 g_free (priv
->sentby
);
128 g_free (priv
->language
);
130 g_array_free (priv
->busy_periods
, TRUE
);
132 /* Chain up to parent's finalize() method. */
133 G_OBJECT_CLASS (e_meeting_attendee_parent_class
)->finalize (object
);
137 e_meeting_attendee_class_init (EMeetingAttendeeClass
*class)
139 GObjectClass
*object_class
;
141 g_type_class_add_private (class, sizeof (EMeetingAttendeePrivate
));
143 object_class
= G_OBJECT_CLASS (class);
144 object_class
->finalize
= e_meeting_attendee_finalize
;
146 signals
[CHANGED
] = g_signal_new (
148 G_TYPE_FROM_CLASS (class),
150 G_STRUCT_OFFSET (EMeetingAttendeeClass
, changed
),
152 g_cclosure_marshal_VOID__VOID
,
157 e_meeting_attendee_init (EMeetingAttendee
*ia
)
159 ia
->priv
= E_MEETING_ATTENDEE_GET_PRIVATE (ia
);
161 ia
->priv
->address
= string_test (NULL
);
162 ia
->priv
->member
= string_test (NULL
);
164 ia
->priv
->cutype
= ICAL_CUTYPE_NONE
;
165 ia
->priv
->role
= ICAL_ROLE_NONE
;
167 ia
->priv
->rsvp
= FALSE
;
169 ia
->priv
->delto
= string_test (NULL
);
170 ia
->priv
->delfrom
= string_test (NULL
);
172 ia
->priv
->status
= ICAL_PARTSTAT_NONE
;
174 ia
->priv
->sentby
= string_test (NULL
);
175 ia
->priv
->cn
= string_test (NULL
);
176 ia
->priv
->language
= string_test (NULL
);
178 ia
->priv
->edit_level
= E_MEETING_ATTENDEE_EDIT_FULL
;
179 ia
->priv
->has_calendar_info
= FALSE
;
181 ia
->priv
->busy_periods
= g_array_new (FALSE
, FALSE
, sizeof (EMeetingFreeBusyPeriod
));
182 g_array_set_clear_func (ia
->priv
->busy_periods
, busy_periods_array_clear_func
);
183 ia
->priv
->busy_periods_sorted
= FALSE
;
185 g_date_clear (&ia
->priv
->busy_periods_start
.date
, 1);
186 ia
->priv
->busy_periods_start
.hour
= 0;
187 ia
->priv
->busy_periods_start
.minute
= 0;
189 g_date_clear (&ia
->priv
->busy_periods_end
.date
, 1);
190 ia
->priv
->busy_periods_end
.hour
= 0;
191 ia
->priv
->busy_periods_end
.minute
= 0;
193 ia
->priv
->start_busy_range_set
= FALSE
;
194 ia
->priv
->end_busy_range_set
= FALSE
;
196 ia
->priv
->longest_period_in_days
= 0;
200 e_meeting_attendee_new (void)
202 return g_object_new (E_TYPE_MEETING_ATTENDEE
, NULL
);
206 e_meeting_attendee_new_from_e_cal_component_attendee (ECalComponentAttendee
*ca
)
208 EMeetingAttendee
*ia
;
210 ia
= E_MEETING_ATTENDEE (g_object_new (E_TYPE_MEETING_ATTENDEE
, NULL
));
212 e_meeting_attendee_set_address (ia
, g_strdup (ca
->value
));
213 e_meeting_attendee_set_member (ia
, g_strdup (ca
->member
));
214 e_meeting_attendee_set_cutype (ia
, ca
->cutype
);
215 e_meeting_attendee_set_role (ia
, ca
->role
);
216 e_meeting_attendee_set_status (ia
, ca
->status
);
217 e_meeting_attendee_set_rsvp (ia
, ca
->rsvp
);
218 e_meeting_attendee_set_delto (ia
, g_strdup (ca
->delto
));
219 e_meeting_attendee_set_delfrom (ia
, g_strdup (ca
->delfrom
));
220 e_meeting_attendee_set_sentby (ia
, g_strdup (ca
->sentby
));
221 e_meeting_attendee_set_cn (ia
, g_strdup (ca
->cn
));
222 e_meeting_attendee_set_language (ia
, g_strdup (ca
->language
));
224 return G_OBJECT (ia
);
227 ECalComponentAttendee
*
228 e_meeting_attendee_as_e_cal_component_attendee (EMeetingAttendee
*ia
)
230 EMeetingAttendeePrivate
*priv
;
231 ECalComponentAttendee
*ca
;
235 ca
= g_new0 (ECalComponentAttendee
, 1);
237 ca
->value
= priv
->address
;
238 ca
->member
= string_is_set (priv
->member
) ? priv
->member
: NULL
;
239 ca
->cutype
= priv
->cutype
;
240 ca
->role
= priv
->role
;
241 ca
->status
= priv
->status
;
242 ca
->rsvp
= priv
->rsvp
;
243 ca
->delto
= string_is_set (priv
->delto
) ? priv
->delto
: NULL
;
244 ca
->delfrom
= string_is_set (priv
->delfrom
) ? priv
->delfrom
: NULL
;
245 ca
->sentby
= string_is_set (priv
->sentby
) ? priv
->sentby
: NULL
;
246 ca
->cn
= string_is_set (priv
->cn
) ? priv
->cn
: NULL
;
247 ca
->language
= string_is_set (priv
->language
) ? priv
->language
: NULL
;
253 e_meeting_attendee_get_fburi (EMeetingAttendee
*ia
)
255 EMeetingAttendeePrivate
*priv
;
263 e_meeting_attendee_set_fburi (EMeetingAttendee
*ia
,
266 EMeetingAttendeePrivate
*priv
;
270 if (priv
->fburi
!= NULL
)
271 g_free (priv
->fburi
);
273 priv
->fburi
= string_test (fburi
);
279 e_meeting_attendee_get_address (EMeetingAttendee
*ia
)
281 EMeetingAttendeePrivate
*priv
;
285 return priv
->address
;
289 e_meeting_attendee_set_address (EMeetingAttendee
*ia
,
292 EMeetingAttendeePrivate
*priv
;
296 if (priv
->address
!= NULL
)
297 g_free (priv
->address
);
299 priv
->address
= string_test (address
);
305 e_meeting_attendee_is_set_address (EMeetingAttendee
*ia
)
307 EMeetingAttendeePrivate
*priv
;
311 return string_is_set (priv
->address
);
315 e_meeting_attendee_get_member (EMeetingAttendee
*ia
)
317 EMeetingAttendeePrivate
*priv
;
325 e_meeting_attendee_set_member (EMeetingAttendee
*ia
,
328 EMeetingAttendeePrivate
*priv
;
332 if (priv
->member
!= NULL
)
333 g_free (priv
->member
);
335 priv
->member
= string_test (member
);
341 e_meeting_attendee_is_set_member (EMeetingAttendee
*ia
)
343 EMeetingAttendeePrivate
*priv
;
347 return string_is_set (priv
->member
);
351 e_meeting_attendee_get_cutype (EMeetingAttendee
*ia
)
353 EMeetingAttendeePrivate
*priv
;
361 e_meeting_attendee_set_cutype (EMeetingAttendee
*ia
,
362 icalparameter_cutype cutype
)
364 EMeetingAttendeePrivate
*priv
;
368 priv
->cutype
= cutype
;
374 e_meeting_attendee_get_role (EMeetingAttendee
*ia
)
376 EMeetingAttendeePrivate
*priv
;
384 e_meeting_attendee_set_role (EMeetingAttendee
*ia
,
385 icalparameter_role role
)
387 EMeetingAttendeePrivate
*priv
;
397 e_meeting_attendee_get_rsvp (EMeetingAttendee
*ia
)
399 EMeetingAttendeePrivate
*priv
;
407 e_meeting_attendee_set_rsvp (EMeetingAttendee
*ia
,
410 EMeetingAttendeePrivate
*priv
;
420 e_meeting_attendee_get_delto (EMeetingAttendee
*ia
)
422 EMeetingAttendeePrivate
*priv
;
430 e_meeting_attendee_set_delto (EMeetingAttendee
*ia
,
433 EMeetingAttendeePrivate
*priv
;
437 if (priv
->delto
!= NULL
)
438 g_free (priv
->delto
);
440 priv
->delto
= string_test (delto
);
446 e_meeting_attendee_is_set_delto (EMeetingAttendee
*ia
)
448 EMeetingAttendeePrivate
*priv
;
452 return string_is_set (priv
->delto
);
456 e_meeting_attendee_get_delfrom (EMeetingAttendee
*ia
)
458 EMeetingAttendeePrivate
*priv
;
462 return priv
->delfrom
;
466 e_meeting_attendee_set_delfrom (EMeetingAttendee
*ia
,
469 EMeetingAttendeePrivate
*priv
;
473 if (priv
->delfrom
!= NULL
)
474 g_free (priv
->delfrom
);
476 priv
->delfrom
= string_test (delfrom
);
482 e_meeting_attendee_is_set_delfrom (EMeetingAttendee
*ia
)
484 EMeetingAttendeePrivate
*priv
;
488 return string_is_set (priv
->delfrom
);
491 icalparameter_partstat
492 e_meeting_attendee_get_status (EMeetingAttendee
*ia
)
494 EMeetingAttendeePrivate
*priv
;
502 e_meeting_attendee_set_status (EMeetingAttendee
*ia
,
503 icalparameter_partstat status
)
505 EMeetingAttendeePrivate
*priv
;
509 priv
->status
= status
;
515 e_meeting_attendee_get_sentby (EMeetingAttendee
*ia
)
517 EMeetingAttendeePrivate
*priv
;
525 e_meeting_attendee_set_sentby (EMeetingAttendee
*ia
,
528 EMeetingAttendeePrivate
*priv
;
532 if (priv
->sentby
!= NULL
)
533 g_free (priv
->sentby
);
535 priv
->sentby
= string_test (sentby
);
541 e_meeting_attendee_is_set_sentby (EMeetingAttendee
*ia
)
543 EMeetingAttendeePrivate
*priv
;
547 return string_is_set (priv
->sentby
);
551 e_meeting_attendee_get_cn (EMeetingAttendee
*ia
)
553 EMeetingAttendeePrivate
*priv
;
561 e_meeting_attendee_set_cn (EMeetingAttendee
*ia
,
564 EMeetingAttendeePrivate
*priv
;
568 if (priv
->cn
!= NULL
)
571 priv
->cn
= string_test (cn
);
577 e_meeting_attendee_is_set_cn (EMeetingAttendee
*ia
)
579 EMeetingAttendeePrivate
*priv
;
583 return string_is_set (priv
->cn
);
587 e_meeting_attendee_get_language (EMeetingAttendee
*ia
)
589 EMeetingAttendeePrivate
*priv
;
593 return priv
->language
;
597 e_meeting_attendee_set_language (EMeetingAttendee
*ia
,
600 EMeetingAttendeePrivate
*priv
;
604 if (priv
->language
!= NULL
)
605 g_free (priv
->language
);
607 priv
->language
= string_test (language
);
613 e_meeting_attendee_is_set_language (EMeetingAttendee
*ia
)
615 EMeetingAttendeePrivate
*priv
;
619 return string_is_set (priv
->language
);
623 e_meeting_attendee_get_atype (EMeetingAttendee
*ia
)
625 EMeetingAttendeePrivate
*priv
;
629 if (priv
->cutype
== ICAL_CUTYPE_ROOM
630 || priv
->cutype
== ICAL_CUTYPE_RESOURCE
)
631 return E_MEETING_ATTENDEE_RESOURCE
;
633 if (priv
->role
== ICAL_ROLE_CHAIR
634 || priv
->role
== ICAL_ROLE_REQPARTICIPANT
)
635 return E_MEETING_ATTENDEE_REQUIRED_PERSON
;
637 return E_MEETING_ATTENDEE_OPTIONAL_PERSON
;
640 EMeetingAttendeeEditLevel
641 e_meeting_attendee_get_edit_level (EMeetingAttendee
*ia
)
643 EMeetingAttendeePrivate
*priv
;
645 g_return_val_if_fail (ia
!= NULL
, E_MEETING_ATTENDEE_EDIT_NONE
);
646 g_return_val_if_fail (E_IS_MEETING_ATTENDEE (ia
), E_MEETING_ATTENDEE_EDIT_NONE
);
650 return priv
->edit_level
;
654 e_meeting_attendee_set_edit_level (EMeetingAttendee
*ia
,
655 EMeetingAttendeeEditLevel level
)
657 EMeetingAttendeePrivate
*priv
;
659 g_return_if_fail (ia
!= NULL
);
660 g_return_if_fail (E_IS_MEETING_ATTENDEE (ia
));
664 priv
->edit_level
= level
;
668 compare_times (EMeetingTime
*time1
,
673 day_comparison
= g_date_compare (
676 if (day_comparison
!= 0)
677 return day_comparison
;
679 if (time1
->hour
< time2
->hour
)
681 if (time1
->hour
> time2
->hour
)
684 if (time1
->minute
< time2
->minute
)
686 if (time1
->minute
> time2
->minute
)
689 /* The start times are exactly the same. */
694 compare_period_starts (gconstpointer arg1
,
697 EMeetingFreeBusyPeriod
*period1
, *period2
;
699 period1
= (EMeetingFreeBusyPeriod
*) arg1
;
700 period2
= (EMeetingFreeBusyPeriod
*) arg2
;
702 return compare_times (&period1
->start
, &period2
->start
);
706 ensure_periods_sorted (EMeetingAttendee
*ia
)
708 EMeetingAttendeePrivate
*priv
;
712 if (priv
->busy_periods_sorted
)
716 priv
->busy_periods
->data
, priv
->busy_periods
->len
,
717 sizeof (EMeetingFreeBusyPeriod
),
718 compare_period_starts
);
720 priv
->busy_periods_sorted
= TRUE
;
724 e_meeting_attendee_get_has_calendar_info (EMeetingAttendee
*ia
)
726 EMeetingAttendeePrivate
*priv
;
730 return priv
->has_calendar_info
;
734 e_meeting_attendee_set_has_calendar_info (EMeetingAttendee
*ia
,
735 gboolean has_calendar_info
)
737 EMeetingAttendeePrivate
*priv
;
741 priv
->has_calendar_info
= has_calendar_info
;
745 e_meeting_attendee_get_busy_periods (EMeetingAttendee
*ia
)
747 EMeetingAttendeePrivate
*priv
;
751 ensure_periods_sorted (ia
);
753 return priv
->busy_periods
;
757 e_meeting_attendee_find_first_busy_period (EMeetingAttendee
*ia
,
760 EMeetingAttendeePrivate
*priv
;
761 EMeetingFreeBusyPeriod
*period
;
762 gint lower
, upper
, middle
= 0, cmp
= 0;
767 /* Make sure the busy periods have been sorted. */
768 ensure_periods_sorted (ia
);
770 /* Calculate the first day which could have a busy period which
771 * continues onto our given date. */
773 g_date_subtract_days (&tmp_date
, priv
->longest_period_in_days
);
775 /* We want the first busy period which starts on tmp_date. */
777 upper
= priv
->busy_periods
->len
;
782 while (lower
< upper
) {
783 middle
= (lower
+ upper
) >> 1;
785 period
= &g_array_index (priv
->busy_periods
,
786 EMeetingFreeBusyPeriod
, middle
);
788 cmp
= g_date_compare (&tmp_date
, &period
->start
.date
);
798 /* There may be several busy periods on the same day so we step
799 * backwards to the first one. */
802 period
= &g_array_index (priv
->busy_periods
,
803 EMeetingFreeBusyPeriod
, middle
- 1);
804 if (g_date_compare (&tmp_date
, &period
->start
.date
) != 0)
808 } else if (cmp
> 0) {
809 /* This means we couldn't find a period on the given day, and
810 * the last one we looked at was before it, so if there are
811 * any more periods after this one we return it. */
813 if (priv
->busy_periods
->len
<= middle
)
821 e_meeting_attendee_add_busy_period (EMeetingAttendee
*ia
,
832 EMeetingFreeBusyType busy_type
,
833 const gchar
*summary
,
834 const gchar
*location
)
836 EMeetingAttendeePrivate
*priv
;
837 EMeetingFreeBusyPeriod period
;
840 g_return_val_if_fail (ia
!= NULL
, FALSE
);
841 g_return_val_if_fail (E_IS_MEETING_ATTENDEE (ia
), FALSE
);
842 g_return_val_if_fail (busy_type
< E_MEETING_FREE_BUSY_LAST
, FALSE
);
843 /* summary may be NULL (optional XFB data) */
844 /* location may be NULL (optional XFB data) */
848 /* Check the dates are valid. */
849 if (!g_date_valid_dmy (start_day
, start_month
, start_year
))
851 if (!g_date_valid_dmy (end_day
, end_month
, end_year
))
853 if (start_hour
< 0 || start_hour
> 23)
855 if (end_hour
< 0 || end_hour
> 23)
857 if (start_minute
< 0 || start_minute
> 59)
859 if (end_minute
< 0 || end_minute
> 59)
862 g_date_clear (&period
.start
.date
, 1);
863 g_date_clear (&period
.end
.date
, 1);
864 g_date_set_dmy (&period
.start
.date
, start_day
, start_month
, start_year
);
865 g_date_set_dmy (&period
.end
.date
, end_day
, end_month
, end_year
);
866 period
.start
.hour
= start_hour
;
867 period
.start
.minute
= start_minute
;
868 period
.end
.hour
= end_hour
;
869 period
.end
.minute
= end_minute
;
870 period
.busy_type
= busy_type
;
872 /* Check that the start time is before or equal to the end time. */
873 if (compare_times (&period
.start
, &period
.end
) > 0)
876 /* If the busy_type is FREE, then there is no need to render it in UI */
877 if (busy_type
== E_MEETING_FREE_BUSY_FREE
)
880 /* If the busy range is not set elsewhere, track it as best we can */
881 if (!priv
->start_busy_range_set
) {
882 if (!g_date_valid (&priv
->busy_periods_start
.date
)) {
883 priv
->busy_periods_start
.date
= period
.start
.date
;
884 priv
->busy_periods_start
.hour
= period
.start
.hour
;
885 priv
->busy_periods_start
.minute
= period
.start
.minute
;
889 compare
= g_date_compare (
891 &priv
->busy_periods_start
.date
);
895 priv
->busy_periods_start
.date
= period
.start
.date
;
896 priv
->busy_periods_start
.hour
= period
.start
.hour
;
897 priv
->busy_periods_start
.minute
= period
.start
.minute
;
900 if (period
.start
.hour
< priv
->busy_periods_start
.hour
901 || (period
.start
.hour
== priv
->busy_periods_start
.hour
902 && period
.start
.minute
< priv
->busy_periods_start
.minute
)) {
903 priv
->busy_periods_start
.date
= period
.start
.date
;
904 priv
->busy_periods_start
.hour
= period
.start
.hour
;
905 priv
->busy_periods_start
.minute
= period
.start
.minute
;
913 if (!priv
->end_busy_range_set
) {
914 if (!g_date_valid (&priv
->busy_periods_end
.date
)) {
915 priv
->busy_periods_end
.date
= period
.end
.date
;
916 priv
->busy_periods_end
.hour
= period
.end
.hour
;
917 priv
->busy_periods_end
.minute
= period
.end
.minute
;
921 compare
= g_date_compare (
923 &priv
->busy_periods_end
.date
);
927 if (period
.end
.hour
> priv
->busy_periods_end
.hour
928 || (period
.end
.hour
== priv
->busy_periods_end
.hour
929 && period
.end
.minute
> priv
->busy_periods_end
.minute
)) {
930 priv
->busy_periods_end
.date
= period
.end
.date
;
931 priv
->busy_periods_end
.hour
= period
.end
.hour
;
932 priv
->busy_periods_end
.minute
= period
.end
.minute
;
937 priv
->busy_periods_end
.date
= period
.end
.date
;
938 priv
->busy_periods_end
.hour
= period
.end
.hour
;
939 priv
->busy_periods_end
.minute
= period
.end
.minute
;
945 /* Setting of extended free/busy (XFB) data, if we have any. */
946 e_meeting_xfb_data_init (&(period
.xfb
));
947 e_meeting_xfb_data_set (&(period
.xfb
), summary
, location
);
949 g_array_append_val (priv
->busy_periods
, period
);
952 g_date_get_julian (&period
.end
.date
) -
953 g_date_get_julian (&period
.start
.date
) + 1;
954 priv
->longest_period_in_days
=
955 MAX (priv
->longest_period_in_days
, period_in_days
);
958 priv
->has_calendar_info
= TRUE
;
959 priv
->busy_periods_sorted
= FALSE
;
965 e_meeting_attendee_get_start_busy_range (EMeetingAttendee
*ia
)
967 EMeetingAttendeePrivate
*priv
;
971 return priv
->busy_periods_start
;
975 e_meeting_attendee_get_end_busy_range (EMeetingAttendee
*ia
)
977 EMeetingAttendeePrivate
*priv
;
981 return priv
->busy_periods_end
;
985 e_meeting_attendee_set_start_busy_range (EMeetingAttendee
*ia
,
992 EMeetingAttendeePrivate
*priv
;
994 g_return_val_if_fail (E_IS_MEETING_ATTENDEE (ia
), FALSE
);
998 /* Check the dates are valid. */
999 if (!g_date_valid_dmy (start_day
, start_month
, start_year
))
1001 if (start_hour
< 0 || start_hour
> 23)
1003 if (start_minute
< 0 || start_minute
> 59)
1006 g_date_clear (&priv
->busy_periods_start
.date
, 1);
1008 &priv
->busy_periods_start
.date
,
1009 start_day
, start_month
, start_year
);
1010 priv
->busy_periods_start
.hour
= start_hour
;
1011 priv
->busy_periods_start
.minute
= start_minute
;
1013 priv
->start_busy_range_set
= TRUE
;
1019 e_meeting_attendee_set_end_busy_range (EMeetingAttendee
*ia
,
1026 EMeetingAttendeePrivate
*priv
;
1028 g_return_val_if_fail (E_IS_MEETING_ATTENDEE (ia
), FALSE
);
1032 /* Check the dates are valid. */
1033 if (!g_date_valid_dmy (end_day
, end_month
, end_year
))
1035 if (end_hour
< 0 || end_hour
> 23)
1037 if (end_minute
< 0 || end_minute
> 59)
1040 g_date_clear (&priv
->busy_periods_end
.date
, 1);
1042 &priv
->busy_periods_end
.date
,
1043 end_day
, end_month
, end_year
);
1044 priv
->busy_periods_end
.hour
= end_hour
;
1045 priv
->busy_periods_end
.minute
= end_minute
;
1047 priv
->end_busy_range_set
= TRUE
;
1052 /* Clears all busy times for the given attendee. */
1054 e_meeting_attendee_clear_busy_periods (EMeetingAttendee
*ia
)
1056 EMeetingAttendeePrivate
*priv
;
1058 g_return_if_fail (E_IS_MEETING_ATTENDEE (ia
));
1062 g_array_set_size (priv
->busy_periods
, 0);
1063 priv
->busy_periods_sorted
= TRUE
;
1065 g_date_clear (&priv
->busy_periods_start
.date
, 1);
1066 priv
->busy_periods_start
.hour
= 0;
1067 priv
->busy_periods_start
.minute
= 0;
1069 g_date_clear (&priv
->busy_periods_end
.date
, 1);
1070 priv
->busy_periods_end
.hour
= 0;
1071 priv
->busy_periods_end
.minute
= 0;
1073 priv
->longest_period_in_days
= 0;