static void mail_store_add (EMailBackend *backend, CamelStore *store, AddStoreCallback callback) { EMailSession *session; EMFolderTreeModel *default_model; MailFolderCache *folder_cache; StoreInfo *store_info; g_return_if_fail (store_table != NULL); g_return_if_fail (store != NULL); g_return_if_fail (CAMEL_IS_STORE (store)); session = e_mail_backend_get_session (backend); default_model = em_folder_tree_model_get_default (); folder_cache = e_mail_session_get_folder_cache (session); store_info = store_info_new (store); store_info->callback = callback; g_hash_table_insert (store_table, store, store_info); if (special_mail_store_is_enabled (store)) em_folder_tree_model_add_store (default_model, store); mail_folder_cache_note_store ( folder_cache, CAMEL_SESSION (session), store, NULL, mail_store_note_store_cb, store_info_ref (store_info)); }
static void rule_add_sources (EMailSession *session, GQueue *queue, GList **sources_folderp, GList **sources_urip) { GList *sources_folder = *sources_folderp; GList *sources_uri = *sources_urip; MailFolderCache *folder_cache; CamelFolder *newfolder; GList *head, *link; folder_cache = e_mail_session_get_folder_cache (session); head = g_queue_peek_head_link (queue); for (link = head; link != NULL; link = g_list_next (link)) { const gchar *uri = link->data; if (mail_folder_cache_get_folder_from_uri ( folder_cache, uri, &newfolder)) { if (newfolder) sources_folder = g_list_append ( sources_folder, newfolder); else sources_uri = g_list_append ( sources_uri, g_strdup (uri)); } } *sources_folderp = sources_folder; *sources_urip = sources_uri; }
static void receive_update_got_store (CamelStore *store, struct _send_info *info) { EMailSession *session; MailFolderCache *folder_cache; session = info->session; folder_cache = e_mail_session_get_folder_cache (session); if (store) { mail_folder_cache_note_store ( folder_cache, store, info->cancellable, receive_update_got_folderinfo, info); } else { receive_done (-1, info); } }
static void vfolder_adduri_exec (struct _adduri_msg *m, GCancellable *cancellable, GError **error) { GList *l; EMailSession *session; CamelFolder *folder = NULL; MailFolderCache *folder_cache; if (vfolder_shutdown) return; session = e_mail_backend_get_session (m->backend); folder_cache = e_mail_session_get_folder_cache (session); /* we dont try lookup the cache if we are removing it, its no longer there */ if (!m->remove && !mail_folder_cache_get_folder_from_uri (folder_cache, m->uri, &folder)) { g_warning ( "Folder '%s' disappeared while I was " "adding/removing it to/from my vfolder", m->uri); return; } if (folder == NULL) folder = e_mail_session_uri_to_folder_sync ( session, m->uri, 0, cancellable, error); if (folder != NULL) { l = m->folders; while (l && !vfolder_shutdown) { if (m->remove) camel_vee_folder_remove_folder ( CAMEL_VEE_FOLDER (l->data), folder); else camel_vee_folder_add_folder ((CamelVeeFolder *) l->data, folder); l = l->next; } g_object_unref (folder); } }
void e_mail_store_remove (EMailBackend *backend, CamelStore *store) { EMailSession *session; MailFolderCache *folder_cache; EMFolderTreeModel *default_model; g_return_if_fail (E_IS_MAIL_BACKEND (backend)); g_return_if_fail (CAMEL_IS_STORE (store)); g_return_if_fail (store_table != NULL); session = e_mail_backend_get_session (backend); /* Because the store table holds a reference to each store used * as a key in it, none of them will ever be gc'ed, meaning any * call to camel_session_get_{service,store} with the same URL * will always return the same object. So this works. */ if (g_hash_table_lookup (store_table, store) == NULL) return; g_object_ref (store); g_hash_table_remove (store_table, store); folder_cache = e_mail_session_get_folder_cache (session); mail_folder_cache_note_store_remove (folder_cache, store); default_model = em_folder_tree_model_get_default (); em_folder_tree_model_remove_store (default_model, store); mail_disconnect_store (store); g_object_unref (store); }
void e_mail_shell_view_update_sidebar (EMailShellView *mail_shell_view) { EMailShellContent *mail_shell_content; EShellBackend *shell_backend; EShellSidebar *shell_sidebar; EShellView *shell_view; EShell *shell; EMailReader *reader; EMailView *mail_view; ESourceRegistry *registry; CamelStore *parent_store; CamelFolder *folder; CamelFolderInfoFlags flags = 0; CamelFolderSummary *folder_summary; MailFolderCache *folder_cache; MessageList *message_list; guint selected_count; GString *buffer, *title_short = NULL; gboolean store_is_local, is_inbox; const gchar *display_name; const gchar *folder_name; const gchar *uid; gchar *title; guint32 num_deleted; guint32 num_junked; guint32 num_junked_not_deleted; guint32 num_unread; guint32 num_visible; g_return_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view)); mail_shell_content = mail_shell_view->priv->mail_shell_content; mail_view = e_mail_shell_content_get_mail_view (mail_shell_content); shell_view = E_SHELL_VIEW (mail_shell_view); shell_backend = e_shell_view_get_shell_backend (shell_view); shell_sidebar = e_shell_view_get_shell_sidebar (shell_view); shell = e_shell_backend_get_shell (shell_backend); registry = e_shell_get_registry (shell); reader = E_MAIL_READER (mail_view); folder = e_mail_reader_ref_folder (reader); /* If no folder is selected, reset the sidebar banners * to their default values and stop. */ if (folder == NULL) { GtkAction *action; gchar *label; action = e_shell_view_get_action (shell_view); g_object_get (action, "label", &label, NULL); e_shell_sidebar_set_secondary_text (shell_sidebar, NULL); e_shell_view_set_title (shell_view, label); g_free (label); return; } folder_name = camel_folder_get_display_name (folder); parent_store = camel_folder_get_parent_store (folder); folder_summary = camel_folder_get_folder_summary (folder); folder_cache = e_mail_session_get_folder_cache ( e_mail_backend_get_session (E_MAIL_BACKEND (shell_backend))); mail_folder_cache_get_folder_info_flags (folder_cache, parent_store, folder_name, &flags); is_inbox = (flags & CAMEL_FOLDER_TYPE_MASK) == CAMEL_FOLDER_TYPE_INBOX; num_deleted = camel_folder_summary_get_deleted_count (folder_summary); num_junked = camel_folder_summary_get_junk_count (folder_summary); num_junked_not_deleted = camel_folder_summary_get_junk_not_deleted_count (folder_summary); num_unread = camel_folder_summary_get_unread_count (folder_summary); num_visible = camel_folder_summary_get_visible_count (folder_summary); buffer = g_string_sized_new (256); message_list = MESSAGE_LIST (e_mail_reader_get_message_list (reader)); selected_count = message_list_selected_count (message_list); if (selected_count > 1) g_string_append_printf ( buffer, ngettext ("%d selected, ", "%d selected, ", selected_count), selected_count); /* "Trash" folder (virtual or real) */ if (camel_folder_get_flags (folder) & CAMEL_FOLDER_IS_TRASH) { if (CAMEL_IS_VTRASH_FOLDER (folder)) { /* For a virtual Trash folder, count * the messages marked for deletion. */ g_string_append_printf ( buffer, ngettext ("%d deleted", "%d deleted", num_deleted), num_deleted); } else { /* For a regular Trash folder, just * count the visible messages. * * XXX Open question: what to do about messages * marked for deletion in Trash? Probably * this is the wrong question to be asking * anyway. Deleting a message in a real * Trash should permanently expunge the * message (if the server supports that), * which would eliminate this corner case. */ if (!e_mail_reader_get_hide_deleted (reader)) num_visible += num_deleted; g_string_append_printf ( buffer, ngettext ("%d deleted", "%d deleted", num_visible), num_visible); } /* "Junk" folder (virtual or real) */ } else if (camel_folder_get_flags (folder) & CAMEL_FOLDER_IS_JUNK) { if (e_mail_reader_get_hide_deleted (reader)) { /* Junk folder with deleted messages hidden. */ g_string_append_printf ( buffer, ngettext ("%d junk", "%d junk", num_junked_not_deleted), num_junked_not_deleted); } else { /* Junk folder with deleted messages visible. */ g_string_append_printf ( buffer, ngettext ("%d junk", "%d junk", num_junked), num_junked); } /* "Drafts" folder */ } else if (!is_inbox && em_utils_folder_is_drafts (registry, folder)) { g_string_append_printf ( buffer, ngettext ("%d draft", "%d drafts", num_visible), num_visible); /* "Outbox" folder */ } else if (!is_inbox && em_utils_folder_is_outbox (registry, folder)) { g_string_append_printf ( buffer, ngettext ("%d unsent", "%d unsent", num_visible), num_visible); /* "Sent" folder */ } else if (!is_inbox && em_utils_folder_is_sent (registry, folder)) { g_string_append_printf ( buffer, ngettext ("%d sent", "%d sent", num_visible), num_visible); /* Normal folder */ } else { if (!e_mail_reader_get_hide_deleted (reader)) num_visible += num_deleted - num_junked + num_junked_not_deleted; if (num_unread > 0 && selected_count <= 1) { g_string_append_printf ( buffer, ngettext ("%d unread, ", "%d unread, ", num_unread), num_unread); title_short = g_string_sized_new (64); g_string_append_printf ( title_short, ngettext ("%d unread", "%d unread", num_unread), num_unread); } g_string_append_printf ( buffer, ngettext ("%d total", "%d total", num_visible), num_visible); } uid = camel_service_get_uid (CAMEL_SERVICE (parent_store)); store_is_local = (g_strcmp0 (uid, E_MAIL_SESSION_LOCAL_UID) == 0); /* Choose a suitable folder name for displaying. */ display_name = folder_name; if (store_is_local) { if (strcmp (folder_name, "Drafts") == 0) display_name = _("Drafts"); else if (strcmp (folder_name, "Inbox") == 0) display_name = _("Inbox"); else if (strcmp (folder_name, "Outbox") == 0) display_name = _("Outbox"); else if (strcmp (folder_name, "Sent") == 0) display_name = _("Sent"); else if (strcmp (folder_name, "Templates") == 0) display_name = _("Templates"); else if (strcmp (folder_name, "Trash") == 0) display_name = _("Trash"); } if (strcmp (folder_name, "INBOX") == 0) display_name = _("Inbox"); if (title_short && title_short->len > 0) title = g_strdup_printf ("%s (%s)", display_name, title_short->str); else title = g_strdup (display_name); e_shell_sidebar_set_secondary_text (shell_sidebar, buffer->str); e_shell_view_set_title (shell_view, title); g_free (title); g_string_free (buffer, TRUE); if (title_short) g_string_free (title_short, TRUE); g_clear_object (&folder); }
void vfolder_load_storage (EMailBackend *backend) { /* lock for loading storage, it is safe to call it more than once */ G_LOCK_DEFINE_STATIC (vfolder_hash); CamelService *service; const gchar *key; const gchar *data_dir; const gchar *config_dir; gchar *user, *storeuri; EFilterRule *rule; MailFolderCache *folder_cache; EMailSession *session; gchar *xmlfile; GConfClient *client; g_return_if_fail (E_IS_MAIL_BACKEND (backend)); G_LOCK (vfolder_hash); if (vfolder_hash) { /* we have already initialized */ G_UNLOCK (vfolder_hash); return; } vfolder_hash = g_hash_table_new (g_str_hash, g_str_equal); G_UNLOCK (vfolder_hash); data_dir = mail_session_get_data_dir (); config_dir = mail_session_get_config_dir (); session = e_mail_backend_get_session (backend); /* first, create the vfolder store, and set it up */ storeuri = g_strdup_printf("vfolder:%s/vfolder", data_dir); service = camel_session_add_service ( CAMEL_SESSION (session), "vfolder", storeuri, CAMEL_PROVIDER_STORE, NULL); if (service != NULL) { camel_service_set_display_name (service, _("Search Folders")); em_utils_connect_service_sync (service, NULL, NULL); } else { g_warning("Cannot open vfolder store - no vfolders available"); return; } g_return_if_fail (CAMEL_IS_STORE (service)); vfolder_store = CAMEL_STORE (service); g_signal_connect ( service, "folder-deleted", G_CALLBACK (store_folder_deleted_cb), backend); g_signal_connect ( service, "folder-renamed", G_CALLBACK (store_folder_renamed_cb), NULL); /* load our rules */ user = g_build_filename (config_dir, "vfolders.xml", NULL); context = em_vfolder_context_new (backend); xmlfile = g_build_filename (EVOLUTION_PRIVDATADIR, "vfoldertypes.xml", NULL); if (e_rule_context_load ((ERuleContext *) context, xmlfile, user) != 0) { g_warning("cannot load vfolders: %s\n", ((ERuleContext *)context)->error); } g_free (xmlfile); g_free (user); g_signal_connect ( context, "rule_added", G_CALLBACK (context_rule_added), context); g_signal_connect ( context, "rule_removed", G_CALLBACK (context_rule_removed), context); /* load store to mail component */ e_mail_store_add (backend, vfolder_store); /* and setup the rules we have */ rule = NULL; while ((rule = e_rule_context_next_rule ((ERuleContext *) context, rule, NULL))) { if (rule->name) { d(printf("rule added: %s\n", rule->name)); context_rule_added ((ERuleContext *) context, rule); } else { d(printf("invalid rule (%p) encountered: rule->name is NULL\n", rule)); } } g_free (storeuri); /* reenable the feature if required */ client = gconf_client_get_default (); key = "/apps/evolution/mail/display/enable_vfolders"; if (!gconf_client_get_bool (client, key, NULL)) gconf_client_set_bool (client, key, TRUE, NULL); g_object_unref (client); folder_cache = e_mail_session_get_folder_cache (session); g_signal_connect ( folder_cache, "folder-available", G_CALLBACK (folder_available_cb), backend); g_signal_connect ( folder_cache, "folder-unavailable", G_CALLBACK (folder_unavailable_cb), backend); g_signal_connect ( folder_cache, "folder-deleted", G_CALLBACK (folder_deleted_cb), backend); g_signal_connect ( folder_cache, "folder-renamed", G_CALLBACK (folder_renamed_cb), NULL); }