コード例 #1
0
ファイル: address-book-rubrica.c プロジェクト: GNOME/balsa
/* 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;
}
コード例 #2
0
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);
}
コード例 #3
0
ファイル: address-book-rubrica.c プロジェクト: GNOME/balsa
/* -- 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;
}