/* Class methods */ static LibBalsaABErr libbalsa_address_book_rubrica_load(LibBalsaAddressBook * ab, const gchar * filter, LibBalsaAddressBookLoadFunc callback, gpointer data) { LibBalsaAddressBookRubrica *ab_rubrica = LIBBALSA_ADDRESS_BOOK_RUBRICA(ab); LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab); LibBalsaABErr load_res; gchar *filter_hi = NULL; GSList *list; g_return_val_if_fail(ab_text->path != NULL, LBABERR_CANNOT_READ); /* try to load the xml file if necessary */ load_res = lbab_rubrica_load_xml(ab_rubrica, NULL); if (load_res != LBABERR_OK) return load_res; if (filter) filter_hi = g_utf8_strup(filter, -1); for (list = ab_text->item_list; list; list = list->next) { LibBalsaAddress *address = LIBBALSA_ADDRESS(list->data); if (!address) continue; if (callback && (!filter_hi || lbab_rubrica_starts_from(address->last_name, filter_hi) || lbab_rubrica_starts_from(address->full_name, filter_hi))) callback(ab, address, data); } if (callback) callback(ab, NULL, data); g_free(filter_hi); return LBABERR_OK; }
static GtkWidget * balsa_vevent_widget(LibBalsaVEvent * event, gboolean may_reply, InternetAddress * sender) { GtkGrid *grid; int row = 0; LibBalsaIdentity *vevent_ident = NULL; grid = GTK_GRID(gtk_grid_new()); gtk_grid_set_row_spacing(grid, 6); gtk_grid_set_column_spacing(grid, 12); GRID_ATTACH(grid, event->summary, _("Summary:")); GRID_ATTACH_ADDRESS(grid, event->organizer, _("Organizer:")); GRID_ATTACH_DATE(grid, event->start, _("Start:")); GRID_ATTACH_DATE(grid, event->end, _("End:")); GRID_ATTACH(grid, event->location, _("Location:")); if (event->attendee) { GList *att; GString *all_atts = NULL; for (att = event->attendee; att; att = att->next) { LibBalsaAddress *lba = LIBBALSA_ADDRESS(att->data); gchar *this_att = libbalsa_vcal_attendee_to_str(lba); if (all_atts) g_string_append_printf(all_atts, "\n%s", this_att); else all_atts = g_string_new(this_att); g_free(this_att); if (may_reply && libbalsa_vcal_attendee_rsvp(lba)) { InternetAddress *ia = internet_address_mailbox_new(NULL, lba->address_list->data); GList *list; for (list = balsa_app.identities; list; list = list->next) { LibBalsaIdentity *ident = list->data; if (libbalsa_ia_rfc2821_equal(ident->ia, ia)) { vevent_ident = ident; break; } } g_object_unref(ia); } } GRID_ATTACH(grid, all_atts->str, ngettext("Attendee:", "Attendees:", g_list_length(event->attendee))); g_string_free(all_atts, TRUE); } GRID_ATTACH_TEXT(grid, event->description, _("Description:")); if (sender && vevent_ident) { GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); GtkWidget *label; GtkWidget *bbox; GtkWidget *button; /* add the callback data to the event object */ g_object_ref(event); g_object_ref(sender); g_object_set_data_full(G_OBJECT(event), "ev:sender", internet_address_to_string(sender, FALSE), (GDestroyNotify) g_free); g_object_set_data_full(G_OBJECT(event), "ev:ident", g_object_ref(vevent_ident), (GDestroyNotify) g_object_unref); /* pack everything into a box */ gtk_container_add(GTK_CONTAINER(box), GTK_WIDGET(grid)); label = gtk_label_new(_("The sender asks you for a reply to this request:")); gtk_container_add(GTK_CONTAINER(box), label); bbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_SPREAD); gtk_container_add(GTK_CONTAINER(box), bbox); button = gtk_button_new_with_label(_("Accept")); g_object_set_data_full(G_OBJECT(button), "event", event, (GDestroyNotify) g_object_unref); g_object_set_data(G_OBJECT(button), "mode", GINT_TO_POINTER(VCAL_PSTAT_ACCEPTED)); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(vevent_reply), bbox); gtk_container_add(GTK_CONTAINER(bbox), button); button = gtk_button_new_with_label(_("Accept tentatively")); g_object_set_data(G_OBJECT(button), "event", event); g_object_set_data(G_OBJECT(button), "mode", GINT_TO_POINTER(VCAL_PSTAT_TENTATIVE)); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(vevent_reply), bbox); gtk_container_add(GTK_CONTAINER(bbox), button); button = gtk_button_new_with_label(_("Decline")); g_object_set_data(G_OBJECT(button), "event", event); g_object_set_data(G_OBJECT(button), "mode", GINT_TO_POINTER(VCAL_PSTAT_DECLINED)); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(vevent_reply), bbox); gtk_container_add(GTK_CONTAINER(bbox), button); return box; } else return GTK_WIDGET(grid); }
/* -- helpers -- */ static LibBalsaABErr lbab_rubrica_load_xml(LibBalsaAddressBookRubrica * ab_rubrica, xmlDocPtr * docptr) { LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab_rubrica); struct stat stat_buf; int fd; xmlDocPtr doc = NULL; xmlNodePtr root_element = NULL; GList *completion_list; CompletionData *cmp_data; GSList *list; /* init the return pointer (if any) */ if (docptr) *docptr = NULL; /* eject if the file did not change on disk and no document result pointer is passed */ if (!docptr && stat(ab_text->path, &stat_buf) == 0) { if (stat_buf.st_mtime == ab_text->mtime) return LBABERR_OK; else ab_text->mtime = stat_buf.st_mtime; } /* free old data */ g_slist_foreach(ab_text->item_list, (GFunc) g_object_unref, NULL); g_slist_free(ab_text->item_list); ab_text->item_list = NULL; g_list_foreach(ab_text->name_complete->items, (GFunc) completion_data_free, NULL); libbalsa_completion_clear_items(ab_text->name_complete); /* try to read the address book */ if ((fd = open(ab_text->path, O_RDONLY)) == -1) return LBABERR_CANNOT_READ; if (libbalsa_lock_file(ab_text->path, fd, FALSE, TRUE, FALSE) < 0) { close(fd); return LBABERR_CANNOT_READ; } doc = xmlParseFile(ab_text->path); libbalsa_unlock_file(ab_text->path, fd, FALSE); close(fd); if (!doc) return LBABERR_CANNOT_READ; /* Get the root element node and extract cards if it is a Rubrica book */ root_element = xmlDocGetRootElement(doc); if (!xmlStrcmp(root_element->name, CXMLCHARP("Rubrica"))) ab_text->item_list = extract_cards(root_element->children); /* return the document if requested of free it */ if (docptr) *docptr = doc; else xmlFreeDoc(doc); /* build the completion list */ // FIXME - Rubrica provides groups... completion_list = NULL; for (list = ab_text->item_list; list; list = list->next) { LibBalsaAddress *address = LIBBALSA_ADDRESS(list->data); GList *l; if (!address) continue; if (address->address_list->next && LIBBALSA_ADDRESS_BOOK(ab_rubrica)->dist_list_mode) { /* Create a group address. */ InternetAddress *ia = internet_address_group_new(address->full_name); InternetAddressGroup *group = (InternetAddressGroup *) ia; for (l = address->address_list; l; l = l->next) { InternetAddress *member = internet_address_mailbox_new(NULL, l->data); internet_address_group_add_member(group, member); g_object_unref(member); } cmp_data = completion_data_new(ia, address->nick_name); completion_list = g_list_prepend(completion_list, cmp_data); g_object_unref(ia); } else { /* Create name addresses. */ GList *l; for (l = address->address_list; l; l = l->next) { InternetAddress *ia = internet_address_mailbox_new(address->full_name, l->data); cmp_data = completion_data_new(ia, address->nick_name); completion_list = g_list_prepend(completion_list, cmp_data); g_object_unref(ia); } } } completion_list = g_list_reverse(completion_list); libbalsa_completion_add_items(ab_text->name_complete, completion_list); g_list_free(completion_list); return LBABERR_OK; }