/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* A class to cache address book conents on local file system * * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) * * This library is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see . * * Authors: Sivaiah Nallagatla */ /** * SECTION: e-book-backend-cache * @include: libedata-book/libedata-book.h * @short_description: A utility for storing contact data and searching for contacts * * The #EBookBackendCache is deprecated, use #EBookSqlite instead. */ #include "evolution-data-server-config.h" #include #include "e-book-backend-cache.h" #include "e-book-backend-sexp.h" #define E_BOOK_BACKEND_CACHE_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE \ ((obj), E_TYPE_BOOK_BACKEND_CACHE, EBookBackendCachePrivate)) struct _EBookBackendCachePrivate { gint placeholder; }; G_DEFINE_TYPE (EBookBackendCache, e_book_backend_cache, E_TYPE_FILE_CACHE) static void e_book_backend_cache_class_init (EBookBackendCacheClass *class) { g_type_class_add_private (class, sizeof (EBookBackendCachePrivate)); } static void e_book_backend_cache_init (EBookBackendCache *cache) { cache->priv = E_BOOK_BACKEND_CACHE_GET_PRIVATE (cache); } /** * e_book_backend_cache_new * @filename: file to write cached data * * Creates a new #EBookBackendCache, which implements a local cache of * #EContact objects, useful for remote backends. * * Returns: a new #EBookBackendCache * * Deprecated: 3.12: Use #EBookSqlite instead */ EBookBackendCache * e_book_backend_cache_new (const gchar *filename) { g_return_val_if_fail (filename != NULL, NULL); return g_object_new ( E_TYPE_BOOK_BACKEND_CACHE, "filename", filename, NULL); } /** * e_book_backend_cache_get_contact: * @cache: an #EBookBackendCache * @uid: a unique contact ID * * Get a cached contact. Note that the returned #EContact will be * newly created, and must be unreffed by the caller when no longer * needed. * * Returns: A cached #EContact, or %NULL if @uid is not cached. * * Deprecated: 3.12: Use #EBookSqlite instead **/ EContact * e_book_backend_cache_get_contact (EBookBackendCache *cache, const gchar *uid) { const gchar *vcard_str; EContact *contact = NULL; g_return_val_if_fail (E_IS_BOOK_BACKEND_CACHE (cache), NULL); g_return_val_if_fail (uid != NULL, NULL); vcard_str = e_file_cache_get_object (E_FILE_CACHE (cache), uid); if (vcard_str) { contact = e_contact_new_from_vcard_with_uid (vcard_str, uid); } return contact; } /** * e_book_backend_cache_add_contact: * @cache: an #EBookBackendCache * @contact: an #EContact * * Adds @contact to @cache. * * Returns: %TRUE if the contact was cached successfully, %FALSE otherwise. * * Deprecated: 3.12: Use #EBookSqlite instead **/ gboolean e_book_backend_cache_add_contact (EBookBackendCache *cache, EContact *contact) { gchar *vcard_str; const gchar *uid; gboolean retval; g_return_val_if_fail (E_IS_BOOK_BACKEND_CACHE (cache), FALSE); uid = e_contact_get_const (contact, E_CONTACT_UID); vcard_str = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30); if (e_file_cache_get_object (E_FILE_CACHE (cache), uid)) retval = e_file_cache_replace_object (E_FILE_CACHE (cache), uid, vcard_str); else retval = e_file_cache_add_object (E_FILE_CACHE (cache), uid, vcard_str); g_free (vcard_str); return retval; } /** * e_book_backend_cache_remove_contact: * @cache: an #EBookBackendCache * @uid: a unique contact ID * * Removes the contact identified by @uid from @cache. * * Returns: %TRUE if the contact was found and removed, %FALSE otherwise. * * Deprecated: 3.12: Use #EBookSqlite instead **/ gboolean e_book_backend_cache_remove_contact (EBookBackendCache *cache, const gchar *uid) { g_return_val_if_fail (E_IS_BOOK_BACKEND_CACHE (cache), FALSE); g_return_val_if_fail (uid != NULL, FALSE); if (!e_file_cache_get_object (E_FILE_CACHE (cache), uid)) return FALSE; return e_file_cache_remove_object (E_FILE_CACHE (cache), uid); } /** * e_book_backend_cache_check_contact: * @cache: an #EBookBackendCache * @uid: a unique contact ID * * Checks if the contact identified by @uid exists in @cache. * * Returns: %TRUE if the cache contains the contact, %FALSE otherwise. * * Deprecated: 3.12: Use #EBookSqlite instead **/ gboolean e_book_backend_cache_check_contact (EBookBackendCache *cache, const gchar *uid) { gboolean retval; g_return_val_if_fail (E_IS_BOOK_BACKEND_CACHE (cache), FALSE); g_return_val_if_fail (uid != NULL, FALSE); retval = FALSE; if (e_file_cache_get_object (E_FILE_CACHE (cache), uid)) retval = TRUE; return retval; } /** * e_book_backend_cache_get_contacts: * @cache: an #EBookBackendCache * @query: an s-expression * * Returns a list of #EContact elements from @cache matching @query. * When done with the list, the caller must unref the contacts and * free the list. * * Returns: A #GList of pointers to #EContact. * * Deprecated: 3.12: Use #EBookSqlite instead **/ GList * e_book_backend_cache_get_contacts (EBookBackendCache *cache, const gchar *query) { gchar *vcard_str; GSList *l, *lcache; GList *list = NULL; EContact *contact; EBookBackendSExp *sexp = NULL; const gchar *uid; g_return_val_if_fail (E_IS_BOOK_BACKEND_CACHE (cache), NULL); if (query) { sexp = e_book_backend_sexp_new (query); if (!sexp) return NULL; } lcache = l = e_file_cache_get_objects (E_FILE_CACHE (cache)); for (; l != NULL; l = g_slist_next (l)) { vcard_str = l->data; if (vcard_str && !strncmp (vcard_str, "BEGIN:VCARD", 11)) { contact = e_contact_new_from_vcard (vcard_str); uid = e_contact_get_const (contact, E_CONTACT_UID); if (uid && *uid && (!query || e_book_backend_sexp_match_contact (sexp, contact))) list = g_list_prepend (list, contact); else g_object_unref (contact); } } if (lcache) g_slist_free (lcache); if (sexp) g_object_unref (sexp); return g_list_reverse (list); } /** * e_book_backend_cache_search: * @cache: an #EBookBackendCache * @query: an s-expression * * Returns an array of pointers to unique contact ID strings for contacts * in @cache matching @query. When done with the array, the caller must * free the ID strings and the array. * * Returns: A #GPtrArray of pointers to contact ID strings. * * Deprecated: 3.12: Use #EBookSqlite instead **/ GPtrArray * e_book_backend_cache_search (EBookBackendCache *cache, const gchar *query) { GList *matching_contacts, *temp; GPtrArray *ptr_array; matching_contacts = e_book_backend_cache_get_contacts (cache, query); ptr_array = g_ptr_array_new (); temp = matching_contacts; for (; matching_contacts != NULL; matching_contacts = g_list_next (matching_contacts)) { g_ptr_array_add (ptr_array, e_contact_get (matching_contacts->data, E_CONTACT_UID)); g_object_unref (matching_contacts->data); } g_list_free (temp); return ptr_array; } /** * e_book_backend_cache_set_populated: * @cache: an #EBookBackendCache * * Flags @cache as being populated - that is, it is up-to-date on the * contents of the book it's caching. * * Deprecated: 3.12: Use #EBookSqlite instead **/ void e_book_backend_cache_set_populated (EBookBackendCache *cache) { g_return_if_fail (E_IS_BOOK_BACKEND_CACHE (cache)); e_file_cache_add_object (E_FILE_CACHE (cache), "populated", "TRUE"); } /** * e_book_backend_cache_is_populated: * @cache: an #EBookBackendCache * * Checks if @cache is populated. * * Returns: %TRUE if @cache is populated, %FALSE otherwise. * * Deprecated: 3.12: Use #EBookSqlite instead **/ gboolean e_book_backend_cache_is_populated (EBookBackendCache *cache) { g_return_val_if_fail (E_IS_BOOK_BACKEND_CACHE (cache), FALSE); if (e_file_cache_get_object (E_FILE_CACHE (cache), "populated")) return TRUE; return FALSE; } void e_book_backend_cache_set_time (EBookBackendCache *cache, const gchar *t) { g_return_if_fail (E_IS_BOOK_BACKEND_CACHE (cache)); if (!e_file_cache_add_object (E_FILE_CACHE (cache), "last_update_time", t)) e_file_cache_replace_object (E_FILE_CACHE (cache), "last_update_time", t); } gchar * e_book_backend_cache_get_time (EBookBackendCache *cache) { g_return_val_if_fail (E_IS_BOOK_BACKEND_CACHE (cache), NULL); return g_strdup (e_file_cache_get_object (E_FILE_CACHE (cache), "last_update_time")); }